blob: a93d4b51d9ee74c25b0687384aa87938740f707b [file] [log] [blame]
unknown088160a2019-05-23 17:43:13 -06001/*
sfricke-samsung6d97e562020-01-07 22:01:00 -08002 * Copyright (c) 2015-2020 The Khronos Group Inc.
3 * Copyright (c) 2015-2020 Valve Corporation
4 * Copyright (c) 2015-2020 LunarG, Inc.
5 * Copyright (c) 2015-2020 Google, Inc.
unknown088160a2019-05-23 17:43:13 -06006 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
20 * Author: Cody Northrop <cnorthrop@google.com>
21 * Author: Dave Houlton <daveh@lunarg.com>
22 * Author: Jeremy Kniager <jeremyk@lunarg.com>
23 * Author: Shannon McPherson <shannon@lunarg.com>
24 * Author: John Zulauf <jzulauf@lunarg.com>
25 */
26
27#include "cast_utils.h"
28#include "layer_validation_tests.h"
29
30TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
31 TEST_DESCRIPTION("Allocate command buffers from one command pool and attempt to delete them from another.");
32
Mark Lobodzinski20310782020-02-28 14:25:17 -070033 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkFreeCommandBuffers-pCommandBuffers-parent");
unknown088160a2019-05-23 17:43:13 -060034
35 ASSERT_NO_FATAL_FAILURE(Init());
36 VkCommandPool command_pool_one;
37 VkCommandPool command_pool_two;
38
39 VkCommandPoolCreateInfo pool_create_info{};
40 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
41 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
42 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
43
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060044 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
unknown088160a2019-05-23 17:43:13 -060045
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060046 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
unknown088160a2019-05-23 17:43:13 -060047
48 VkCommandBuffer cb;
49 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
50 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
51 command_buffer_allocate_info.commandPool = command_pool_one;
52 command_buffer_allocate_info.commandBufferCount = 1;
53 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060054 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
unknown088160a2019-05-23 17:43:13 -060055
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060056 vk::FreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
unknown088160a2019-05-23 17:43:13 -060057
58 m_errorMonitor->VerifyFound();
59
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060060 vk::DestroyCommandPool(m_device->device(), command_pool_one, NULL);
61 vk::DestroyCommandPool(m_device->device(), command_pool_two, NULL);
unknown088160a2019-05-23 17:43:13 -060062}
63
64TEST_F(VkLayerTest, InvalidSecondaryCommandBufferBarrier) {
65 TEST_DESCRIPTION("Add an invalid image barrier in a secondary command buffer");
66 ASSERT_NO_FATAL_FAILURE(Init());
67
68 // A renderpass with a single subpass that declared a self-dependency
69 VkAttachmentDescription attach[] = {
70 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
71 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
72 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
73 };
74 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
75 VkSubpassDescription subpasses[] = {
76 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
77 };
78 VkSubpassDependency dep = {0,
79 0,
80 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
81 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
82 VK_ACCESS_SHADER_WRITE_BIT,
83 VK_ACCESS_SHADER_WRITE_BIT,
84 VK_DEPENDENCY_BY_REGION_BIT};
85 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 1, &dep};
86 VkRenderPass rp;
87
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060088 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
unknown088160a2019-05-23 17:43:13 -060089 ASSERT_VK_SUCCESS(err);
90
91 VkImageObj image(m_device);
92 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
93 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
94 // Second image that img_barrier will incorrectly use
95 VkImageObj image2(m_device);
96 image2.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
97
98 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
99 VkFramebuffer fb;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600100 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
unknown088160a2019-05-23 17:43:13 -0600101 ASSERT_VK_SUCCESS(err);
102
103 m_commandBuffer->begin();
104
105 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
106 nullptr,
107 rp,
108 fb,
109 {{
110 0,
111 0,
112 },
113 {32, 32}},
114 0,
115 nullptr};
116
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600117 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -0600118
119 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
120 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
121
122 VkCommandBufferInheritanceInfo cbii = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
123 nullptr,
124 rp,
125 0,
126 VK_NULL_HANDLE, // Set to NULL FB handle intentionally to flesh out any errors
127 VK_FALSE,
128 0,
129 0};
130 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
131 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,
132 &cbii};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600133 vk::BeginCommandBuffer(secondary.handle(), &cbbi);
unknown088160a2019-05-23 17:43:13 -0600134 VkImageMemoryBarrier img_barrier = {};
135 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
136 img_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
137 img_barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
138 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
139 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
140 img_barrier.image = image2.handle(); // Image mis-matches with FB image
141 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
142 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
143 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
144 img_barrier.subresourceRange.baseArrayLayer = 0;
145 img_barrier.subresourceRange.baseMipLevel = 0;
146 img_barrier.subresourceRange.layerCount = 1;
147 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600148 vk::CmdPipelineBarrier(secondary.handle(), VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
149 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, &img_barrier);
unknown088160a2019-05-23 17:43:13 -0600150 secondary.end();
151
Shannon McPherson93970b12020-06-12 14:34:35 -0600152 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-04073");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600153 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600154 m_errorMonitor->VerifyFound();
155
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600156 vk::DestroyFramebuffer(m_device->device(), fb, nullptr);
157 vk::DestroyRenderPass(m_device->device(), rp, nullptr);
unknown088160a2019-05-23 17:43:13 -0600158}
159
160TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
161 TEST_DESCRIPTION(
162 "Run a simple draw calls to validate failure when Depth Bias dynamic state is required but not correctly bound.");
163
164 ASSERT_NO_FATAL_FAILURE(Init());
165 // Dynamic depth bias
Mark Lobodzinski20310782020-02-28 14:25:17 -0700166 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bias state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600167 VKTriangleTest(BsoFailDepthBias);
168 m_errorMonitor->VerifyFound();
169}
170
171TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
172 TEST_DESCRIPTION(
173 "Run a simple draw calls to validate failure when Line Width dynamic state is required but not correctly bound.");
174
175 ASSERT_NO_FATAL_FAILURE(Init());
176 // Dynamic line width
Mark Lobodzinski20310782020-02-28 14:25:17 -0700177 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line width state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600178 VKTriangleTest(BsoFailLineWidth);
179 m_errorMonitor->VerifyFound();
180}
181
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500182TEST_F(VkLayerTest, DynamicLineStippleNotBound) {
183 TEST_DESCRIPTION(
184 "Run a simple draw calls to validate failure when Line Stipple dynamic state is required but not correctly bound.");
185
186 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
187 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
188 } else {
189 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
190 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
191 return;
192 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -0700193 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500194 std::array<const char *, 1> required_device_extensions = {{VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME}};
195 for (auto device_extension : required_device_extensions) {
196 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
197 m_device_extension_names.push_back(device_extension);
198 } else {
199 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
200 return;
201 }
202 }
203
204 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600205 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500206 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
207
208 auto line_rasterization_features = lvl_init_struct<VkPhysicalDeviceLineRasterizationFeaturesEXT>();
209 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&line_rasterization_features);
210 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
211
212 if (!line_rasterization_features.stippledBresenhamLines || !line_rasterization_features.bresenhamLines) {
213 printf("%sStipple Bresenham lines not supported; skipped.\n", kSkipPrefix);
214 return;
215 }
216
217 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
218
Mark Lobodzinski20310782020-02-28 14:25:17 -0700219 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line stipple state not set for this command buffer");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500220 VKTriangleTest(BsoFailLineStipple);
221 m_errorMonitor->VerifyFound();
222}
223
unknown088160a2019-05-23 17:43:13 -0600224TEST_F(VkLayerTest, DynamicViewportNotBound) {
225 TEST_DESCRIPTION(
226 "Run a simple draw calls to validate failure when Viewport dynamic state is required but not correctly bound.");
227
228 ASSERT_NO_FATAL_FAILURE(Init());
229 // Dynamic viewport state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700230 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600231 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
232 VKTriangleTest(BsoFailViewport);
233 m_errorMonitor->VerifyFound();
234}
235
236TEST_F(VkLayerTest, DynamicScissorNotBound) {
237 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic state is required but not correctly bound.");
238
239 ASSERT_NO_FATAL_FAILURE(Init());
240 // Dynamic scissor state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700241 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600242 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
243 VKTriangleTest(BsoFailScissor);
244 m_errorMonitor->VerifyFound();
245}
246
247TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
248 TEST_DESCRIPTION(
249 "Run a simple draw calls to validate failure when Blend Constants dynamic state is required but not correctly bound.");
250
251 ASSERT_NO_FATAL_FAILURE(Init());
252 // Dynamic blend constant state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700253 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic blend constants state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600254 VKTriangleTest(BsoFailBlend);
255 m_errorMonitor->VerifyFound();
256}
257
258TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
259 TEST_DESCRIPTION(
260 "Run a simple draw calls to validate failure when Depth Bounds dynamic state is required but not correctly bound.");
261
262 ASSERT_NO_FATAL_FAILURE(Init());
263 if (!m_device->phy().features().depthBounds) {
264 printf("%s Device does not support depthBounds test; skipped.\n", kSkipPrefix);
265 return;
266 }
267 // Dynamic depth bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -0700268 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bounds state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600269 VKTriangleTest(BsoFailDepthBounds);
270 m_errorMonitor->VerifyFound();
271}
272
273TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
274 TEST_DESCRIPTION(
275 "Run a simple draw calls to validate failure when Stencil Read dynamic state is required but not correctly bound.");
276
277 ASSERT_NO_FATAL_FAILURE(Init());
278 // Dynamic stencil read mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700279 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil read mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600280 VKTriangleTest(BsoFailStencilReadMask);
281 m_errorMonitor->VerifyFound();
282}
283
284TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
285 TEST_DESCRIPTION(
286 "Run a simple draw calls to validate failure when Stencil Write dynamic state is required but not correctly bound.");
287
288 ASSERT_NO_FATAL_FAILURE(Init());
289 // Dynamic stencil write mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700290 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil write mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600291 VKTriangleTest(BsoFailStencilWriteMask);
292 m_errorMonitor->VerifyFound();
293}
294
295TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
296 TEST_DESCRIPTION(
297 "Run a simple draw calls to validate failure when Stencil Ref dynamic state is required but not correctly bound.");
298
299 ASSERT_NO_FATAL_FAILURE(Init());
300 // Dynamic stencil reference
Mark Lobodzinski20310782020-02-28 14:25:17 -0700301 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil reference state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600302 VKTriangleTest(BsoFailStencilReference);
303 m_errorMonitor->VerifyFound();
304}
305
306TEST_F(VkLayerTest, IndexBufferNotBound) {
307 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
308
309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700310 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Index buffer object not bound to this command buffer when Indexed ");
unknown088160a2019-05-23 17:43:13 -0600311 VKTriangleTest(BsoFailIndexBuffer);
312 m_errorMonitor->VerifyFound();
313}
314
315TEST_F(VkLayerTest, IndexBufferBadSize) {
316 TEST_DESCRIPTION("Run indexed draw call with bad index buffer size.");
317
318 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski20310782020-02-28 14:25:17 -0700319 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed() index size ");
unknown088160a2019-05-23 17:43:13 -0600320 VKTriangleTest(BsoFailIndexBufferBadSize);
321 m_errorMonitor->VerifyFound();
322}
323
324TEST_F(VkLayerTest, IndexBufferBadOffset) {
325 TEST_DESCRIPTION("Run indexed draw call with bad index buffer offset.");
326
327 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski20310782020-02-28 14:25:17 -0700328 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed() index size ");
unknown088160a2019-05-23 17:43:13 -0600329 VKTriangleTest(BsoFailIndexBufferBadOffset);
330 m_errorMonitor->VerifyFound();
331}
332
333TEST_F(VkLayerTest, IndexBufferBadBindSize) {
334 TEST_DESCRIPTION("Run bind index buffer with a size greater than the index buffer.");
335
336 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski20310782020-02-28 14:25:17 -0700337 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed() index size ");
unknown088160a2019-05-23 17:43:13 -0600338 VKTriangleTest(BsoFailIndexBufferBadMapSize);
339 m_errorMonitor->VerifyFound();
340}
341
342TEST_F(VkLayerTest, IndexBufferBadBindOffset) {
343 TEST_DESCRIPTION("Run bind index buffer with an offset greater than the size of the index buffer.");
344
345 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski20310782020-02-28 14:25:17 -0700346 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed() index size ");
unknown088160a2019-05-23 17:43:13 -0600347 VKTriangleTest(BsoFailIndexBufferBadMapOffset);
348 m_errorMonitor->VerifyFound();
349}
350
351TEST_F(VkLayerTest, MissingClearAttachment) {
352 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment structure passed to vkCmdClearAttachments");
353 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700354 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02501");
unknown088160a2019-05-23 17:43:13 -0600355
356 VKTriangleTest(BsoFailCmdClearAttachments);
357 m_errorMonitor->VerifyFound();
358}
359
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700360TEST_F(VkLayerTest, SecondaryCommandbufferAsPrimary) {
361 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit.");
Mark Lobodzinski20310782020-02-28 14:25:17 -0700362 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pCommandBuffers-00075");
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700363
364 ASSERT_NO_FATAL_FAILURE(Init());
365
366 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
367 secondary.begin();
368 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
369 secondary.end();
370
371 VkSubmitInfo submit_info;
372 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
373 submit_info.pNext = NULL;
374 submit_info.waitSemaphoreCount = 0;
375 submit_info.pWaitSemaphores = NULL;
376 submit_info.pWaitDstStageMask = NULL;
377 submit_info.commandBufferCount = 1;
378 submit_info.pCommandBuffers = &secondary.handle();
379 submit_info.signalSemaphoreCount = 0;
380 submit_info.pSignalSemaphores = NULL;
381
382 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
383 m_errorMonitor->VerifyFound();
384}
385
unknown088160a2019-05-23 17:43:13 -0600386TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700387 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600388 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
389
390 ASSERT_NO_FATAL_FAILURE(Init());
391 ASSERT_NO_FATAL_FAILURE(InitViewport());
392 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
393
394 // We luck out b/c by default the framework creates CB w/ the
395 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
396 m_commandBuffer->begin();
397 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
398 m_commandBuffer->end();
399
400 // Bypass framework since it does the waits automatically
401 VkResult err = VK_SUCCESS;
402 VkSubmitInfo submit_info;
403 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
404 submit_info.pNext = NULL;
405 submit_info.waitSemaphoreCount = 0;
406 submit_info.pWaitSemaphores = NULL;
407 submit_info.pWaitDstStageMask = NULL;
408 submit_info.commandBufferCount = 1;
409 submit_info.pCommandBuffers = &m_commandBuffer->handle();
410 submit_info.signalSemaphoreCount = 0;
411 submit_info.pSignalSemaphores = NULL;
412
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600413 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -0600414 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600415 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600416
417 // Cause validation error by re-submitting cmd buffer that should only be
418 // submitted once
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600419 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
420 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600421
422 m_errorMonitor->VerifyFound();
423}
424
425TEST_F(VkLayerTest, InvalidPushConstants) {
426 ASSERT_NO_FATAL_FAILURE(Init());
427 ASSERT_NO_FATAL_FAILURE(InitViewport());
428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
429
430 VkPipelineLayout pipeline_layout;
431 VkPushConstantRange pc_range = {};
432 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
433 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
434 pipeline_layout_ci.pushConstantRangeCount = 1;
435 pipeline_layout_ci.pPushConstantRanges = &pc_range;
436
437 //
438 // Check for invalid push constant ranges in pipeline layouts.
439 //
440 struct PipelineLayoutTestCase {
441 VkPushConstantRange const range;
442 char const *msg;
443 };
444
445 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
446 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
447 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCreatePipelineLayout() call has push constants index 0 with size 0."},
448 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1}, "vkCreatePipelineLayout() call has push constants index 0 with size 1."},
449 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1}, "vkCreatePipelineLayout() call has push constants index 0 with size 1."},
450 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0}, "vkCreatePipelineLayout() call has push constants index 0 with size 0."},
451 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4}, "vkCreatePipelineLayout() call has push constants index 0 with offset 1. Offset must"},
452 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big}, "vkCreatePipelineLayout() call has push constants index 0 with offset "},
453 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big}, "vkCreatePipelineLayout() call has push constants index 0 with offset "},
454 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4}, "vkCreatePipelineLayout() call has push constants index 0 with offset "},
455 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
456 "vkCreatePipelineLayout() call has push constants index 0 with offset "},
457 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
458 "vkCreatePipelineLayout() call has push constants index 0 with offset "},
459 }};
460
461 // Check for invalid offset and size
462 for (const auto &iter : range_tests) {
463 pc_range = iter.range;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700464 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600465 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600466 m_errorMonitor->VerifyFound();
467 }
468
469 // Check for invalid stage flag
470 pc_range.offset = 0;
471 pc_range.size = 16;
472 pc_range.stageFlags = 0;
473 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -0700474 kErrorBit, "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600475 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600476 m_errorMonitor->VerifyFound();
477
478 // Check for duplicate stage flags in a list of push constant ranges.
479 // A shader can only have one push constant block and that block is mapped
480 // to the push constant range that has that shader's stage flag set.
481 // The shader's stage flag can only appear once in all the ranges, so the
482 // implementation can find the one and only range to map it to.
483 const uint32_t ranges_per_test = 5;
484 struct DuplicateStageFlagsTestCase {
485 VkPushConstantRange const ranges[ranges_per_test];
486 std::vector<char const *> const msg;
487 };
488 // Overlapping ranges are OK, but a stage flag can appear only once.
489 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
490 {
491 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
492 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
493 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
494 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
495 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
496 {
497 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
498 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
499 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
500 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
501 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
502 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
503 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
504 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
505 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
506 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
507 }},
508 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
509 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
510 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
511 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
512 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
513 {
514 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
515 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
516 }},
517 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
518 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
519 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
520 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
521 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
522 {
523 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
524 }},
525 },
526 };
527
528 for (const auto &iter : duplicate_stageFlags_tests) {
529 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
530 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700531 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg.begin(), iter.msg.end());
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600532 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600533 m_errorMonitor->VerifyFound();
534 }
535
536 //
537 // CmdPushConstants tests
538 //
539
540 // Setup a pipeline layout with ranges: [0,32) [16,80)
541 const std::vector<VkPushConstantRange> pc_range2 = {{VK_SHADER_STAGE_VERTEX_BIT, 16, 64},
542 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 32}};
543 const VkPipelineLayoutObj pipeline_layout_obj(m_device, {}, pc_range2);
544
545 const uint8_t dummy_values[100] = {};
546
547 m_commandBuffer->begin();
548 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
549
550 // Check for invalid stage flag
551 // Note that VU 00996 isn't reached due to parameter validation
Mark Lobodzinski20310782020-02-28 14:25:17 -0700552 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600553 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), 0, 0, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600554 m_errorMonitor->VerifyFound();
555
556 // Positive tests for the overlapping ranges
557 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600558 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16,
559 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600560 m_errorMonitor->VerifyNotFound();
561 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600562 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 32, 48, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600563 m_errorMonitor->VerifyNotFound();
564 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600565 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
566 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600567 m_errorMonitor->VerifyNotFound();
568
569 // Wrong cmd stages for extant range
570 // No range for all cmd stages -- "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
Mark Lobodzinski20310782020-02-28 14:25:17 -0700571 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
unknown088160a2019-05-23 17:43:13 -0600572 // Missing cmd stages for found overlapping range -- "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
Mark Lobodzinski20310782020-02-28 14:25:17 -0700573 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600574 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16,
575 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600576 m_errorMonitor->VerifyFound();
577
578 // Wrong no extant range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700579 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600580 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 80, 4,
581 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600582 m_errorMonitor->VerifyFound();
583
584 // Wrong overlapping extent
Mark Lobodzinski20310782020-02-28 14:25:17 -0700585 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600586 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
587 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 20, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600588 m_errorMonitor->VerifyFound();
589
590 // Wrong stage flags for valid overlapping range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700591 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600592 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600593 m_errorMonitor->VerifyFound();
594
595 m_commandBuffer->EndRenderPass();
596 m_commandBuffer->end();
597}
598
599TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700600 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "You must call vkBeginCommandBuffer() before this call to ");
unknown088160a2019-05-23 17:43:13 -0600601
602 ASSERT_NO_FATAL_FAILURE(Init());
603 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
604 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600605 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600606
607 m_errorMonitor->VerifyFound();
608}
609
610TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
611 ASSERT_NO_FATAL_FAILURE(Init());
612
613 VkCommandBufferObj cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
614
615 // Force the failure by not setting the Renderpass and Framebuffer fields
616 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
617 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
618
619 VkCommandBufferBeginInfo cmd_buf_info = {};
620 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
621 cmd_buf_info.pNext = NULL;
622 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
623 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
624
Mark Lobodzinski20310782020-02-28 14:25:17 -0700625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferBeginInfo-flags-00053");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600626 vk::BeginCommandBuffer(cb.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600627 m_errorMonitor->VerifyFound();
628}
629
630TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
631 ASSERT_NO_FATAL_FAILURE(Init());
632
Mark Lobodzinski20310782020-02-28 14:25:17 -0700633 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600634
635 // A pool we can reset in.
636 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
637 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
638
639 secondary.begin();
640 secondary.end();
641
642 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600643 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600644
645 // rerecording of secondary
646 secondary.reset(); // explicit reset here.
647 secondary.begin();
648 secondary.end();
649
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600650 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600651 m_errorMonitor->VerifyFound();
652}
653
654TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
655 ASSERT_NO_FATAL_FAILURE(Init());
656
Mark Lobodzinski20310782020-02-28 14:25:17 -0700657 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600658
659 // A pool we can reset in.
660 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
661 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
662
663 secondary.begin();
664 secondary.end();
665
666 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600667 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600668
669 // rerecording of secondary
670 secondary.begin(); // implicit reset in begin
671 secondary.end();
672
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600673 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600674 m_errorMonitor->VerifyFound();
675}
676
677TEST_F(VkLayerTest, CascadedInvalidation) {
678 ASSERT_NO_FATAL_FAILURE(Init());
679
680 VkEventCreateInfo eci = {VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, nullptr, 0};
681 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600682 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600683
684 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
685 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600686 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600687 secondary.end();
688
689 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600690 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600691 m_commandBuffer->end();
692
693 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600694 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600695
Mark Lobodzinski20310782020-02-28 14:25:17 -0700696 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600697 m_commandBuffer->QueueCommandBuffer(false);
698 m_errorMonitor->VerifyFound();
699}
700
701TEST_F(VkLayerTest, CommandBufferResetErrors) {
702 // Cause error due to Begin while recording CB
703 // Then cause 2 errors for attempting to reset CB w/o having
704 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
705 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600707
708 ASSERT_NO_FATAL_FAILURE(Init());
709
710 // Calls AllocateCommandBuffers
711 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
712
713 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
714 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
715 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
716 VkCommandBufferBeginInfo cmd_buf_info = {};
717 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
718 cmd_buf_info.pNext = NULL;
719 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
720 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
721
722 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600723 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600724 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600725 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600726 m_errorMonitor->VerifyFound();
727
Mark Lobodzinski20310782020-02-28 14:25:17 -0700728 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600729 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
730 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600731 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600732 m_errorMonitor->VerifyFound();
733
Mark Lobodzinski20310782020-02-28 14:25:17 -0700734 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600735 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600736 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600737 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600738 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600739 m_errorMonitor->VerifyFound();
740}
741
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700742TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
743 ASSERT_NO_FATAL_FAILURE(Init());
744
745 // Calls AllocateCommandBuffers
746 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
747
748 VkCommandBufferBeginInfo cmd_buf_info = {};
749 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
750 cmd_buf_info.pNext = NULL;
751 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
752
753 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
754 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
755 m_errorMonitor->VerifyFound();
756}
757
unknown088160a2019-05-23 17:43:13 -0600758TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
759 // Call CmdClearAttachmentss outside of an active RenderPass
760
Mark Lobodzinski20310782020-02-28 14:25:17 -0700761 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600762 "vkCmdClearAttachments(): This call must be issued inside an active render pass");
763
764 ASSERT_NO_FATAL_FAILURE(Init());
765 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
766
767 // Start no RenderPass
768 m_commandBuffer->begin();
769
770 VkClearAttachment color_attachment;
771 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
772 color_attachment.clearValue.color.float32[0] = 0;
773 color_attachment.clearValue.color.float32[1] = 0;
774 color_attachment.clearValue.color.float32[2] = 0;
775 color_attachment.clearValue.color.float32[3] = 0;
776 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600777 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600778 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600779
780 m_errorMonitor->VerifyFound();
781}
782
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600783TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
784 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
785
Mark Lobodzinski20310782020-02-28 14:25:17 -0700786 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600787
788 ASSERT_NO_FATAL_FAILURE(Init());
789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
790
791 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600792 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600793
794 VkClearAttachment color_attachment;
795 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
796 color_attachment.clearValue.color.float32[0] = 0;
797 color_attachment.clearValue.color.float32[1] = 0;
798 color_attachment.clearValue.color.float32[2] = 0;
799 color_attachment.clearValue.color.float32[3] = 0;
800 color_attachment.colorAttachment = 0;
801 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600802 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600803
804 m_errorMonitor->VerifyFound();
805}
806
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700807TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
808 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
809
810 ASSERT_NO_FATAL_FAILURE(Init());
811 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
812
813 m_commandBuffer->begin();
814 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
815
816 VkClearAttachment color_attachment;
817 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
818 color_attachment.clearValue.color.float32[0] = 0;
819 color_attachment.clearValue.color.float32[1] = 0;
820 color_attachment.clearValue.color.float32[2] = 0;
821 color_attachment.clearValue.color.float32[3] = 0;
822 color_attachment.colorAttachment = 0;
823 VkClearRect clear_rect = {};
824 clear_rect.rect.offset = {0, 0};
825 clear_rect.baseArrayLayer = 0;
826 clear_rect.layerCount = 1;
827
828 clear_rect.rect.extent = {0, 1};
829 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
830 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
831 m_errorMonitor->VerifyFound();
832
833 clear_rect.rect.extent = {1, 0};
834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
835 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
836 m_errorMonitor->VerifyFound();
837}
838
unknown088160a2019-05-23 17:43:13 -0600839TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
840 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
841
842 ASSERT_NO_FATAL_FAILURE(Init());
843 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
844
845 // An empty primary command buffer
846 VkCommandBufferObj cb(m_device, m_commandPool);
847 cb.begin();
848 cb.end();
849
850 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600851 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -0600852 VkCommandBuffer handle = cb.handle();
853
Mark Lobodzinski20310782020-02-28 14:25:17 -0700854 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600855 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -0600856 m_errorMonitor->VerifyFound();
857
858 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
859
860 m_commandBuffer->EndRenderPass();
861 m_commandBuffer->end();
862}
863
Petr Kraus8e53cf02020-01-03 05:30:04 +0100864TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
865 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
866
867 ASSERT_NO_FATAL_FAILURE(Init());
868
869 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
870 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
871 secondary_cb.begin();
872 secondary_cb.end();
873
874 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -0700875 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +0100876 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
877 m_errorMonitor->VerifyFound();
878}
879
unknown088160a2019-05-23 17:43:13 -0600880TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
881 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
882
883 ASSERT_NO_FATAL_FAILURE(Init());
884 ASSERT_NO_FATAL_FAILURE(InitViewport());
885 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
886
887 const VkPipelineLayoutObj pipeline_layout(m_device);
888
889 struct VboEntry {
890 uint16_t input0[2];
891 uint32_t input1;
892 float input2[4];
893 };
894
895 const unsigned vbo_entry_count = 3;
896 const VboEntry vbo_data[vbo_entry_count] = {};
897
898 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
899 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
900
901 VkVertexInputBindingDescription input_binding;
902 input_binding.binding = 0;
903 input_binding.stride = sizeof(VboEntry);
904 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
905
906 VkVertexInputAttributeDescription input_attribs[3];
907
908 input_attribs[0].binding = 0;
909 // Location switch between attrib[0] and attrib[1] is intentional
910 input_attribs[0].location = 1;
911 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
912 input_attribs[0].offset = offsetof(VboEntry, input1);
913
914 input_attribs[1].binding = 0;
915 input_attribs[1].location = 0;
916 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
917 input_attribs[1].offset = offsetof(VboEntry, input0);
918
919 input_attribs[2].binding = 0;
920 input_attribs[2].location = 2;
921 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
922 input_attribs[2].offset = offsetof(VboEntry, input2);
923
924 char const *vsSource =
925 "#version 450\n"
926 "\n"
927 "layout(location = 0) in vec2 input0;"
928 "layout(location = 1) in vec4 input1;"
929 "layout(location = 2) in vec4 input2;"
930 "\n"
931 "void main(){\n"
932 " gl_Position = input1 + input2;\n"
933 " gl_Position.xy += input0;\n"
934 "}\n";
unknown088160a2019-05-23 17:43:13 -0600935
936 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
locke-lunarg8e2c91b2019-06-11 17:53:26 -0600937 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
unknown088160a2019-05-23 17:43:13 -0600938
939 VkPipelineObj pipe1(m_device);
940 pipe1.AddDefaultColorAttachment();
941 pipe1.AddShader(&vs);
942 pipe1.AddShader(&fs);
943 pipe1.AddVertexInputBindings(&input_binding, 1);
944 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
945 pipe1.SetViewport(m_viewports);
946 pipe1.SetScissor(m_scissors);
947 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
948
949 input_binding.stride = 6;
950
951 VkPipelineObj pipe2(m_device);
952 pipe2.AddDefaultColorAttachment();
953 pipe2.AddShader(&vs);
954 pipe2.AddShader(&fs);
955 pipe2.AddVertexInputBindings(&input_binding, 1);
956 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
957 pipe2.SetViewport(m_viewports);
958 pipe2.SetScissor(m_scissors);
959 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
960
961 m_commandBuffer->begin();
962 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
963
964 // Test with invalid buffer offset
965 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600966 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
967 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -0700968 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
969 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 1");
970 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -0600971 m_commandBuffer->Draw(1, 0, 0, 0);
972 m_errorMonitor->VerifyFound();
973
974 // Test with invalid buffer stride
975 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600976 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
977 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -0700978 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
unknown088160a2019-05-23 17:43:13 -0600979 // Attribute[1] is aligned properly even with a wrong stride
Mark Lobodzinski20310782020-02-28 14:25:17 -0700980 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -0600981 m_commandBuffer->Draw(1, 0, 0, 0);
982 m_errorMonitor->VerifyFound();
983
984 m_commandBuffer->EndRenderPass();
985 m_commandBuffer->end();
986}
987
988TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
989 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -0600990 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -0600991
992 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
993
994 secondary.begin();
995 secondary.end();
996
997 VkCommandBufferBeginInfo cbbi = {
998 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
999 nullptr,
1000 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1001 nullptr,
1002 };
1003
1004 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001005 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001006 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001007 m_errorMonitor->VerifyFound();
1008 m_commandBuffer->end();
1009}
1010
1011TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1012 ASSERT_NO_FATAL_FAILURE(Init());
1013
John Zulauff1640d12019-08-13 15:39:58 -06001014 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001015
1016 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1017
1018 VkCommandBufferInheritanceInfo inh = {
1019 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1020 nullptr,
1021 };
1022 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1023
1024 secondary.begin(&cbbi);
1025 secondary.end();
1026
1027 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001028 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001029 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001030 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001031 m_errorMonitor->VerifyFound();
1032 m_commandBuffer->end();
1033}
1034
1035TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1036 ASSERT_NO_FATAL_FAILURE(Init());
1037
1038 // variation on previous test executing the same CB twice in the same
1039 // CmdExecuteCommands call
1040
John Zulauff1640d12019-08-13 15:39:58 -06001041 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001042
1043 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1044
1045 VkCommandBufferInheritanceInfo inh = {
1046 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1047 nullptr,
1048 };
1049 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1050
1051 secondary.begin(&cbbi);
1052 secondary.end();
1053
1054 m_commandBuffer->begin();
1055 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001056 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001057 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001058 m_errorMonitor->VerifyFound();
1059 m_commandBuffer->end();
1060}
1061
1062TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1063 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1064 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1065 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1066 ASSERT_NO_FATAL_FAILURE(Init());
1067
1068 VkCommandBuffer cmd_bufs[2];
1069 VkCommandBufferAllocateInfo alloc_info;
1070 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1071 alloc_info.pNext = NULL;
1072 alloc_info.commandBufferCount = 2;
1073 alloc_info.commandPool = m_commandPool->handle();
1074 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001075 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001076
1077 VkCommandBufferBeginInfo cb_binfo;
1078 cb_binfo.pNext = NULL;
1079 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1080 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1081 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001082 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001083 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001084 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1085 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001086 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1087
1088 VkSubmitInfo submit_info = {};
1089 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1090 submit_info.commandBufferCount = 2;
1091 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001092 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001093 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001094 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001095 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001096
1097 // Set one time use and now look for one time submit
1098 duplicates[0] = duplicates[1] = cmd_bufs[1];
1099 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 -06001100 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1101 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1102 vk::EndCommandBuffer(cmd_bufs[1]);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001103 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001104 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001105 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001106 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001107}
1108
1109TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1110 TEST_DESCRIPTION(
1111 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1112
Mark Lobodzinski20310782020-02-28 14:25:17 -07001113 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001114
1115 ASSERT_NO_FATAL_FAILURE(Init());
1116 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1117
unknown088160a2019-05-23 17:43:13 -06001118 char const *fsSource =
1119 "#version 450\n"
1120 "\n"
1121 "layout(set=0, binding=0) uniform sampler3D s;\n"
1122 "layout(location=0) out vec4 color;\n"
1123 "void main() {\n"
1124 " color = texture(s, vec3(0));\n"
1125 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001126 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001127 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1128
1129 VkPipelineObj pipe(m_device);
1130 pipe.AddShader(&vs);
1131 pipe.AddShader(&fs);
1132 pipe.AddDefaultColorAttachment();
1133
1134 VkTextureObj texture(m_device, nullptr);
1135 VkSamplerObj sampler(m_device);
1136
1137 VkDescriptorSetObj descriptorSet(m_device);
1138 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1139 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1140
1141 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1142 ASSERT_VK_SUCCESS(err);
1143
1144 m_commandBuffer->begin();
1145 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1146
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001147 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001148 m_commandBuffer->BindDescriptorSet(descriptorSet);
1149
1150 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001151 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001152 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001153 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001154
1155 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001156 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001157
1158 m_errorMonitor->VerifyFound();
1159
1160 m_commandBuffer->EndRenderPass();
1161 m_commandBuffer->end();
1162}
1163
1164TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1165 TEST_DESCRIPTION(
1166 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1167 "vice versa.");
1168
Mark Lobodzinski20310782020-02-28 14:25:17 -07001169 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001170
1171 ASSERT_NO_FATAL_FAILURE(Init());
1172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1173
unknown088160a2019-05-23 17:43:13 -06001174 char const *fsSource =
1175 "#version 450\n"
1176 "\n"
1177 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
1178 "layout(location=0) out vec4 color;\n"
1179 "void main() {\n"
1180 " color = texelFetch(s, ivec2(0), 0);\n"
1181 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001182 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001183 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1184
1185 VkPipelineObj pipe(m_device);
1186 pipe.AddShader(&vs);
1187 pipe.AddShader(&fs);
1188 pipe.AddDefaultColorAttachment();
1189
1190 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1191 VkSamplerObj sampler(m_device);
1192
1193 VkDescriptorSetObj descriptorSet(m_device);
1194 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1195 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1196
1197 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1198 ASSERT_VK_SUCCESS(err);
1199
1200 m_commandBuffer->begin();
1201 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1202
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001203 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001204 m_commandBuffer->BindDescriptorSet(descriptorSet);
1205
1206 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001207 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001208 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001209 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001210
1211 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001212 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001213
1214 m_errorMonitor->VerifyFound();
1215
1216 m_commandBuffer->EndRenderPass();
1217 m_commandBuffer->end();
1218}
1219
1220TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1221 TEST_DESCRIPTION(
1222 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1223
Mark Lobodzinski20310782020-02-28 14:25:17 -07001224 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001225
1226 ASSERT_NO_FATAL_FAILURE(Init());
1227 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1228
unknown088160a2019-05-23 17:43:13 -06001229 char const *fsSource =
1230 "#version 450\n"
1231 "\n"
1232 "layout(set=0, binding=0) uniform isampler2D s;\n"
1233 "layout(location=0) out vec4 color;\n"
1234 "void main() {\n"
1235 " color = texelFetch(s, ivec2(0), 0);\n"
1236 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001237 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001238 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1239
1240 VkPipelineObj pipe(m_device);
1241 pipe.AddShader(&vs);
1242 pipe.AddShader(&fs);
1243 pipe.AddDefaultColorAttachment();
1244
1245 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1246 VkSamplerObj sampler(m_device);
1247
1248 VkDescriptorSetObj descriptorSet(m_device);
1249 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1250 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1251
1252 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1253 ASSERT_VK_SUCCESS(err);
1254
1255 m_commandBuffer->begin();
1256 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1257
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001258 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001259 m_commandBuffer->BindDescriptorSet(descriptorSet);
1260
1261 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001262 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001263 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001264 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001265
1266 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001267 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001268
1269 m_errorMonitor->VerifyFound();
1270
1271 m_commandBuffer->EndRenderPass();
1272 m_commandBuffer->end();
1273}
1274
unknown088160a2019-05-23 17:43:13 -06001275TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1276 TEST_DESCRIPTION(
1277 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001278 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1279 bool maintenance1 = false;
1280 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
1281 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1282 maintenance1 = true;
1283 }
1284 ASSERT_NO_FATAL_FAILURE(InitState());
1285
1286 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1287 VkFormatProperties format_props;
1288 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1289 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1290 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1291 return;
1292 }
unknown088160a2019-05-23 17:43:13 -06001293
1294 // Create two images to copy between
1295 VkImageObj src_image_obj(m_device);
1296 VkImageObj dst_image_obj(m_device);
1297
1298 VkImageCreateInfo image_create_info = {};
1299 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1300 image_create_info.pNext = NULL;
1301 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001302 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001303 image_create_info.extent.width = 32;
1304 image_create_info.extent.height = 32;
1305 image_create_info.extent.depth = 1;
1306 image_create_info.mipLevels = 1;
1307 image_create_info.arrayLayers = 4;
1308 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1309 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1310 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1311 image_create_info.flags = 0;
1312
1313 src_image_obj.init(&image_create_info);
1314 ASSERT_TRUE(src_image_obj.initialized());
1315
1316 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1317 dst_image_obj.init(&image_create_info);
1318 ASSERT_TRUE(dst_image_obj.initialized());
1319
1320 m_commandBuffer->begin();
1321 VkImageCopy copyRegion;
1322 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1323 copyRegion.srcSubresource.mipLevel = 0;
1324 copyRegion.srcSubresource.baseArrayLayer = 0;
1325 copyRegion.srcSubresource.layerCount = 1;
1326 copyRegion.srcOffset.x = 0;
1327 copyRegion.srcOffset.y = 0;
1328 copyRegion.srcOffset.z = 0;
1329 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1330 copyRegion.dstSubresource.mipLevel = 0;
1331 copyRegion.dstSubresource.baseArrayLayer = 0;
1332 // Introduce failure by forcing the dst layerCount to differ from src
1333 copyRegion.dstSubresource.layerCount = 3;
1334 copyRegion.dstOffset.x = 0;
1335 copyRegion.dstOffset.y = 0;
1336 copyRegion.dstOffset.z = 0;
1337 copyRegion.extent.width = 1;
1338 copyRegion.extent.height = 1;
1339 copyRegion.extent.depth = 1;
1340
sfricke-samsung30b094c2020-05-30 11:42:11 -07001341 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1342 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001343 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1344 &copyRegion);
1345 m_errorMonitor->VerifyFound();
1346}
1347
1348TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1349 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1350
Jeff Leger465acf52020-10-12 18:07:16 -04001351 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1352
1353 bool copy_commands2 = false;
1354 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1355 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1356 copy_commands2 = true;
1357 }
1358 ASSERT_NO_FATAL_FAILURE(InitState());
1359
1360 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
1361 PFN_vkCmdCopyImageToBuffer2KHR vkCmdCopyImageToBuffer2Function = nullptr;
1362 if (copy_commands2) {
1363 vkCmdCopyBufferToImage2Function =
1364 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
1365 vkCmdCopyImageToBuffer2Function =
1366 (PFN_vkCmdCopyImageToBuffer2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImageToBuffer2KHR");
1367 }
unknown088160a2019-05-23 17:43:13 -06001368
1369 VkPhysicalDeviceFeatures device_features = {};
1370 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1371 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1372 if (device_features.textureCompressionBC) {
1373 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1374 } else if (device_features.textureCompressionETC2) {
1375 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1376 } else if (device_features.textureCompressionASTC_LDR) {
1377 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1378 } else {
1379 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1380 return;
1381 }
1382
1383 VkImageCreateInfo ci;
1384 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1385 ci.pNext = NULL;
1386 ci.flags = 0;
1387 ci.imageType = VK_IMAGE_TYPE_2D;
1388 ci.format = compressed_format;
1389 ci.extent = {32, 32, 1};
1390 ci.mipLevels = 6;
1391 ci.arrayLayers = 1;
1392 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1393 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1394 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1395 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1396 ci.queueFamilyIndexCount = 0;
1397 ci.pQueueFamilyIndices = NULL;
1398 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1399
1400 VkImageObj image(m_device);
1401 image.init(&ci);
1402 ASSERT_TRUE(image.initialized());
1403
1404 VkImageObj odd_image(m_device);
1405 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1406 odd_image.init(&ci);
1407 ASSERT_TRUE(odd_image.initialized());
1408
1409 // Allocate buffers
1410 VkMemoryPropertyFlags reqs = 0;
1411 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1412 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1413 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1414 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1415 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1416
1417 VkBufferImageCopy region = {};
1418 region.bufferRowLength = 0;
1419 region.bufferImageHeight = 0;
1420 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1421 region.imageSubresource.layerCount = 1;
1422 region.imageOffset = {0, 0, 0};
1423 region.bufferOffset = 0;
1424
1425 // start recording
1426 m_commandBuffer->begin();
1427
locke-lunargdf00db02020-03-04 19:00:57 -07001428 VkMemoryBarrier mem_barriers[3];
1429 mem_barriers[0] = lvl_init_struct<VkMemoryBarrier>();
1430 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1431 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1432 mem_barriers[1] = lvl_init_struct<VkMemoryBarrier>();
1433 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1434 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1435 mem_barriers[2] = lvl_init_struct<VkMemoryBarrier>();
1436 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1437 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1438
unknown088160a2019-05-23 17:43:13 -06001439 // Mip level copies that work - 5 levels
1440 m_errorMonitor->ExpectSuccess();
1441
1442 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1443 region.imageExtent = {32, 32, 1};
1444 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001445 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001446
1447 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1448 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001449 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001450
1451 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1452 region.imageExtent = {8, 8, 1};
1453 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001454 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001455
1456 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1457 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001458 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001459
1460 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1461 region.imageExtent = {4, 4, 1};
1462 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001463 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001464
1465 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1466 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001467 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001468
1469 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1470 region.imageExtent = {2, 2, 1};
1471 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001472
1473 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1474 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001475 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001476
1477 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1478 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001479 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001480
1481 region.imageExtent = {1, 1, 1};
1482 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001483
1484 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1485 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001486 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001487
1488 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1489 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001490 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001491 m_errorMonitor->VerifyNotFound();
1492
1493 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001494 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001495 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001496 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001497 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001498 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001499 m_errorMonitor->VerifyFound();
1500
sfricke-samsung3a10b922020-05-13 23:23:16 -07001501 std::string vuid;
Jeff Leger465acf52020-10-12 18:07:16 -04001502 std::string vuid2;
sfricke-samsung3a10b922020-05-13 23:23:16 -07001503 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
1504 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
1505
unknown088160a2019-05-23 17:43:13 -06001506 // Copy width < compressed block size, but not the full mip width
1507 region.imageExtent = {1, 2, 1};
1508 region.imageSubresource.mipLevel = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001509 vuid = ycbcr ? "VUID-vkCmdCopyBufferToImage-imageExtent-00207" : "VUID-vkCmdCopyBufferToImage-imageExtent-00207";
sfricke-samsung3a10b922020-05-13 23:23:16 -07001510 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001511 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001512 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001513 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001514 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001515
1516 // Equivalent test using KHR_copy_commands2
1517 if (copy_commands2 && vkCmdCopyImageToBuffer2Function) {
1518 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1519 NULL,
1520 region.bufferOffset,
1521 region.bufferRowLength,
1522 region.bufferImageHeight,
1523 region.imageSubresource,
1524 region.imageOffset,
1525 region.imageExtent};
1526 const VkCopyImageToBufferInfo2KHR copy_image_to_buffer_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR,
1527 NULL,
1528 image.handle(),
1529 VK_IMAGE_LAYOUT_GENERAL,
1530 buffer_16.handle(),
1531 1,
1532 &region2};
1533 vuid2 = ycbcr ? "VUID-VkCopyImageToBufferInfo2KHR-imageExtent-00207" : "VUID-VkCopyImageToBufferInfo2KHR-imageExtent-00207";
1534 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // width not a multiple of compressed block width
1535 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1536 "VUID-VkCopyImageToBufferInfo2KHR-imageOffset-01794"); // image transfer granularity
1537 vkCmdCopyImageToBuffer2Function(m_commandBuffer->handle(), &copy_image_to_buffer_info2);
1538 m_errorMonitor->VerifyFound();
1539 }
1540
sfricke-samsung3a10b922020-05-13 23:23:16 -07001541 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001542 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001543 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001544 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001545 m_errorMonitor->VerifyFound();
1546
Jeff Leger465acf52020-10-12 18:07:16 -04001547 // Equivalent test using KHR_copy_commands2
1548 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1549 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1550 NULL,
1551 region.bufferOffset,
1552 region.bufferRowLength,
1553 region.bufferImageHeight,
1554 region.imageSubresource,
1555 region.imageOffset,
1556 region.imageExtent};
1557 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1558 NULL,
1559 buffer_16.handle(),
1560 image.handle(),
1561 VK_IMAGE_LAYOUT_GENERAL,
1562 1,
1563 &region2};
1564 vuid2 = ycbcr ? "VUID-VkCopyBufferToImageInfo2KHR-imageExtent-00207" : "VUID-VkCopyBufferToImageInfo2KHR-imageExtent-00207";
1565 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // width not a multiple of compressed block width
1566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1567 "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-01793"); // image transfer granularity
1568 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1569 m_errorMonitor->VerifyFound();
1570 }
1571
unknown088160a2019-05-23 17:43:13 -06001572 // Copy height < compressed block size but not the full mip height
1573 region.imageExtent = {2, 1, 1};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001574 vuid = ycbcr ? "VUID-vkCmdCopyBufferToImage-imageExtent-00208" : "VUID-vkCmdCopyBufferToImage-imageExtent-00208";
sfricke-samsung3a10b922020-05-13 23:23:16 -07001575 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001576 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001577 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001578 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001579 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001580
1581 // Equivalent test using KHR_copy_commands2
1582 if (copy_commands2 && vkCmdCopyImageToBuffer2Function) {
1583 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1584 NULL,
1585 region.bufferOffset,
1586 region.bufferRowLength,
1587 region.bufferImageHeight,
1588 region.imageSubresource,
1589 region.imageOffset,
1590 region.imageExtent};
1591 const VkCopyImageToBufferInfo2KHR copy_image_to_buffer_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR,
1592 NULL,
1593 image.handle(),
1594 VK_IMAGE_LAYOUT_GENERAL,
1595 buffer_16.handle(),
1596 1,
1597 &region2};
1598 vuid2 = ycbcr ? "VUID-VkCopyImageToBufferInfo2KHR-imageExtent-00208" : "VUID-VkCopyImageToBufferInfo2KHR-imageExtent-00208";
1599 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // height not a multiple of compressed block width
1600 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1601 "VUID-VkCopyImageToBufferInfo2KHR-imageOffset-01794"); // image transfer granularity
1602 vkCmdCopyImageToBuffer2Function(m_commandBuffer->handle(), &copy_image_to_buffer_info2);
1603 m_errorMonitor->VerifyFound();
1604 }
1605
sfricke-samsung3a10b922020-05-13 23:23:16 -07001606 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001607 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001608 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001609 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001610 m_errorMonitor->VerifyFound();
1611
Jeff Leger465acf52020-10-12 18:07:16 -04001612 // Equivalent test using KHR_copy_commands2
1613 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1614 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1615 NULL,
1616 region.bufferOffset,
1617 region.bufferRowLength,
1618 region.bufferImageHeight,
1619 region.imageSubresource,
1620 region.imageOffset,
1621 region.imageExtent};
1622 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1623 NULL,
1624 buffer_16.handle(),
1625 image.handle(),
1626 VK_IMAGE_LAYOUT_GENERAL,
1627 1,
1628 &region2};
1629 vuid2 = ycbcr ? "VUID-VkCopyBufferToImageInfo2KHR-imageExtent-00208" : "VUID-VkCopyBufferToImageInfo2KHR-imageExtent-00208";
1630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // height not a multiple of compressed block width
1631 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1632 "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-01793"); // image transfer granularity
1633 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1634 m_errorMonitor->VerifyFound();
1635 }
1636
unknown088160a2019-05-23 17:43:13 -06001637 // Offsets must be multiple of compressed block size
1638 region.imageOffset = {1, 1, 0};
1639 region.imageExtent = {1, 1, 1};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001640 vuid = ycbcr ? "VUID-vkCmdCopyBufferToImage-imageOffset-00205" : "VUID-vkCmdCopyBufferToImage-imageOffset-00205";
sfricke-samsung3a10b922020-05-13 23:23:16 -07001641 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001642 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001643 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001644 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001645 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001646
1647 // Equivalent test using KHR_copy_commands2
1648 if (copy_commands2 && vkCmdCopyImageToBuffer2Function) {
1649 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1650 NULL,
1651 region.bufferOffset,
1652 region.bufferRowLength,
1653 region.bufferImageHeight,
1654 region.imageSubresource,
1655 region.imageOffset,
1656 region.imageExtent};
1657 const VkCopyImageToBufferInfo2KHR copy_image_to_buffer_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_TO_BUFFER_INFO_2_KHR,
1658 NULL,
1659 image.handle(),
1660 VK_IMAGE_LAYOUT_GENERAL,
1661 buffer_16.handle(),
1662 1,
1663 &region2};
1664 vuid2 = ycbcr ? "VUID-VkCopyImageToBufferInfo2KHR-imageOffset-00205" : "VUID-VkCopyImageToBufferInfo2KHR-imageOffset-00205";
1665 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // imageOffset not a multiple of block size
1666 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1667 "VUID-VkCopyImageToBufferInfo2KHR-imageOffset-01794"); // image transfer granularity
1668 vkCmdCopyImageToBuffer2Function(m_commandBuffer->handle(), &copy_image_to_buffer_info2);
1669 m_errorMonitor->VerifyFound();
1670 }
1671
sfricke-samsung3a10b922020-05-13 23:23:16 -07001672 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001673 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001674 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001675 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001676 m_errorMonitor->VerifyFound();
1677
Jeff Leger465acf52020-10-12 18:07:16 -04001678 // Equivalent test using KHR_copy_commands2
1679 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1680 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1681 NULL,
1682 region.bufferOffset,
1683 region.bufferRowLength,
1684 region.bufferImageHeight,
1685 region.imageSubresource,
1686 region.imageOffset,
1687 region.imageExtent};
1688 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1689 NULL,
1690 buffer_16.handle(),
1691 image.handle(),
1692 VK_IMAGE_LAYOUT_GENERAL,
1693 1,
1694 &region2};
1695 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // imageOffset not a multiple of block size
1696 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1697 "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-01793"); // image transfer granularity
1698 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1699 m_errorMonitor->VerifyFound();
1700 }
1701
unknown088160a2019-05-23 17:43:13 -06001702 // Offset + extent width = mip width - should succeed
1703 region.imageOffset = {4, 4, 0};
1704 region.imageExtent = {3, 4, 1};
1705 region.imageSubresource.mipLevel = 2;
1706 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001707
1708 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1709 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001710 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1711 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001712
1713 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1714 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001715 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1716 &region);
unknown088160a2019-05-23 17:43:13 -06001717 m_errorMonitor->VerifyNotFound();
1718
unknown088160a2019-05-23 17:43:13 -06001719 // Offset + extent width < mip width and not a multiple of block width - should fail
1720 region.imageExtent = {3, 3, 1};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001721 vuid = ycbcr ? "VUID-vkCmdCopyBufferToImage-imageExtent-00208" : "VUID-vkCmdCopyBufferToImage-imageExtent-00208";
sfricke-samsung3a10b922020-05-13 23:23:16 -07001722 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001724 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001725 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1726 &region);
unknown088160a2019-05-23 17:43:13 -06001727 m_errorMonitor->VerifyFound();
sfricke-samsung3a10b922020-05-13 23:23:16 -07001728 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001729 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001730 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001731 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1732 &region);
unknown088160a2019-05-23 17:43:13 -06001733 m_errorMonitor->VerifyFound();
1734}
1735
1736TEST_F(VkLayerTest, ImageBufferCopyTests) {
1737 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001738
1739 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1740 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1741 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1742 if (mp_extensions) {
1743 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1744 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001745 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
sfricke-samsung6d97e562020-01-07 22:01:00 -08001746 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1747 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1748 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1749 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1750 if (mp_extensions) {
1751 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1752 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1753 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1754 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1755 }
1756 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001757
1758 // Bail if any dimension of transfer granularity is 0.
1759 auto index = m_device->graphics_queue_node_index_;
1760 auto queue_family_properties = m_device->phy().queue_properties();
1761 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1762 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1763 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1764 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1765 return;
1766 }
1767
sfricke-samsung6d97e562020-01-07 22:01:00 -08001768 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1769 // 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 -07001770 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1771 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001772 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001773 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1774 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1775 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1776 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1777 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001778 // compression
1779 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1780 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1781 // multi-planar
1782 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 -06001783
sfricke-samsung6d97e562020-01-07 22:01:00 -08001784 // Verify R8G8B8A8_UINT format is supported for transfer
1785 bool missing_rgba_support = false;
1786 VkFormatProperties props = {0, 0, 0};
1787 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1788 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1789 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1790 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1791
1792 if (!missing_rgba_support) {
1793 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1794 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1795 VK_IMAGE_TILING_OPTIMAL, 0);
1796 ASSERT_TRUE(image_64k.initialized());
1797
1798 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1799 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1800 VK_IMAGE_TILING_OPTIMAL, 0);
1801 ASSERT_TRUE(image_16k.initialized());
1802 }
unknown088160a2019-05-23 17:43:13 -06001803
1804 // Verify all needed Depth/Stencil formats are supported
1805 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001806 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001807 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1808 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1809 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001810 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001811 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1812 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1813 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001814 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001815 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1816 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1817 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001818 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001819 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1820 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1821 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1822
1823 if (!missing_ds_support) {
1824 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1825 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1826 ASSERT_TRUE(image_16k_depth.initialized());
1827
1828 ds_image_4D_1S.Init(
1829 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1830 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1831 VK_IMAGE_TILING_OPTIMAL, 0);
1832 ASSERT_TRUE(ds_image_4D_1S.initialized());
1833
1834 ds_image_3D_1S.Init(
1835 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1836 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1837 VK_IMAGE_TILING_OPTIMAL, 0);
1838 ASSERT_TRUE(ds_image_3D_1S.initialized());
1839
1840 ds_image_2D.Init(
1841 256, 256, 1, VK_FORMAT_D16_UNORM,
1842 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1843 VK_IMAGE_TILING_OPTIMAL, 0);
1844 ASSERT_TRUE(ds_image_2D.initialized());
1845
1846 ds_image_1S.Init(
1847 256, 256, 1, VK_FORMAT_S8_UINT,
1848 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1849 VK_IMAGE_TILING_OPTIMAL, 0);
1850 ASSERT_TRUE(ds_image_1S.initialized());
1851 }
1852
1853 // Allocate buffers
1854 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1855 VkMemoryPropertyFlags reqs = 0;
1856 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1857 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1858 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1859 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1860
1861 VkBufferImageCopy region = {};
1862 region.bufferRowLength = 0;
1863 region.bufferImageHeight = 0;
1864 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1865 region.imageSubresource.layerCount = 1;
1866 region.imageOffset = {0, 0, 0};
1867 region.imageExtent = {64, 64, 1};
1868 region.bufferOffset = 0;
1869
locke-lunargdf00db02020-03-04 19:00:57 -07001870 VkMemoryBarrier mem_barriers[3];
1871 mem_barriers[0] = lvl_init_struct<VkMemoryBarrier>();
1872 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1873 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1874 mem_barriers[1] = lvl_init_struct<VkMemoryBarrier>();
1875 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1876 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1877 mem_barriers[2] = lvl_init_struct<VkMemoryBarrier>();
1878 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1879 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1880
sfricke-samsung6d97e562020-01-07 22:01:00 -08001881 if (missing_rgba_support) {
1882 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001883
sfricke-samsung6d97e562020-01-07 22:01:00 -08001884 // start recording for future tests
1885 m_commandBuffer->begin();
1886 } else {
1887 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001888 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001889 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1890 &region);
unknown088160a2019-05-23 17:43:13 -06001891 m_errorMonitor->VerifyFound();
1892
Mark Lobodzinski20310782020-02-28 14:25:17 -07001893 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001894 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1895 &region);
1896 m_errorMonitor->VerifyFound();
1897
1898 // start recording
1899 m_commandBuffer->begin();
1900
1901 // successful copies
1902 m_errorMonitor->ExpectSuccess();
1903 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1904 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001905
1906 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1907 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001908 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1909 &region);
1910 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001911
1912 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1913 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001914 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1915 &region);
1916 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001917
1918 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1919 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001920 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1921 &region);
1922 region.imageOffset.x = 0;
1923 region.imageExtent.height = 64;
1924 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001925
1926 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1927 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001928 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1929 &region);
1930 m_errorMonitor->VerifyNotFound();
1931
1932 // image/buffer too small (extent too large) on copy to image
1933 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001934 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001935 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1936 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1937 &region);
1938 m_errorMonitor->VerifyFound();
1939
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001940 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001941 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001942 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
1943 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1944 &region);
1945 m_errorMonitor->VerifyFound();
1946
1947 // image/buffer too small (offset) on copy to image
1948 region.imageExtent = {64, 64, 1};
1949 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001950 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001951 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1952 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1953 &region);
1954 m_errorMonitor->VerifyFound();
1955
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001956 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
1957 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001958 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001959 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
1960 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1961 &region);
1962 m_errorMonitor->VerifyFound();
1963
1964 // image/buffer too small on copy to buffer
1965 region.imageExtent = {64, 64, 1};
1966 region.imageOffset = {0, 0, 0};
1967 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001968 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001969 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
1970 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1971 &region);
1972 m_errorMonitor->VerifyFound();
1973
1974 region.imageExtent = {64, 65, 1};
1975 region.bufferOffset = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001976 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001977 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001978 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // image too small
1979 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1980 &region);
1981 m_errorMonitor->VerifyFound();
1982
1983 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07001984 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001985 region.imageExtent = {64, 64, 1};
1986 region.bufferRowLength = 68;
1987 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1988 &region);
1989 m_errorMonitor->VerifyFound();
1990
1991 // An extent with zero area should produce a warning, but no error
Mark Lobodzinski20310782020-02-28 14:25:17 -07001992 m_errorMonitor->SetDesiredFailureMsg(kWarningBit | kErrorBit, "} has zero area");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001993 region.imageExtent.width = 0;
1994 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1995 &region);
1996 m_errorMonitor->VerifyFound();
1997
1998 // aspect bits
1999 region.imageExtent = {64, 64, 1};
2000 region.bufferRowLength = 0;
2001 region.bufferImageHeight = 0;
2002 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07002003 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002004 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
2005 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
2006 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2007 buffer_16k.handle(), 1, &region);
2008 m_errorMonitor->VerifyFound();
2009
Mark Lobodzinski20310782020-02-28 14:25:17 -07002010 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002011 "VUID-vkCmdCopyBufferToImage-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002012 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2013 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2014 buffer_16k.handle(), 1, &region);
2015 m_errorMonitor->VerifyFound();
2016 }
2017
Mark Lobodzinski20310782020-02-28 14:25:17 -07002018 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002019 "VUID-vkCmdCopyBufferToImage-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002020 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2021 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2022 &region);
2023 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002024 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002025
2026 // Out-of-range mip levels should fail
2027 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002028 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002029 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2030 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
2031 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002032 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002033 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002034 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // unavoidable "region exceeds image bounds" for non-existent mip
2035 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2036 &region);
2037 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002038 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002039 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2040 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
2041 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002042 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002043 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002044 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // unavoidable "region exceeds image bounds" for non-existent mip
2045 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2046 &region);
2047 m_errorMonitor->VerifyFound();
2048 region.imageSubresource.mipLevel = 0;
2049
2050 // Out-of-range array layers should fail
2051 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2052 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002053 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002054 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2055 &region);
2056 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002057 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002058 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2059 &region);
2060 m_errorMonitor->VerifyFound();
2061 region.imageSubresource.baseArrayLayer = 0;
2062
2063 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002064 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002065 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2066 buffer_16k.handle(), 1, &region);
2067 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002069 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2070 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002071 m_errorMonitor->VerifyFound();
2072 }
2073
unknown088160a2019-05-23 17:43:13 -06002074 // Test Depth/Stencil copies
2075 if (missing_ds_support) {
2076 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2077 } else {
2078 VkBufferImageCopy ds_region = {};
2079 ds_region.bufferOffset = 0;
2080 ds_region.bufferRowLength = 0;
2081 ds_region.bufferImageHeight = 0;
2082 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2083 ds_region.imageSubresource.mipLevel = 0;
2084 ds_region.imageSubresource.baseArrayLayer = 0;
2085 ds_region.imageSubresource.layerCount = 1;
2086 ds_region.imageOffset = {0, 0, 0};
2087 ds_region.imageExtent = {256, 256, 1};
2088
2089 // Depth copies that should succeed
2090 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002091 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2092 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002093 m_errorMonitor->VerifyNotFound();
2094
2095 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002096 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2097 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002098 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2099 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002100 m_errorMonitor->VerifyNotFound();
2101
2102 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002103 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2104 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002105 m_errorMonitor->VerifyNotFound();
2106
2107 // Depth copies that should fail
2108 ds_region.bufferOffset = 4;
2109 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002110 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002111 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002112 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2113 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002114 m_errorMonitor->VerifyFound();
2115
2116 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002117 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002118 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002119 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002120 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002121 m_errorMonitor->VerifyFound();
2122
2123 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002124 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002125 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002126 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2127 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002128 m_errorMonitor->VerifyFound();
2129
2130 // Stencil copies that should succeed
2131 ds_region.bufferOffset = 0;
2132 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2133 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002134 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2135 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002136 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2137 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002138 m_errorMonitor->VerifyNotFound();
2139
2140 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002141 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2142 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002143 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2144 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002145 m_errorMonitor->VerifyNotFound();
2146
2147 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002148 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2149 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002150 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2151 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002152 m_errorMonitor->VerifyNotFound();
2153
2154 // Stencil copies that should fail
2155 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002156 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002157 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002158 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2159 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002160 m_errorMonitor->VerifyFound();
2161
2162 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002163 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002164 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2165 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002166 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2167 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002168 m_errorMonitor->VerifyFound();
2169
2170 ds_region.bufferRowLength = 0;
2171 ds_region.bufferOffset = 4;
2172 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002173 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002174 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002175 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2176 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002177 m_errorMonitor->VerifyFound();
2178 }
2179
2180 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002181 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002182 VkPhysicalDeviceFeatures device_features = {};
2183 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2184 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2185 device_features.textureCompressionASTC_LDR)) {
2186 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2187 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002188 // Verify transfer support for each compression format used blow
2189 bool missing_bc_support = false;
2190 bool missing_etc_support = false;
2191 bool missing_astc_support = false;
2192 bool missing_compression_support = false;
2193
2194 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2195 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2196 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2197 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2198
2199 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2200 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2201 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2202 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2203
2204 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2205 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2206 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2207 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2208
2209 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002210 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2211 0);
2212 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2213 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002214 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002215 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2216 VK_IMAGE_TILING_OPTIMAL, 0);
2217 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2218 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002219 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002220 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2221 VK_IMAGE_TILING_OPTIMAL, 0);
2222 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2223 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002224 } else {
2225 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002226 }
unknown088160a2019-05-23 17:43:13 -06002227
sfricke-samsung6d97e562020-01-07 22:01:00 -08002228 if (missing_compression_support) {
2229 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2230 } else {
2231 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002232 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002233 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002234 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2235 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002236 m_errorMonitor->ExpectSuccess();
2237 region.imageExtent = {128, 128, 1};
2238 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2239 buffer_16k.handle(), 1, &region);
2240 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002241
sfricke-samsung6d97e562020-01-07 22:01:00 -08002242 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002243 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002244 region.bufferOffset = 16;
2245 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2246 buffer_16k.handle(), 1, &region);
2247 m_errorMonitor->VerifyFound();
2248 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002249
sfricke-samsung6d97e562020-01-07 22:01:00 -08002250 // extents that are not a multiple of compressed block size
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002251 vuid =
2252 mp_extensions ? "VUID-vkCmdCopyBufferToImage-imageExtent-00207" : "VUID-vkCmdCopyBufferToImage-imageExtent-00207";
sfricke-samsung3a10b922020-05-13 23:23:16 -07002253 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002254 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002255 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2256 region.imageExtent.width = 66;
2257 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2258 buffer_16k.handle(), 1, &region);
2259 m_errorMonitor->VerifyFound();
2260 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002261
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002262 vuid =
2263 mp_extensions ? "VUID-vkCmdCopyBufferToImage-imageExtent-00208" : "VUID-vkCmdCopyBufferToImage-imageExtent-00208";
sfricke-samsung3a10b922020-05-13 23:23:16 -07002264 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002265 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002266 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2267 region.imageExtent.height = 2;
2268 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2269 buffer_16k.handle(), 1, &region);
2270 m_errorMonitor->VerifyFound();
2271 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002272
sfricke-samsung6d97e562020-01-07 22:01:00 -08002273 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002274
sfricke-samsung6d97e562020-01-07 22:01:00 -08002275 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2276 m_errorMonitor->ExpectSuccess();
2277 region.imageExtent.width = 66;
2278 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002279 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2280 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002281 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2282 buffer_16k.handle(), 1, &region);
2283 region.imageExtent.width = 16;
2284 region.imageOffset.x = 0;
2285 region.imageExtent.height = 2;
2286 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002287 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2288 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002289 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2290 buffer_16k.handle(), 1, &region);
2291 m_errorMonitor->VerifyNotFound();
2292 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002293
sfricke-samsung6d97e562020-01-07 22:01:00 -08002294 // buffer offset must be a multiple of texel block size (16)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002295 vuid =
2296 mp_extensions ? "VUID-vkCmdCopyBufferToImage-bufferOffset-00206" : "VUID-vkCmdCopyBufferToImage-bufferOffset-00206";
sfricke-samsung3a10b922020-05-13 23:23:16 -07002297 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002298 vuid =
2299 mp_extensions ? "VUID-vkCmdCopyBufferToImage-bufferOffset-01558" : "VUID-vkCmdCopyBufferToImage-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002300 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002301 region.imageExtent = {64, 64, 1};
2302 region.bufferOffset = 24;
2303 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2304 buffer_16k.handle(), 1, &region);
2305 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002306
sfricke-samsung6d97e562020-01-07 22:01:00 -08002307 // rowlength not a multiple of block width (4)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002308 vuid = mp_extensions ? "VUID-vkCmdCopyBufferToImage-bufferRowLength-00203"
2309 : "VUID-vkCmdCopyBufferToImage-bufferRowLength-00203";
sfricke-samsung3a10b922020-05-13 23:23:16 -07002310 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002311 region.bufferOffset = 0;
2312 region.bufferRowLength = 130;
2313 region.bufferImageHeight = 0;
2314 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2315 buffer_64k.handle(), 1, &region);
2316 m_errorMonitor->VerifyFound();
2317
2318 // imageheight not a multiple of block height (4)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002319 vuid = mp_extensions ? "VUID-vkCmdCopyBufferToImage-bufferImageHeight-00204"
2320 : "VUID-vkCmdCopyBufferToImage-bufferImageHeight-00204";
sfricke-samsung3a10b922020-05-13 23:23:16 -07002321 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002322 region.bufferRowLength = 0;
2323 region.bufferImageHeight = 130;
2324 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2325 buffer_64k.handle(), 1, &region);
2326 m_errorMonitor->VerifyFound();
2327 }
2328 }
2329
2330 // Test multi-planar formats, if supported
2331 if (!mp_extensions) {
2332 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2333 } else {
2334 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2335 // being required with samplerYcbcrConversion feature
2336 bool missing_mp_support = false;
2337 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2338 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2339 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2340 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2341
2342 if (missing_mp_support) {
2343 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2344 } else {
2345 VkBufferImageCopy mp_region = {};
2346 mp_region.bufferOffset = 0;
2347 mp_region.bufferRowLength = 0;
2348 mp_region.bufferImageHeight = 0;
2349 mp_region.imageSubresource.mipLevel = 0;
2350 mp_region.imageSubresource.baseArrayLayer = 0;
2351 mp_region.imageSubresource.layerCount = 1;
2352 mp_region.imageOffset = {0, 0, 0};
2353 mp_region.imageExtent = {128, 128, 1};
2354
2355 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2356 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2357 VK_IMAGE_TILING_OPTIMAL, 0);
2358 ASSERT_TRUE(image_multi_planar.initialized());
2359
2360 // Copies into a mutli-planar image aspect properly
2361 m_errorMonitor->ExpectSuccess();
2362 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002363 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2364 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002365 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2366 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2367 m_errorMonitor->VerifyNotFound();
2368
2369 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002370 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002371 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2372 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2373 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2374 m_errorMonitor->VerifyFound();
2375
2376 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002377 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002378 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2379 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2380 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2381 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002382
2383 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002384 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002385 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2386 mp_region.bufferOffset = 5;
2387 mp_region.imageExtent = {8, 8, 1};
2388 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2389 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2390 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002391 }
unknown088160a2019-05-23 17:43:13 -06002392 }
2393}
2394
2395TEST_F(VkLayerTest, MiscImageLayerTests) {
2396 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2397
2398 ASSERT_NO_FATAL_FAILURE(Init());
2399
2400 // TODO: Ideally we should check if a format is supported, before using it.
2401 VkImageObj image(m_device);
2402 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2403 ASSERT_TRUE(image.initialized());
2404 VkBufferObj buffer;
2405 VkMemoryPropertyFlags reqs = 0;
2406 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2407 VkBufferImageCopy region = {};
2408 region.bufferRowLength = 128;
2409 region.bufferImageHeight = 128;
2410 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2411 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2412 region.imageSubresource.layerCount = 1;
2413 region.imageExtent.height = 4;
2414 region.imageExtent.width = 4;
2415 region.imageExtent.depth = 1;
2416
2417 VkImageObj image2(m_device);
2418 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2419 ASSERT_TRUE(image2.initialized());
2420 VkBufferObj buffer2;
2421 VkMemoryPropertyFlags reqs2 = 0;
2422 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002423 m_commandBuffer->begin();
2424
2425 // Image must have offset.z of 0 and extent.depth of 1
2426 // Introduce failure by setting imageExtent.depth to 0
2427 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002428 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002429 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2430 &region);
unknown088160a2019-05-23 17:43:13 -06002431 m_errorMonitor->VerifyFound();
2432
2433 region.imageExtent.depth = 1;
2434
2435 // Image must have offset.z of 0 and extent.depth of 1
2436 // Introduce failure by setting imageOffset.z to 4
2437 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2438 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002439 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2440 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002441 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00172");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002442 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2443 &region);
unknown088160a2019-05-23 17:43:13 -06002444 m_errorMonitor->VerifyFound();
2445
2446 region.imageOffset.z = 0;
2447 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2448 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2449 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002450 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002451 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2452 &region);
unknown088160a2019-05-23 17:43:13 -06002453 m_errorMonitor->VerifyFound();
2454
unknown088160a2019-05-23 17:43:13 -06002455 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2456 region.bufferOffset = 0;
2457 region.imageExtent.height = 128;
2458 region.imageExtent.width = 128;
2459 // Introduce failure by setting bufferRowLength > 0 but less than width
2460 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002461 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002462 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2463 &region);
unknown088160a2019-05-23 17:43:13 -06002464 m_errorMonitor->VerifyFound();
2465
2466 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2467 region.bufferRowLength = 128;
2468 // Introduce failure by setting bufferRowHeight > 0 but less than height
2469 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002470 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002471 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2472 &region);
unknown088160a2019-05-23 17:43:13 -06002473 m_errorMonitor->VerifyFound();
2474
2475 region.bufferImageHeight = 128;
2476 VkImageObj intImage1(m_device);
2477 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2478 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2479 VkImageObj intImage2(m_device);
2480 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2481 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2482 VkImageBlit blitRegion = {};
2483 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2484 blitRegion.srcSubresource.baseArrayLayer = 0;
2485 blitRegion.srcSubresource.layerCount = 1;
2486 blitRegion.srcSubresource.mipLevel = 0;
2487 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2488 blitRegion.dstSubresource.baseArrayLayer = 0;
2489 blitRegion.dstSubresource.layerCount = 1;
2490 blitRegion.dstSubresource.mipLevel = 0;
2491 blitRegion.srcOffsets[0] = {128, 0, 0};
2492 blitRegion.srcOffsets[1] = {128, 128, 1};
2493 blitRegion.dstOffsets[0] = {0, 128, 0};
2494 blitRegion.dstOffsets[1] = {128, 128, 1};
2495
2496 // Look for NULL-blit warning
Mark Lobodzinski20310782020-02-28 14:25:17 -07002497 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].srcOffsets specify a zero-volume area.");
2498 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002499 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2500 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002501 m_errorMonitor->VerifyFound();
2502}
2503
2504TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2505 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002506 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2507
2508 bool copy_commands2 = false;
2509 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2510 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2511 copy_commands2 = true;
2512 }
2513 ASSERT_NO_FATAL_FAILURE(InitState());
2514
2515 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2516 if (copy_commands2) {
2517 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2518 }
unknown088160a2019-05-23 17:43:13 -06002519
sfricke-samsung30b094c2020-05-30 11:42:11 -07002520 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2521 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
2522 printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
2523 return;
2524 }
2525
unknown088160a2019-05-23 17:43:13 -06002526 VkImageCreateInfo ci;
2527 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2528 ci.pNext = NULL;
2529 ci.flags = 0;
2530 ci.imageType = VK_IMAGE_TYPE_1D;
2531 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2532 ci.extent = {32, 1, 1};
2533 ci.mipLevels = 1;
2534 ci.arrayLayers = 1;
2535 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2536 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2537 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2538 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2539 ci.queueFamilyIndexCount = 0;
2540 ci.pQueueFamilyIndices = NULL;
2541 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2542
2543 // Create 1D image
2544 VkImageObj image_1D(m_device);
2545 image_1D.init(&ci);
2546 ASSERT_TRUE(image_1D.initialized());
2547
2548 // 2D image
2549 ci.imageType = VK_IMAGE_TYPE_2D;
2550 ci.extent = {32, 32, 1};
2551 VkImageObj image_2D(m_device);
2552 image_2D.init(&ci);
2553 ASSERT_TRUE(image_2D.initialized());
2554
2555 // 3D image
2556 ci.imageType = VK_IMAGE_TYPE_3D;
2557 ci.extent = {32, 32, 8};
2558 VkImageObj image_3D(m_device);
2559 image_3D.init(&ci);
2560 ASSERT_TRUE(image_3D.initialized());
2561
2562 // 2D image array
2563 ci.imageType = VK_IMAGE_TYPE_2D;
2564 ci.extent = {32, 32, 1};
2565 ci.arrayLayers = 8;
2566 VkImageObj image_2D_array(m_device);
2567 image_2D_array.init(&ci);
2568 ASSERT_TRUE(image_2D_array.initialized());
2569
2570 m_commandBuffer->begin();
2571
2572 VkImageCopy copy_region;
2573 copy_region.extent = {32, 1, 1};
2574 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2575 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2576 copy_region.srcSubresource.mipLevel = 0;
2577 copy_region.dstSubresource.mipLevel = 0;
2578 copy_region.srcSubresource.baseArrayLayer = 0;
2579 copy_region.dstSubresource.baseArrayLayer = 0;
2580 copy_region.srcSubresource.layerCount = 1;
2581 copy_region.dstSubresource.layerCount = 1;
2582 copy_region.srcOffset = {0, 0, 0};
2583 copy_region.dstOffset = {0, 0, 0};
2584
2585 // Sanity check
2586 m_errorMonitor->ExpectSuccess();
2587 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2588 &copy_region);
2589 m_errorMonitor->VerifyNotFound();
2590
Jeff Leger465acf52020-10-12 18:07:16 -04002591 // Equivalent sanity check using KHR_copy_commands2
2592 if (copy_commands2 && vkCmdCopyImage2Function) {
2593 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2594 NULL,
2595 copy_region.srcSubresource,
2596 copy_region.srcOffset,
2597 copy_region.dstSubresource,
2598 copy_region.dstOffset,
2599 copy_region.extent};
2600 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2601 NULL,
2602 image_1D.image(),
2603 VK_IMAGE_LAYOUT_GENERAL,
2604 image_2D.image(),
2605 VK_IMAGE_LAYOUT_GENERAL,
2606 1,
2607 &region2};
2608 m_errorMonitor->ExpectSuccess();
2609 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2610 m_errorMonitor->VerifyNotFound();
2611 }
2612
unknown088160a2019-05-23 17:43:13 -06002613 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2614 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002615 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2616 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002617 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2618 &copy_region);
2619 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002620
2621 // Equivalent test using KHR_copy_commands2
2622 if (copy_commands2 && vkCmdCopyImage2Function) {
2623 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2624 NULL,
2625 copy_region.srcSubresource,
2626 copy_region.srcOffset,
2627 copy_region.dstSubresource,
2628 copy_region.dstOffset,
2629 copy_region.extent};
2630 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2631 NULL,
2632 image_1D.image(),
2633 VK_IMAGE_LAYOUT_GENERAL,
2634 image_2D.image(),
2635 VK_IMAGE_LAYOUT_GENERAL,
2636 1,
2637 &region2};
2638 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2639 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2640 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2641 m_errorMonitor->VerifyFound();
2642 }
2643
unknown088160a2019-05-23 17:43:13 -06002644 copy_region.srcOffset.y = 0;
2645 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002646 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2647 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002648 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2649 &copy_region);
2650 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002651
2652 // Equivalent test using KHR_copy_commands2
2653 if (copy_commands2 && vkCmdCopyImage2Function) {
2654 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2655 NULL,
2656 copy_region.srcSubresource,
2657 copy_region.srcOffset,
2658 copy_region.dstSubresource,
2659 copy_region.dstOffset,
2660 copy_region.extent};
2661 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2662 NULL,
2663 image_2D.image(),
2664 VK_IMAGE_LAYOUT_GENERAL,
2665 image_1D.image(),
2666 VK_IMAGE_LAYOUT_GENERAL,
2667 1,
2668 &region2};
2669 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2670 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2671 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2672 m_errorMonitor->VerifyFound();
2673 }
2674
unknown088160a2019-05-23 17:43:13 -06002675 copy_region.dstOffset.y = 0;
2676
2677 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2678 copy_region.extent.height = 2;
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
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002708 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2709 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002710 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2711 &copy_region);
2712 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002713
2714 // Equivalent test using KHR_copy_commands2
2715 if (copy_commands2 && vkCmdCopyImage2Function) {
2716 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2717 NULL,
2718 copy_region.srcSubresource,
2719 copy_region.srcOffset,
2720 copy_region.dstSubresource,
2721 copy_region.dstOffset,
2722 copy_region.extent};
2723 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2724 NULL,
2725 image_2D.image(),
2726 VK_IMAGE_LAYOUT_GENERAL,
2727 image_1D.image(),
2728 VK_IMAGE_LAYOUT_GENERAL,
2729 1,
2730 &region2};
2731 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2733 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2734 m_errorMonitor->VerifyFound();
2735 }
2736
unknown088160a2019-05-23 17:43:13 -06002737 copy_region.extent.height = 1;
2738
2739 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2740 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002741 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2742 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002743 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2744 &copy_region);
2745 m_errorMonitor->VerifyFound();
2746 copy_region.srcOffset.z = 0;
2747 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002748 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2749 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002750 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2751 &copy_region);
2752 m_errorMonitor->VerifyFound();
2753 copy_region.dstOffset.z = 0;
2754
2755 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2756 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002757 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002758 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002759 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002760 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002761 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002762 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002763 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002764 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2765 &copy_region);
2766 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002769 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002770 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002771 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002773 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
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();
2777 copy_region.extent.depth = 1;
2778
2779 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2780 copy_region.extent = {16, 16, 1};
2781 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002782 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002783 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002784 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002785 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2786 &copy_region);
2787 m_errorMonitor->VerifyFound();
2788 copy_region.srcOffset.z = 0;
2789 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002790 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002791 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002792 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002793 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2794 &copy_region);
2795 m_errorMonitor->VerifyFound();
2796 copy_region.dstOffset.z = 0;
2797
2798 // 3D texture accessing an array layer other than 0. VU 09c0011a
2799 copy_region.extent = {4, 4, 1};
2800 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002801 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002802 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002803 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2804 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2805 &copy_region);
2806 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002807 copy_region.srcSubresource.baseArrayLayer = 0;
2808
unknown088160a2019-05-23 17:43:13 -06002809 m_commandBuffer->end();
2810}
2811
2812TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2813 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002814 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06002815 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
2816 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2817 } else {
2818 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2819 return;
2820 }
2821 ASSERT_NO_FATAL_FAILURE(InitState());
2822
2823 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2824 VkFormatProperties format_props;
2825 // TODO: Remove this check if or when devsim handles extensions.
2826 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2827 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002828 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002829 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2830 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2831 return;
2832 }
2833
2834 VkImageCreateInfo ci;
2835 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2836 ci.pNext = NULL;
2837 ci.flags = 0;
2838 ci.imageType = VK_IMAGE_TYPE_1D;
2839 ci.format = image_format;
2840 ci.extent = {32, 1, 1};
2841 ci.mipLevels = 1;
2842 ci.arrayLayers = 1;
2843 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2844 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2845 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2846 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2847 ci.queueFamilyIndexCount = 0;
2848 ci.pQueueFamilyIndices = NULL;
2849 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2850
2851 // Create 1D image
2852 VkImageObj image_1D(m_device);
2853 image_1D.init(&ci);
2854 ASSERT_TRUE(image_1D.initialized());
2855
2856 // 2D image
2857 ci.imageType = VK_IMAGE_TYPE_2D;
2858 ci.extent = {32, 32, 1};
2859 VkImageObj image_2D(m_device);
2860 image_2D.init(&ci);
2861 ASSERT_TRUE(image_2D.initialized());
2862
2863 // 3D image
2864 ci.imageType = VK_IMAGE_TYPE_3D;
2865 ci.extent = {32, 32, 8};
2866 VkImageObj image_3D(m_device);
2867 image_3D.init(&ci);
2868 ASSERT_TRUE(image_3D.initialized());
2869
2870 // 2D image array
2871 ci.imageType = VK_IMAGE_TYPE_2D;
2872 ci.extent = {32, 32, 1};
2873 ci.arrayLayers = 8;
2874 VkImageObj image_2D_array(m_device);
2875 image_2D_array.init(&ci);
2876 ASSERT_TRUE(image_2D_array.initialized());
2877
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002878 // second 2D image array
2879 ci.imageType = VK_IMAGE_TYPE_2D;
2880 ci.extent = {32, 32, 1};
2881 ci.arrayLayers = 8;
2882 VkImageObj image_2D_array_2(m_device);
2883 image_2D_array_2.init(&ci);
2884 ASSERT_TRUE(image_2D_array_2.initialized());
2885
unknown088160a2019-05-23 17:43:13 -06002886 m_commandBuffer->begin();
2887
2888 VkImageCopy copy_region;
2889 copy_region.extent = {32, 1, 1};
2890 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2891 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2892 copy_region.srcSubresource.mipLevel = 0;
2893 copy_region.dstSubresource.mipLevel = 0;
2894 copy_region.srcSubresource.baseArrayLayer = 0;
2895 copy_region.dstSubresource.baseArrayLayer = 0;
2896 copy_region.srcSubresource.layerCount = 1;
2897 copy_region.dstSubresource.layerCount = 1;
2898 copy_region.srcOffset = {0, 0, 0};
2899 copy_region.dstOffset = {0, 0, 0};
2900
2901 // Copy from layer not present
2902 copy_region.srcSubresource.baseArrayLayer = 4;
2903 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002904 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002905 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2906 &copy_region);
2907 m_errorMonitor->VerifyFound();
2908 copy_region.srcSubresource.baseArrayLayer = 0;
2909 copy_region.srcSubresource.layerCount = 1;
2910
2911 // Copy to layer not present
2912 copy_region.dstSubresource.baseArrayLayer = 1;
2913 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002915 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2916 &copy_region);
2917 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002918 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002919 copy_region.dstSubresource.layerCount = 1;
2920
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002921 // both 2D and extent.depth not 1
2922 // Need two 2D array images to prevent other errors
2923 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002924 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002925 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2926 1, &copy_region);
2927 m_errorMonitor->VerifyFound();
2928 copy_region.extent = {32, 1, 1};
2929
2930 // 2D src / 3D dst and depth not equal to src layerCount
2931 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002932 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002933 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002934 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2935 &copy_region);
2936 m_errorMonitor->VerifyFound();
2937 copy_region.extent = {32, 1, 1};
2938
2939 // 3D src / 2D dst and depth not equal to dst layerCount
2940 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002941 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002943 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2944 &copy_region);
2945 m_errorMonitor->VerifyFound();
2946 copy_region.extent = {32, 1, 1};
2947
unknown088160a2019-05-23 17:43:13 -06002948 m_commandBuffer->end();
2949}
2950
2951TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
2952 // Image copy tests on compressed images with block alignment errors
2953 SetTargetApiVersion(VK_API_VERSION_1_1);
2954 ASSERT_NO_FATAL_FAILURE(Init());
2955
2956 // Select a compressed format and verify support
2957 VkPhysicalDeviceFeatures device_features = {};
2958 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2959 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
2960 if (device_features.textureCompressionBC) {
2961 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
2962 } else if (device_features.textureCompressionETC2) {
2963 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
2964 } else if (device_features.textureCompressionASTC_LDR) {
2965 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
2966 }
2967
2968 VkImageCreateInfo ci;
2969 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2970 ci.pNext = NULL;
2971 ci.flags = 0;
2972 ci.imageType = VK_IMAGE_TYPE_2D;
2973 ci.format = compressed_format;
2974 ci.extent = {64, 64, 1};
2975 ci.mipLevels = 1;
2976 ci.arrayLayers = 1;
2977 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2978 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2979 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2980 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2981 ci.queueFamilyIndexCount = 0;
2982 ci.pQueueFamilyIndices = NULL;
2983 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2984
2985 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002986 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
2987 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06002988 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
2989 return;
2990 }
2991
2992 // Create images
2993 VkImageObj image_1(m_device);
2994 image_1.init(&ci);
2995 ASSERT_TRUE(image_1.initialized());
2996
2997 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
2998 VkImageObj image_2(m_device);
2999 image_2.init(&ci);
3000 ASSERT_TRUE(image_2.initialized());
3001
3002 m_commandBuffer->begin();
3003
3004 VkImageCopy copy_region;
3005 copy_region.extent = {48, 48, 1};
3006 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3007 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3008 copy_region.srcSubresource.mipLevel = 0;
3009 copy_region.dstSubresource.mipLevel = 0;
3010 copy_region.srcSubresource.baseArrayLayer = 0;
3011 copy_region.dstSubresource.baseArrayLayer = 0;
3012 copy_region.srcSubresource.layerCount = 1;
3013 copy_region.dstSubresource.layerCount = 1;
3014 copy_region.srcOffset = {0, 0, 0};
3015 copy_region.dstOffset = {0, 0, 0};
3016
3017 // Sanity check
3018 m_errorMonitor->ExpectSuccess();
3019 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3020 m_errorMonitor->VerifyNotFound();
3021
3022 std::string vuid;
3023 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3024 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3025
3026 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3027 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003028 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003029 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003030 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3031 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003032 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3033 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3034 m_errorMonitor->VerifyFound();
3035 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003036 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3037 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003038 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3039 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3040 m_errorMonitor->VerifyFound();
3041 copy_region.srcOffset = {0, 0, 0};
3042
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003043 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003044 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003045 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3046 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003047 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3048 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3049 m_errorMonitor->VerifyFound();
3050 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003051 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3052 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003053 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3054 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3055 m_errorMonitor->VerifyFound();
3056 copy_region.dstOffset = {0, 0, 0};
3057
3058 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003059 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003060 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003061 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3062 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003063 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3064 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3065 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003066 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003067 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3069 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003070 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3071 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3072 m_errorMonitor->VerifyFound();
3073
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003074 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003075 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003076 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3077 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003078 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3079 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3080 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003081 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003082 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3084 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003085 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3086 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3087 m_errorMonitor->VerifyFound();
3088
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003089 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3090 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003091 // There are currently no supported compressed formats with a block depth other than 1,
3092 // so impossible to create a 'not a multiple' condition for depth.
3093 m_commandBuffer->end();
3094}
3095
3096TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3097 // Image copy tests on single-plane _422 formats with block alignment errors
3098
3099 // Enable KHR multiplane req'd extensions
3100 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3101 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3102 if (mp_extensions) {
3103 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3104 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003105 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003106 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3107 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3108 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3109 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3110 if (mp_extensions) {
3111 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3112 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3113 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3114 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3115 } else {
3116 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3117 return;
3118 }
3119 ASSERT_NO_FATAL_FAILURE(InitState());
3120
3121 // Select a _422 format and verify support
3122 VkImageCreateInfo ci = {};
3123 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3124 ci.pNext = NULL;
3125 ci.flags = 0;
3126 ci.imageType = VK_IMAGE_TYPE_2D;
3127 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3128 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3129 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3130 ci.mipLevels = 1;
3131 ci.arrayLayers = 1;
3132 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3133 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3134 ci.queueFamilyIndexCount = 0;
3135 ci.pQueueFamilyIndices = NULL;
3136 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3137
3138 // Verify formats
3139 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3140 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3141 if (!supported) {
3142 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3143 return; // Assume there's low ROI on searching for different mp formats
3144 }
3145
3146 // Create images
3147 ci.extent = {64, 64, 1};
3148 VkImageObj image_422(m_device);
3149 image_422.init(&ci);
3150 ASSERT_TRUE(image_422.initialized());
3151
3152 ci.extent = {64, 64, 1};
3153 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3154 VkImageObj image_ucmp(m_device);
3155 image_ucmp.init(&ci);
3156 ASSERT_TRUE(image_ucmp.initialized());
3157
3158 m_commandBuffer->begin();
3159
3160 VkImageCopy copy_region;
3161 copy_region.extent = {48, 48, 1};
3162 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3163 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3164 copy_region.srcSubresource.mipLevel = 0;
3165 copy_region.dstSubresource.mipLevel = 0;
3166 copy_region.srcSubresource.baseArrayLayer = 0;
3167 copy_region.dstSubresource.baseArrayLayer = 0;
3168 copy_region.srcSubresource.layerCount = 1;
3169 copy_region.dstSubresource.layerCount = 1;
3170 copy_region.srcOffset = {0, 0, 0};
3171 copy_region.dstOffset = {0, 0, 0};
3172
3173 // Src offsets must be multiples of compressed block sizes
3174 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003175 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003176 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003177 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3178 &copy_region);
3179 m_errorMonitor->VerifyFound();
3180 copy_region.srcOffset = {0, 0, 0};
3181
3182 // Dst offsets must be multiples of compressed block sizes
3183 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003184 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003185 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003186 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003187 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3188 &copy_region);
3189 m_errorMonitor->VerifyFound();
3190 copy_region.dstOffset = {0, 0, 0};
3191
3192 // Copy extent must be multiples of compressed block sizes if not full width/height
3193 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003194 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003195 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003196 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3197 &copy_region);
3198 m_errorMonitor->VerifyFound();
3199
unknown357e1782019-09-25 17:57:40 -06003200 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003201 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3202 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003203 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003204 copy_region.dstOffset = {0, 0, 0};
3205
3206 m_commandBuffer->end();
3207}
3208
3209TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3210 // Image copy tests on multiplane images with aspect errors
3211
3212 // Enable KHR multiplane req'd extensions
3213 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3214 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3215 if (mp_extensions) {
3216 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3217 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003218 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003219 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3220 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3221 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3222 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3223 if (mp_extensions) {
3224 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3225 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3226 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3227 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3228 } else {
3229 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3230 return;
3231 }
3232 ASSERT_NO_FATAL_FAILURE(InitState());
3233
3234 // Select multi-plane formats and verify support
3235 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3236 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3237
3238 VkImageCreateInfo ci = {};
3239 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3240 ci.pNext = NULL;
3241 ci.flags = 0;
3242 ci.imageType = VK_IMAGE_TYPE_2D;
3243 ci.format = mp2_format;
3244 ci.extent = {256, 256, 1};
3245 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3246 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3247 ci.mipLevels = 1;
3248 ci.arrayLayers = 1;
3249 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3250 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3251 ci.queueFamilyIndexCount = 0;
3252 ci.pQueueFamilyIndices = NULL;
3253 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3254
3255 // Verify formats
3256 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3257 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3258 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3259 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3260 ci.format = mp3_format;
3261 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3262 if (!supported) {
3263 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3264 kSkipPrefix);
3265 return; // Assume there's low ROI on searching for different mp formats
3266 }
3267
3268 // Create images
3269 VkImageObj mp3_image(m_device);
3270 mp3_image.init(&ci);
3271 ASSERT_TRUE(mp3_image.initialized());
3272
3273 ci.format = mp2_format;
3274 VkImageObj mp2_image(m_device);
3275 mp2_image.init(&ci);
3276 ASSERT_TRUE(mp2_image.initialized());
3277
3278 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3279 VkImageObj sp_image(m_device);
3280 sp_image.init(&ci);
3281 ASSERT_TRUE(sp_image.initialized());
3282
3283 m_commandBuffer->begin();
3284
3285 VkImageCopy copy_region;
3286 copy_region.extent = {128, 128, 1};
3287 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3288 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3289 copy_region.srcSubresource.mipLevel = 0;
3290 copy_region.dstSubresource.mipLevel = 0;
3291 copy_region.srcSubresource.baseArrayLayer = 0;
3292 copy_region.dstSubresource.baseArrayLayer = 0;
3293 copy_region.srcSubresource.layerCount = 1;
3294 copy_region.dstSubresource.layerCount = 1;
3295 copy_region.srcOffset = {0, 0, 0};
3296 copy_region.dstOffset = {0, 0, 0};
3297
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003298 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003299 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3300 &copy_region);
3301 m_errorMonitor->VerifyFound();
3302
unknown088160a2019-05-23 17:43:13 -06003303 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3304 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003305 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003306 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3307 &copy_region);
3308 m_errorMonitor->VerifyFound();
3309
3310 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3311 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003313 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3314 &copy_region);
3315 m_errorMonitor->VerifyFound();
3316
3317 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003318 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003319 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3320 &copy_region);
3321 m_errorMonitor->VerifyFound();
3322
3323 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003324 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003325 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003326 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3327 &copy_region);
3328 m_errorMonitor->VerifyFound();
3329
3330 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3331 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003332 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003333 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003334 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3335 &copy_region);
3336 m_errorMonitor->VerifyFound();
3337
3338 m_commandBuffer->end();
3339}
3340
3341TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3342 // Image copy with source region specified greater than src image size
3343 ASSERT_NO_FATAL_FAILURE(Init());
3344
3345 // Create images with full mip chain
3346 VkImageCreateInfo ci;
3347 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3348 ci.pNext = NULL;
3349 ci.flags = 0;
3350 ci.imageType = VK_IMAGE_TYPE_3D;
3351 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3352 ci.extent = {32, 32, 8};
3353 ci.mipLevels = 6;
3354 ci.arrayLayers = 1;
3355 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3356 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3357 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3358 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3359 ci.queueFamilyIndexCount = 0;
3360 ci.pQueueFamilyIndices = NULL;
3361 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3362
3363 VkImageObj src_image(m_device);
3364 src_image.init(&ci);
3365 ASSERT_TRUE(src_image.initialized());
3366
3367 // Dest image with one more mip level
3368 ci.extent = {64, 64, 16};
3369 ci.mipLevels = 7;
3370 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3371 VkImageObj dst_image(m_device);
3372 dst_image.init(&ci);
3373 ASSERT_TRUE(dst_image.initialized());
3374
3375 m_commandBuffer->begin();
3376
3377 VkImageCopy copy_region;
3378 copy_region.extent = {32, 32, 8};
3379 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3380 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3381 copy_region.srcSubresource.mipLevel = 0;
3382 copy_region.dstSubresource.mipLevel = 0;
3383 copy_region.srcSubresource.baseArrayLayer = 0;
3384 copy_region.dstSubresource.baseArrayLayer = 0;
3385 copy_region.srcSubresource.layerCount = 1;
3386 copy_region.dstSubresource.layerCount = 1;
3387 copy_region.srcOffset = {0, 0, 0};
3388 copy_region.dstOffset = {0, 0, 0};
3389
3390 m_errorMonitor->ExpectSuccess();
3391 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3392 &copy_region);
3393 m_errorMonitor->VerifyNotFound();
3394
3395 // Source exceeded in x-dim, VU 01202
3396 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003397 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003398 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3399 &copy_region);
3400 m_errorMonitor->VerifyFound();
3401
3402 // Source exceeded in y-dim, VU 01203
3403 copy_region.srcOffset.x = 0;
3404 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003405 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003406 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3407 &copy_region);
3408 m_errorMonitor->VerifyFound();
3409
3410 // Source exceeded in z-dim, VU 01204
3411 copy_region.extent = {4, 4, 4};
3412 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003413 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003414 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3415 &copy_region);
3416 m_errorMonitor->VerifyFound();
3417
3418 m_commandBuffer->end();
3419}
3420
3421TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3422 // Image copy with dest region specified greater than dest image size
3423 ASSERT_NO_FATAL_FAILURE(Init());
3424
3425 // Create images with full mip chain
3426 VkImageCreateInfo ci;
3427 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3428 ci.pNext = NULL;
3429 ci.flags = 0;
3430 ci.imageType = VK_IMAGE_TYPE_3D;
3431 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3432 ci.extent = {32, 32, 8};
3433 ci.mipLevels = 6;
3434 ci.arrayLayers = 1;
3435 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3436 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3437 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3438 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3439 ci.queueFamilyIndexCount = 0;
3440 ci.pQueueFamilyIndices = NULL;
3441 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3442
3443 VkImageObj dst_image(m_device);
3444 dst_image.init(&ci);
3445 ASSERT_TRUE(dst_image.initialized());
3446
3447 // Src image with one more mip level
3448 ci.extent = {64, 64, 16};
3449 ci.mipLevels = 7;
3450 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3451 VkImageObj src_image(m_device);
3452 src_image.init(&ci);
3453 ASSERT_TRUE(src_image.initialized());
3454
3455 m_commandBuffer->begin();
3456
3457 VkImageCopy copy_region;
3458 copy_region.extent = {32, 32, 8};
3459 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3460 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3461 copy_region.srcSubresource.mipLevel = 0;
3462 copy_region.dstSubresource.mipLevel = 0;
3463 copy_region.srcSubresource.baseArrayLayer = 0;
3464 copy_region.dstSubresource.baseArrayLayer = 0;
3465 copy_region.srcSubresource.layerCount = 1;
3466 copy_region.dstSubresource.layerCount = 1;
3467 copy_region.srcOffset = {0, 0, 0};
3468 copy_region.dstOffset = {0, 0, 0};
3469
3470 m_errorMonitor->ExpectSuccess();
3471 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3472 &copy_region);
3473 m_errorMonitor->VerifyNotFound();
3474
3475 // Dest exceeded in x-dim, VU 01205
3476 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003477 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
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 // Dest exceeded in y-dim, VU 01206
3483 copy_region.dstOffset.x = 0;
3484 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003485 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003486 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3487 &copy_region);
3488 m_errorMonitor->VerifyFound();
3489
3490 // Dest exceeded in z-dim, VU 01207
3491 copy_region.extent = {4, 4, 4};
3492 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003493 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003494 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3495 &copy_region);
3496 m_errorMonitor->VerifyFound();
3497
3498 m_commandBuffer->end();
3499}
3500
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003501TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3502 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3503
3504 // Enable KHR multiplane req'd extensions
3505 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3506 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3507 if (mp_extensions == true) {
3508 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3509 }
3510 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3511 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3512 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3513 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3514 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3515 if (mp_extensions == true) {
3516 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3517 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3518 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3519 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3520 } else {
3521 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3522 return;
3523 }
3524 ASSERT_NO_FATAL_FAILURE(InitState());
3525
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003526 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3527 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003528 VkFormatProperties props = {0, 0, 0};
3529 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003530 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003531 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3532 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3533 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3534
3535 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003536 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003537 return;
3538 }
3539
3540 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3541 VkImageObj src_image(m_device);
3542 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003543 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 -08003544 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003545 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 -08003546 ASSERT_TRUE(dst_image.initialized());
3547
3548 VkImageCopy copy_region = {};
3549 copy_region.extent = {64, 64, 1}; // Size of plane 1
3550 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3551 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3552 copy_region.srcSubresource.mipLevel = 0;
3553 copy_region.dstSubresource.mipLevel = 0;
3554 copy_region.srcSubresource.baseArrayLayer = 0;
3555 copy_region.dstSubresource.baseArrayLayer = 0;
3556 copy_region.srcSubresource.layerCount = 1;
3557 copy_region.dstSubresource.layerCount = 1;
3558 copy_region.srcOffset = {0, 0, 0};
3559 copy_region.dstOffset = {0, 0, 0};
3560 VkImageCopy original_region = copy_region;
3561
3562 m_commandBuffer->begin();
3563
3564 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3565 m_errorMonitor->ExpectSuccess();
3566 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3567 &copy_region);
3568 m_errorMonitor->VerifyNotFound();
3569
3570 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3571 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3572 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3573 m_errorMonitor->ExpectSuccess();
3574 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3575 &copy_region);
3576 m_errorMonitor->VerifyNotFound();
3577
locke-lunargdf00db02020-03-04 19:00:57 -07003578 VkMemoryBarrier mem_barrier = lvl_init_struct<VkMemoryBarrier>();
3579 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3580 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3581
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003582 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3583 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3584 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3585 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003586 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3587 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003588 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3589 &copy_region);
3590 m_errorMonitor->VerifyNotFound();
3591
3592 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3593 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3594 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3595 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003596 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3597 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003598 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3599 &copy_region);
3600 m_errorMonitor->VerifyNotFound();
3601
3602 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3603 copy_region.extent = {128, 64, 1};
3604 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3605 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3606 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003607 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3608 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003609 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3610 &copy_region);
3611 m_errorMonitor->VerifyNotFound();
3612
3613 // 128x64 copy from plane 0 -> Plane 1
3614 copy_region.extent = {128, 64, 1};
3615 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3616 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003617 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003618 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3619 &copy_region);
3620 m_errorMonitor->VerifyFound();
3621
3622 // 128x64 copy from plane 1 -> Plane 0
3623 copy_region.extent = {128, 64, 1};
3624 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3625 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003626 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003627 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3628 &copy_region);
3629 m_errorMonitor->VerifyFound();
3630
3631 // src exceeded in y-dim from offset
3632 copy_region = original_region;
3633 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003634 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003635 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3636 &copy_region);
3637 m_errorMonitor->VerifyFound();
3638
3639 // dst exceeded in y-dim from offset
3640 copy_region = original_region;
3641 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003642 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003643 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3644 &copy_region);
3645 m_errorMonitor->VerifyFound();
3646
3647 m_commandBuffer->end();
3648}
3649
unknown088160a2019-05-23 17:43:13 -06003650TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003651 if (!EnableDeviceProfileLayer()) {
3652 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3653 return;
3654 }
unknown088160a2019-05-23 17:43:13 -06003655
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003656 // Enable KHR multiplane req'd extensions
3657 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3658 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3659 if (mp_extensions == true) {
3660 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3661 }
3662 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3663 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3664 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3665 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3666 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3667 if (mp_extensions == true) {
3668 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3669 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3670 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3671 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3672 }
3673 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003674
sfricke-samsung51067b22020-04-30 21:41:17 -07003675 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3676 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003677
sfricke-samsung51067b22020-04-30 21:41:17 -07003678 // Load required functions
3679 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3680 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3681 return;
3682 }
3683
3684 // Set transfer for all potential used formats
3685 VkFormatProperties format_props;
3686 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3687 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3688 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3689
3690 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3691 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3692 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003693
3694 VkImageCreateInfo image_create_info = {};
3695 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3696 image_create_info.pNext = NULL;
3697 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003698 image_create_info.extent.width = 32;
3699 image_create_info.extent.height = 32;
3700 image_create_info.extent.depth = 1;
3701 image_create_info.mipLevels = 1;
3702 image_create_info.arrayLayers = 1;
3703 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003704 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3705 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003706 image_create_info.flags = 0;
3707
sfricke-samsung51067b22020-04-30 21:41:17 -07003708 image_create_info.format = VK_FORMAT_R8_UNORM;
3709 VkImageObj image_8b_unorm(m_device);
3710 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003711
sfricke-samsung51067b22020-04-30 21:41:17 -07003712 image_create_info.format = VK_FORMAT_R8_UINT;
3713 VkImageObj image_8b_uint(m_device);
3714 image_8b_uint.init(&image_create_info);
3715
3716 // First try to test two single plane mismatch
3717 {
3718 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3719 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3720 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3721
3722 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3723 VkImageObj image_32b_unorm(m_device);
3724 image_32b_unorm.init(&image_create_info);
3725
3726 m_commandBuffer->begin();
3727 VkImageCopy copyRegion;
3728 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3729 copyRegion.srcSubresource.mipLevel = 0;
3730 copyRegion.srcSubresource.baseArrayLayer = 0;
3731 copyRegion.srcSubresource.layerCount = 1;
3732 copyRegion.srcOffset.x = 0;
3733 copyRegion.srcOffset.y = 0;
3734 copyRegion.srcOffset.z = 0;
3735 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3736 copyRegion.dstSubresource.mipLevel = 0;
3737 copyRegion.dstSubresource.baseArrayLayer = 0;
3738 copyRegion.dstSubresource.layerCount = 1;
3739 copyRegion.dstOffset.x = 0;
3740 copyRegion.dstOffset.y = 0;
3741 copyRegion.dstOffset.z = 0;
3742 copyRegion.extent.width = 1;
3743 copyRegion.extent.height = 1;
3744 copyRegion.extent.depth = 1;
3745
3746 // Sanity check between two 8bit formats
3747 m_errorMonitor->ExpectSuccess();
3748 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3749 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3750 m_errorMonitor->VerifyNotFound();
3751
3752 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3753 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3754 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3755 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3756 m_errorMonitor->VerifyFound();
3757
3758 // Swap src and dst
3759 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3760 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3761 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3762 m_errorMonitor->VerifyFound();
3763
3764 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003765 }
3766
sfricke-samsung51067b22020-04-30 21:41:17 -07003767 // DstImage is a mismatched plane of a multi-planar format
3768 if (mp_extensions == false) {
3769 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3770 } else {
3771 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3772 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3773 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003774
sfricke-samsung51067b22020-04-30 21:41:17 -07003775 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3776 VkImageObj image_8b_16b_420_unorm(m_device);
3777 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003778
sfricke-samsung51067b22020-04-30 21:41:17 -07003779 m_commandBuffer->begin();
3780 VkImageCopy copyRegion;
3781 copyRegion.srcSubresource.mipLevel = 0;
3782 copyRegion.srcSubresource.baseArrayLayer = 0;
3783 copyRegion.srcSubresource.layerCount = 1;
3784 copyRegion.srcOffset.x = 0;
3785 copyRegion.srcOffset.y = 0;
3786 copyRegion.srcOffset.z = 0;
3787 copyRegion.dstSubresource.mipLevel = 0;
3788 copyRegion.dstSubresource.baseArrayLayer = 0;
3789 copyRegion.dstSubresource.layerCount = 1;
3790 copyRegion.dstOffset.x = 0;
3791 copyRegion.dstOffset.y = 0;
3792 copyRegion.dstOffset.z = 0;
3793 copyRegion.extent.width = 1;
3794 copyRegion.extent.height = 1;
3795 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003796
sfricke-samsung51067b22020-04-30 21:41:17 -07003797 // First test single-plane -> multi-plan
3798 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3799 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003800
sfricke-samsung51067b22020-04-30 21:41:17 -07003801 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3802 m_errorMonitor->ExpectSuccess();
3803 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3804 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3805 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003806
locke-lunargdf00db02020-03-04 19:00:57 -07003807 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3808 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3809
sfricke-samsung51067b22020-04-30 21:41:17 -07003810 // Make sure no false postiives if Compatible format
3811 m_errorMonitor->ExpectSuccess();
3812 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3813 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3814 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003815
sfricke-samsung51067b22020-04-30 21:41:17 -07003816 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3817 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3819 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3820 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3821 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003822
sfricke-samsung51067b22020-04-30 21:41:17 -07003823 // Same tests but swap src and dst
3824 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3825 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003826
locke-lunargdf00db02020-03-04 19:00:57 -07003827 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3828 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3829 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3830 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3831
sfricke-samsung51067b22020-04-30 21:41:17 -07003832 m_errorMonitor->ExpectSuccess();
3833 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3834 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3835 m_errorMonitor->VerifyNotFound();
3836
locke-lunargdf00db02020-03-04 19:00:57 -07003837 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3838 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3839
sfricke-samsung51067b22020-04-30 21:41:17 -07003840 m_errorMonitor->ExpectSuccess();
3841 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3842 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3843 m_errorMonitor->VerifyNotFound();
3844
3845 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3846 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3847 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3848 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3849 m_errorMonitor->VerifyFound();
3850
3851 m_commandBuffer->end();
3852 }
unknown088160a2019-05-23 17:43:13 -06003853}
3854
3855TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3856 ASSERT_NO_FATAL_FAILURE(Init());
3857 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3858 if (!depth_format) {
3859 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3860 return;
3861 }
3862
3863 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003864 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003865 if (properties.optimalTilingFeatures == 0) {
3866 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3867 return;
3868 }
3869
3870 VkImageObj srcImage(m_device);
3871 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3872 ASSERT_TRUE(srcImage.initialized());
3873 VkImageObj dstImage(m_device);
3874 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3875 ASSERT_TRUE(dstImage.initialized());
3876
3877 // Create two images of different types and try to copy between them
3878
3879 m_commandBuffer->begin();
3880 VkImageCopy copyRegion;
3881 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3882 copyRegion.srcSubresource.mipLevel = 0;
3883 copyRegion.srcSubresource.baseArrayLayer = 0;
3884 copyRegion.srcSubresource.layerCount = 1;
3885 copyRegion.srcOffset.x = 0;
3886 copyRegion.srcOffset.y = 0;
3887 copyRegion.srcOffset.z = 0;
3888 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3889 copyRegion.dstSubresource.mipLevel = 0;
3890 copyRegion.dstSubresource.baseArrayLayer = 0;
3891 copyRegion.dstSubresource.layerCount = 1;
3892 copyRegion.dstOffset.x = 0;
3893 copyRegion.dstOffset.y = 0;
3894 copyRegion.dstOffset.z = 0;
3895 copyRegion.extent.width = 1;
3896 copyRegion.extent.height = 1;
3897 copyRegion.extent.depth = 1;
3898
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003899 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003900 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3901 &copyRegion);
3902 m_commandBuffer->end();
3903
3904 m_errorMonitor->VerifyFound();
3905}
3906
3907TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3908 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3909
3910 ASSERT_NO_FATAL_FAILURE(Init());
3911
3912 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003913 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3914 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3915 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003916
3917 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3918 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
3919 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
3920 return;
3921 }
3922
3923 VkImageCreateInfo ci;
3924 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3925 ci.pNext = NULL;
3926 ci.flags = 0;
3927 ci.imageType = VK_IMAGE_TYPE_2D;
3928 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3929 ci.extent = {128, 128, 1};
3930 ci.mipLevels = 1;
3931 ci.arrayLayers = 1;
3932 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3933 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3934 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3935 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3936 ci.queueFamilyIndexCount = 0;
3937 ci.pQueueFamilyIndices = NULL;
3938 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3939
3940 VkImageObj image1(m_device);
3941 image1.init(&ci);
3942 ASSERT_TRUE(image1.initialized());
3943
3944 ci.samples = VK_SAMPLE_COUNT_2_BIT;
3945 VkImageObj image2(m_device);
3946 image2.init(&ci);
3947 ASSERT_TRUE(image2.initialized());
3948
3949 ci.samples = VK_SAMPLE_COUNT_4_BIT;
3950 VkImageObj image4(m_device);
3951 image4.init(&ci);
3952 ASSERT_TRUE(image4.initialized());
3953
3954 m_commandBuffer->begin();
3955
3956 VkImageCopy copyRegion;
3957 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3958 copyRegion.srcSubresource.mipLevel = 0;
3959 copyRegion.srcSubresource.baseArrayLayer = 0;
3960 copyRegion.srcSubresource.layerCount = 1;
3961 copyRegion.srcOffset = {0, 0, 0};
3962 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3963 copyRegion.dstSubresource.mipLevel = 0;
3964 copyRegion.dstSubresource.baseArrayLayer = 0;
3965 copyRegion.dstSubresource.layerCount = 1;
3966 copyRegion.dstOffset = {0, 0, 0};
3967 copyRegion.extent = {128, 128, 1};
3968
3969 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07003970 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003971 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
3972 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003973 m_errorMonitor->VerifyFound();
3974
Mark Lobodzinski20310782020-02-28 14:25:17 -07003975 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003976 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
3977 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003978 m_errorMonitor->VerifyFound();
3979
3980 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07003981 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003982 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
3983 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003984 m_errorMonitor->VerifyFound();
3985
Mark Lobodzinski20310782020-02-28 14:25:17 -07003986 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003987 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
3988 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003989 m_errorMonitor->VerifyFound();
3990
3991 m_commandBuffer->end();
3992}
3993
3994TEST_F(VkLayerTest, CopyImageAspectMismatch) {
3995 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003996
3997 if (!EnableDeviceProfileLayer()) {
3998 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3999 return;
4000 }
4001
4002 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4003 if (mp_extensions) {
4004 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4005 }
4006
4007 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4008 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4009 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4010 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4011 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4012 if (mp_extensions) {
4013 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4014 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4015 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4016 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4017 }
4018 ASSERT_NO_FATAL_FAILURE(InitState());
4019
4020 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4021 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4022
4023 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4024 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4025 return;
4026 }
4027
unknown088160a2019-05-23 17:43:13 -06004028 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4029 if (!ds_format) {
4030 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4031 return;
4032 }
4033
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004034 // Add Transfer support for all used formats
4035 VkFormatProperties formatProps;
4036 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
4037 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4038 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4039 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
4040 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4041 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4042 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4043 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4044 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4045
unknown088160a2019-05-23 17:43:13 -06004046 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4047 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4048 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4049 VK_IMAGE_TILING_OPTIMAL, 0);
4050 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4051 VK_IMAGE_TILING_OPTIMAL, 0);
4052 ASSERT_TRUE(color_image.initialized());
4053 ASSERT_TRUE(depth_image.initialized());
4054 ASSERT_TRUE(ds_image.initialized());
4055
4056 VkImageCopy copyRegion;
4057 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4058 copyRegion.srcSubresource.mipLevel = 0;
4059 copyRegion.srcSubresource.baseArrayLayer = 0;
4060 copyRegion.srcSubresource.layerCount = 1;
4061 copyRegion.srcOffset = {0, 0, 0};
4062 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4063 copyRegion.dstSubresource.mipLevel = 0;
4064 copyRegion.dstSubresource.baseArrayLayer = 0;
4065 copyRegion.dstSubresource.layerCount = 1;
4066 copyRegion.dstOffset = {64, 0, 0};
4067 copyRegion.extent = {64, 128, 1};
4068
4069 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004070 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004071 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004072 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4073 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004074 m_errorMonitor->VerifyFound();
4075
4076 m_commandBuffer->begin();
4077
4078 // Src and dest aspect masks don't match
4079 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004080 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004081 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004082 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4083 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004084 m_errorMonitor->VerifyFound();
4085 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4086
4087 // Illegal combinations of aspect bits
4088 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4089 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004090 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004091 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004092 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004094 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4095 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004096 m_errorMonitor->VerifyFound();
4097 // same test for dstSubresource
4098 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4099 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004100 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004101 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004102 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004103 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004104 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4105 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004106 m_errorMonitor->VerifyFound();
4107
4108 // Metadata aspect is illegal
4109 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4110 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004111 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004112 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004113 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004114 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4115 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004116 m_errorMonitor->VerifyFound();
4117 // same test for dstSubresource
4118 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4119 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004120 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004121 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004122 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004123 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4124 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004125 m_errorMonitor->VerifyFound();
4126
4127 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4128 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004129 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004130
4131 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004132 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004133 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004134 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004135 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4136 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004137 m_errorMonitor->VerifyFound();
4138
4139 // Aspect mask doesn't match dest image format
4140 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4141 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004142 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004143 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004144 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004145 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4146 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004147 m_errorMonitor->VerifyFound();
4148
4149 m_commandBuffer->end();
4150}
4151
4152TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004153 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004154
4155 ASSERT_NO_FATAL_FAILURE(Init());
4156
4157 // Create two images of sample count 1 and try to Resolve between them
4158
4159 VkImageCreateInfo image_create_info = {};
4160 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4161 image_create_info.pNext = NULL;
4162 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4163 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4164 image_create_info.extent.width = 32;
4165 image_create_info.extent.height = 1;
4166 image_create_info.extent.depth = 1;
4167 image_create_info.mipLevels = 1;
4168 image_create_info.arrayLayers = 1;
4169 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4170 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4171 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4172 image_create_info.flags = 0;
4173
4174 VkImageObj srcImage(m_device);
4175 srcImage.init(&image_create_info);
4176 ASSERT_TRUE(srcImage.initialized());
4177
4178 VkImageObj dstImage(m_device);
4179 dstImage.init(&image_create_info);
4180 ASSERT_TRUE(dstImage.initialized());
4181
4182 m_commandBuffer->begin();
4183 VkImageResolve resolveRegion;
4184 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4185 resolveRegion.srcSubresource.mipLevel = 0;
4186 resolveRegion.srcSubresource.baseArrayLayer = 0;
4187 resolveRegion.srcSubresource.layerCount = 1;
4188 resolveRegion.srcOffset.x = 0;
4189 resolveRegion.srcOffset.y = 0;
4190 resolveRegion.srcOffset.z = 0;
4191 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4192 resolveRegion.dstSubresource.mipLevel = 0;
4193 resolveRegion.dstSubresource.baseArrayLayer = 0;
4194 resolveRegion.dstSubresource.layerCount = 1;
4195 resolveRegion.dstOffset.x = 0;
4196 resolveRegion.dstOffset.y = 0;
4197 resolveRegion.dstOffset.z = 0;
4198 resolveRegion.extent.width = 1;
4199 resolveRegion.extent.height = 1;
4200 resolveRegion.extent.depth = 1;
4201 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4202 &resolveRegion);
4203 m_commandBuffer->end();
4204
4205 m_errorMonitor->VerifyFound();
4206}
4207
4208TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004209 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004210
4211 ASSERT_NO_FATAL_FAILURE(Init());
4212
4213 // Create two images of sample count 4 and try to Resolve between them
4214
4215 VkImageCreateInfo image_create_info = {};
4216 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4217 image_create_info.pNext = NULL;
4218 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4219 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4220 image_create_info.extent.width = 32;
4221 image_create_info.extent.height = 1;
4222 image_create_info.extent.depth = 1;
4223 image_create_info.mipLevels = 1;
4224 image_create_info.arrayLayers = 1;
4225 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4226 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4227 // Note: Some implementations expect color attachment usage for any
4228 // multisample surface
4229 image_create_info.usage =
4230 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4231 image_create_info.flags = 0;
4232
4233 VkImageObj srcImage(m_device);
4234 srcImage.init(&image_create_info);
4235 ASSERT_TRUE(srcImage.initialized());
4236
4237 VkImageObj dstImage(m_device);
4238 dstImage.init(&image_create_info);
4239 ASSERT_TRUE(dstImage.initialized());
4240
4241 m_commandBuffer->begin();
4242 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4243 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4244 // VK_IMAGE_LAYOUT_GENERAL = 1,
4245 VkImageResolve resolveRegion;
4246 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4247 resolveRegion.srcSubresource.mipLevel = 0;
4248 resolveRegion.srcSubresource.baseArrayLayer = 0;
4249 resolveRegion.srcSubresource.layerCount = 1;
4250 resolveRegion.srcOffset.x = 0;
4251 resolveRegion.srcOffset.y = 0;
4252 resolveRegion.srcOffset.z = 0;
4253 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4254 resolveRegion.dstSubresource.mipLevel = 0;
4255 resolveRegion.dstSubresource.baseArrayLayer = 0;
4256 resolveRegion.dstSubresource.layerCount = 1;
4257 resolveRegion.dstOffset.x = 0;
4258 resolveRegion.dstOffset.y = 0;
4259 resolveRegion.dstOffset.z = 0;
4260 resolveRegion.extent.width = 1;
4261 resolveRegion.extent.height = 1;
4262 resolveRegion.extent.depth = 1;
4263 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4264 &resolveRegion);
4265 m_commandBuffer->end();
4266
4267 m_errorMonitor->VerifyFound();
4268}
4269
4270TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004271 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004272
4273 ASSERT_NO_FATAL_FAILURE(Init());
4274
4275 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004276 VkImageObj srcImage(m_device);
4277 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004278
4279 VkImageCreateInfo image_create_info = {};
4280 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4281 image_create_info.pNext = NULL;
4282 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4283 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4284 image_create_info.extent.width = 32;
4285 image_create_info.extent.height = 1;
4286 image_create_info.extent.depth = 1;
4287 image_create_info.mipLevels = 1;
4288 image_create_info.arrayLayers = 1;
4289 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4290 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4291 // Note: Some implementations expect color attachment usage for any
4292 // multisample surface
4293 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4294 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004295 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004296
4297 // Set format to something other than source image
4298 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4299 // Note: Some implementations expect color attachment usage for any
4300 // multisample surface
4301 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4302 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004303 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004304
4305 m_commandBuffer->begin();
4306 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4307 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4308 // VK_IMAGE_LAYOUT_GENERAL = 1,
4309 VkImageResolve resolveRegion;
4310 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4311 resolveRegion.srcSubresource.mipLevel = 0;
4312 resolveRegion.srcSubresource.baseArrayLayer = 0;
4313 resolveRegion.srcSubresource.layerCount = 1;
4314 resolveRegion.srcOffset.x = 0;
4315 resolveRegion.srcOffset.y = 0;
4316 resolveRegion.srcOffset.z = 0;
4317 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4318 resolveRegion.dstSubresource.mipLevel = 0;
4319 resolveRegion.dstSubresource.baseArrayLayer = 0;
4320 resolveRegion.dstSubresource.layerCount = 1;
4321 resolveRegion.dstOffset.x = 0;
4322 resolveRegion.dstOffset.y = 0;
4323 resolveRegion.dstOffset.z = 0;
4324 resolveRegion.extent.width = 1;
4325 resolveRegion.extent.height = 1;
4326 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004327 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4328 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004329 m_commandBuffer->end();
4330
4331 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004332}
4333
4334TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004335 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004336
4337 ASSERT_NO_FATAL_FAILURE(Init());
4338
4339 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004340 VkImageObj srcImage(m_device);
4341 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004342
4343 VkImageCreateInfo image_create_info = {};
4344 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4345 image_create_info.pNext = NULL;
4346 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4347 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4348 image_create_info.extent.width = 32;
4349 image_create_info.extent.height = 1;
4350 image_create_info.extent.depth = 1;
4351 image_create_info.mipLevels = 1;
4352 image_create_info.arrayLayers = 1;
4353 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4354 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4355 // Note: Some implementations expect color attachment usage for any
4356 // multisample surface
4357 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4358 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004359 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004360
4361 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4362 // Note: Some implementations expect color attachment usage for any
4363 // multisample surface
4364 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4365 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004366 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004367
4368 m_commandBuffer->begin();
4369 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4370 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4371 // VK_IMAGE_LAYOUT_GENERAL = 1,
4372 VkImageResolve resolveRegion;
4373 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4374 resolveRegion.srcSubresource.mipLevel = 0;
4375 resolveRegion.srcSubresource.baseArrayLayer = 0;
4376 resolveRegion.srcSubresource.layerCount = 1;
4377 resolveRegion.srcOffset.x = 0;
4378 resolveRegion.srcOffset.y = 0;
4379 resolveRegion.srcOffset.z = 0;
4380 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4381 resolveRegion.dstSubresource.mipLevel = 0;
4382 resolveRegion.dstSubresource.baseArrayLayer = 0;
4383 resolveRegion.dstSubresource.layerCount = 1;
4384 resolveRegion.dstOffset.x = 0;
4385 resolveRegion.dstOffset.y = 0;
4386 resolveRegion.dstOffset.z = 0;
4387 resolveRegion.extent.width = 1;
4388 resolveRegion.extent.height = 1;
4389 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004390 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4391 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004392 m_commandBuffer->end();
4393
4394 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004395}
4396
4397TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4398 ASSERT_NO_FATAL_FAILURE(Init());
4399
4400 // Create two images of different types and try to copy between them
4401 VkImageObj srcImage(m_device);
4402 VkImageObj dstImage(m_device);
4403
4404 VkImageCreateInfo image_create_info = {};
4405 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4406 image_create_info.pNext = NULL;
4407 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4408 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4409 image_create_info.extent.width = 32;
4410 image_create_info.extent.height = 32;
4411 image_create_info.extent.depth = 1;
4412 image_create_info.mipLevels = 1;
4413 image_create_info.arrayLayers = 1;
4414 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4415 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4416 image_create_info.usage =
4417 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4418 // Note: Some implementations expect color attachment usage for any
4419 // multisample surface
4420 image_create_info.flags = 0;
4421 srcImage.init(&image_create_info);
4422 ASSERT_TRUE(srcImage.initialized());
4423
4424 // Note: Some implementations expect color attachment usage for any
4425 // multisample surface
4426 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4427 dstImage.init(&image_create_info);
4428 ASSERT_TRUE(dstImage.initialized());
4429
4430 m_commandBuffer->begin();
4431 // source image must have valid contents before resolve
4432 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4433 VkImageSubresourceRange subresource = {};
4434 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4435 subresource.layerCount = 1;
4436 subresource.levelCount = 1;
4437 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4438 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4439 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4440 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4441
4442 VkImageResolve resolveRegion;
4443 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4444 resolveRegion.srcSubresource.mipLevel = 0;
4445 resolveRegion.srcSubresource.baseArrayLayer = 0;
4446 resolveRegion.srcSubresource.layerCount = 1;
4447 resolveRegion.srcOffset.x = 0;
4448 resolveRegion.srcOffset.y = 0;
4449 resolveRegion.srcOffset.z = 0;
4450 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4451 resolveRegion.dstSubresource.mipLevel = 0;
4452 resolveRegion.dstSubresource.baseArrayLayer = 0;
4453 resolveRegion.dstSubresource.layerCount = 1;
4454 resolveRegion.dstOffset.x = 0;
4455 resolveRegion.dstOffset.y = 0;
4456 resolveRegion.dstOffset.z = 0;
4457 resolveRegion.extent.width = 1;
4458 resolveRegion.extent.height = 1;
4459 resolveRegion.extent.depth = 1;
4460 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004461 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004462 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4463 1, &resolveRegion);
4464 m_errorMonitor->VerifyFound();
4465 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004466 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004467 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4468 1, &resolveRegion);
4469 m_errorMonitor->VerifyFound();
4470 m_commandBuffer->end();
4471}
4472
4473TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004474 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4475
4476 bool copy_commands2 = false;
4477 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4478 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4479 copy_commands2 = true;
4480 }
4481 ASSERT_NO_FATAL_FAILURE(InitState());
4482
4483 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4484 if (copy_commands2) {
4485 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4486 }
unknown088160a2019-05-23 17:43:13 -06004487
4488 // Create two images of different types and try to copy between them
4489 VkImageObj srcImage(m_device);
4490 VkImageObj dstImage(m_device);
4491
4492 VkImageCreateInfo image_create_info = {};
4493 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4494 image_create_info.pNext = NULL;
4495 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4496 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4497 image_create_info.extent.width = 32;
4498 image_create_info.extent.height = 32;
4499 image_create_info.extent.depth = 1;
4500 image_create_info.mipLevels = 1;
4501 image_create_info.arrayLayers = 1;
4502 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4503 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4504 image_create_info.usage =
4505 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4506 // Note: Some implementations expect color attachment usage for any
4507 // multisample surface
4508 image_create_info.flags = 0;
4509 srcImage.init(&image_create_info);
4510 ASSERT_TRUE(srcImage.initialized());
4511
4512 // Note: Some implementations expect color attachment usage for any
4513 // multisample surface
4514 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4515 dstImage.init(&image_create_info);
4516 ASSERT_TRUE(dstImage.initialized());
4517
4518 m_commandBuffer->begin();
4519 // source image must have valid contents before resolve
4520 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4521 VkImageSubresourceRange subresource = {};
4522 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4523 subresource.layerCount = 1;
4524 subresource.levelCount = 1;
4525 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4526 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4527 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4528 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4529
4530 VkImageResolve resolveRegion;
4531 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4532 resolveRegion.srcSubresource.mipLevel = 0;
4533 resolveRegion.srcSubresource.baseArrayLayer = 0;
4534 resolveRegion.srcSubresource.layerCount = 1;
4535 resolveRegion.srcOffset.x = 0;
4536 resolveRegion.srcOffset.y = 0;
4537 resolveRegion.srcOffset.z = 0;
4538 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4539 resolveRegion.dstSubresource.mipLevel = 0;
4540 resolveRegion.dstSubresource.baseArrayLayer = 0;
4541 resolveRegion.dstSubresource.layerCount = 1;
4542 resolveRegion.dstOffset.x = 0;
4543 resolveRegion.dstOffset.y = 0;
4544 resolveRegion.dstOffset.z = 0;
4545 resolveRegion.extent.width = 1;
4546 resolveRegion.extent.height = 1;
4547 resolveRegion.extent.depth = 1;
4548 // invalid source mip level
4549 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004550 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004551 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4552 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4553 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004554
4555 // Equivalent test using KHR_copy_commands2
4556 if (copy_commands2 && vkCmdResolveImage2Function) {
4557 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4558 NULL,
4559 resolveRegion.srcSubresource,
4560 resolveRegion.srcOffset,
4561 resolveRegion.dstSubresource,
4562 resolveRegion.dstOffset,
4563 resolveRegion.extent};
4564 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4565 NULL,
4566 srcImage.image(),
4567 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4568 dstImage.image(),
4569 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4570 1,
4571 &resolveRegion2};
4572 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01709");
4573 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4574 m_errorMonitor->VerifyFound();
4575 }
4576
unknown088160a2019-05-23 17:43:13 -06004577 resolveRegion.srcSubresource.mipLevel = 0;
4578 // invalid dest mip level
4579 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004580 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004581 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4582 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4583 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004584
4585 // Equivalent test using KHR_copy_commands2
4586 if (copy_commands2 && vkCmdResolveImage2Function) {
4587 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4588 NULL,
4589 resolveRegion.srcSubresource,
4590 resolveRegion.srcOffset,
4591 resolveRegion.dstSubresource,
4592 resolveRegion.dstOffset,
4593 resolveRegion.extent};
4594 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4595 NULL,
4596 srcImage.image(),
4597 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4598 dstImage.image(),
4599 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4600 1,
4601 &resolveRegion2};
4602 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01710");
4603 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4604 m_errorMonitor->VerifyFound();
4605 }
4606
unknown088160a2019-05-23 17:43:13 -06004607 resolveRegion.dstSubresource.mipLevel = 0;
4608 // invalid source array layer range
4609 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004610 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004611 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4612 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4613 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004614
4615 // Equivalent test using KHR_copy_commands2
4616 if (copy_commands2 && vkCmdResolveImage2Function) {
4617 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4618 NULL,
4619 resolveRegion.srcSubresource,
4620 resolveRegion.srcOffset,
4621 resolveRegion.dstSubresource,
4622 resolveRegion.dstOffset,
4623 resolveRegion.extent};
4624 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4625 NULL,
4626 srcImage.image(),
4627 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4628 dstImage.image(),
4629 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4630 1,
4631 &resolveRegion2};
4632 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01711");
4633 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4634 m_errorMonitor->VerifyFound();
4635 }
4636
unknown088160a2019-05-23 17:43:13 -06004637 resolveRegion.srcSubresource.baseArrayLayer = 0;
4638 // invalid dest array layer range
4639 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004640 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004641 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4642 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4643 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004644
4645 // Equivalent test using KHR_copy_commands2
4646 if (copy_commands2 && vkCmdResolveImage2Function) {
4647 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4648 NULL,
4649 resolveRegion.srcSubresource,
4650 resolveRegion.srcOffset,
4651 resolveRegion.dstSubresource,
4652 resolveRegion.dstOffset,
4653 resolveRegion.extent};
4654 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4655 NULL,
4656 srcImage.image(),
4657 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4658 dstImage.image(),
4659 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4660 1,
4661 &resolveRegion2};
4662 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01712");
4663 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4664 m_errorMonitor->VerifyFound();
4665 }
4666
unknown088160a2019-05-23 17:43:13 -06004667 resolveRegion.dstSubresource.baseArrayLayer = 0;
4668
4669 m_commandBuffer->end();
4670}
4671
sfricke-samsungf78d0592020-06-11 21:34:44 -07004672TEST_F(VkLayerTest, ResolveImageImageType) {
4673 ASSERT_NO_FATAL_FAILURE(Init());
4674 // Create images of different types and try to resolve between them
4675 VkImageObj srcImage2D(m_device);
4676 VkImageObj dstImage1D(m_device);
4677 VkImageObj dstImage3D(m_device);
4678
4679 VkImageCreateInfo image_create_info = {};
4680 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4681 image_create_info.pNext = NULL;
4682 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4683 image_create_info.extent.width = 32;
4684 image_create_info.extent.height = 1;
4685 image_create_info.extent.depth = 1;
4686 image_create_info.mipLevels = 1;
4687 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
4688 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4689 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4690 image_create_info.usage =
4691 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4692 // Note: Some implementations expect color attachment usage for any
4693 // multisample surface
4694 image_create_info.flags = 0;
4695
4696 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4697 srcImage2D.init(&image_create_info);
4698 ASSERT_TRUE(srcImage2D.initialized());
4699
4700 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4701 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4702 dstImage1D.init(&image_create_info);
4703 ASSERT_TRUE(dstImage1D.initialized());
4704
4705 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4706 image_create_info.extent.height = 16;
4707 image_create_info.extent.depth = 16;
4708 image_create_info.arrayLayers = 1;
4709 dstImage3D.init(&image_create_info);
4710 ASSERT_TRUE(dstImage3D.initialized());
4711
4712 m_commandBuffer->begin();
4713
4714 VkImageResolve resolveRegion;
4715 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4716 resolveRegion.srcSubresource.mipLevel = 0;
4717 resolveRegion.srcSubresource.baseArrayLayer = 0;
4718 resolveRegion.srcSubresource.layerCount = 1;
4719 resolveRegion.srcOffset.x = 0;
4720 resolveRegion.srcOffset.y = 0;
4721 resolveRegion.srcOffset.z = 0;
4722 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4723 resolveRegion.dstSubresource.mipLevel = 0;
4724 resolveRegion.dstSubresource.baseArrayLayer = 0;
4725 resolveRegion.dstSubresource.layerCount = 1;
4726 resolveRegion.dstOffset.x = 0;
4727 resolveRegion.dstOffset.y = 0;
4728 resolveRegion.dstOffset.z = 0;
4729 resolveRegion.extent.width = 1;
4730 resolveRegion.extent.height = 1;
4731 resolveRegion.extent.depth = 1;
4732
4733 // non-zero value baseArrayLayer
4734 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004736 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4737 &resolveRegion);
4738 m_errorMonitor->VerifyFound();
4739 resolveRegion.srcSubresource.baseArrayLayer = 0;
4740
4741 // Set height with 1D dstImage
4742 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004743 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004744 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004747 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4748 &resolveRegion);
4749 m_errorMonitor->VerifyFound();
4750 resolveRegion.extent.height = 1;
4751
4752 // Set depth with 1D dstImage and 2D srcImage
4753 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004754 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4755 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004756 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4757 &resolveRegion);
4758 m_errorMonitor->VerifyFound();
4759 resolveRegion.extent.depth = 1;
4760
4761 m_commandBuffer->end();
4762}
4763
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004764TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4765 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4766 ASSERT_NO_FATAL_FAILURE(Init());
4767
4768 VkImageObj srcImage2D(m_device);
4769 VkImageObj dstImage2D(m_device);
4770
4771 VkImageCreateInfo image_create_info = {};
4772 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4773 image_create_info.pNext = NULL;
4774 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4775 image_create_info.extent.width = 32;
4776 image_create_info.extent.height = 32;
4777 image_create_info.extent.depth = 1;
4778 image_create_info.mipLevels = 6; // full chain from 32x32 to 1x1
4779 image_create_info.arrayLayers = 1;
4780 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4781 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4782 image_create_info.usage =
4783 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4784 // Note: Some implementations expect color attachment usage for any
4785 // multisample surface
4786 image_create_info.flags = 0;
4787
4788 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4789 srcImage2D.init(&image_create_info);
4790 ASSERT_TRUE(srcImage2D.initialized());
4791
4792 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4793 dstImage2D.init(&image_create_info);
4794 ASSERT_TRUE(dstImage2D.initialized());
4795
4796 m_commandBuffer->begin();
4797
4798 VkImageResolve resolveRegion = {};
4799 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4800 resolveRegion.srcSubresource.mipLevel = 0;
4801 resolveRegion.srcSubresource.baseArrayLayer = 0;
4802 resolveRegion.srcSubresource.layerCount = 1;
4803 resolveRegion.srcOffset.x = 0;
4804 resolveRegion.srcOffset.y = 0;
4805 resolveRegion.srcOffset.z = 0;
4806 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4807 resolveRegion.dstSubresource.mipLevel = 0;
4808 resolveRegion.dstSubresource.baseArrayLayer = 0;
4809 resolveRegion.dstSubresource.layerCount = 1;
4810 resolveRegion.dstOffset.x = 0;
4811 resolveRegion.dstOffset.y = 0;
4812 resolveRegion.dstOffset.z = 0;
4813 resolveRegion.extent.width = 32;
4814 resolveRegion.extent.height = 32;
4815 resolveRegion.extent.depth = 1;
4816
4817 m_errorMonitor->ExpectSuccess();
4818 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4819 &resolveRegion);
4820 m_errorMonitor->VerifyNotFound();
4821
4822 // srcImage exceeded in x-dim
4823 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004824 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004825 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4826 &resolveRegion);
4827 m_errorMonitor->VerifyFound();
4828 resolveRegion.srcOffset.x = 0;
4829
4830 // dstImage exceeded in x-dim
4831 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004832 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004833 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4834 &resolveRegion);
4835 m_errorMonitor->VerifyFound();
4836 resolveRegion.dstOffset.x = 0;
4837
4838 // both image exceeded in y-dim because mipLevel 3 is a 4x4 size image
4839 resolveRegion.extent = {4, 8, 1};
4840 resolveRegion.srcSubresource.mipLevel = 3;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004841 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004842 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4843 &resolveRegion);
4844 m_errorMonitor->VerifyFound();
4845 resolveRegion.srcSubresource.mipLevel = 0;
4846
4847 resolveRegion.dstSubresource.mipLevel = 3;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004848 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004849 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4850 &resolveRegion);
4851 m_errorMonitor->VerifyFound();
4852 resolveRegion.dstSubresource.mipLevel = 0;
4853
4854 // srcImage exceeded in z-dim
4855 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004856 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4857 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004858 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4859 &resolveRegion);
4860 m_errorMonitor->VerifyFound();
4861 resolveRegion.srcOffset.z = 0;
4862
4863 // dstImage exceeded in z-dim
4864 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004865 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4866 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004867 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4868 &resolveRegion);
4869 m_errorMonitor->VerifyFound();
4870 resolveRegion.dstOffset.z = 0;
4871
4872 m_commandBuffer->end();
4873}
4874
unknown088160a2019-05-23 17:43:13 -06004875TEST_F(VkLayerTest, ClearImageErrors) {
4876 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4877
4878 ASSERT_NO_FATAL_FAILURE(Init());
4879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4880
4881 m_commandBuffer->begin();
4882
4883 // Color image
4884 VkClearColorValue clear_color;
4885 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4886 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4887 const int32_t img_width = 32;
4888 const int32_t img_height = 32;
4889 VkImageCreateInfo image_create_info = {};
4890 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4891 image_create_info.pNext = NULL;
4892 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4893 image_create_info.format = color_format;
4894 image_create_info.extent.width = img_width;
4895 image_create_info.extent.height = img_height;
4896 image_create_info.extent.depth = 1;
4897 image_create_info.mipLevels = 1;
4898 image_create_info.arrayLayers = 1;
4899 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4900 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4901
4902 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4903 vk_testing::Image color_image_no_transfer;
4904 color_image_no_transfer.init(*m_device, image_create_info);
4905
4906 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4907 vk_testing::Image color_image;
4908 color_image.init(*m_device, image_create_info);
4909
4910 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4911
4912 // Depth/Stencil image
4913 VkClearDepthStencilValue clear_value = {0};
4914 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4915 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4916 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4917 ds_image_create_info.extent.width = 64;
4918 ds_image_create_info.extent.height = 64;
4919 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4920 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4921
4922 vk_testing::Image ds_image;
4923 ds_image.init(*m_device, ds_image_create_info);
4924
4925 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
4926
sfricke-samsungcd924d92020-05-20 23:51:17 -07004927 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06004928
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004929 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06004930
4931 m_errorMonitor->VerifyFound();
4932
sfricke-samsungcd924d92020-05-20 23:51:17 -07004933 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06004934
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004935 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
4936 &color_range);
unknown088160a2019-05-23 17:43:13 -06004937
4938 m_errorMonitor->VerifyFound();
4939
4940 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07004941 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07004942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06004943
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004944 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4945 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06004946
4947 m_errorMonitor->VerifyFound();
4948}
4949
4950TEST_F(VkLayerTest, CommandQueueFlags) {
4951 TEST_DESCRIPTION(
4952 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
4953
4954 ASSERT_NO_FATAL_FAILURE(Init());
4955
4956 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4957 if (queueFamilyIndex == UINT32_MAX) {
4958 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4959 return;
4960 } else {
4961 // Create command pool on a non-graphics queue
4962 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
4963
4964 // Setup command buffer on pool
4965 VkCommandBufferObj command_buffer(m_device, &command_pool);
4966 command_buffer.begin();
4967
4968 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07004969 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06004970 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4971 command_buffer.SetViewport(0, 1, &viewport);
4972 m_errorMonitor->VerifyFound();
4973 }
4974}
4975
sfricke-samsung674ba102020-08-18 22:38:49 -07004976TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
4977 TEST_DESCRIPTION(
4978 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
4979 "buffer");
4980
4981 ASSERT_NO_FATAL_FAILURE(Init());
4982
4983 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4984 if (queueFamilyIndex == UINT32_MAX) {
4985 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4986 return;
4987 } else {
4988 // Create Depth image
4989 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
4990 if (ds_format == VK_FORMAT_UNDEFINED) {
4991 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
4992 return;
4993 }
4994
4995 VkImageObj ds_image(m_device);
4996 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
4997 VK_IMAGE_TILING_OPTIMAL, 0);
4998 ASSERT_TRUE(ds_image.initialized());
4999
5000 // Allocate buffers
5001 VkBufferObj buffer;
5002 VkMemoryPropertyFlags reqs = 0;
5003 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5004
5005 VkBufferImageCopy region = {};
5006 region.bufferRowLength = 0;
5007 region.bufferImageHeight = 0;
5008 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5009 region.imageSubresource.layerCount = 1;
5010 region.imageOffset = {0, 0, 0};
5011 region.imageExtent = {64, 64, 1};
5012 region.bufferOffset = 0;
5013
5014 // Create command pool on a non-graphics queue
5015 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5016
5017 // Setup command buffer on pool
5018 VkCommandBufferObj command_buffer(m_device, &command_pool);
5019 command_buffer.begin();
5020
sfricke-samsungea4fd142020-10-17 23:51:59 -07005021 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005022 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5023 1, &region);
5024 m_errorMonitor->VerifyFound();
5025 }
5026}
5027
unknown088160a2019-05-23 17:43:13 -06005028TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5029 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5030 ASSERT_NO_FATAL_FAILURE(Init());
5031 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5032 // never record secondary
5033
Mark Lobodzinski20310782020-02-28 14:25:17 -07005034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005035 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005036 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005037 m_errorMonitor->VerifyFound();
5038 m_commandBuffer->end();
5039}
5040
5041TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5042 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5043
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005044 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005045 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5046
5047 VkImageCreateInfo image_create_info = {};
5048 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5049 image_create_info.pNext = NULL;
5050 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5051 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5052 image_create_info.extent.width = 32;
5053 image_create_info.extent.height = 1;
5054 image_create_info.extent.depth = 1;
5055 image_create_info.mipLevels = 1;
5056 image_create_info.arrayLayers = 1;
5057 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5058 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5059 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5060 image_create_info.flags = 0;
5061
5062 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5063 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5064
5065 VkImageObj image(m_device);
5066 image.init(&image_create_info);
5067 ASSERT_TRUE(image.initialized());
5068 VkImageMemoryBarrier image_barrier =
5069 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5070
5071 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5072 image_barrier.oldLayout = old_layout;
5073 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005074 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5075 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005076 };
5077
5078 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5079 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5080 secondary.begin();
5081 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5082 secondary.end();
5083
Mark Lobodzinski20310782020-02-28 14:25:17 -07005084 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005085 m_commandBuffer->begin();
5086 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005087 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005088 m_errorMonitor->VerifyFound();
5089
unknown088160a2019-05-23 17:43:13 -06005090 m_commandBuffer->reset();
5091 secondary.reset();
5092
5093 // Validate that UNDEFINED doesn't false positive on us
5094 secondary.begin();
5095 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5096 secondary.end();
5097 m_commandBuffer->begin();
5098 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5099 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005100 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005101 m_errorMonitor->VerifyNotFound();
5102 m_commandBuffer->end();
5103}
5104
5105TEST_F(VkLayerTest, SetDynViewportParamTests) {
5106 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5107
5108 SetTargetApiVersion(VK_API_VERSION_1_1);
5109 VkPhysicalDeviceFeatures features{};
5110 ASSERT_NO_FATAL_FAILURE(Init(&features));
5111
5112 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5113 const VkViewport viewports[] = {vp, vp};
5114
5115 m_commandBuffer->begin();
5116
5117 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005118 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005119 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005120 m_errorMonitor->VerifyFound();
5121
Mark Lobodzinski20310782020-02-28 14:25:17 -07005122 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005123 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005124 m_errorMonitor->VerifyFound();
5125
Mark Lobodzinski20310782020-02-28 14:25:17 -07005126 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005127 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005128 m_errorMonitor->VerifyFound();
5129
Mark Lobodzinski20310782020-02-28 14:25:17 -07005130 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5131 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005132 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005133 m_errorMonitor->VerifyFound();
5134
Mark Lobodzinski20310782020-02-28 14:25:17 -07005135 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005136 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005137 m_errorMonitor->VerifyFound();
5138
5139 // core viewport tests
5140 using std::vector;
5141 struct TestCase {
5142 VkViewport vp;
5143 std::string veid;
5144 };
5145
5146 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5147 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5148 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5149
5150 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5151 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5152 const auto one_before_min_bounds = NearestSmaller(min_bound);
5153 const auto one_past_max_bounds = NearestGreater(max_bound);
5154
5155 const auto below_zero = NearestSmaller(0.0f);
5156 const auto past_one = NearestGreater(1.0f);
5157
5158 vector<TestCase> test_cases = {
5159 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5160 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5161 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5162 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5163 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5164 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5165 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5166 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5167 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5168 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5169 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5170 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5171 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5172 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5173 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5174 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5175 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5176 };
5177
5178 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5179 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5180 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5181 } else {
5182 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5183 }
5184
5185 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005186 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005187 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005188 m_errorMonitor->VerifyFound();
5189 }
5190}
5191
5192TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5193 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5194
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005195 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005196
5197 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
5198 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
5199 } else {
5200 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5201 return;
5202 }
5203 ASSERT_NO_FATAL_FAILURE(InitState());
5204
5205 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5206}
5207
5208TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5209 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5210
5211 ASSERT_NO_FATAL_FAILURE(Init());
5212
5213 if (!m_device->phy().features().multiViewport) {
5214 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5215 return;
5216 }
5217
unknown088160a2019-05-23 17:43:13 -06005218 m_commandBuffer->begin();
5219
Mark Lobodzinski20310782020-02-28 14:25:17 -07005220 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005221 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005222 m_errorMonitor->VerifyFound();
5223
Petr Kraus14e49492019-09-09 20:13:29 +02005224 const auto max_viewports = m_device->props.limits.maxViewports;
5225
Mark Lobodzinski20310782020-02-28 14:25:17 -07005226 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005227 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005228 m_errorMonitor->VerifyFound();
5229
Petr Kraus14e49492019-09-09 20:13:29 +02005230 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5231 if (max_viewports >= too_big_max_viewports) {
5232 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5233 kSkipPrefix);
5234 } else {
5235 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5236 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5237
Mark Lobodzinski20310782020-02-28 14:25:17 -07005238 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005239 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005240 m_errorMonitor->VerifyFound();
5241
Mark Lobodzinski20310782020-02-28 14:25:17 -07005242 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005243 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005244 m_errorMonitor->VerifyFound();
5245
Mark Lobodzinski20310782020-02-28 14:25:17 -07005246 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005247 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005248 m_errorMonitor->VerifyFound();
5249
Mark Lobodzinski20310782020-02-28 14:25:17 -07005250 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005251 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005252 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005253 }
unknown088160a2019-05-23 17:43:13 -06005254}
5255
5256TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5257 TEST_DESCRIPTION(
5258 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5259
5260 ASSERT_NO_FATAL_FAILURE(Init());
5261 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5262
5263 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5264 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5265
5266 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5267 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5268 nullptr, // pNext
5269 m_renderPass,
5270 0, // subpass
5271 m_framebuffer,
5272 };
5273 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5274 nullptr, // pNext
5275 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5276
5277 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5278 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5279 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5280 sec_cmdbuff_inside_rp.end();
5281
5282 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5283 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5284 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5285 sec_cmdbuff_outside_rp.end();
5286
5287 m_commandBuffer->begin();
5288
Mark Lobodzinski20310782020-02-28 14:25:17 -07005289 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005290 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005291 m_errorMonitor->VerifyFound();
5292
5293 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5294 nullptr, // pNext
5295 m_renderPass,
5296 m_framebuffer,
5297 {{0, 0}, {32, 32}},
5298 static_cast<uint32_t>(m_renderPassClearValues.size()),
5299 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005300 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005301
Mark Lobodzinski20310782020-02-28 14:25:17 -07005302 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005303 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005304 m_errorMonitor->VerifyFound();
5305}
5306
5307TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5308 TEST_DESCRIPTION(
5309 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5310 ASSERT_NO_FATAL_FAILURE(Init());
5311 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5312
5313 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
5314 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5315 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5316 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5317 command_buffer_allocate_info.commandBufferCount = 1;
5318
5319 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005320 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
unknown088160a2019-05-23 17:43:13 -06005321 VkCommandBufferBeginInfo command_buffer_begin_info = {};
5322 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
5323 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5324 command_buffer_inheritance_info.renderPass = m_renderPass;
5325 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5326
5327 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5328 command_buffer_begin_info.flags =
5329 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5330 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5331
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005332 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005333 VkClearAttachment color_attachment;
5334 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5335 color_attachment.clearValue.color.float32[0] = 0;
5336 color_attachment.clearValue.color.float32[1] = 0;
5337 color_attachment.clearValue.color.float32[2] = 0;
5338 color_attachment.clearValue.color.float32[3] = 0;
5339 color_attachment.colorAttachment = 0;
5340 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005341 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005342 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5343 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005344 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005345 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005346
Mark Lobodzinski20310782020-02-28 14:25:17 -07005347 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005348 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005349 m_errorMonitor->VerifyFound();
5350
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005351 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005352 m_commandBuffer->end();
5353}
5354
5355TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5356 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
5357 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5358 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5359 } else {
5360 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5361 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5362 return;
5363 }
5364
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005365 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005366 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5367 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5368 } else {
5369 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5370 return;
5371 }
5372 ASSERT_NO_FATAL_FAILURE(InitState());
5373
5374 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5375 if (push_descriptor_prop.maxPushDescriptors < 1) {
5376 // Some implementations report an invalid maxPushDescriptors of 0
5377 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5378 return;
5379 }
5380
5381 // Create ordinary and push descriptor set layout
5382 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5383 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5384 ASSERT_TRUE(ds_layout.initialized());
5385 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5386 ASSERT_TRUE(push_ds_layout.initialized());
5387
5388 // Now use the descriptor set layouts to create a pipeline layout
5389 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5390 ASSERT_TRUE(pipeline_layout.initialized());
5391
5392 // Create a descriptor to push
5393 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5394 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5395 ASSERT_TRUE(buffer_obj.initialized());
5396
5397 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5398 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5399 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5400
5401 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5402 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5403
5404 // Find address of extension call and make the call
5405 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005406 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005407 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5408
5409 // Section 1: Queue family matching/capabilities.
5410 // Create command pool on a non-graphics queue
5411 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5412 const uint32_t transfer_only_qfi =
5413 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5414 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005415 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005416 } else {
5417 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5418
5419 VkCommandPoolObj command_pool(m_device, err_qfi);
5420 ASSERT_TRUE(command_pool.initialized());
5421 VkCommandBufferObj command_buffer(m_device, &command_pool);
5422 ASSERT_TRUE(command_buffer.initialized());
5423 command_buffer.begin();
5424
Mark Lobodzinski20310782020-02-28 14:25:17 -07005425 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5426 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005427 if (err_qfi == transfer_only_qfi) {
5428 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005429 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005430 }
5431 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5432 &descriptor_write);
5433 m_errorMonitor->VerifyFound();
5434 command_buffer.end();
5435
5436 // If we succeed in testing only one condition above, we need to test the other below.
5437 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5438 // Need to test the neither compute/gfx supported case separately.
5439 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5440 ASSERT_TRUE(tran_command_pool.initialized());
5441 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5442 ASSERT_TRUE(tran_command_buffer.initialized());
5443 tran_command_buffer.begin();
5444
5445 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005446 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5447 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5448 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005449 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5450 &descriptor_write);
5451 m_errorMonitor->VerifyFound();
5452 tran_command_buffer.end();
5453 }
5454 }
5455
5456 // Push to the non-push binding
5457 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005458 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005459 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5460 &descriptor_write);
5461 m_errorMonitor->VerifyFound();
5462
5463 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005464 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005465 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5466 &descriptor_write);
5467 m_errorMonitor->VerifyFound();
5468 m_commandBuffer->end();
5469
5470 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5471 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005472 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005473 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR()");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005474 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005475 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5476 &descriptor_write);
5477 m_errorMonitor->VerifyFound();
5478}
5479
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005480TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5481 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5482 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5483 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5484 } else {
5485 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5486 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5487 return;
5488 }
5489
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005490 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005491 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5492 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5493 } else {
5494 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5495 return;
5496 }
5497 ASSERT_NO_FATAL_FAILURE(InitState());
5498
5499 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5500 if (push_descriptor_prop.maxPushDescriptors < 1) {
5501 // Some implementations report an invalid maxPushDescriptors of 0.
5502 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5503 return;
5504 }
5505
5506 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5507 if (min_alignment == 0) {
5508 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5509 return;
5510 }
5511
5512 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5513 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5514 ASSERT_TRUE(push_ds_layout.initialized());
5515
5516 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5517 ASSERT_TRUE(pipeline_layout.initialized());
5518
5519 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5520 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5521 ASSERT_TRUE(buffer_obj.initialized());
5522
5523 // Use an invalid alignment.
5524 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5525 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5526 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5527
5528 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5529 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5530 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5531
5532 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005533 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005534 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5535 &descriptor_write);
5536 m_errorMonitor->VerifyFound();
5537
5538 m_commandBuffer->end();
5539}
5540
unknown088160a2019-05-23 17:43:13 -06005541TEST_F(VkLayerTest, SetDynScissorParamTests) {
5542 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5543
5544 VkPhysicalDeviceFeatures features{};
5545 ASSERT_NO_FATAL_FAILURE(Init(&features));
5546
5547 const VkRect2D scissor = {{0, 0}, {16, 16}};
5548 const VkRect2D scissors[] = {scissor, scissor};
5549
5550 m_commandBuffer->begin();
5551
5552 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005553 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005554 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005555 m_errorMonitor->VerifyFound();
5556
Mark Lobodzinski20310782020-02-28 14:25:17 -07005557 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005558 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005559 m_errorMonitor->VerifyFound();
5560
Mark Lobodzinski20310782020-02-28 14:25:17 -07005561 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005562 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005563 m_errorMonitor->VerifyFound();
5564
Mark Lobodzinski20310782020-02-28 14:25:17 -07005565 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005567 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005568 m_errorMonitor->VerifyFound();
5569
Mark Lobodzinski20310782020-02-28 14:25:17 -07005570 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005571 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005572 m_errorMonitor->VerifyFound();
5573
5574 struct TestCase {
5575 VkRect2D scissor;
5576 std::string vuid;
5577 };
5578
5579 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5580 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5581 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5582 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5583 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5584 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5585 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5586 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5587
5588 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005589 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005590 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005591 m_errorMonitor->VerifyFound();
5592 }
5593
5594 m_commandBuffer->end();
5595}
5596
5597TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5598 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5599
5600 ASSERT_NO_FATAL_FAILURE(Init());
5601
5602 if (!m_device->phy().features().multiViewport) {
5603 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5604 return;
5605 }
5606
unknown088160a2019-05-23 17:43:13 -06005607 m_commandBuffer->begin();
5608
Mark Lobodzinski20310782020-02-28 14:25:17 -07005609 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005610 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005611 m_errorMonitor->VerifyFound();
5612
Petr Kraus14e49492019-09-09 20:13:29 +02005613 const auto max_scissors = m_device->props.limits.maxViewports;
5614
Mark Lobodzinski20310782020-02-28 14:25:17 -07005615 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005616 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005617 m_errorMonitor->VerifyFound();
5618
Petr Kraus14e49492019-09-09 20:13:29 +02005619 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5620 if (max_scissors >= too_big_max_scissors) {
5621 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5622 kSkipPrefix);
5623 } else {
5624 const VkRect2D scissor = {{0, 0}, {16, 16}};
5625 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5626
Mark Lobodzinski20310782020-02-28 14:25:17 -07005627 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005628 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005629 m_errorMonitor->VerifyFound();
5630
Mark Lobodzinski20310782020-02-28 14:25:17 -07005631 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005632 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005633 m_errorMonitor->VerifyFound();
5634
Mark Lobodzinski20310782020-02-28 14:25:17 -07005635 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005636 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005637 m_errorMonitor->VerifyFound();
5638
Mark Lobodzinski20310782020-02-28 14:25:17 -07005639 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005640 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005641 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005642 }
unknown088160a2019-05-23 17:43:13 -06005643}
5644
5645TEST_F(VkLayerTest, DrawIndirect) {
5646 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect");
5647
5648 ASSERT_NO_FATAL_FAILURE(Init());
5649 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5650
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005651 CreatePipelineHelper pipe(*this);
5652 pipe.InitInfo();
5653 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5654 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5655 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5656 dyn_state_ci.dynamicStateCount = size(dyn_states);
5657 dyn_state_ci.pDynamicStates = dyn_states;
5658 pipe.dyn_state_ci_ = dyn_state_ci;
5659 pipe.InitState();
5660 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005661
5662 m_commandBuffer->begin();
5663 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5664
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005665 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5666 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5667 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005668
5669 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005670 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005671 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005672 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005673
5674 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5675 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5676 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005677 VkBufferObj draw_buffer;
5678 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005679
5680 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07005681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005682 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005683 m_errorMonitor->VerifyFound();
5684
5685 m_commandBuffer->EndRenderPass();
5686 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06005687}
5688
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005689TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
5690 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
5691
5692 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5693 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5694 } else {
5695 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5696 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5697 return;
5698 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005699 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005700
5701 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
5702 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5703 } else {
5704 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07005705 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005706 }
5707
5708 ASSERT_NO_FATAL_FAILURE(InitState());
5709 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5710
5711 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
5712 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
5713
5714 m_commandBuffer->begin();
5715 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5716 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5717 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5718 buffer_create_info.size = 1024;
5719 VkBufferObj counter_buffer;
5720 counter_buffer.init(*m_device, buffer_create_info);
5721
5722 // VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289
Mark Lobodzinski20310782020-02-28 14:25:17 -07005723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005724 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 0xCADECADE);
5725 m_errorMonitor->VerifyFound();
5726
5727 m_commandBuffer->EndRenderPass();
5728 m_commandBuffer->end();
5729}
5730
unknown088160a2019-05-23 17:43:13 -06005731TEST_F(VkLayerTest, DrawIndirectCountKHR) {
5732 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
5733
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005734 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005735 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
5736 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
5737 } else {
5738 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
5739 return;
5740 }
5741 ASSERT_NO_FATAL_FAILURE(InitState());
5742 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5743
5744 VkMemoryRequirements memory_requirements;
5745 VkMemoryAllocateInfo memory_allocate_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
5746
5747 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005748 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06005749
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005750 CreatePipelineHelper pipe(*this);
5751 pipe.InitInfo();
5752 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5753 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5754 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5755 dyn_state_ci.dynamicStateCount = size(dyn_states);
5756 dyn_state_ci.pDynamicStates = dyn_states;
5757 pipe.dyn_state_ci_ = dyn_state_ci;
5758 pipe.InitState();
5759 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005760
5761 m_commandBuffer->begin();
5762 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5763
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005764 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5765 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5766 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005767
5768 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005769 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005770 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005771 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005772
5773 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5774 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
5775 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5776 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005777 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06005778
5779 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5780 count_buffer_create_info.size = sizeof(uint32_t);
5781 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005782 VkBufferObj count_buffer;
5783 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005784
Mike Schuchardt65847d92019-12-20 13:50:47 -08005785 // VUID-vkCmdDrawIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07005786 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005787 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
5788 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005789 m_errorMonitor->VerifyFound();
5790
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005791 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06005792 memory_allocate_info.allocationSize = memory_requirements.size;
5793 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
5794 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005795 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
5796 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06005797
5798 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005799 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06005800
Mike Schuchardt65847d92019-12-20 13:50:47 -08005801 // VUID-vkCmdDrawIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07005802 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06005803 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
5804 m_errorMonitor->VerifyFound();
5805
Mike Schuchardt65847d92019-12-20 13:50:47 -08005806 // VUID-vkCmdDrawIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07005807 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005808 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
5809 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005810 m_errorMonitor->VerifyFound();
5811
Mike Schuchardt65847d92019-12-20 13:50:47 -08005812 // VUID-vkCmdDrawIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07005813 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005814 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
5815 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005816 m_errorMonitor->VerifyFound();
5817
Mike Schuchardt65847d92019-12-20 13:50:47 -08005818 // VUID-vkCmdDrawIndirectCount-stride-03110
Mark Lobodzinski20310782020-02-28 14:25:17 -07005819 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005820 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06005821 m_errorMonitor->VerifyFound();
5822
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005823 // 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 -06005824 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08005825 // VUID-vkCmdDrawIndirectCount-renderPass-02684
5826 // VUID-vkCmdDrawIndirectCount-subpass-02685
5827 // VUID-vkCmdDrawIndirectCount-commandBuffer-02701
unknown088160a2019-05-23 17:43:13 -06005828
5829 m_commandBuffer->EndRenderPass();
5830 m_commandBuffer->end();
5831
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005832 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
5833 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06005834
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005835 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06005836}
5837
5838TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
5839 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
5840
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005841 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005842 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
5843 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
5844 } else {
5845 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
5846 return;
5847 }
5848 ASSERT_NO_FATAL_FAILURE(InitState());
5849 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5850
unknown088160a2019-05-23 17:43:13 -06005851 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005852 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06005853
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005854 CreatePipelineHelper pipe(*this);
5855 pipe.InitInfo();
5856 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5857 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5858 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5859 dyn_state_ci.dynamicStateCount = size(dyn_states);
5860 dyn_state_ci.pDynamicStates = dyn_states;
5861 pipe.dyn_state_ci_ = dyn_state_ci;
5862 pipe.InitState();
5863 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005864
5865 m_commandBuffer->begin();
5866 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5867
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005868 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5869 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5870 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005871
5872 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005873 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005874 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005875 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005876
5877 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5878 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
5879 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005880 VkBufferObj draw_buffer;
5881 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005882
5883 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5884 count_buffer_create_info.size = sizeof(uint32_t);
5885 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005886 VkBufferObj count_buffer;
5887 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005888
5889 VkBufferCreateInfo index_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5890 index_buffer_create_info.size = sizeof(uint32_t);
5891 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005892 VkBufferObj index_buffer;
5893 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005894
Mike Schuchardt65847d92019-12-20 13:50:47 -08005895 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial - only tests whether the index buffer is bound)
Mark Lobodzinski20310782020-02-28 14:25:17 -07005896 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005897 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06005898 sizeof(VkDrawIndexedIndirectCommand));
5899 m_errorMonitor->VerifyFound();
5900
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005901 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06005902
5903 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005904 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06005905
Mike Schuchardt65847d92019-12-20 13:50:47 -08005906 // VUID-vkCmdDrawIndexedIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07005907 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005908 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06005909 sizeof(VkDrawIndexedIndirectCommand));
5910 m_errorMonitor->VerifyFound();
5911
5912 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005913 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06005914
Mike Schuchardt65847d92019-12-20 13:50:47 -08005915 // VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07005916 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005917 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06005918 sizeof(VkDrawIndexedIndirectCommand));
5919 m_errorMonitor->VerifyFound();
5920
Mike Schuchardt65847d92019-12-20 13:50:47 -08005921 // VUID-vkCmdDrawIndexedIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07005922 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005923 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06005924 sizeof(VkDrawIndexedIndirectCommand));
5925 m_errorMonitor->VerifyFound();
5926
Mike Schuchardt65847d92019-12-20 13:50:47 -08005927 // VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07005928 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005929 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06005930 sizeof(VkDrawIndexedIndirectCommand));
5931 m_errorMonitor->VerifyFound();
5932
Mike Schuchardt65847d92019-12-20 13:50:47 -08005933 // VUID-vkCmdDrawIndexedIndirectCount-stride-03142
Mark Lobodzinski20310782020-02-28 14:25:17 -07005934 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005935 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06005936 m_errorMonitor->VerifyFound();
5937
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005938 // 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 -06005939 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08005940 // VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684
5941 // VUID-vkCmdDrawIndexedIndirectCount-subpass-02685
5942 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial)
unknown088160a2019-05-23 17:43:13 -06005943
5944 m_commandBuffer->EndRenderPass();
5945 m_commandBuffer->end();
5946
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005947 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
5948 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06005949}
5950
sfricke-samsung860d3b22020-05-04 21:08:29 -07005951TEST_F(VkLayerTest, DrawIndirectCountFeature) {
5952 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
5953
5954 SetTargetApiVersion(VK_API_VERSION_1_2);
5955 ASSERT_NO_FATAL_FAILURE(Init());
5956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5957 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
5958 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
5959 return;
5960 }
5961
5962 VkBufferObj indirect_buffer;
5963 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
5964 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
5965
5966 VkBufferObj indexed_indirect_buffer;
5967 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
5968 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
5969
5970 VkBufferObj count_buffer;
5971 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
5972
5973 VkBufferObj index_buffer;
5974 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5975
5976 CreatePipelineHelper pipe(*this);
5977 pipe.InitInfo();
5978 pipe.InitState();
5979 pipe.CreateGraphicsPipeline();
5980
5981 // Make calls to valid commands but without the drawIndirectCount feature set
5982 m_commandBuffer->begin();
5983 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5984
5985 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5986
Shannon McPherson2c793ba2020-08-28 12:13:24 -06005987 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07005988 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
5989 sizeof(VkDrawIndirectCommand));
5990 m_errorMonitor->VerifyFound();
5991
5992 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
5993
Shannon McPherson2c793ba2020-08-28 12:13:24 -06005994 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07005995 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
5996 sizeof(VkDrawIndexedIndirectCommand));
5997 m_errorMonitor->VerifyFound();
5998
5999 m_commandBuffer->EndRenderPass();
6000 m_commandBuffer->end();
6001}
6002
unknown088160a2019-05-23 17:43:13 -06006003TEST_F(VkLayerTest, ExclusiveScissorNV) {
6004 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6005
6006 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6007 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6008 } else {
6009 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6010 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6011 return;
6012 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006013 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006014 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6015 for (auto device_extension : required_device_extensions) {
6016 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6017 m_device_extension_names.push_back(device_extension);
6018 } else {
6019 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6020 return;
6021 }
6022 }
6023
6024 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006025 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006026 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6027
6028 // Create a device that enables exclusive scissor but disables multiViewport
6029 auto exclusive_scissor_features = lvl_init_struct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6030 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
6031 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6032
6033 features2.features.multiViewport = VK_FALSE;
6034
6035 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6037
6038 if (m_device->phy().properties().limits.maxViewports) {
6039 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6040 return;
6041 }
6042
6043 // Based on PSOViewportStateTests
6044 {
6045 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6046 VkViewport viewports[] = {viewport, viewport};
6047 VkRect2D scissor = {{0, 0}, {64, 64}};
6048 VkRect2D scissors[100] = {scissor, scissor};
6049
6050 using std::vector;
6051 struct TestCase {
6052 uint32_t viewport_count;
6053 VkViewport *viewports;
6054 uint32_t scissor_count;
6055 VkRect2D *scissors;
6056 uint32_t exclusive_scissor_count;
6057 VkRect2D *exclusive_scissors;
6058
6059 vector<std::string> vuids;
6060 };
6061
6062 vector<TestCase> test_cases = {
6063 {1,
6064 viewports,
6065 1,
6066 scissors,
6067 2,
6068 scissors,
6069 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6070 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6071 {1,
6072 viewports,
6073 1,
6074 scissors,
6075 100,
6076 scissors,
6077 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6078 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6079 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006080 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006081 };
6082
6083 for (const auto &test_case : test_cases) {
6084 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc = {
6085 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV};
6086
6087 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6088 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6089 helper.vp_state_ci_.pViewports = test_case.viewports;
6090 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6091 helper.vp_state_ci_.pScissors = test_case.scissors;
6092 helper.vp_state_ci_.pNext = &exc;
6093
6094 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6095 exc.pExclusiveScissors = test_case.exclusive_scissors;
6096 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006097 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006098 }
6099 }
6100
6101 // Based on SetDynScissorParamTests
6102 {
6103 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006104 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006105
6106 const VkRect2D scissor = {{0, 0}, {16, 16}};
6107 const VkRect2D scissors[] = {scissor, scissor};
6108
6109 m_commandBuffer->begin();
6110
Mark Lobodzinski20310782020-02-28 14:25:17 -07006111 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006112 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6113 m_errorMonitor->VerifyFound();
6114
Mark Lobodzinski20310782020-02-28 14:25:17 -07006115 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006116 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6117 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6118 m_errorMonitor->VerifyFound();
6119
Mark Lobodzinski20310782020-02-28 14:25:17 -07006120 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006121 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6122 m_errorMonitor->VerifyFound();
6123
Mark Lobodzinski20310782020-02-28 14:25:17 -07006124 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006125 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006126 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006127 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6128 m_errorMonitor->VerifyFound();
6129
Mark Lobodzinski20310782020-02-28 14:25:17 -07006130 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6131 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006132 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6133 m_errorMonitor->VerifyFound();
6134
Mark Lobodzinski20310782020-02-28 14:25:17 -07006135 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006136 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6137 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6138 m_errorMonitor->VerifyFound();
6139
6140 struct TestCase {
6141 VkRect2D scissor;
6142 std::string vuid;
6143 };
6144
6145 std::vector<TestCase> test_cases = {
6146 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6147 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6148 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6149 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6150 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6151 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6152 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6153 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6154
6155 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006156 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006157 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6158 m_errorMonitor->VerifyFound();
6159 }
6160
6161 m_commandBuffer->end();
6162 }
6163}
6164
6165TEST_F(VkLayerTest, MeshShaderNV) {
6166 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6167
6168 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6169 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6170 } else {
6171 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6172 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6173 return;
6174 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006175 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006176 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
6177 for (auto device_extension : required_device_extensions) {
6178 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6179 m_device_extension_names.push_back(device_extension);
6180 } else {
6181 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6182 return;
6183 }
6184 }
6185
Tony-LunarG048f5012020-04-29 16:55:11 -06006186 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006187 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6188 return;
6189 }
6190
6191 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006192 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006193 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6194
6195 // Create a device that enables mesh_shader
6196 auto mesh_shader_features = lvl_init_struct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6197 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
6198 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6199 features2.features.multiDrawIndirect = VK_FALSE;
6200
6201 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6202 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6203
6204 static const char vertShaderText[] =
6205 "#version 450\n"
6206 "vec2 vertices[3];\n"
6207 "void main() {\n"
6208 " vertices[0] = vec2(-1.0, -1.0);\n"
6209 " vertices[1] = vec2( 1.0, -1.0);\n"
6210 " vertices[2] = vec2( 0.0, 1.0);\n"
6211 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
6212 " gl_PointSize = 1.0f;\n"
6213 "}\n";
6214
6215 static const char meshShaderText[] =
6216 "#version 450\n"
6217 "#extension GL_NV_mesh_shader : require\n"
6218 "layout(local_size_x = 1) in;\n"
6219 "layout(max_vertices = 3) out;\n"
6220 "layout(max_primitives = 1) out;\n"
6221 "layout(triangles) out;\n"
6222 "void main() {\n"
6223 " gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);\n"
6224 " gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);\n"
6225 " gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);\n"
6226 " gl_PrimitiveIndicesNV[0] = 0;\n"
6227 " gl_PrimitiveIndicesNV[1] = 1;\n"
6228 " gl_PrimitiveIndicesNV[2] = 2;\n"
6229 " gl_PrimitiveCountNV = 1;\n"
6230 "}\n";
6231
6232 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6233 VkShaderObj ms(m_device, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV, this);
6234 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6235
6236 // Test pipeline creation
6237 {
6238 // can't mix mesh with vertex
6239 const auto break_vp = [&](CreatePipelineHelper &helper) {
6240 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6241 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006242 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006243 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6244
6245 // vertex or mesh must be present
6246 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006247 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006248 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6249
6250 // vertexinput and inputassembly must be valid when vertex stage is present
6251 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6252 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6253 helper.gp_ci_.pVertexInputState = nullptr;
6254 helper.gp_ci_.pInputAssemblyState = nullptr;
6255 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006256 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006257 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6258 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6259 }
6260
6261 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006262 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006263
6264 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6265 buffer_create_info.size = sizeof(uint32_t);
6266 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6267 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006268 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006269 ASSERT_VK_SUCCESS(result);
6270
6271 m_commandBuffer->begin();
6272
Mark Lobodzinski20310782020-02-28 14:25:17 -07006273 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6274 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006275 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6276 m_errorMonitor->VerifyFound();
6277
6278 m_commandBuffer->end();
6279
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006280 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006281}
6282
6283TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6284 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
6285 ASSERT_NO_FATAL_FAILURE(Init());
6286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6287
6288 VkEvent event;
6289 VkEventCreateInfo event_create_info{};
6290 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006291 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006292
6293 m_commandBuffer->begin();
6294
Shannon McPherson93970b12020-06-12 14:34:35 -06006295 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006296 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006297 m_errorMonitor->VerifyFound();
6298
Shannon McPherson93970b12020-06-12 14:34:35 -06006299 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006300 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006301 m_errorMonitor->VerifyFound();
6302
Shannon McPherson93970b12020-06-12 14:34:35 -06006303 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006304 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006305 m_errorMonitor->VerifyFound();
6306
Shannon McPherson93970b12020-06-12 14:34:35 -06006307 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006308 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006309 m_errorMonitor->VerifyFound();
6310
Shannon McPherson93970b12020-06-12 14:34:35 -06006311 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006313 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6314 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006315 m_errorMonitor->VerifyFound();
6316
Shannon McPherson93970b12020-06-12 14:34:35 -06006317 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6318 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006319 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6320 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006321 m_errorMonitor->VerifyFound();
6322
Shannon McPherson93970b12020-06-12 14:34:35 -06006323 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6324 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006325 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6326 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006327 m_errorMonitor->VerifyFound();
6328
Shannon McPherson93970b12020-06-12 14:34:35 -06006329 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6330 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006331 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6332 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006333 m_errorMonitor->VerifyFound();
6334
6335 m_commandBuffer->end();
6336
6337 VkSemaphoreCreateInfo semaphore_create_info = {};
6338 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6339 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006340 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006341
6342 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
6343 VkSubmitInfo submit_info = {};
6344
6345 // Signal the semaphore so the next test can wait on it.
6346 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6347 submit_info.signalSemaphoreCount = 1;
6348 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006349 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006350 m_errorMonitor->VerifyNotFound();
6351
6352 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6353 submit_info.signalSemaphoreCount = 0;
6354 submit_info.pSignalSemaphores = nullptr;
6355 submit_info.waitSemaphoreCount = 1;
6356 submit_info.pWaitSemaphores = &semaphore;
6357 submit_info.pWaitDstStageMask = &stage_flags;
6358
Mark Lobodzinski20310782020-02-28 14:25:17 -07006359 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02089");
6360 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02090");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006361 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006362 m_errorMonitor->VerifyFound();
6363
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006364 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006365
6366 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6367 VkPipelineShaderStageCreateInfo meshStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6368 meshStage = vs.GetStageCreateInfo();
6369 meshStage.stage = VK_SHADER_STAGE_MESH_BIT_NV;
6370 VkPipelineShaderStageCreateInfo taskStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6371 taskStage = vs.GetStageCreateInfo();
6372 taskStage.stage = VK_SHADER_STAGE_TASK_BIT_NV;
6373
6374 // mesh and task shaders not supported
6375 const auto break_vp = [&](CreatePipelineHelper &helper) {
6376 helper.shader_stages_ = {meshStage, taskStage, vs.GetStageCreateInfo()};
6377 };
6378 CreatePipelineHelper::OneshotTest(
Mark Lobodzinski20310782020-02-28 14:25:17 -07006379 *this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006380 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "VUID-VkPipelineShaderStageCreateInfo-pName-00707",
6381 "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6382 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
6383
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006384 vk::DestroyEvent(m_device->device(), event, nullptr);
6385 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006386}
Chris Mayerc93536f2019-09-19 16:34:49 +02006387
6388TEST_F(VkLayerTest, ViewportWScalingNV) {
6389 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6390
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006391 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006392
6393 VkPhysicalDeviceFeatures device_features = {};
6394 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6395
6396 if (!device_features.multiViewport) {
6397 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6398 return;
6399 }
6400
6401 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6402 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6403 } else {
6404 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6405 return;
6406 }
6407
6408 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6409 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6410
6411 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006412 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006413
6414 const char vs_src[] = R"(
6415 #version 450
6416 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6417 vec2( 1.0f, 1.0f),
6418 vec2(-1.0f, -1.0f),
6419 vec2( 1.0f, -1.0f) };
6420 out gl_PerVertex {
6421 vec4 gl_Position;
6422 };
6423
6424 void main() {
6425 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
6426 })";
6427
6428 const char fs_src[] = R"(
6429 #version 450
6430 layout(location = 0) out vec4 outColor;
6431
6432 void main() {
6433 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
6434 })";
6435
6436 const std::vector<VkViewport> vp = {
6437 {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}};
6438 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6439 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6440
6441 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6442
6443 VkPipelineViewportWScalingStateCreateInfoNV vpsi = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV};
6444 vpsi.viewportWScalingEnable = VK_TRUE;
6445 vpsi.viewportCount = vp_count;
6446 vpsi.pViewportWScalings = scale.data();
6447
6448 VkPipelineViewportStateCreateInfo vpci = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO};
6449 vpci.viewportCount = vp_count;
6450 vpci.pViewports = vp.data();
6451 vpci.scissorCount = vp_count;
6452 vpci.pScissors = sc.data();
6453 vpci.pNext = &vpsi;
6454
6455 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6456
6457 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006458 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006459
6460 // Create pipeline with w-scaling enabled but without a valid scaling array
6461 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006462 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006463 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6464
6465 vpsi.pViewportWScalings = scale.data();
6466
6467 // Create pipeline with w-scaling enabled but without matching viewport counts
6468 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006469 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006470 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6471
6472 const VkPipelineLayoutObj pl(m_device);
6473
6474 VkShaderObj vs(m_device, vs_src, VK_SHADER_STAGE_VERTEX_BIT, this);
6475 VkShaderObj fs(m_device, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6476
6477 VkPipelineObj pipe(m_device);
6478 pipe.AddDefaultColorAttachment();
6479 pipe.AddShader(&vs);
6480 pipe.AddShader(&fs);
6481 pipe.SetViewport(vp);
6482 pipe.SetScissor(sc);
6483 pipe.CreateVKPipeline(pl.handle(), renderPass());
6484
6485 VkPipelineObj pipeDynWScale(m_device);
6486 pipeDynWScale.AddDefaultColorAttachment();
6487 pipeDynWScale.AddShader(&vs);
6488 pipeDynWScale.AddShader(&fs);
6489 pipeDynWScale.SetViewport(vp);
6490 pipeDynWScale.SetScissor(sc);
6491 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6492 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6493
6494 m_commandBuffer->begin();
6495
6496 // Bind pipeline without dynamic w scaling enabled
6497 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006498 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006499 m_errorMonitor->VerifyNotFound();
6500
Chris Mayerc93536f2019-09-19 16:34:49 +02006501 // Bind pipeline that has dynamic w-scaling enabled
6502 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006503 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006504 m_errorMonitor->VerifyNotFound();
6505
6506 const auto max_vps = m_device->props.limits.maxViewports;
6507
Mark Lobodzinski20310782020-02-28 14:25:17 -07006508 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01323");
Chris Mayerc93536f2019-09-19 16:34:49 +02006509 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), max_vps, vp_count, scale.data());
6510 m_errorMonitor->VerifyFound();
6511
Mark Lobodzinski20310782020-02-28 14:25:17 -07006512 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006513 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6514 m_errorMonitor->VerifyFound();
6515
6516 m_errorMonitor->ExpectSuccess();
6517 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6518 m_errorMonitor->VerifyNotFound();
6519
6520 m_commandBuffer->end();
6521}
sfricke-samsung914e8002020-01-07 22:26:18 -08006522
6523TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6524 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6525
6526 // Enable Sampler YCbCr Conversion req'd extensions
6527 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6528 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6529 if (mp_extensions) {
6530 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6531 }
6532 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006533 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sfricke-samsung914e8002020-01-07 22:26:18 -08006534 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6535 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6536 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6537 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6538 if (mp_extensions) {
6539 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6540 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6541 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6542 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6543 } else {
6544 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6545 return;
6546 }
6547
6548 // Explictly not enable Ycbcr Conversion Features
6549 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {};
6550 ycbcr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
6551 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6552 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6553
6554 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6555 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6556 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6557 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6558 return;
6559 }
6560
6561 // Create Ycbcr conversion
6562 VkSamplerYcbcrConversion conversions;
6563 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6564 NULL,
6565 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6566 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6567 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6568 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6569 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6570 VK_CHROMA_LOCATION_COSITED_EVEN,
6571 VK_CHROMA_LOCATION_COSITED_EVEN,
6572 VK_FILTER_NEAREST,
6573 false};
6574
Mark Lobodzinski20310782020-02-28 14:25:17 -07006575 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006576 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6577 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006578}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006579
6580TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6581 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6582
6583 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6584 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6585 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6586 return;
6587 }
6588 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6589
6590 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6591
6592 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6593 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6594 return;
6595 }
6596 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6597
6598 {
6599 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6600 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6601 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6602
6603 auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6604 auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
6605 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6606
6607 if (!tf_features.transformFeedback) {
6608 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6609 return;
6610 }
6611 }
6612
6613 ASSERT_NO_FATAL_FAILURE(InitState());
6614 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6615
6616 {
6617 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
6618 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6619 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6620
6621 auto info = lvl_init_struct<VkBufferCreateInfo>();
6622 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6623 info.size = 4;
6624 VkBufferObj buffer;
6625 buffer.init(*m_device, info);
6626 VkDeviceSize offsets[1]{};
6627
6628 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
6629 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
6630 m_errorMonitor->VerifyFound();
6631 }
6632
6633 {
6634 auto vkCmdBeginTransformFeedbackEXT =
6635 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6636 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6637
6638 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
6639 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6640 m_errorMonitor->VerifyFound();
6641 }
6642
6643 {
6644 auto vkCmdEndTransformFeedbackEXT =
6645 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6646 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6647
6648 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
6649 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
6650 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6651 m_errorMonitor->VerifyFound();
6652 }
6653}
6654
6655TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
6656 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
6657
6658 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6659 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6660 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6661 return;
6662 }
6663 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6664
6665 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6666
6667 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6668 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6669 return;
6670 }
6671 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6672
6673 {
6674 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6675 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6676 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6677
6678 auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6679 auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
6680 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6681
6682 if (!tf_features.transformFeedback) {
6683 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6684 return;
6685 }
6686
6687 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6688 }
6689
6690 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6691
6692 auto vkCmdBindTransformFeedbackBuffersEXT =
6693 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6694 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6695
6696 {
6697 auto tf_properties = lvl_init_struct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6698 auto pd_properties = lvl_init_struct<VkPhysicalDeviceProperties2>(&tf_properties);
6699 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6700
6701 auto info = lvl_init_struct<VkBufferCreateInfo>();
6702 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6703 info.size = 8;
6704 VkBufferObj const buffer_obj(*m_device, info);
6705
6706 // Request a firstBinding that is too large.
6707 {
6708 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
6709 VkDeviceSize const offsets[1]{};
6710
6711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
6712 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6713 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
6714 nullptr);
6715 m_errorMonitor->VerifyFound();
6716 }
6717
6718 // Request too many bindings.
6719 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
6720 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
6721 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
6722
6723 std::vector<VkDeviceSize> offsets(bindingCount);
6724
6725 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6726 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
6727 nullptr);
6728 m_errorMonitor->VerifyFound();
6729 }
6730
6731 // Request a size that is larger than the maximum size.
6732 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
6733 VkDeviceSize const offsets[1]{};
6734 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
6735
6736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
6737 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
6738 m_errorMonitor->VerifyFound();
6739 }
6740 }
6741
6742 {
6743 auto info = lvl_init_struct<VkBufferCreateInfo>();
6744 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6745 info.size = 8;
6746 VkBufferObj const buffer_obj(*m_device, info);
6747
6748 // Request an offset that is too large.
6749 {
6750 VkDeviceSize const offsets[1]{info.size + 4};
6751
6752 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
6753 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6754 m_errorMonitor->VerifyFound();
6755 }
6756
6757 // Request an offset that is not a multiple of 4.
6758 {
6759 VkDeviceSize const offsets[1]{1};
6760
6761 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
6762 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6763 m_errorMonitor->VerifyFound();
6764 }
6765
6766 // Request a size that is larger than the buffer's size.
6767 {
6768 VkDeviceSize const offsets[1]{};
6769 VkDeviceSize const sizes[1]{info.size + 1};
6770
6771 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006772 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
6773 m_errorMonitor->VerifyFound();
6774 }
6775
6776 // Request an offset and size whose sum is larger than the buffer's size.
6777 {
6778 VkDeviceSize const offsets[1]{4};
6779 VkDeviceSize const sizes[1]{info.size - 3};
6780
6781 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
6782 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
6783 m_errorMonitor->VerifyFound();
6784 }
6785
6786 // Bind while transform feedback is active.
6787 {
6788 auto vkCmdBeginTransformFeedbackEXT =
6789 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6790 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6791 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6792
6793 VkDeviceSize const offsets[1]{};
6794
6795 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
6796 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6797 m_errorMonitor->VerifyFound();
6798
6799 auto vkCmdEndTransformFeedbackEXT =
6800 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6801 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6802 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6803 }
6804 }
6805
6806 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
6807 {
6808 auto info = lvl_init_struct<VkBufferCreateInfo>();
6809 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6810 info.size = 4;
6811 VkBufferObj const buffer_obj(*m_device, info);
6812
6813 VkDeviceSize const offsets[1]{};
6814
6815 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
6816 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6817 m_errorMonitor->VerifyFound();
6818 }
6819
6820 // Don't bind memory.
6821 {
6822 VkBuffer buffer{};
6823 {
6824 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
6825 ASSERT_TRUE(vkCreateBuffer != nullptr);
6826
6827 auto info = lvl_init_struct<VkBufferCreateInfo>();
6828 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6829 info.size = 4;
6830 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
6831 }
6832
6833 VkDeviceSize const offsets[1]{};
6834
6835 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
6836 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
6837 m_errorMonitor->VerifyFound();
6838 }
6839}
6840
6841TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
6842 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
6843
6844 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6845 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6846 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6847 return;
6848 }
6849 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6850
6851 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6852
6853 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6854 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6855 return;
6856 }
6857 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6858
6859 {
6860 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6861 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6862 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6863
6864 auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6865 auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
6866 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6867
6868 if (!tf_features.transformFeedback) {
6869 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6870 return;
6871 }
6872
6873 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6874 }
6875
6876 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6877
6878 auto vkCmdBeginTransformFeedbackEXT =
6879 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6880 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6881
6882 {
6883 auto tf_properties = lvl_init_struct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6884 auto pd_properties = lvl_init_struct<VkPhysicalDeviceProperties2>(&tf_properties);
6885 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6886
6887 // Request a firstCounterBuffer that is too large.
6888 {
6889 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
6890
6891 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
6892 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
6893 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
6894 m_errorMonitor->VerifyFound();
6895 }
6896
6897 // Request too many buffers.
6898 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
6899 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
6900
6901 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
6902 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
6903 m_errorMonitor->VerifyFound();
6904 }
6905 }
6906
6907 // Request an out-of-bounds location.
6908 {
6909 auto info = lvl_init_struct<VkBufferCreateInfo>();
6910 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
6911 info.size = 4;
6912 VkBufferObj const buffer_obj(*m_device, info);
6913
6914 VkDeviceSize const offsets[1]{1};
6915
6916 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
6917 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
6918 m_errorMonitor->VerifyFound();
6919 }
6920
6921 // Request specific offsets without specifying buffers.
6922 {
6923 VkDeviceSize const offsets[1]{};
6924
6925 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
6926 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
6927 m_errorMonitor->VerifyFound();
6928 }
6929
6930 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
6931 {
6932 auto info = lvl_init_struct<VkBufferCreateInfo>();
6933 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
6934 info.size = 4;
6935 VkBufferObj const buffer_obj(*m_device, info);
6936
6937 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
6938 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
6939 m_errorMonitor->VerifyFound();
6940 }
6941
6942 // Begin while transform feedback is active.
6943 {
6944 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6945
6946 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
6947 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6948 m_errorMonitor->VerifyFound();
6949
6950 auto vkCmdEndTransformFeedbackEXT =
6951 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6952 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6953
6954 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6955 }
6956}
6957
6958TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
6959 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
6960
6961 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6962 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6963 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6964 return;
6965 }
6966 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6967
6968 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6969
6970 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6971 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6972 return;
6973 }
6974 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6975
6976 {
6977 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6978 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6979 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6980
6981 auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6982 auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
6983 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6984
6985 if (!tf_features.transformFeedback) {
6986 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6987 return;
6988 }
6989
6990 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6991 }
6992
6993 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6994
6995 auto vkCmdEndTransformFeedbackEXT =
6996 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6997 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6998
6999 {
7000 // Activate transform feedback.
7001 auto vkCmdBeginTransformFeedbackEXT =
7002 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7003 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7004 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7005
7006 {
7007 auto tf_properties = lvl_init_struct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7008 auto pd_properties = lvl_init_struct<VkPhysicalDeviceProperties2>(&tf_properties);
7009 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7010
7011 // Request a firstCounterBuffer that is too large.
7012 {
7013 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7014
7015 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7016 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7017 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7018 m_errorMonitor->VerifyFound();
7019 }
7020
7021 // Request too many buffers.
7022 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7023 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7024
7025 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7026 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7027 m_errorMonitor->VerifyFound();
7028 }
7029 }
7030
7031 // Request an out-of-bounds location.
7032 {
7033 auto info = lvl_init_struct<VkBufferCreateInfo>();
7034 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7035 info.size = 4;
7036 VkBufferObj const buffer_obj(*m_device, info);
7037
7038 VkDeviceSize const offsets[1]{1};
7039
7040 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7041 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7042 m_errorMonitor->VerifyFound();
7043 }
7044
7045 // Request specific offsets without specifying buffers.
7046 {
7047 VkDeviceSize const offsets[1]{};
7048
7049 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7050 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7051 m_errorMonitor->VerifyFound();
7052 }
7053
7054 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7055 {
7056 auto info = lvl_init_struct<VkBufferCreateInfo>();
7057 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7058 info.size = 4;
7059 VkBufferObj const buffer_obj(*m_device, info);
7060
7061 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7062 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7063 m_errorMonitor->VerifyFound();
7064 }
7065 }
7066
7067 // End while transform feedback is inactive.
7068 {
7069 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7070
7071 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7072 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7073 m_errorMonitor->VerifyFound();
7074 }
7075}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007076
sfricke-samsung39ee2442020-07-22 21:21:15 -07007077TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7078 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007079
7080 // protect memory added in VK 1.1
7081 SetTargetApiVersion(VK_API_VERSION_1_1);
7082
7083 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7084 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7085 } else {
7086 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7087 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7088 return;
7089 }
7090 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7091
7092 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7093 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7094 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7095
7096 auto protected_memory_features = lvl_init_struct<VkPhysicalDeviceProtectedMemoryFeatures>();
7097 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
7098 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7099
7100 if (protected_memory_features.protectedMemory == VK_FALSE) {
7101 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7102 return;
7103 };
7104
7105 // Turns m_commandBuffer into a protected command buffer
7106 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7107
7108 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7109 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7110 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7111 return;
7112 }
7113
7114 VkBufferObj indirect_buffer;
7115 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7116 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7117
7118 VkBufferObj indexed_indirect_buffer;
7119 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7120 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7121
7122 VkBufferObj index_buffer;
7123 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7124
7125 CreatePipelineHelper pipe(*this);
7126 pipe.InitInfo();
7127 pipe.InitState();
7128 pipe.CreateGraphicsPipeline();
7129
sfricke-samsung39ee2442020-07-22 21:21:15 -07007130 VkQueryPool query_pool;
7131 VkQueryPoolCreateInfo query_pool_create_info{};
7132 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7133 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7134 query_pool_create_info.queryCount = 1;
7135 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7136
sfricke-samsung071af2d2020-07-02 10:37:22 -07007137 m_commandBuffer->begin();
7138 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7139
7140 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7141
7142 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7143 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7144 m_errorMonitor->VerifyFound();
7145
7146 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7147
7148 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7149 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7150 sizeof(VkDrawIndexedIndirectCommand));
7151 m_errorMonitor->VerifyFound();
7152
7153 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007154
7155 // Query should be outside renderpass
7156 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7157
7158 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7159 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7160 m_errorMonitor->VerifyFound();
7161
7162 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7163 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7164 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7165 m_errorMonitor->VerifyFound();
7166
sfricke-samsung071af2d2020-07-02 10:37:22 -07007167 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007168
7169 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007170}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007171
7172TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7173 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7174
7175 SetTargetApiVersion(VK_API_VERSION_1_1);
7176
7177 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7178 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7179 } else {
7180 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7181 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7182 return;
7183 }
7184 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7185
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007186 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7187 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7188 return;
7189 }
7190
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007191 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7192 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7193 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7194
7195 auto protected_memory_features = lvl_init_struct<VkPhysicalDeviceProtectedMemoryFeatures>();
7196 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
7197 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7198
7199 if (protected_memory_features.protectedMemory == VK_FALSE) {
7200 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7201 return;
7202 };
7203
7204 // Turns m_commandBuffer into a unprotected command buffer
7205 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7206
7207 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7208 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7209
7210 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7211 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7212 return;
7213 }
7214
7215 // Create actual protected and unprotected buffers
7216 VkBuffer buffer_protected = VK_NULL_HANDLE;
7217 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
7218 VkBufferCreateInfo buffer_create_info = {};
7219 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7220 buffer_create_info.pNext = nullptr;
7221 buffer_create_info.size = 1 << 20; // 1 MB
7222 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
7223 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7224
7225 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7226 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7227 buffer_create_info.flags = 0;
7228 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7229
7230 // Create actual protected and unprotected images
7231 VkImageObj image_protected(m_device);
7232 VkImageObj image_unprotected(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007233 VkImageView image_views[2];
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007234 VkImageCreateInfo image_create_info = {};
7235 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7236 image_create_info.pNext = nullptr;
7237 image_create_info.extent = {64, 64, 1};
7238 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
7239 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7240 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
7241 image_create_info.usage =
7242 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
7243 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7244 image_create_info.arrayLayers = 1;
7245 image_create_info.mipLevels = 1;
7246
7247 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7248 image_protected.init_no_mem(*m_device, image_create_info);
7249 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007250 image_views[0] = image_protected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007251
7252 image_create_info.flags = 0;
7253 image_unprotected.init_no_mem(*m_device, image_create_info);
7254 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007255 image_views[1] = image_unprotected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007256
7257 // Create protected and unproteced memory
7258 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7259 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7260
7261 VkMemoryAllocateInfo alloc_info = {};
7262 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7263 alloc_info.pNext = nullptr;
7264 alloc_info.allocationSize = 0;
7265
7266 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7267 VkMemoryRequirements mem_reqs_protected;
7268 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7269 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7270 VkMemoryRequirements mem_reqs_unprotected;
7271 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7272 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7273
7274 // Get memory index for a protected and unprotected memory
7275 VkPhysicalDeviceMemoryProperties phys_mem_props;
7276 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7277 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7278 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7279 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7280 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7281 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7282 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7283 memory_type_unprotected = i;
7284 }
7285 // Check just protected bit is in type at all
7286 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7287 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7288 memory_type_protected = i;
7289 }
7290 }
7291 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7292 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7293 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7294 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7295 return;
7296 }
7297
7298 alloc_info.memoryTypeIndex = memory_type_protected;
7299 alloc_info.allocationSize = mem_reqs_protected.size;
7300 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7301
7302 alloc_info.allocationSize = mem_reqs_unprotected.size;
7303 alloc_info.memoryTypeIndex = memory_type_unprotected;
7304 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7305
7306 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7307 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7308 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7309 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
7310
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007311 // A renderpass and framebuffer that contains a protected and unprotected image view
7312 VkAttachmentDescription attachments[2] = {
7313 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7314 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7315 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7316 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7317 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7318 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7319 };
7320 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7321 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7322 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7323 VkSubpassDependency dependency = {0,
7324 0,
7325 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7326 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7327 VK_ACCESS_SHADER_WRITE_BIT,
7328 VK_ACCESS_SHADER_WRITE_BIT,
7329 VK_DEPENDENCY_BY_REGION_BIT};
7330 VkRenderPassCreateInfo render_pass_create_info = {
7331 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7332 VkRenderPass render_pass;
7333 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7334 VkFramebufferCreateInfo framebuffer_create_info = {
7335 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7336 VkFramebuffer framebuffer;
7337 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7338
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007339 // Various structs used for commands
7340 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7341 VkImageBlit blit_region = {};
7342 blit_region.srcSubresource = image_subresource;
7343 blit_region.dstSubresource = image_subresource;
7344 blit_region.srcOffsets[0] = {0, 0, 0};
7345 blit_region.srcOffsets[1] = {8, 8, 1};
7346 blit_region.dstOffsets[0] = {0, 8, 0};
7347 blit_region.dstOffsets[1] = {8, 8, 1};
7348 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7349 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7350 VkBufferCopy buffer_copy = {0, 0, 64};
7351 VkBufferImageCopy buffer_image_copy = {};
7352 buffer_image_copy.bufferRowLength = 0;
7353 buffer_image_copy.bufferImageHeight = 0;
7354 buffer_image_copy.imageSubresource = image_subresource;
7355 buffer_image_copy.imageOffset = {0, 0, 0};
7356 buffer_image_copy.imageExtent = {1, 1, 1};
7357 buffer_image_copy.bufferOffset = 0;
7358 VkImageCopy image_copy = {};
7359 image_copy.srcSubresource = image_subresource;
7360 image_copy.srcOffset = {0, 0, 0};
7361 image_copy.dstSubresource = image_subresource;
7362 image_copy.dstOffset = {0, 0, 0};
7363 image_copy.extent = {1, 1, 1};
7364 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007365 VkRect2D render_area = {{0, 0}, {8, 8}};
7366 VkRenderPassBeginInfo render_pass_begin = {
7367 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7368 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7369 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7370 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007371
7372 // Use protected resources in unprotected command buffer
7373 m_commandBuffer->begin();
7374
7375 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7376 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7377 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7378 m_errorMonitor->VerifyFound();
7379
7380 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7381 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7382 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7383 m_errorMonitor->VerifyFound();
7384
7385 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7386 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7387 &subresource_range);
7388 m_errorMonitor->VerifyFound();
7389
7390 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7391 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7392 m_errorMonitor->VerifyFound();
7393
7394 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7395 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7396 m_errorMonitor->VerifyFound();
7397
7398 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7399 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7400 &buffer_image_copy);
7401 m_errorMonitor->VerifyFound();
7402
7403 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7404 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7405 &buffer_image_copy);
7406 m_errorMonitor->VerifyFound();
7407
7408 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7409 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7410 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7411 m_errorMonitor->VerifyFound();
7412
7413 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7414 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7415 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7416 m_errorMonitor->VerifyFound();
7417
7418 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7419 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected, 1,
7420 &buffer_image_copy);
7421 m_errorMonitor->VerifyFound();
7422
7423 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7424 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected, 1,
7425 &buffer_image_copy);
7426 m_errorMonitor->VerifyFound();
7427
7428 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7429 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7430 m_errorMonitor->VerifyFound();
7431
7432 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7433 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7434 m_errorMonitor->VerifyFound();
7435
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007436 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7437
7438 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7439 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7440 m_errorMonitor->VerifyFound();
7441
7442 vk::CmdEndRenderPass(m_commandBuffer->handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007443 m_commandBuffer->end();
7444
7445 // Use unprotected resources in protected command buffer
7446 protectedCommandBuffer.begin();
7447
7448 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7449 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7450 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7451 m_errorMonitor->VerifyFound();
7452
7453 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7454 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7455 &subresource_range);
7456 m_errorMonitor->VerifyFound();
7457
7458 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7459 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7460 m_errorMonitor->VerifyFound();
7461
7462 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7463 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7464 1, &buffer_image_copy);
7465 m_errorMonitor->VerifyFound();
7466
7467 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7468 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7469 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7470 m_errorMonitor->VerifyFound();
7471
7472 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7473 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7474 1, &buffer_image_copy);
7475 m_errorMonitor->VerifyFound();
7476
7477 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7478 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7479 m_errorMonitor->VerifyFound();
7480
7481 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7482 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7483 m_errorMonitor->VerifyFound();
7484
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007485 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7486
7487 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7488 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7489 m_errorMonitor->VerifyFound();
7490
7491 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007492 protectedCommandBuffer.end();
7493
sfricke-samsung96cd9932020-08-23 20:57:11 -07007494 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7495 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7496
7497 VkProtectedSubmitInfo protected_submit_info = {};
7498 protected_submit_info.sType = VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO;
7499 protected_submit_info.pNext = nullptr;
7500
7501 VkSubmitInfo submit_info = {};
7502 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7503 submit_info.pNext = &protected_submit_info;
7504 submit_info.commandBufferCount = 2;
7505 submit_info.pCommandBuffers = comman_buffers;
7506
7507 protected_submit_info.protectedSubmit = VK_TRUE;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007508 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007509 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7510 m_errorMonitor->VerifyFound();
7511
7512 protected_submit_info.protectedSubmit = VK_FALSE;
7513 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7514 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7515 m_errorMonitor->VerifyFound();
7516
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007517 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7518 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7519 vk::FreeMemory(device(), memory_protected, nullptr);
7520 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007521 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7522 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007523}
locke-lunarg6b0de702020-08-07 17:42:13 -06007524
7525TEST_F(VkLayerTest, InvailStorageAtomicOperation) {
7526 TEST_DESCRIPTION(
7527 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7528 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7529
7530 ASSERT_NO_FATAL_FAILURE(Init());
7531
7532 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7533 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7534 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7535 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7536
7537 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7538 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7539 return;
7540 }
7541
7542 VkFormat buffer_view_format =
7543 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
7544 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7545 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
7546 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7547 return;
7548 }
7549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7550
7551 VkPhysicalDeviceFeatures device_features = {};
7552 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
7553 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
7554 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
7555 return;
7556 }
7557
7558 VkImageObj image(m_device);
7559 image.Init(image_ci);
7560 VkImageView image_view = image.targetView(image_format);
7561
7562 VkSampler sampler = VK_NULL_HANDLE;
7563 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
7564 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
7565
7566 VkBufferObj buffer;
7567 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
7568
7569 VkBufferViewCreateInfo bvci = {};
7570 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7571 bvci.buffer = buffer.handle();
7572 bvci.format = buffer_view_format;
7573 bvci.range = VK_WHOLE_SIZE;
7574 VkBufferView buffer_view;
7575 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
7576
7577 char const *fsSource =
7578 "#version 450\n"
locke-lunarg76e8dee2020-08-21 13:20:02 -06007579 "layout(set=0, binding=3, rgba8) uniform image2D si0;\n "
7580 "layout(set=0, binding=2, rgba8) uniform image2D si1[2];\n "
7581 "layout(set = 0, binding = 1, r8) uniform imageBuffer stb2;\n"
7582 "layout(set = 0, binding = 0, r8) uniform imageBuffer stb3[2];\n"
locke-lunarg6b0de702020-08-07 17:42:13 -06007583 "void main() {\n"
7584 " imageAtomicExchange(si0, ivec2(0), 1);\n"
7585 " imageAtomicExchange(si1[0], ivec2(0), 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007586 " imageAtomicExchange(si1[1], ivec2(0), 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007587 " imageAtomicExchange(stb2, 0, 1);\n"
7588 " imageAtomicExchange(stb3[0], 0, 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007589 " imageAtomicExchange(stb3[1], 0, 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007590 "}\n";
7591
7592 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7593 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7594
7595 CreatePipelineHelper g_pipe(*this);
7596 g_pipe.InitInfo();
7597 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06007598 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7599 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7600 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7601 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06007602 g_pipe.InitState();
7603 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7604
locke-lunarg76e8dee2020-08-21 13:20:02 -06007605 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007606 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007607 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007608 VK_IMAGE_LAYOUT_GENERAL, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007609 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
7610 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06007611 g_pipe.descriptor_set_->UpdateDescriptorSets();
7612
7613 m_commandBuffer->begin();
7614 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7615 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7616 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7617 &g_pipe.descriptor_set_->set_, 0, nullptr);
7618
7619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7620 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7622 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7623 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7624 m_errorMonitor->VerifyFound();
7625
7626 m_commandBuffer->EndRenderPass();
7627 m_commandBuffer->end();
7628}
locke-lunargae1bbab2020-09-10 11:55:56 -06007629
7630TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
7631 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
7632
7633 ASSERT_NO_FATAL_FAILURE(Init());
7634 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7635
7636 // push constant range: 0-99
7637 char const *const vsSource =
7638 "#version 450\n"
7639 "\n"
7640 "layout(push_constant, std430) uniform foo {\n"
7641 " bool b;\n"
7642 " float f2[3];\n"
7643 " vec3 v;\n"
7644 " vec4 v2[2];\n"
7645 " mat3 m;\n"
7646 "} constants;\n"
7647 "void func1( float f ){\n"
7648 // use the whole v2[1]. byte: 48-63.
7649 " vec2 v2 = constants.v2[1].yz;\n"
7650 "}\n"
7651 "void main(){\n"
7652 // use only v2[0].z. byte: 40-43.
7653 " func1( constants.v2[0].z);\n"
7654 // index of m is variable. The all m is used. byte: 64-99.
7655 " for(int i=1;i<2;++i) {\n"
7656 " vec3 v3 = constants.m[i]; \n"
7657 " }\n"
7658 "}\n";
7659
7660 // push constant range: 0 - 95
7661 char const *const fsSource =
7662 "#version 450\n"
7663 "\n"
7664 "struct foo1{\n"
7665 " int i[4];"
7666 "}f;\n"
7667 "layout(push_constant, std430) uniform foo {\n"
7668 " float x[2][2][2];\n"
7669 " foo1 s;\n"
7670 " foo1 ss[3];\n"
7671 "} constants;\n"
7672 "void main(){\n"
7673 // use s. byte: 32-47.
7674 " f = constants.s;\n"
7675 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
7676 " for(int i=1;i<2;++i) {\n"
7677 " int ii = constants.ss[i].i[3]; \n"
7678 " }\n"
7679 "}\n";
7680
7681 VkShaderObj const vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7682 VkShaderObj const fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7683
7684 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
7685 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
7686
7687 VkPipelineLayoutCreateInfo pipeline_layout_info{
7688 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &push_constant_range};
7689
7690 VkPipelineLayout pipeline_layout;
7691 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
7692
7693 CreatePipelineHelper g_pipe(*this);
7694 g_pipe.InitInfo();
7695 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
7696 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
7697 g_pipe.InitState();
7698 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7699
7700 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
7701 VkPipelineLayout pipeline_layout_small;
7702 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
7703
7704 CreatePipelineHelper g_pipe_small_range(*this);
7705 g_pipe_small_range.InitInfo();
7706 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
7707 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
7708 g_pipe_small_range.InitState();
7709
7710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-CoreValidation-Shader-PushConstantOutOfRange");
7711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-CoreValidation-Shader-PushConstantOutOfRange");
7712 g_pipe_small_range.CreateGraphicsPipeline();
7713 m_errorMonitor->VerifyFound();
7714
7715 m_commandBuffer->begin();
7716 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7717
7718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
7719 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7720 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7721 &g_pipe.descriptor_set_->set_, 0, nullptr);
7722 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7723 m_errorMonitor->VerifyFound();
7724
7725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
7726 const float dummy_values[128] = {};
7727 vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
7728 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
7729 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7730 m_errorMonitor->VerifyFound();
7731
7732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
7733 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
7734 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7735 m_errorMonitor->VerifyFound();
7736
7737 m_errorMonitor->ExpectSuccess();
7738 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
7739 68, dummy_values);
7740 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7741 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06007742}
7743
7744TEST_F(VkLayerTest, VerifyVertextBinding) {
7745 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
7746
7747 ASSERT_NO_FATAL_FAILURE(Init());
7748 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7749
7750 VkBufferObj vtx_buf;
7751 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
7752 vtx_buf.init(*m_device, info);
7753
7754 CreatePipelineHelper pipe(*this);
7755 pipe.InitInfo();
7756 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
7757 VkVertexInputBindingDescription vtx_binding_des[3] = {
7758 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
7759
7760 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
7761 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
7762 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
7763 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
7764 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
7765 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
7766 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
7767 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
7768 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
7769 pipe.InitState();
7770 pipe.CreateGraphicsPipeline();
7771
7772 m_commandBuffer->begin();
7773 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7774 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7775 VkDeviceSize offset = 0;
7776 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
7777
7778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
7779 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
7780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
7781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
7782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
7783 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7784 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06007785
7786 m_commandBuffer->EndRenderPass();
7787 m_commandBuffer->end();
7788}
locke-lunargd7a08e92020-10-21 00:24:00 -06007789
7790TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
7791 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
7792 ASSERT_NO_FATAL_FAILURE(Init());
7793 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7794
7795 CreatePipelineHelper pipe(*this);
7796 pipe.InitInfo();
7797
7798 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
7799
7800 auto dyn_state_ci = lvl_init_struct<VkPipelineDynamicStateCreateInfo>();
7801 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
7802 dyn_state_ci.pDynamicStates = dyn_states.data();
7803 pipe.dyn_state_ci_ = dyn_state_ci;
7804 pipe.InitState();
7805 pipe.CreateGraphicsPipeline();
7806
7807 m_commandBuffer->begin();
7808 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7809 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7810
7811 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7812 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7813 VkRect2D scissor = {{0, 0}, {16, 16}};
7814 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7815 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
7816
7817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
7818 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7819 m_errorMonitor->VerifyFound();
7820
7821 m_commandBuffer->EndRenderPass();
7822 m_commandBuffer->end();
7823}