blob: f0b726bbdddd05cdb0c94612bdff92a96b3b7333 [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
1351 ASSERT_NO_FATAL_FAILURE(Init());
1352
1353 VkPhysicalDeviceFeatures device_features = {};
1354 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1355 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1356 if (device_features.textureCompressionBC) {
1357 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1358 } else if (device_features.textureCompressionETC2) {
1359 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1360 } else if (device_features.textureCompressionASTC_LDR) {
1361 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1362 } else {
1363 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1364 return;
1365 }
1366
1367 VkImageCreateInfo ci;
1368 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1369 ci.pNext = NULL;
1370 ci.flags = 0;
1371 ci.imageType = VK_IMAGE_TYPE_2D;
1372 ci.format = compressed_format;
1373 ci.extent = {32, 32, 1};
1374 ci.mipLevels = 6;
1375 ci.arrayLayers = 1;
1376 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1377 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1378 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1379 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1380 ci.queueFamilyIndexCount = 0;
1381 ci.pQueueFamilyIndices = NULL;
1382 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1383
1384 VkImageObj image(m_device);
1385 image.init(&ci);
1386 ASSERT_TRUE(image.initialized());
1387
1388 VkImageObj odd_image(m_device);
1389 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1390 odd_image.init(&ci);
1391 ASSERT_TRUE(odd_image.initialized());
1392
1393 // Allocate buffers
1394 VkMemoryPropertyFlags reqs = 0;
1395 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1396 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1397 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1398 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1399 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1400
1401 VkBufferImageCopy region = {};
1402 region.bufferRowLength = 0;
1403 region.bufferImageHeight = 0;
1404 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1405 region.imageSubresource.layerCount = 1;
1406 region.imageOffset = {0, 0, 0};
1407 region.bufferOffset = 0;
1408
1409 // start recording
1410 m_commandBuffer->begin();
1411
locke-lunargdf00db02020-03-04 19:00:57 -07001412 VkMemoryBarrier mem_barriers[3];
1413 mem_barriers[0] = lvl_init_struct<VkMemoryBarrier>();
1414 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1415 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1416 mem_barriers[1] = lvl_init_struct<VkMemoryBarrier>();
1417 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1418 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1419 mem_barriers[2] = lvl_init_struct<VkMemoryBarrier>();
1420 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1421 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1422
unknown088160a2019-05-23 17:43:13 -06001423 // Mip level copies that work - 5 levels
1424 m_errorMonitor->ExpectSuccess();
1425
1426 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1427 region.imageExtent = {32, 32, 1};
1428 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001429 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001430
1431 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1432 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001433 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001434
1435 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1436 region.imageExtent = {8, 8, 1};
1437 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001438 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001439
1440 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1441 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001442 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001443
1444 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1445 region.imageExtent = {4, 4, 1};
1446 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001447 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001448
1449 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1450 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001451 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001452
1453 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1454 region.imageExtent = {2, 2, 1};
1455 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001456
1457 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1458 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001459 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001460
1461 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1462 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001463 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001464
1465 region.imageExtent = {1, 1, 1};
1466 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001467
1468 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1469 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001470 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001471
1472 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1473 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001474 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001475 m_errorMonitor->VerifyNotFound();
1476
1477 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001478 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001479 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001480 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001481 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001482 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001483 m_errorMonitor->VerifyFound();
1484
sfricke-samsung3a10b922020-05-13 23:23:16 -07001485 std::string vuid;
1486 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
1487 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
1488
unknown088160a2019-05-23 17:43:13 -06001489 // Copy width < compressed block size, but not the full mip width
1490 region.imageExtent = {1, 2, 1};
1491 region.imageSubresource.mipLevel = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001492 vuid = ycbcr ? "VUID-vkCmdCopyBufferToImage-imageExtent-00207" : "VUID-vkCmdCopyBufferToImage-imageExtent-00207";
sfricke-samsung3a10b922020-05-13 23:23:16 -07001493 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001494 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001495 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001496 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001497 m_errorMonitor->VerifyFound();
sfricke-samsung3a10b922020-05-13 23:23:16 -07001498 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001499 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001500 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001501 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001502 m_errorMonitor->VerifyFound();
1503
1504 // Copy height < compressed block size but not the full mip height
1505 region.imageExtent = {2, 1, 1};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001506 vuid = ycbcr ? "VUID-vkCmdCopyBufferToImage-imageExtent-00208" : "VUID-vkCmdCopyBufferToImage-imageExtent-00208";
sfricke-samsung3a10b922020-05-13 23:23:16 -07001507 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001508 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001509 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001510 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001511 m_errorMonitor->VerifyFound();
sfricke-samsung3a10b922020-05-13 23:23:16 -07001512 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001513 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001514 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001515 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001516 m_errorMonitor->VerifyFound();
1517
1518 // Offsets must be multiple of compressed block size
1519 region.imageOffset = {1, 1, 0};
1520 region.imageExtent = {1, 1, 1};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001521 vuid = ycbcr ? "VUID-vkCmdCopyBufferToImage-imageOffset-00205" : "VUID-vkCmdCopyBufferToImage-imageOffset-00205";
sfricke-samsung3a10b922020-05-13 23:23:16 -07001522 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001523 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001524 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001525 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001526 m_errorMonitor->VerifyFound();
sfricke-samsung3a10b922020-05-13 23:23:16 -07001527 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001528 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001529 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001530 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001531 m_errorMonitor->VerifyFound();
1532
1533 // Offset + extent width = mip width - should succeed
1534 region.imageOffset = {4, 4, 0};
1535 region.imageExtent = {3, 4, 1};
1536 region.imageSubresource.mipLevel = 2;
1537 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001538
1539 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1540 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001541 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1542 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001543
1544 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1545 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001546 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1547 &region);
unknown088160a2019-05-23 17:43:13 -06001548 m_errorMonitor->VerifyNotFound();
1549
unknown088160a2019-05-23 17:43:13 -06001550 // Offset + extent width < mip width and not a multiple of block width - should fail
1551 region.imageExtent = {3, 3, 1};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001552 vuid = ycbcr ? "VUID-vkCmdCopyBufferToImage-imageExtent-00208" : "VUID-vkCmdCopyBufferToImage-imageExtent-00208";
sfricke-samsung3a10b922020-05-13 23:23:16 -07001553 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001554 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001555 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001556 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1557 &region);
unknown088160a2019-05-23 17:43:13 -06001558 m_errorMonitor->VerifyFound();
sfricke-samsung3a10b922020-05-13 23:23:16 -07001559 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001560 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001561 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001562 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1563 &region);
unknown088160a2019-05-23 17:43:13 -06001564 m_errorMonitor->VerifyFound();
1565}
1566
1567TEST_F(VkLayerTest, ImageBufferCopyTests) {
1568 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001569
1570 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1571 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1572 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1573 if (mp_extensions) {
1574 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1575 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001576 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
sfricke-samsung6d97e562020-01-07 22:01:00 -08001577 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1578 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1579 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1580 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1581 if (mp_extensions) {
1582 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1583 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1584 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1585 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1586 }
1587 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001588
1589 // Bail if any dimension of transfer granularity is 0.
1590 auto index = m_device->graphics_queue_node_index_;
1591 auto queue_family_properties = m_device->phy().queue_properties();
1592 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1593 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1594 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1595 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1596 return;
1597 }
1598
sfricke-samsung6d97e562020-01-07 22:01:00 -08001599 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1600 // 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 -07001601 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1602 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001603 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001604 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1605 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1606 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1607 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1608 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001609 // compression
1610 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1611 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1612 // multi-planar
1613 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 -06001614
sfricke-samsung6d97e562020-01-07 22:01:00 -08001615 // Verify R8G8B8A8_UINT format is supported for transfer
1616 bool missing_rgba_support = false;
1617 VkFormatProperties props = {0, 0, 0};
1618 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1619 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1620 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1621 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1622
1623 if (!missing_rgba_support) {
1624 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1625 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1626 VK_IMAGE_TILING_OPTIMAL, 0);
1627 ASSERT_TRUE(image_64k.initialized());
1628
1629 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1630 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1631 VK_IMAGE_TILING_OPTIMAL, 0);
1632 ASSERT_TRUE(image_16k.initialized());
1633 }
unknown088160a2019-05-23 17:43:13 -06001634
1635 // Verify all needed Depth/Stencil formats are supported
1636 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001637 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001638 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1639 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1640 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001641 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001642 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1643 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1644 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001645 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001646 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1647 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1648 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001649 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001650 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1651 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1652 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1653
1654 if (!missing_ds_support) {
1655 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1656 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1657 ASSERT_TRUE(image_16k_depth.initialized());
1658
1659 ds_image_4D_1S.Init(
1660 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1661 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1662 VK_IMAGE_TILING_OPTIMAL, 0);
1663 ASSERT_TRUE(ds_image_4D_1S.initialized());
1664
1665 ds_image_3D_1S.Init(
1666 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1667 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1668 VK_IMAGE_TILING_OPTIMAL, 0);
1669 ASSERT_TRUE(ds_image_3D_1S.initialized());
1670
1671 ds_image_2D.Init(
1672 256, 256, 1, VK_FORMAT_D16_UNORM,
1673 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1674 VK_IMAGE_TILING_OPTIMAL, 0);
1675 ASSERT_TRUE(ds_image_2D.initialized());
1676
1677 ds_image_1S.Init(
1678 256, 256, 1, VK_FORMAT_S8_UINT,
1679 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1680 VK_IMAGE_TILING_OPTIMAL, 0);
1681 ASSERT_TRUE(ds_image_1S.initialized());
1682 }
1683
1684 // Allocate buffers
1685 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1686 VkMemoryPropertyFlags reqs = 0;
1687 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1688 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1689 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1690 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1691
1692 VkBufferImageCopy region = {};
1693 region.bufferRowLength = 0;
1694 region.bufferImageHeight = 0;
1695 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1696 region.imageSubresource.layerCount = 1;
1697 region.imageOffset = {0, 0, 0};
1698 region.imageExtent = {64, 64, 1};
1699 region.bufferOffset = 0;
1700
locke-lunargdf00db02020-03-04 19:00:57 -07001701 VkMemoryBarrier mem_barriers[3];
1702 mem_barriers[0] = lvl_init_struct<VkMemoryBarrier>();
1703 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1704 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1705 mem_barriers[1] = lvl_init_struct<VkMemoryBarrier>();
1706 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1707 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1708 mem_barriers[2] = lvl_init_struct<VkMemoryBarrier>();
1709 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1710 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1711
sfricke-samsung6d97e562020-01-07 22:01:00 -08001712 if (missing_rgba_support) {
1713 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001714
sfricke-samsung6d97e562020-01-07 22:01:00 -08001715 // start recording for future tests
1716 m_commandBuffer->begin();
1717 } else {
1718 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001719 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001720 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1721 &region);
unknown088160a2019-05-23 17:43:13 -06001722 m_errorMonitor->VerifyFound();
1723
Mark Lobodzinski20310782020-02-28 14:25:17 -07001724 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001725 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1726 &region);
1727 m_errorMonitor->VerifyFound();
1728
1729 // start recording
1730 m_commandBuffer->begin();
1731
1732 // successful copies
1733 m_errorMonitor->ExpectSuccess();
1734 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1735 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001736
1737 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1738 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001739 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1740 &region);
1741 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001742
1743 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1744 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001745 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1746 &region);
1747 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001748
1749 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1750 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001751 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1752 &region);
1753 region.imageOffset.x = 0;
1754 region.imageExtent.height = 64;
1755 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001756
1757 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1758 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001759 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1760 &region);
1761 m_errorMonitor->VerifyNotFound();
1762
1763 // image/buffer too small (extent too large) on copy to image
1764 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001765 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001766 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1767 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1768 &region);
1769 m_errorMonitor->VerifyFound();
1770
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001771 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001772 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001773 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
1774 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1775 &region);
1776 m_errorMonitor->VerifyFound();
1777
1778 // image/buffer too small (offset) on copy to image
1779 region.imageExtent = {64, 64, 1};
1780 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001781 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001782 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1783 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1784 &region);
1785 m_errorMonitor->VerifyFound();
1786
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001787 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
1788 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001789 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001790 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
1791 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1792 &region);
1793 m_errorMonitor->VerifyFound();
1794
1795 // image/buffer too small on copy to buffer
1796 region.imageExtent = {64, 64, 1};
1797 region.imageOffset = {0, 0, 0};
1798 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001799 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001800 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
1801 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1802 &region);
1803 m_errorMonitor->VerifyFound();
1804
1805 region.imageExtent = {64, 65, 1};
1806 region.bufferOffset = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001807 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001808 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001809 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // image too small
1810 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1811 &region);
1812 m_errorMonitor->VerifyFound();
1813
1814 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07001815 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001816 region.imageExtent = {64, 64, 1};
1817 region.bufferRowLength = 68;
1818 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1819 &region);
1820 m_errorMonitor->VerifyFound();
1821
1822 // An extent with zero area should produce a warning, but no error
Mark Lobodzinski20310782020-02-28 14:25:17 -07001823 m_errorMonitor->SetDesiredFailureMsg(kWarningBit | kErrorBit, "} has zero area");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001824 region.imageExtent.width = 0;
1825 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1826 &region);
1827 m_errorMonitor->VerifyFound();
1828
1829 // aspect bits
1830 region.imageExtent = {64, 64, 1};
1831 region.bufferRowLength = 0;
1832 region.bufferImageHeight = 0;
1833 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07001834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001835 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
1836 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
1837 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
1838 buffer_16k.handle(), 1, &region);
1839 m_errorMonitor->VerifyFound();
1840
Mark Lobodzinski20310782020-02-28 14:25:17 -07001841 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001842 "VUID-vkCmdCopyBufferToImage-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08001843 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1844 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
1845 buffer_16k.handle(), 1, &region);
1846 m_errorMonitor->VerifyFound();
1847 }
1848
Mark Lobodzinski20310782020-02-28 14:25:17 -07001849 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001850 "VUID-vkCmdCopyBufferToImage-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08001851 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
1852 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1853 &region);
1854 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06001855 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08001856
1857 // Out-of-range mip levels should fail
1858 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001859 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001860 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
1861 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
1862 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001863 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07001864 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001865 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // unavoidable "region exceeds image bounds" for non-existent mip
1866 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1867 &region);
1868 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001869 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001870 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
1871 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
1872 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001873 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07001874 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001875 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // unavoidable "region exceeds image bounds" for non-existent mip
1876 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1877 &region);
1878 m_errorMonitor->VerifyFound();
1879 region.imageSubresource.mipLevel = 0;
1880
1881 // Out-of-range array layers should fail
1882 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
1883 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001884 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001885 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1886 &region);
1887 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001888 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001889 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1890 &region);
1891 m_errorMonitor->VerifyFound();
1892 region.imageSubresource.baseArrayLayer = 0;
1893
1894 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07001895 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001896 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1897 buffer_16k.handle(), 1, &region);
1898 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001899 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001900 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
1901 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001902 m_errorMonitor->VerifyFound();
1903 }
1904
unknown088160a2019-05-23 17:43:13 -06001905 // Test Depth/Stencil copies
1906 if (missing_ds_support) {
1907 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
1908 } else {
1909 VkBufferImageCopy ds_region = {};
1910 ds_region.bufferOffset = 0;
1911 ds_region.bufferRowLength = 0;
1912 ds_region.bufferImageHeight = 0;
1913 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
1914 ds_region.imageSubresource.mipLevel = 0;
1915 ds_region.imageSubresource.baseArrayLayer = 0;
1916 ds_region.imageSubresource.layerCount = 1;
1917 ds_region.imageOffset = {0, 0, 0};
1918 ds_region.imageExtent = {256, 256, 1};
1919
1920 // Depth copies that should succeed
1921 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001922 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1923 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001924 m_errorMonitor->VerifyNotFound();
1925
1926 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001927 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1928 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001929 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1930 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001931 m_errorMonitor->VerifyNotFound();
1932
1933 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001934 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1935 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001936 m_errorMonitor->VerifyNotFound();
1937
1938 // Depth copies that should fail
1939 ds_region.bufferOffset = 4;
1940 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07001941 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001942 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001943 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1944 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001945 m_errorMonitor->VerifyFound();
1946
1947 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07001948 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06001949 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001950 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06001951 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001952 m_errorMonitor->VerifyFound();
1953
1954 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07001955 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001956 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001957 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1958 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001959 m_errorMonitor->VerifyFound();
1960
1961 // Stencil copies that should succeed
1962 ds_region.bufferOffset = 0;
1963 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
1964 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001965 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1966 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001967 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1968 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001969 m_errorMonitor->VerifyNotFound();
1970
1971 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001972 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1973 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001974 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1975 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001976 m_errorMonitor->VerifyNotFound();
1977
1978 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001979 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1980 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001981 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1982 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001983 m_errorMonitor->VerifyNotFound();
1984
1985 // Stencil copies that should fail
1986 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07001987 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001988 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001989 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1990 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001991 m_errorMonitor->VerifyFound();
1992
1993 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07001994 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001995 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
1996 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001997 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
1998 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06001999 m_errorMonitor->VerifyFound();
2000
2001 ds_region.bufferRowLength = 0;
2002 ds_region.bufferOffset = 4;
2003 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002004 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002005 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002006 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2007 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002008 m_errorMonitor->VerifyFound();
2009 }
2010
2011 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002012 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002013 VkPhysicalDeviceFeatures device_features = {};
2014 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2015 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2016 device_features.textureCompressionASTC_LDR)) {
2017 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2018 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002019 // Verify transfer support for each compression format used blow
2020 bool missing_bc_support = false;
2021 bool missing_etc_support = false;
2022 bool missing_astc_support = false;
2023 bool missing_compression_support = false;
2024
2025 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2026 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2027 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2028 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2029
2030 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2031 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2032 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2033 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2034
2035 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2036 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2037 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2038 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2039
2040 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002041 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2042 0);
2043 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2044 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002045 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002046 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2047 VK_IMAGE_TILING_OPTIMAL, 0);
2048 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2049 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002050 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002051 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2052 VK_IMAGE_TILING_OPTIMAL, 0);
2053 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2054 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002055 } else {
2056 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002057 }
unknown088160a2019-05-23 17:43:13 -06002058
sfricke-samsung6d97e562020-01-07 22:01:00 -08002059 if (missing_compression_support) {
2060 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2061 } else {
2062 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002063 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002064 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002065 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2066 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002067 m_errorMonitor->ExpectSuccess();
2068 region.imageExtent = {128, 128, 1};
2069 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2070 buffer_16k.handle(), 1, &region);
2071 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002072
sfricke-samsung6d97e562020-01-07 22:01:00 -08002073 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002074 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002075 region.bufferOffset = 16;
2076 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2077 buffer_16k.handle(), 1, &region);
2078 m_errorMonitor->VerifyFound();
2079 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002080
sfricke-samsung6d97e562020-01-07 22:01:00 -08002081 // extents that are not a multiple of compressed block size
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002082 vuid =
2083 mp_extensions ? "VUID-vkCmdCopyBufferToImage-imageExtent-00207" : "VUID-vkCmdCopyBufferToImage-imageExtent-00207";
sfricke-samsung3a10b922020-05-13 23:23:16 -07002084 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002085 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002086 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2087 region.imageExtent.width = 66;
2088 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2089 buffer_16k.handle(), 1, &region);
2090 m_errorMonitor->VerifyFound();
2091 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002092
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002093 vuid =
2094 mp_extensions ? "VUID-vkCmdCopyBufferToImage-imageExtent-00208" : "VUID-vkCmdCopyBufferToImage-imageExtent-00208";
sfricke-samsung3a10b922020-05-13 23:23:16 -07002095 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002096 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002097 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2098 region.imageExtent.height = 2;
2099 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2100 buffer_16k.handle(), 1, &region);
2101 m_errorMonitor->VerifyFound();
2102 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002103
sfricke-samsung6d97e562020-01-07 22:01:00 -08002104 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002105
sfricke-samsung6d97e562020-01-07 22:01:00 -08002106 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2107 m_errorMonitor->ExpectSuccess();
2108 region.imageExtent.width = 66;
2109 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002110 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2111 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002112 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2113 buffer_16k.handle(), 1, &region);
2114 region.imageExtent.width = 16;
2115 region.imageOffset.x = 0;
2116 region.imageExtent.height = 2;
2117 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002118 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2119 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002120 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2121 buffer_16k.handle(), 1, &region);
2122 m_errorMonitor->VerifyNotFound();
2123 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002124
sfricke-samsung6d97e562020-01-07 22:01:00 -08002125 // buffer offset must be a multiple of texel block size (16)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002126 vuid =
2127 mp_extensions ? "VUID-vkCmdCopyBufferToImage-bufferOffset-00206" : "VUID-vkCmdCopyBufferToImage-bufferOffset-00206";
sfricke-samsung3a10b922020-05-13 23:23:16 -07002128 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002129 vuid =
2130 mp_extensions ? "VUID-vkCmdCopyBufferToImage-bufferOffset-01558" : "VUID-vkCmdCopyBufferToImage-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002131 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002132 region.imageExtent = {64, 64, 1};
2133 region.bufferOffset = 24;
2134 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2135 buffer_16k.handle(), 1, &region);
2136 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002137
sfricke-samsung6d97e562020-01-07 22:01:00 -08002138 // rowlength not a multiple of block width (4)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002139 vuid = mp_extensions ? "VUID-vkCmdCopyBufferToImage-bufferRowLength-00203"
2140 : "VUID-vkCmdCopyBufferToImage-bufferRowLength-00203";
sfricke-samsung3a10b922020-05-13 23:23:16 -07002141 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002142 region.bufferOffset = 0;
2143 region.bufferRowLength = 130;
2144 region.bufferImageHeight = 0;
2145 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2146 buffer_64k.handle(), 1, &region);
2147 m_errorMonitor->VerifyFound();
2148
2149 // imageheight not a multiple of block height (4)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002150 vuid = mp_extensions ? "VUID-vkCmdCopyBufferToImage-bufferImageHeight-00204"
2151 : "VUID-vkCmdCopyBufferToImage-bufferImageHeight-00204";
sfricke-samsung3a10b922020-05-13 23:23:16 -07002152 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002153 region.bufferRowLength = 0;
2154 region.bufferImageHeight = 130;
2155 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2156 buffer_64k.handle(), 1, &region);
2157 m_errorMonitor->VerifyFound();
2158 }
2159 }
2160
2161 // Test multi-planar formats, if supported
2162 if (!mp_extensions) {
2163 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2164 } else {
2165 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2166 // being required with samplerYcbcrConversion feature
2167 bool missing_mp_support = false;
2168 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2169 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2170 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2171 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2172
2173 if (missing_mp_support) {
2174 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2175 } else {
2176 VkBufferImageCopy mp_region = {};
2177 mp_region.bufferOffset = 0;
2178 mp_region.bufferRowLength = 0;
2179 mp_region.bufferImageHeight = 0;
2180 mp_region.imageSubresource.mipLevel = 0;
2181 mp_region.imageSubresource.baseArrayLayer = 0;
2182 mp_region.imageSubresource.layerCount = 1;
2183 mp_region.imageOffset = {0, 0, 0};
2184 mp_region.imageExtent = {128, 128, 1};
2185
2186 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2187 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2188 VK_IMAGE_TILING_OPTIMAL, 0);
2189 ASSERT_TRUE(image_multi_planar.initialized());
2190
2191 // Copies into a mutli-planar image aspect properly
2192 m_errorMonitor->ExpectSuccess();
2193 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002194 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2195 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002196 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2197 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2198 m_errorMonitor->VerifyNotFound();
2199
2200 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002201 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002202 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2203 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2204 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2205 m_errorMonitor->VerifyFound();
2206
2207 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002208 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002209 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2210 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2211 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2212 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002213
2214 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002215 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002216 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2217 mp_region.bufferOffset = 5;
2218 mp_region.imageExtent = {8, 8, 1};
2219 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2220 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2221 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002222 }
unknown088160a2019-05-23 17:43:13 -06002223 }
2224}
2225
2226TEST_F(VkLayerTest, MiscImageLayerTests) {
2227 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2228
2229 ASSERT_NO_FATAL_FAILURE(Init());
2230
2231 // TODO: Ideally we should check if a format is supported, before using it.
2232 VkImageObj image(m_device);
2233 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2234 ASSERT_TRUE(image.initialized());
2235 VkBufferObj buffer;
2236 VkMemoryPropertyFlags reqs = 0;
2237 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2238 VkBufferImageCopy region = {};
2239 region.bufferRowLength = 128;
2240 region.bufferImageHeight = 128;
2241 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2242 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2243 region.imageSubresource.layerCount = 1;
2244 region.imageExtent.height = 4;
2245 region.imageExtent.width = 4;
2246 region.imageExtent.depth = 1;
2247
2248 VkImageObj image2(m_device);
2249 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2250 ASSERT_TRUE(image2.initialized());
2251 VkBufferObj buffer2;
2252 VkMemoryPropertyFlags reqs2 = 0;
2253 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002254 m_commandBuffer->begin();
2255
2256 // Image must have offset.z of 0 and extent.depth of 1
2257 // Introduce failure by setting imageExtent.depth to 0
2258 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002259 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002260 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2261 &region);
unknown088160a2019-05-23 17:43:13 -06002262 m_errorMonitor->VerifyFound();
2263
2264 region.imageExtent.depth = 1;
2265
2266 // Image must have offset.z of 0 and extent.depth of 1
2267 // Introduce failure by setting imageOffset.z to 4
2268 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2269 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002270 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2271 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002272 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00172");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002273 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2274 &region);
unknown088160a2019-05-23 17:43:13 -06002275 m_errorMonitor->VerifyFound();
2276
2277 region.imageOffset.z = 0;
2278 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2279 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2280 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002281 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002282 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2283 &region);
unknown088160a2019-05-23 17:43:13 -06002284 m_errorMonitor->VerifyFound();
2285
unknown088160a2019-05-23 17:43:13 -06002286 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2287 region.bufferOffset = 0;
2288 region.imageExtent.height = 128;
2289 region.imageExtent.width = 128;
2290 // Introduce failure by setting bufferRowLength > 0 but less than width
2291 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002292 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002293 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2294 &region);
unknown088160a2019-05-23 17:43:13 -06002295 m_errorMonitor->VerifyFound();
2296
2297 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2298 region.bufferRowLength = 128;
2299 // Introduce failure by setting bufferRowHeight > 0 but less than height
2300 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002301 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002302 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2303 &region);
unknown088160a2019-05-23 17:43:13 -06002304 m_errorMonitor->VerifyFound();
2305
2306 region.bufferImageHeight = 128;
2307 VkImageObj intImage1(m_device);
2308 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2309 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2310 VkImageObj intImage2(m_device);
2311 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2312 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2313 VkImageBlit blitRegion = {};
2314 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2315 blitRegion.srcSubresource.baseArrayLayer = 0;
2316 blitRegion.srcSubresource.layerCount = 1;
2317 blitRegion.srcSubresource.mipLevel = 0;
2318 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2319 blitRegion.dstSubresource.baseArrayLayer = 0;
2320 blitRegion.dstSubresource.layerCount = 1;
2321 blitRegion.dstSubresource.mipLevel = 0;
2322 blitRegion.srcOffsets[0] = {128, 0, 0};
2323 blitRegion.srcOffsets[1] = {128, 128, 1};
2324 blitRegion.dstOffsets[0] = {0, 128, 0};
2325 blitRegion.dstOffsets[1] = {128, 128, 1};
2326
2327 // Look for NULL-blit warning
Mark Lobodzinski20310782020-02-28 14:25:17 -07002328 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].srcOffsets specify a zero-volume area.");
2329 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002330 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2331 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002332 m_errorMonitor->VerifyFound();
2333}
2334
2335TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2336 // Image copy tests where format type and extents don't match
2337 ASSERT_NO_FATAL_FAILURE(Init());
2338
sfricke-samsung30b094c2020-05-30 11:42:11 -07002339 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2340 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
2341 printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
2342 return;
2343 }
2344
unknown088160a2019-05-23 17:43:13 -06002345 VkImageCreateInfo ci;
2346 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2347 ci.pNext = NULL;
2348 ci.flags = 0;
2349 ci.imageType = VK_IMAGE_TYPE_1D;
2350 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2351 ci.extent = {32, 1, 1};
2352 ci.mipLevels = 1;
2353 ci.arrayLayers = 1;
2354 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2355 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2356 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2357 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2358 ci.queueFamilyIndexCount = 0;
2359 ci.pQueueFamilyIndices = NULL;
2360 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2361
2362 // Create 1D image
2363 VkImageObj image_1D(m_device);
2364 image_1D.init(&ci);
2365 ASSERT_TRUE(image_1D.initialized());
2366
2367 // 2D image
2368 ci.imageType = VK_IMAGE_TYPE_2D;
2369 ci.extent = {32, 32, 1};
2370 VkImageObj image_2D(m_device);
2371 image_2D.init(&ci);
2372 ASSERT_TRUE(image_2D.initialized());
2373
2374 // 3D image
2375 ci.imageType = VK_IMAGE_TYPE_3D;
2376 ci.extent = {32, 32, 8};
2377 VkImageObj image_3D(m_device);
2378 image_3D.init(&ci);
2379 ASSERT_TRUE(image_3D.initialized());
2380
2381 // 2D image array
2382 ci.imageType = VK_IMAGE_TYPE_2D;
2383 ci.extent = {32, 32, 1};
2384 ci.arrayLayers = 8;
2385 VkImageObj image_2D_array(m_device);
2386 image_2D_array.init(&ci);
2387 ASSERT_TRUE(image_2D_array.initialized());
2388
2389 m_commandBuffer->begin();
2390
2391 VkImageCopy copy_region;
2392 copy_region.extent = {32, 1, 1};
2393 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2394 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2395 copy_region.srcSubresource.mipLevel = 0;
2396 copy_region.dstSubresource.mipLevel = 0;
2397 copy_region.srcSubresource.baseArrayLayer = 0;
2398 copy_region.dstSubresource.baseArrayLayer = 0;
2399 copy_region.srcSubresource.layerCount = 1;
2400 copy_region.dstSubresource.layerCount = 1;
2401 copy_region.srcOffset = {0, 0, 0};
2402 copy_region.dstOffset = {0, 0, 0};
2403
2404 // Sanity check
2405 m_errorMonitor->ExpectSuccess();
2406 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2407 &copy_region);
2408 m_errorMonitor->VerifyNotFound();
2409
2410 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2411 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002412 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2413 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002414 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2415 &copy_region);
2416 m_errorMonitor->VerifyFound();
2417 copy_region.srcOffset.y = 0;
2418 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002419 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2420 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002421 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2422 &copy_region);
2423 m_errorMonitor->VerifyFound();
2424 copy_region.dstOffset.y = 0;
2425
2426 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2427 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002428 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2429 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002430 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2431 &copy_region);
2432 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002433 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2434 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002435 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2436 &copy_region);
2437 m_errorMonitor->VerifyFound();
2438 copy_region.extent.height = 1;
2439
2440 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2441 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002442 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2443 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002444 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2445 &copy_region);
2446 m_errorMonitor->VerifyFound();
2447 copy_region.srcOffset.z = 0;
2448 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002449 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2450 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002451 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2452 &copy_region);
2453 m_errorMonitor->VerifyFound();
2454 copy_region.dstOffset.z = 0;
2455
2456 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2457 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002458 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002459 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002460 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002461 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002462 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002463 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002464 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002465 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2466 &copy_region);
2467 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002468 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002469 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002470 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002471 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002472 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002473 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002474 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002475 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2476 &copy_region);
2477 m_errorMonitor->VerifyFound();
2478 copy_region.extent.depth = 1;
2479
2480 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2481 copy_region.extent = {16, 16, 1};
2482 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002483 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002484 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002485 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002486 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2487 &copy_region);
2488 m_errorMonitor->VerifyFound();
2489 copy_region.srcOffset.z = 0;
2490 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002491 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002492 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002493 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002494 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2495 &copy_region);
2496 m_errorMonitor->VerifyFound();
2497 copy_region.dstOffset.z = 0;
2498
2499 // 3D texture accessing an array layer other than 0. VU 09c0011a
2500 copy_region.extent = {4, 4, 1};
2501 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002502 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002503 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002504 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2505 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2506 &copy_region);
2507 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002508 copy_region.srcSubresource.baseArrayLayer = 0;
2509
unknown088160a2019-05-23 17:43:13 -06002510 m_commandBuffer->end();
2511}
2512
2513TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2514 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002515 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06002516 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
2517 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2518 } else {
2519 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2520 return;
2521 }
2522 ASSERT_NO_FATAL_FAILURE(InitState());
2523
2524 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2525 VkFormatProperties format_props;
2526 // TODO: Remove this check if or when devsim handles extensions.
2527 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2528 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002529 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002530 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2531 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2532 return;
2533 }
2534
2535 VkImageCreateInfo ci;
2536 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2537 ci.pNext = NULL;
2538 ci.flags = 0;
2539 ci.imageType = VK_IMAGE_TYPE_1D;
2540 ci.format = image_format;
2541 ci.extent = {32, 1, 1};
2542 ci.mipLevels = 1;
2543 ci.arrayLayers = 1;
2544 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2545 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2546 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2547 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2548 ci.queueFamilyIndexCount = 0;
2549 ci.pQueueFamilyIndices = NULL;
2550 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2551
2552 // Create 1D image
2553 VkImageObj image_1D(m_device);
2554 image_1D.init(&ci);
2555 ASSERT_TRUE(image_1D.initialized());
2556
2557 // 2D image
2558 ci.imageType = VK_IMAGE_TYPE_2D;
2559 ci.extent = {32, 32, 1};
2560 VkImageObj image_2D(m_device);
2561 image_2D.init(&ci);
2562 ASSERT_TRUE(image_2D.initialized());
2563
2564 // 3D image
2565 ci.imageType = VK_IMAGE_TYPE_3D;
2566 ci.extent = {32, 32, 8};
2567 VkImageObj image_3D(m_device);
2568 image_3D.init(&ci);
2569 ASSERT_TRUE(image_3D.initialized());
2570
2571 // 2D image array
2572 ci.imageType = VK_IMAGE_TYPE_2D;
2573 ci.extent = {32, 32, 1};
2574 ci.arrayLayers = 8;
2575 VkImageObj image_2D_array(m_device);
2576 image_2D_array.init(&ci);
2577 ASSERT_TRUE(image_2D_array.initialized());
2578
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002579 // second 2D image array
2580 ci.imageType = VK_IMAGE_TYPE_2D;
2581 ci.extent = {32, 32, 1};
2582 ci.arrayLayers = 8;
2583 VkImageObj image_2D_array_2(m_device);
2584 image_2D_array_2.init(&ci);
2585 ASSERT_TRUE(image_2D_array_2.initialized());
2586
unknown088160a2019-05-23 17:43:13 -06002587 m_commandBuffer->begin();
2588
2589 VkImageCopy copy_region;
2590 copy_region.extent = {32, 1, 1};
2591 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2592 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2593 copy_region.srcSubresource.mipLevel = 0;
2594 copy_region.dstSubresource.mipLevel = 0;
2595 copy_region.srcSubresource.baseArrayLayer = 0;
2596 copy_region.dstSubresource.baseArrayLayer = 0;
2597 copy_region.srcSubresource.layerCount = 1;
2598 copy_region.dstSubresource.layerCount = 1;
2599 copy_region.srcOffset = {0, 0, 0};
2600 copy_region.dstOffset = {0, 0, 0};
2601
2602 // Copy from layer not present
2603 copy_region.srcSubresource.baseArrayLayer = 4;
2604 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002605 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002606 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2607 &copy_region);
2608 m_errorMonitor->VerifyFound();
2609 copy_region.srcSubresource.baseArrayLayer = 0;
2610 copy_region.srcSubresource.layerCount = 1;
2611
2612 // Copy to layer not present
2613 copy_region.dstSubresource.baseArrayLayer = 1;
2614 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002615 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002616 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2617 &copy_region);
2618 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002619 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002620 copy_region.dstSubresource.layerCount = 1;
2621
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002622 // both 2D and extent.depth not 1
2623 // Need two 2D array images to prevent other errors
2624 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002626 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2627 1, &copy_region);
2628 m_errorMonitor->VerifyFound();
2629 copy_region.extent = {32, 1, 1};
2630
2631 // 2D src / 3D dst and depth not equal to src layerCount
2632 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002633 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002634 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002635 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2636 &copy_region);
2637 m_errorMonitor->VerifyFound();
2638 copy_region.extent = {32, 1, 1};
2639
2640 // 3D src / 2D dst and depth not equal to dst layerCount
2641 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002642 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002643 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002644 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2645 &copy_region);
2646 m_errorMonitor->VerifyFound();
2647 copy_region.extent = {32, 1, 1};
2648
unknown088160a2019-05-23 17:43:13 -06002649 m_commandBuffer->end();
2650}
2651
2652TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
2653 // Image copy tests on compressed images with block alignment errors
2654 SetTargetApiVersion(VK_API_VERSION_1_1);
2655 ASSERT_NO_FATAL_FAILURE(Init());
2656
2657 // Select a compressed format and verify support
2658 VkPhysicalDeviceFeatures device_features = {};
2659 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2660 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
2661 if (device_features.textureCompressionBC) {
2662 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
2663 } else if (device_features.textureCompressionETC2) {
2664 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
2665 } else if (device_features.textureCompressionASTC_LDR) {
2666 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
2667 }
2668
2669 VkImageCreateInfo ci;
2670 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2671 ci.pNext = NULL;
2672 ci.flags = 0;
2673 ci.imageType = VK_IMAGE_TYPE_2D;
2674 ci.format = compressed_format;
2675 ci.extent = {64, 64, 1};
2676 ci.mipLevels = 1;
2677 ci.arrayLayers = 1;
2678 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2679 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2680 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2681 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2682 ci.queueFamilyIndexCount = 0;
2683 ci.pQueueFamilyIndices = NULL;
2684 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2685
2686 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002687 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
2688 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06002689 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
2690 return;
2691 }
2692
2693 // Create images
2694 VkImageObj image_1(m_device);
2695 image_1.init(&ci);
2696 ASSERT_TRUE(image_1.initialized());
2697
2698 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
2699 VkImageObj image_2(m_device);
2700 image_2.init(&ci);
2701 ASSERT_TRUE(image_2.initialized());
2702
2703 m_commandBuffer->begin();
2704
2705 VkImageCopy copy_region;
2706 copy_region.extent = {48, 48, 1};
2707 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2708 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2709 copy_region.srcSubresource.mipLevel = 0;
2710 copy_region.dstSubresource.mipLevel = 0;
2711 copy_region.srcSubresource.baseArrayLayer = 0;
2712 copy_region.dstSubresource.baseArrayLayer = 0;
2713 copy_region.srcSubresource.layerCount = 1;
2714 copy_region.dstSubresource.layerCount = 1;
2715 copy_region.srcOffset = {0, 0, 0};
2716 copy_region.dstOffset = {0, 0, 0};
2717
2718 // Sanity check
2719 m_errorMonitor->ExpectSuccess();
2720 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2721 m_errorMonitor->VerifyNotFound();
2722
2723 std::string vuid;
2724 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
2725 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
2726
2727 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
2728 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002729 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06002730 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07002731 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002733 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
2734 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2735 m_errorMonitor->VerifyFound();
2736 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07002737 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002739 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
2740 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2741 m_errorMonitor->VerifyFound();
2742 copy_region.srcOffset = {0, 0, 0};
2743
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002744 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06002745 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07002746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2747 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002748 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
2749 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2750 m_errorMonitor->VerifyFound();
2751 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07002752 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2753 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002754 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
2755 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2756 m_errorMonitor->VerifyFound();
2757 copy_region.dstOffset = {0, 0, 0};
2758
2759 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002760 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06002761 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07002762 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2763 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002764 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
2765 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2766 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002767 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06002768 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07002769 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2770 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002771 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
2772 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2773 m_errorMonitor->VerifyFound();
2774
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002775 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06002776 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07002777 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2778 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002779 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
2780 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2781 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002782 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06002783 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07002784 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
2785 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002786 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
2787 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2788 m_errorMonitor->VerifyFound();
2789
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002790 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
2791 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06002792 // There are currently no supported compressed formats with a block depth other than 1,
2793 // so impossible to create a 'not a multiple' condition for depth.
2794 m_commandBuffer->end();
2795}
2796
2797TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
2798 // Image copy tests on single-plane _422 formats with block alignment errors
2799
2800 // Enable KHR multiplane req'd extensions
2801 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
2802 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
2803 if (mp_extensions) {
2804 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2805 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002806 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06002807 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2808 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
2809 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
2810 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
2811 if (mp_extensions) {
2812 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2813 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
2814 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
2815 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
2816 } else {
2817 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
2818 return;
2819 }
2820 ASSERT_NO_FATAL_FAILURE(InitState());
2821
2822 // Select a _422 format and verify support
2823 VkImageCreateInfo ci = {};
2824 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2825 ci.pNext = NULL;
2826 ci.flags = 0;
2827 ci.imageType = VK_IMAGE_TYPE_2D;
2828 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
2829 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2830 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2831 ci.mipLevels = 1;
2832 ci.arrayLayers = 1;
2833 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2834 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2835 ci.queueFamilyIndexCount = 0;
2836 ci.pQueueFamilyIndices = NULL;
2837 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2838
2839 // Verify formats
2840 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
2841 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
2842 if (!supported) {
2843 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
2844 return; // Assume there's low ROI on searching for different mp formats
2845 }
2846
2847 // Create images
2848 ci.extent = {64, 64, 1};
2849 VkImageObj image_422(m_device);
2850 image_422.init(&ci);
2851 ASSERT_TRUE(image_422.initialized());
2852
2853 ci.extent = {64, 64, 1};
2854 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2855 VkImageObj image_ucmp(m_device);
2856 image_ucmp.init(&ci);
2857 ASSERT_TRUE(image_ucmp.initialized());
2858
2859 m_commandBuffer->begin();
2860
2861 VkImageCopy copy_region;
2862 copy_region.extent = {48, 48, 1};
2863 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2864 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2865 copy_region.srcSubresource.mipLevel = 0;
2866 copy_region.dstSubresource.mipLevel = 0;
2867 copy_region.srcSubresource.baseArrayLayer = 0;
2868 copy_region.dstSubresource.baseArrayLayer = 0;
2869 copy_region.srcSubresource.layerCount = 1;
2870 copy_region.dstSubresource.layerCount = 1;
2871 copy_region.srcOffset = {0, 0, 0};
2872 copy_region.dstOffset = {0, 0, 0};
2873
2874 // Src offsets must be multiples of compressed block sizes
2875 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002876 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002877 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06002878 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2879 &copy_region);
2880 m_errorMonitor->VerifyFound();
2881 copy_region.srcOffset = {0, 0, 0};
2882
2883 // Dst offsets must be multiples of compressed block sizes
2884 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002885 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002886 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002887 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06002888 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2889 &copy_region);
2890 m_errorMonitor->VerifyFound();
2891 copy_region.dstOffset = {0, 0, 0};
2892
2893 // Copy extent must be multiples of compressed block sizes if not full width/height
2894 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002895 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002896 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06002897 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2898 &copy_region);
2899 m_errorMonitor->VerifyFound();
2900
unknown357e1782019-09-25 17:57:40 -06002901 // 422 dest
unknown088160a2019-05-23 17:43:13 -06002902 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2903 &copy_region);
unknown357e1782019-09-25 17:57:40 -06002904 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002905 copy_region.dstOffset = {0, 0, 0};
2906
2907 m_commandBuffer->end();
2908}
2909
2910TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
2911 // Image copy tests on multiplane images with aspect errors
2912
2913 // Enable KHR multiplane req'd extensions
2914 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
2915 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
2916 if (mp_extensions) {
2917 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
2918 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002919 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06002920 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2921 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
2922 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
2923 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
2924 if (mp_extensions) {
2925 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2926 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
2927 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
2928 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
2929 } else {
2930 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
2931 return;
2932 }
2933 ASSERT_NO_FATAL_FAILURE(InitState());
2934
2935 // Select multi-plane formats and verify support
2936 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
2937 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
2938
2939 VkImageCreateInfo ci = {};
2940 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2941 ci.pNext = NULL;
2942 ci.flags = 0;
2943 ci.imageType = VK_IMAGE_TYPE_2D;
2944 ci.format = mp2_format;
2945 ci.extent = {256, 256, 1};
2946 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2947 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2948 ci.mipLevels = 1;
2949 ci.arrayLayers = 1;
2950 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2951 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2952 ci.queueFamilyIndexCount = 0;
2953 ci.pQueueFamilyIndices = NULL;
2954 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2955
2956 // Verify formats
2957 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
2958 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
2959 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
2960 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
2961 ci.format = mp3_format;
2962 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
2963 if (!supported) {
2964 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
2965 kSkipPrefix);
2966 return; // Assume there's low ROI on searching for different mp formats
2967 }
2968
2969 // Create images
2970 VkImageObj mp3_image(m_device);
2971 mp3_image.init(&ci);
2972 ASSERT_TRUE(mp3_image.initialized());
2973
2974 ci.format = mp2_format;
2975 VkImageObj mp2_image(m_device);
2976 mp2_image.init(&ci);
2977 ASSERT_TRUE(mp2_image.initialized());
2978
2979 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
2980 VkImageObj sp_image(m_device);
2981 sp_image.init(&ci);
2982 ASSERT_TRUE(sp_image.initialized());
2983
2984 m_commandBuffer->begin();
2985
2986 VkImageCopy copy_region;
2987 copy_region.extent = {128, 128, 1};
2988 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
2989 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
2990 copy_region.srcSubresource.mipLevel = 0;
2991 copy_region.dstSubresource.mipLevel = 0;
2992 copy_region.srcSubresource.baseArrayLayer = 0;
2993 copy_region.dstSubresource.baseArrayLayer = 0;
2994 copy_region.srcSubresource.layerCount = 1;
2995 copy_region.dstSubresource.layerCount = 1;
2996 copy_region.srcOffset = {0, 0, 0};
2997 copy_region.dstOffset = {0, 0, 0};
2998
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002999 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003000 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3001 &copy_region);
3002 m_errorMonitor->VerifyFound();
3003
unknown088160a2019-05-23 17:43:13 -06003004 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3005 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003007 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3008 &copy_region);
3009 m_errorMonitor->VerifyFound();
3010
3011 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3012 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003013 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003014 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3015 &copy_region);
3016 m_errorMonitor->VerifyFound();
3017
3018 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003019 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003020 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3021 &copy_region);
3022 m_errorMonitor->VerifyFound();
3023
3024 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003025 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003026 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003027 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3028 &copy_region);
3029 m_errorMonitor->VerifyFound();
3030
3031 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3032 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003033 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003035 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3036 &copy_region);
3037 m_errorMonitor->VerifyFound();
3038
3039 m_commandBuffer->end();
3040}
3041
3042TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3043 // Image copy with source region specified greater than src image size
3044 ASSERT_NO_FATAL_FAILURE(Init());
3045
3046 // Create images with full mip chain
3047 VkImageCreateInfo ci;
3048 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3049 ci.pNext = NULL;
3050 ci.flags = 0;
3051 ci.imageType = VK_IMAGE_TYPE_3D;
3052 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3053 ci.extent = {32, 32, 8};
3054 ci.mipLevels = 6;
3055 ci.arrayLayers = 1;
3056 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3057 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3058 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3059 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3060 ci.queueFamilyIndexCount = 0;
3061 ci.pQueueFamilyIndices = NULL;
3062 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3063
3064 VkImageObj src_image(m_device);
3065 src_image.init(&ci);
3066 ASSERT_TRUE(src_image.initialized());
3067
3068 // Dest image with one more mip level
3069 ci.extent = {64, 64, 16};
3070 ci.mipLevels = 7;
3071 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3072 VkImageObj dst_image(m_device);
3073 dst_image.init(&ci);
3074 ASSERT_TRUE(dst_image.initialized());
3075
3076 m_commandBuffer->begin();
3077
3078 VkImageCopy copy_region;
3079 copy_region.extent = {32, 32, 8};
3080 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3081 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3082 copy_region.srcSubresource.mipLevel = 0;
3083 copy_region.dstSubresource.mipLevel = 0;
3084 copy_region.srcSubresource.baseArrayLayer = 0;
3085 copy_region.dstSubresource.baseArrayLayer = 0;
3086 copy_region.srcSubresource.layerCount = 1;
3087 copy_region.dstSubresource.layerCount = 1;
3088 copy_region.srcOffset = {0, 0, 0};
3089 copy_region.dstOffset = {0, 0, 0};
3090
3091 m_errorMonitor->ExpectSuccess();
3092 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3093 &copy_region);
3094 m_errorMonitor->VerifyNotFound();
3095
3096 // Source exceeded in x-dim, VU 01202
3097 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003098 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003099 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3100 &copy_region);
3101 m_errorMonitor->VerifyFound();
3102
3103 // Source exceeded in y-dim, VU 01203
3104 copy_region.srcOffset.x = 0;
3105 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003106 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003107 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3108 &copy_region);
3109 m_errorMonitor->VerifyFound();
3110
3111 // Source exceeded in z-dim, VU 01204
3112 copy_region.extent = {4, 4, 4};
3113 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003114 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003115 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3116 &copy_region);
3117 m_errorMonitor->VerifyFound();
3118
3119 m_commandBuffer->end();
3120}
3121
3122TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3123 // Image copy with dest region specified greater than dest image size
3124 ASSERT_NO_FATAL_FAILURE(Init());
3125
3126 // Create images with full mip chain
3127 VkImageCreateInfo ci;
3128 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3129 ci.pNext = NULL;
3130 ci.flags = 0;
3131 ci.imageType = VK_IMAGE_TYPE_3D;
3132 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3133 ci.extent = {32, 32, 8};
3134 ci.mipLevels = 6;
3135 ci.arrayLayers = 1;
3136 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3137 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3138 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3139 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3140 ci.queueFamilyIndexCount = 0;
3141 ci.pQueueFamilyIndices = NULL;
3142 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3143
3144 VkImageObj dst_image(m_device);
3145 dst_image.init(&ci);
3146 ASSERT_TRUE(dst_image.initialized());
3147
3148 // Src image with one more mip level
3149 ci.extent = {64, 64, 16};
3150 ci.mipLevels = 7;
3151 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3152 VkImageObj src_image(m_device);
3153 src_image.init(&ci);
3154 ASSERT_TRUE(src_image.initialized());
3155
3156 m_commandBuffer->begin();
3157
3158 VkImageCopy copy_region;
3159 copy_region.extent = {32, 32, 8};
3160 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3161 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3162 copy_region.srcSubresource.mipLevel = 0;
3163 copy_region.dstSubresource.mipLevel = 0;
3164 copy_region.srcSubresource.baseArrayLayer = 0;
3165 copy_region.dstSubresource.baseArrayLayer = 0;
3166 copy_region.srcSubresource.layerCount = 1;
3167 copy_region.dstSubresource.layerCount = 1;
3168 copy_region.srcOffset = {0, 0, 0};
3169 copy_region.dstOffset = {0, 0, 0};
3170
3171 m_errorMonitor->ExpectSuccess();
3172 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3173 &copy_region);
3174 m_errorMonitor->VerifyNotFound();
3175
3176 // Dest exceeded in x-dim, VU 01205
3177 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003178 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003179 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3180 &copy_region);
3181 m_errorMonitor->VerifyFound();
3182
3183 // Dest exceeded in y-dim, VU 01206
3184 copy_region.dstOffset.x = 0;
3185 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003186 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003187 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3188 &copy_region);
3189 m_errorMonitor->VerifyFound();
3190
3191 // Dest exceeded in z-dim, VU 01207
3192 copy_region.extent = {4, 4, 4};
3193 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003194 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003195 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3196 &copy_region);
3197 m_errorMonitor->VerifyFound();
3198
3199 m_commandBuffer->end();
3200}
3201
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003202TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3203 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3204
3205 // Enable KHR multiplane req'd extensions
3206 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3207 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3208 if (mp_extensions == true) {
3209 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3210 }
3211 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3212 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3213 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3214 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3215 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3216 if (mp_extensions == true) {
3217 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3218 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3219 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3220 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3221 } else {
3222 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3223 return;
3224 }
3225 ASSERT_NO_FATAL_FAILURE(InitState());
3226
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003227 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3228 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003229 VkFormatProperties props = {0, 0, 0};
3230 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003231 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003232 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3233 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3234 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3235
3236 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003237 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003238 return;
3239 }
3240
3241 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3242 VkImageObj src_image(m_device);
3243 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003244 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 -08003245 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003246 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 -08003247 ASSERT_TRUE(dst_image.initialized());
3248
3249 VkImageCopy copy_region = {};
3250 copy_region.extent = {64, 64, 1}; // Size of plane 1
3251 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3252 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3253 copy_region.srcSubresource.mipLevel = 0;
3254 copy_region.dstSubresource.mipLevel = 0;
3255 copy_region.srcSubresource.baseArrayLayer = 0;
3256 copy_region.dstSubresource.baseArrayLayer = 0;
3257 copy_region.srcSubresource.layerCount = 1;
3258 copy_region.dstSubresource.layerCount = 1;
3259 copy_region.srcOffset = {0, 0, 0};
3260 copy_region.dstOffset = {0, 0, 0};
3261 VkImageCopy original_region = copy_region;
3262
3263 m_commandBuffer->begin();
3264
3265 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3266 m_errorMonitor->ExpectSuccess();
3267 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3268 &copy_region);
3269 m_errorMonitor->VerifyNotFound();
3270
3271 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3272 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3273 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3274 m_errorMonitor->ExpectSuccess();
3275 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3276 &copy_region);
3277 m_errorMonitor->VerifyNotFound();
3278
locke-lunargdf00db02020-03-04 19:00:57 -07003279 VkMemoryBarrier mem_barrier = lvl_init_struct<VkMemoryBarrier>();
3280 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3281 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3282
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003283 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3284 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3285 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3286 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003287 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3288 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003289 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3290 &copy_region);
3291 m_errorMonitor->VerifyNotFound();
3292
3293 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3294 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3295 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3296 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003297 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3298 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003299 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3300 &copy_region);
3301 m_errorMonitor->VerifyNotFound();
3302
3303 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3304 copy_region.extent = {128, 64, 1};
3305 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3306 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3307 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003308 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3309 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003310 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3311 &copy_region);
3312 m_errorMonitor->VerifyNotFound();
3313
3314 // 128x64 copy from plane 0 -> Plane 1
3315 copy_region.extent = {128, 64, 1};
3316 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3317 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003318 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003319 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3320 &copy_region);
3321 m_errorMonitor->VerifyFound();
3322
3323 // 128x64 copy from plane 1 -> Plane 0
3324 copy_region.extent = {128, 64, 1};
3325 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3326 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003327 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003328 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3329 &copy_region);
3330 m_errorMonitor->VerifyFound();
3331
3332 // src exceeded in y-dim from offset
3333 copy_region = original_region;
3334 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003335 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003336 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3337 &copy_region);
3338 m_errorMonitor->VerifyFound();
3339
3340 // dst exceeded in y-dim from offset
3341 copy_region = original_region;
3342 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003343 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003344 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3345 &copy_region);
3346 m_errorMonitor->VerifyFound();
3347
3348 m_commandBuffer->end();
3349}
3350
unknown088160a2019-05-23 17:43:13 -06003351TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003352 if (!EnableDeviceProfileLayer()) {
3353 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3354 return;
3355 }
unknown088160a2019-05-23 17:43:13 -06003356
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003357 // Enable KHR multiplane req'd extensions
3358 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3359 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3360 if (mp_extensions == true) {
3361 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3362 }
3363 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3364 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3365 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3366 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3367 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3368 if (mp_extensions == true) {
3369 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3370 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3371 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3372 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3373 }
3374 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003375
sfricke-samsung51067b22020-04-30 21:41:17 -07003376 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3377 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003378
sfricke-samsung51067b22020-04-30 21:41:17 -07003379 // Load required functions
3380 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3381 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3382 return;
3383 }
3384
3385 // Set transfer for all potential used formats
3386 VkFormatProperties format_props;
3387 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3388 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3389 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3390
3391 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3392 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3393 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003394
3395 VkImageCreateInfo image_create_info = {};
3396 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3397 image_create_info.pNext = NULL;
3398 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003399 image_create_info.extent.width = 32;
3400 image_create_info.extent.height = 32;
3401 image_create_info.extent.depth = 1;
3402 image_create_info.mipLevels = 1;
3403 image_create_info.arrayLayers = 1;
3404 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003405 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3406 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003407 image_create_info.flags = 0;
3408
sfricke-samsung51067b22020-04-30 21:41:17 -07003409 image_create_info.format = VK_FORMAT_R8_UNORM;
3410 VkImageObj image_8b_unorm(m_device);
3411 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003412
sfricke-samsung51067b22020-04-30 21:41:17 -07003413 image_create_info.format = VK_FORMAT_R8_UINT;
3414 VkImageObj image_8b_uint(m_device);
3415 image_8b_uint.init(&image_create_info);
3416
3417 // First try to test two single plane mismatch
3418 {
3419 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3420 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3421 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3422
3423 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3424 VkImageObj image_32b_unorm(m_device);
3425 image_32b_unorm.init(&image_create_info);
3426
3427 m_commandBuffer->begin();
3428 VkImageCopy copyRegion;
3429 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3430 copyRegion.srcSubresource.mipLevel = 0;
3431 copyRegion.srcSubresource.baseArrayLayer = 0;
3432 copyRegion.srcSubresource.layerCount = 1;
3433 copyRegion.srcOffset.x = 0;
3434 copyRegion.srcOffset.y = 0;
3435 copyRegion.srcOffset.z = 0;
3436 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3437 copyRegion.dstSubresource.mipLevel = 0;
3438 copyRegion.dstSubresource.baseArrayLayer = 0;
3439 copyRegion.dstSubresource.layerCount = 1;
3440 copyRegion.dstOffset.x = 0;
3441 copyRegion.dstOffset.y = 0;
3442 copyRegion.dstOffset.z = 0;
3443 copyRegion.extent.width = 1;
3444 copyRegion.extent.height = 1;
3445 copyRegion.extent.depth = 1;
3446
3447 // Sanity check between two 8bit formats
3448 m_errorMonitor->ExpectSuccess();
3449 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3450 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3451 m_errorMonitor->VerifyNotFound();
3452
3453 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3454 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3455 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3456 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3457 m_errorMonitor->VerifyFound();
3458
3459 // Swap src and dst
3460 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3461 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3462 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3463 m_errorMonitor->VerifyFound();
3464
3465 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003466 }
3467
sfricke-samsung51067b22020-04-30 21:41:17 -07003468 // DstImage is a mismatched plane of a multi-planar format
3469 if (mp_extensions == false) {
3470 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3471 } else {
3472 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3473 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3474 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003475
sfricke-samsung51067b22020-04-30 21:41:17 -07003476 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3477 VkImageObj image_8b_16b_420_unorm(m_device);
3478 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003479
sfricke-samsung51067b22020-04-30 21:41:17 -07003480 m_commandBuffer->begin();
3481 VkImageCopy copyRegion;
3482 copyRegion.srcSubresource.mipLevel = 0;
3483 copyRegion.srcSubresource.baseArrayLayer = 0;
3484 copyRegion.srcSubresource.layerCount = 1;
3485 copyRegion.srcOffset.x = 0;
3486 copyRegion.srcOffset.y = 0;
3487 copyRegion.srcOffset.z = 0;
3488 copyRegion.dstSubresource.mipLevel = 0;
3489 copyRegion.dstSubresource.baseArrayLayer = 0;
3490 copyRegion.dstSubresource.layerCount = 1;
3491 copyRegion.dstOffset.x = 0;
3492 copyRegion.dstOffset.y = 0;
3493 copyRegion.dstOffset.z = 0;
3494 copyRegion.extent.width = 1;
3495 copyRegion.extent.height = 1;
3496 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003497
sfricke-samsung51067b22020-04-30 21:41:17 -07003498 // First test single-plane -> multi-plan
3499 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3500 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003501
sfricke-samsung51067b22020-04-30 21:41:17 -07003502 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3503 m_errorMonitor->ExpectSuccess();
3504 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3505 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3506 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003507
locke-lunargdf00db02020-03-04 19:00:57 -07003508 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3509 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3510
sfricke-samsung51067b22020-04-30 21:41:17 -07003511 // Make sure no false postiives if Compatible format
3512 m_errorMonitor->ExpectSuccess();
3513 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3514 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3515 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003516
sfricke-samsung51067b22020-04-30 21:41:17 -07003517 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3518 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3519 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3520 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3521 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3522 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003523
sfricke-samsung51067b22020-04-30 21:41:17 -07003524 // Same tests but swap src and dst
3525 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3526 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003527
locke-lunargdf00db02020-03-04 19:00:57 -07003528 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3529 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3530 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3531 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3532
sfricke-samsung51067b22020-04-30 21:41:17 -07003533 m_errorMonitor->ExpectSuccess();
3534 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3535 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3536 m_errorMonitor->VerifyNotFound();
3537
locke-lunargdf00db02020-03-04 19:00:57 -07003538 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3539 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3540
sfricke-samsung51067b22020-04-30 21:41:17 -07003541 m_errorMonitor->ExpectSuccess();
3542 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3543 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3544 m_errorMonitor->VerifyNotFound();
3545
3546 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3547 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3548 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3549 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3550 m_errorMonitor->VerifyFound();
3551
3552 m_commandBuffer->end();
3553 }
unknown088160a2019-05-23 17:43:13 -06003554}
3555
3556TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3557 ASSERT_NO_FATAL_FAILURE(Init());
3558 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3559 if (!depth_format) {
3560 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3561 return;
3562 }
3563
3564 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003565 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003566 if (properties.optimalTilingFeatures == 0) {
3567 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3568 return;
3569 }
3570
3571 VkImageObj srcImage(m_device);
3572 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3573 ASSERT_TRUE(srcImage.initialized());
3574 VkImageObj dstImage(m_device);
3575 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3576 ASSERT_TRUE(dstImage.initialized());
3577
3578 // Create two images of different types and try to copy between them
3579
3580 m_commandBuffer->begin();
3581 VkImageCopy copyRegion;
3582 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3583 copyRegion.srcSubresource.mipLevel = 0;
3584 copyRegion.srcSubresource.baseArrayLayer = 0;
3585 copyRegion.srcSubresource.layerCount = 1;
3586 copyRegion.srcOffset.x = 0;
3587 copyRegion.srcOffset.y = 0;
3588 copyRegion.srcOffset.z = 0;
3589 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3590 copyRegion.dstSubresource.mipLevel = 0;
3591 copyRegion.dstSubresource.baseArrayLayer = 0;
3592 copyRegion.dstSubresource.layerCount = 1;
3593 copyRegion.dstOffset.x = 0;
3594 copyRegion.dstOffset.y = 0;
3595 copyRegion.dstOffset.z = 0;
3596 copyRegion.extent.width = 1;
3597 copyRegion.extent.height = 1;
3598 copyRegion.extent.depth = 1;
3599
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003600 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003601 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3602 &copyRegion);
3603 m_commandBuffer->end();
3604
3605 m_errorMonitor->VerifyFound();
3606}
3607
3608TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3609 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3610
3611 ASSERT_NO_FATAL_FAILURE(Init());
3612
3613 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003614 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3615 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3616 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003617
3618 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3619 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
3620 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
3621 return;
3622 }
3623
3624 VkImageCreateInfo ci;
3625 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3626 ci.pNext = NULL;
3627 ci.flags = 0;
3628 ci.imageType = VK_IMAGE_TYPE_2D;
3629 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3630 ci.extent = {128, 128, 1};
3631 ci.mipLevels = 1;
3632 ci.arrayLayers = 1;
3633 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3634 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3635 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3636 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3637 ci.queueFamilyIndexCount = 0;
3638 ci.pQueueFamilyIndices = NULL;
3639 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3640
3641 VkImageObj image1(m_device);
3642 image1.init(&ci);
3643 ASSERT_TRUE(image1.initialized());
3644
3645 ci.samples = VK_SAMPLE_COUNT_2_BIT;
3646 VkImageObj image2(m_device);
3647 image2.init(&ci);
3648 ASSERT_TRUE(image2.initialized());
3649
3650 ci.samples = VK_SAMPLE_COUNT_4_BIT;
3651 VkImageObj image4(m_device);
3652 image4.init(&ci);
3653 ASSERT_TRUE(image4.initialized());
3654
3655 m_commandBuffer->begin();
3656
3657 VkImageCopy copyRegion;
3658 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3659 copyRegion.srcSubresource.mipLevel = 0;
3660 copyRegion.srcSubresource.baseArrayLayer = 0;
3661 copyRegion.srcSubresource.layerCount = 1;
3662 copyRegion.srcOffset = {0, 0, 0};
3663 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3664 copyRegion.dstSubresource.mipLevel = 0;
3665 copyRegion.dstSubresource.baseArrayLayer = 0;
3666 copyRegion.dstSubresource.layerCount = 1;
3667 copyRegion.dstOffset = {0, 0, 0};
3668 copyRegion.extent = {128, 128, 1};
3669
3670 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07003671 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003672 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
3673 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003674 m_errorMonitor->VerifyFound();
3675
Mark Lobodzinski20310782020-02-28 14:25:17 -07003676 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003677 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
3678 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003679 m_errorMonitor->VerifyFound();
3680
3681 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07003682 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003683 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
3684 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003685 m_errorMonitor->VerifyFound();
3686
Mark Lobodzinski20310782020-02-28 14:25:17 -07003687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003688 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
3689 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003690 m_errorMonitor->VerifyFound();
3691
3692 m_commandBuffer->end();
3693}
3694
3695TEST_F(VkLayerTest, CopyImageAspectMismatch) {
3696 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003697
3698 if (!EnableDeviceProfileLayer()) {
3699 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3700 return;
3701 }
3702
3703 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
3704 if (mp_extensions) {
3705 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3706 }
3707
3708 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3709 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3710 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3711 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3712 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3713 if (mp_extensions) {
3714 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3715 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3716 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3717 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3718 }
3719 ASSERT_NO_FATAL_FAILURE(InitState());
3720
3721 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3722 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
3723
3724 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3725 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
3726 return;
3727 }
3728
unknown088160a2019-05-23 17:43:13 -06003729 auto ds_format = FindSupportedDepthStencilFormat(gpu());
3730 if (!ds_format) {
3731 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
3732 return;
3733 }
3734
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003735 // Add Transfer support for all used formats
3736 VkFormatProperties formatProps;
3737 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
3738 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
3739 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
3740 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
3741 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
3742 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
3743 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
3744 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
3745 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
3746
unknown088160a2019-05-23 17:43:13 -06003747 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
3748 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3749 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
3750 VK_IMAGE_TILING_OPTIMAL, 0);
3751 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
3752 VK_IMAGE_TILING_OPTIMAL, 0);
3753 ASSERT_TRUE(color_image.initialized());
3754 ASSERT_TRUE(depth_image.initialized());
3755 ASSERT_TRUE(ds_image.initialized());
3756
3757 VkImageCopy copyRegion;
3758 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3759 copyRegion.srcSubresource.mipLevel = 0;
3760 copyRegion.srcSubresource.baseArrayLayer = 0;
3761 copyRegion.srcSubresource.layerCount = 1;
3762 copyRegion.srcOffset = {0, 0, 0};
3763 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3764 copyRegion.dstSubresource.mipLevel = 0;
3765 copyRegion.dstSubresource.baseArrayLayer = 0;
3766 copyRegion.dstSubresource.layerCount = 1;
3767 copyRegion.dstOffset = {64, 0, 0};
3768 copyRegion.extent = {64, 128, 1};
3769
3770 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07003771 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003772 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003773 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
3774 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003775 m_errorMonitor->VerifyFound();
3776
3777 m_commandBuffer->begin();
3778
3779 // Src and dest aspect masks don't match
3780 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003781 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07003782 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003783 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
3784 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003785 m_errorMonitor->VerifyFound();
3786 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3787
3788 // Illegal combinations of aspect bits
3789 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
3790 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07003791 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06003792 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003793 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003794 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003795 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
3796 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003797 m_errorMonitor->VerifyFound();
3798 // same test for dstSubresource
3799 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3800 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07003801 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06003802 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003803 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003804 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003805 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
3806 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003807 m_errorMonitor->VerifyFound();
3808
3809 // Metadata aspect is illegal
3810 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
3811 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07003812 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06003813 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07003814 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003815 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
3816 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003817 m_errorMonitor->VerifyFound();
3818 // same test for dstSubresource
3819 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3820 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07003821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06003822 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07003823 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003824 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
3825 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003826 m_errorMonitor->VerifyFound();
3827
3828 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3829 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003830 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06003831
3832 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06003834 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003835 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003836 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
3837 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003838 m_errorMonitor->VerifyFound();
3839
3840 // Aspect mask doesn't match dest image format
3841 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3842 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003843 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06003844 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003845 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003846 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
3847 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003848 m_errorMonitor->VerifyFound();
3849
3850 m_commandBuffer->end();
3851}
3852
3853TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07003854 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06003855
3856 ASSERT_NO_FATAL_FAILURE(Init());
3857
3858 // Create two images of sample count 1 and try to Resolve between them
3859
3860 VkImageCreateInfo image_create_info = {};
3861 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3862 image_create_info.pNext = NULL;
3863 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3864 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3865 image_create_info.extent.width = 32;
3866 image_create_info.extent.height = 1;
3867 image_create_info.extent.depth = 1;
3868 image_create_info.mipLevels = 1;
3869 image_create_info.arrayLayers = 1;
3870 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3871 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3872 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3873 image_create_info.flags = 0;
3874
3875 VkImageObj srcImage(m_device);
3876 srcImage.init(&image_create_info);
3877 ASSERT_TRUE(srcImage.initialized());
3878
3879 VkImageObj dstImage(m_device);
3880 dstImage.init(&image_create_info);
3881 ASSERT_TRUE(dstImage.initialized());
3882
3883 m_commandBuffer->begin();
3884 VkImageResolve resolveRegion;
3885 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3886 resolveRegion.srcSubresource.mipLevel = 0;
3887 resolveRegion.srcSubresource.baseArrayLayer = 0;
3888 resolveRegion.srcSubresource.layerCount = 1;
3889 resolveRegion.srcOffset.x = 0;
3890 resolveRegion.srcOffset.y = 0;
3891 resolveRegion.srcOffset.z = 0;
3892 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3893 resolveRegion.dstSubresource.mipLevel = 0;
3894 resolveRegion.dstSubresource.baseArrayLayer = 0;
3895 resolveRegion.dstSubresource.layerCount = 1;
3896 resolveRegion.dstOffset.x = 0;
3897 resolveRegion.dstOffset.y = 0;
3898 resolveRegion.dstOffset.z = 0;
3899 resolveRegion.extent.width = 1;
3900 resolveRegion.extent.height = 1;
3901 resolveRegion.extent.depth = 1;
3902 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3903 &resolveRegion);
3904 m_commandBuffer->end();
3905
3906 m_errorMonitor->VerifyFound();
3907}
3908
3909TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07003910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06003911
3912 ASSERT_NO_FATAL_FAILURE(Init());
3913
3914 // Create two images of sample count 4 and try to Resolve between them
3915
3916 VkImageCreateInfo image_create_info = {};
3917 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3918 image_create_info.pNext = NULL;
3919 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3920 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3921 image_create_info.extent.width = 32;
3922 image_create_info.extent.height = 1;
3923 image_create_info.extent.depth = 1;
3924 image_create_info.mipLevels = 1;
3925 image_create_info.arrayLayers = 1;
3926 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
3927 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3928 // Note: Some implementations expect color attachment usage for any
3929 // multisample surface
3930 image_create_info.usage =
3931 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
3932 image_create_info.flags = 0;
3933
3934 VkImageObj srcImage(m_device);
3935 srcImage.init(&image_create_info);
3936 ASSERT_TRUE(srcImage.initialized());
3937
3938 VkImageObj dstImage(m_device);
3939 dstImage.init(&image_create_info);
3940 ASSERT_TRUE(dstImage.initialized());
3941
3942 m_commandBuffer->begin();
3943 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
3944 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
3945 // VK_IMAGE_LAYOUT_GENERAL = 1,
3946 VkImageResolve resolveRegion;
3947 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3948 resolveRegion.srcSubresource.mipLevel = 0;
3949 resolveRegion.srcSubresource.baseArrayLayer = 0;
3950 resolveRegion.srcSubresource.layerCount = 1;
3951 resolveRegion.srcOffset.x = 0;
3952 resolveRegion.srcOffset.y = 0;
3953 resolveRegion.srcOffset.z = 0;
3954 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3955 resolveRegion.dstSubresource.mipLevel = 0;
3956 resolveRegion.dstSubresource.baseArrayLayer = 0;
3957 resolveRegion.dstSubresource.layerCount = 1;
3958 resolveRegion.dstOffset.x = 0;
3959 resolveRegion.dstOffset.y = 0;
3960 resolveRegion.dstOffset.z = 0;
3961 resolveRegion.extent.width = 1;
3962 resolveRegion.extent.height = 1;
3963 resolveRegion.extent.depth = 1;
3964 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3965 &resolveRegion);
3966 m_commandBuffer->end();
3967
3968 m_errorMonitor->VerifyFound();
3969}
3970
3971TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07003972 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06003973
3974 ASSERT_NO_FATAL_FAILURE(Init());
3975
3976 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06003977 VkImageObj srcImage(m_device);
3978 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06003979
3980 VkImageCreateInfo image_create_info = {};
3981 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3982 image_create_info.pNext = NULL;
3983 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3984 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3985 image_create_info.extent.width = 32;
3986 image_create_info.extent.height = 1;
3987 image_create_info.extent.depth = 1;
3988 image_create_info.mipLevels = 1;
3989 image_create_info.arrayLayers = 1;
3990 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
3991 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3992 // Note: Some implementations expect color attachment usage for any
3993 // multisample surface
3994 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
3995 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06003996 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003997
3998 // Set format to something other than source image
3999 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4000 // Note: Some implementations expect color attachment usage for any
4001 // multisample surface
4002 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4003 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004004 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004005
4006 m_commandBuffer->begin();
4007 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4008 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4009 // VK_IMAGE_LAYOUT_GENERAL = 1,
4010 VkImageResolve resolveRegion;
4011 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4012 resolveRegion.srcSubresource.mipLevel = 0;
4013 resolveRegion.srcSubresource.baseArrayLayer = 0;
4014 resolveRegion.srcSubresource.layerCount = 1;
4015 resolveRegion.srcOffset.x = 0;
4016 resolveRegion.srcOffset.y = 0;
4017 resolveRegion.srcOffset.z = 0;
4018 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4019 resolveRegion.dstSubresource.mipLevel = 0;
4020 resolveRegion.dstSubresource.baseArrayLayer = 0;
4021 resolveRegion.dstSubresource.layerCount = 1;
4022 resolveRegion.dstOffset.x = 0;
4023 resolveRegion.dstOffset.y = 0;
4024 resolveRegion.dstOffset.z = 0;
4025 resolveRegion.extent.width = 1;
4026 resolveRegion.extent.height = 1;
4027 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004028 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4029 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004030 m_commandBuffer->end();
4031
4032 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004033}
4034
4035TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004036 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004037
4038 ASSERT_NO_FATAL_FAILURE(Init());
4039
4040 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004041 VkImageObj srcImage(m_device);
4042 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004043
4044 VkImageCreateInfo image_create_info = {};
4045 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4046 image_create_info.pNext = NULL;
4047 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4048 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4049 image_create_info.extent.width = 32;
4050 image_create_info.extent.height = 1;
4051 image_create_info.extent.depth = 1;
4052 image_create_info.mipLevels = 1;
4053 image_create_info.arrayLayers = 1;
4054 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4055 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4056 // Note: Some implementations expect color attachment usage for any
4057 // multisample surface
4058 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4059 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004060 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004061
4062 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4063 // Note: Some implementations expect color attachment usage for any
4064 // multisample surface
4065 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4066 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004067 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004068
4069 m_commandBuffer->begin();
4070 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4071 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4072 // VK_IMAGE_LAYOUT_GENERAL = 1,
4073 VkImageResolve resolveRegion;
4074 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4075 resolveRegion.srcSubresource.mipLevel = 0;
4076 resolveRegion.srcSubresource.baseArrayLayer = 0;
4077 resolveRegion.srcSubresource.layerCount = 1;
4078 resolveRegion.srcOffset.x = 0;
4079 resolveRegion.srcOffset.y = 0;
4080 resolveRegion.srcOffset.z = 0;
4081 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4082 resolveRegion.dstSubresource.mipLevel = 0;
4083 resolveRegion.dstSubresource.baseArrayLayer = 0;
4084 resolveRegion.dstSubresource.layerCount = 1;
4085 resolveRegion.dstOffset.x = 0;
4086 resolveRegion.dstOffset.y = 0;
4087 resolveRegion.dstOffset.z = 0;
4088 resolveRegion.extent.width = 1;
4089 resolveRegion.extent.height = 1;
4090 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004091 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4092 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004093 m_commandBuffer->end();
4094
4095 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004096}
4097
4098TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4099 ASSERT_NO_FATAL_FAILURE(Init());
4100
4101 // Create two images of different types and try to copy between them
4102 VkImageObj srcImage(m_device);
4103 VkImageObj dstImage(m_device);
4104
4105 VkImageCreateInfo image_create_info = {};
4106 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4107 image_create_info.pNext = NULL;
4108 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4109 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4110 image_create_info.extent.width = 32;
4111 image_create_info.extent.height = 32;
4112 image_create_info.extent.depth = 1;
4113 image_create_info.mipLevels = 1;
4114 image_create_info.arrayLayers = 1;
4115 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4116 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4117 image_create_info.usage =
4118 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4119 // Note: Some implementations expect color attachment usage for any
4120 // multisample surface
4121 image_create_info.flags = 0;
4122 srcImage.init(&image_create_info);
4123 ASSERT_TRUE(srcImage.initialized());
4124
4125 // Note: Some implementations expect color attachment usage for any
4126 // multisample surface
4127 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4128 dstImage.init(&image_create_info);
4129 ASSERT_TRUE(dstImage.initialized());
4130
4131 m_commandBuffer->begin();
4132 // source image must have valid contents before resolve
4133 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4134 VkImageSubresourceRange subresource = {};
4135 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4136 subresource.layerCount = 1;
4137 subresource.levelCount = 1;
4138 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4139 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4140 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4141 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4142
4143 VkImageResolve resolveRegion;
4144 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4145 resolveRegion.srcSubresource.mipLevel = 0;
4146 resolveRegion.srcSubresource.baseArrayLayer = 0;
4147 resolveRegion.srcSubresource.layerCount = 1;
4148 resolveRegion.srcOffset.x = 0;
4149 resolveRegion.srcOffset.y = 0;
4150 resolveRegion.srcOffset.z = 0;
4151 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4152 resolveRegion.dstSubresource.mipLevel = 0;
4153 resolveRegion.dstSubresource.baseArrayLayer = 0;
4154 resolveRegion.dstSubresource.layerCount = 1;
4155 resolveRegion.dstOffset.x = 0;
4156 resolveRegion.dstOffset.y = 0;
4157 resolveRegion.dstOffset.z = 0;
4158 resolveRegion.extent.width = 1;
4159 resolveRegion.extent.height = 1;
4160 resolveRegion.extent.depth = 1;
4161 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004162 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004163 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4164 1, &resolveRegion);
4165 m_errorMonitor->VerifyFound();
4166 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004167 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004168 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4169 1, &resolveRegion);
4170 m_errorMonitor->VerifyFound();
4171 m_commandBuffer->end();
4172}
4173
4174TEST_F(VkLayerTest, ResolveInvalidSubresource) {
4175 ASSERT_NO_FATAL_FAILURE(Init());
4176
4177 // Create two images of different types and try to copy between them
4178 VkImageObj srcImage(m_device);
4179 VkImageObj dstImage(m_device);
4180
4181 VkImageCreateInfo image_create_info = {};
4182 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4183 image_create_info.pNext = NULL;
4184 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4185 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4186 image_create_info.extent.width = 32;
4187 image_create_info.extent.height = 32;
4188 image_create_info.extent.depth = 1;
4189 image_create_info.mipLevels = 1;
4190 image_create_info.arrayLayers = 1;
4191 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4192 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4193 image_create_info.usage =
4194 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4195 // Note: Some implementations expect color attachment usage for any
4196 // multisample surface
4197 image_create_info.flags = 0;
4198 srcImage.init(&image_create_info);
4199 ASSERT_TRUE(srcImage.initialized());
4200
4201 // Note: Some implementations expect color attachment usage for any
4202 // multisample surface
4203 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4204 dstImage.init(&image_create_info);
4205 ASSERT_TRUE(dstImage.initialized());
4206
4207 m_commandBuffer->begin();
4208 // source image must have valid contents before resolve
4209 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4210 VkImageSubresourceRange subresource = {};
4211 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4212 subresource.layerCount = 1;
4213 subresource.levelCount = 1;
4214 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4215 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4216 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4217 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4218
4219 VkImageResolve resolveRegion;
4220 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4221 resolveRegion.srcSubresource.mipLevel = 0;
4222 resolveRegion.srcSubresource.baseArrayLayer = 0;
4223 resolveRegion.srcSubresource.layerCount = 1;
4224 resolveRegion.srcOffset.x = 0;
4225 resolveRegion.srcOffset.y = 0;
4226 resolveRegion.srcOffset.z = 0;
4227 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4228 resolveRegion.dstSubresource.mipLevel = 0;
4229 resolveRegion.dstSubresource.baseArrayLayer = 0;
4230 resolveRegion.dstSubresource.layerCount = 1;
4231 resolveRegion.dstOffset.x = 0;
4232 resolveRegion.dstOffset.y = 0;
4233 resolveRegion.dstOffset.z = 0;
4234 resolveRegion.extent.width = 1;
4235 resolveRegion.extent.height = 1;
4236 resolveRegion.extent.depth = 1;
4237 // invalid source mip level
4238 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004239 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004240 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4241 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4242 m_errorMonitor->VerifyFound();
4243 resolveRegion.srcSubresource.mipLevel = 0;
4244 // invalid dest mip level
4245 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004246 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004247 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4248 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4249 m_errorMonitor->VerifyFound();
4250 resolveRegion.dstSubresource.mipLevel = 0;
4251 // invalid source array layer range
4252 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004253 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004254 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4255 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4256 m_errorMonitor->VerifyFound();
4257 resolveRegion.srcSubresource.baseArrayLayer = 0;
4258 // invalid dest array layer range
4259 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004260 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004261 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4262 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4263 m_errorMonitor->VerifyFound();
4264 resolveRegion.dstSubresource.baseArrayLayer = 0;
4265
4266 m_commandBuffer->end();
4267}
4268
sfricke-samsungf78d0592020-06-11 21:34:44 -07004269TEST_F(VkLayerTest, ResolveImageImageType) {
4270 ASSERT_NO_FATAL_FAILURE(Init());
4271 // Create images of different types and try to resolve between them
4272 VkImageObj srcImage2D(m_device);
4273 VkImageObj dstImage1D(m_device);
4274 VkImageObj dstImage3D(m_device);
4275
4276 VkImageCreateInfo image_create_info = {};
4277 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4278 image_create_info.pNext = NULL;
4279 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4280 image_create_info.extent.width = 32;
4281 image_create_info.extent.height = 1;
4282 image_create_info.extent.depth = 1;
4283 image_create_info.mipLevels = 1;
4284 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
4285 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4286 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4287 image_create_info.usage =
4288 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4289 // Note: Some implementations expect color attachment usage for any
4290 // multisample surface
4291 image_create_info.flags = 0;
4292
4293 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4294 srcImage2D.init(&image_create_info);
4295 ASSERT_TRUE(srcImage2D.initialized());
4296
4297 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4298 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4299 dstImage1D.init(&image_create_info);
4300 ASSERT_TRUE(dstImage1D.initialized());
4301
4302 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4303 image_create_info.extent.height = 16;
4304 image_create_info.extent.depth = 16;
4305 image_create_info.arrayLayers = 1;
4306 dstImage3D.init(&image_create_info);
4307 ASSERT_TRUE(dstImage3D.initialized());
4308
4309 m_commandBuffer->begin();
4310
4311 VkImageResolve resolveRegion;
4312 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4313 resolveRegion.srcSubresource.mipLevel = 0;
4314 resolveRegion.srcSubresource.baseArrayLayer = 0;
4315 resolveRegion.srcSubresource.layerCount = 1;
4316 resolveRegion.srcOffset.x = 0;
4317 resolveRegion.srcOffset.y = 0;
4318 resolveRegion.srcOffset.z = 0;
4319 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4320 resolveRegion.dstSubresource.mipLevel = 0;
4321 resolveRegion.dstSubresource.baseArrayLayer = 0;
4322 resolveRegion.dstSubresource.layerCount = 1;
4323 resolveRegion.dstOffset.x = 0;
4324 resolveRegion.dstOffset.y = 0;
4325 resolveRegion.dstOffset.z = 0;
4326 resolveRegion.extent.width = 1;
4327 resolveRegion.extent.height = 1;
4328 resolveRegion.extent.depth = 1;
4329
4330 // non-zero value baseArrayLayer
4331 resolveRegion.srcSubresource.baseArrayLayer = 2;
4332 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageResolve-srcImage-00268");
4333 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4334 &resolveRegion);
4335 m_errorMonitor->VerifyFound();
4336 resolveRegion.srcSubresource.baseArrayLayer = 0;
4337
4338 // Set height with 1D dstImage
4339 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004340 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004341 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004342 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4343 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004344 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4345 &resolveRegion);
4346 m_errorMonitor->VerifyFound();
4347 resolveRegion.extent.height = 1;
4348
4349 // Set depth with 1D dstImage and 2D srcImage
4350 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004351 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4352 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004353 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4354 &resolveRegion);
4355 m_errorMonitor->VerifyFound();
4356 resolveRegion.extent.depth = 1;
4357
4358 m_commandBuffer->end();
4359}
4360
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004361TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4362 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4363 ASSERT_NO_FATAL_FAILURE(Init());
4364
4365 VkImageObj srcImage2D(m_device);
4366 VkImageObj dstImage2D(m_device);
4367
4368 VkImageCreateInfo image_create_info = {};
4369 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4370 image_create_info.pNext = NULL;
4371 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4372 image_create_info.extent.width = 32;
4373 image_create_info.extent.height = 32;
4374 image_create_info.extent.depth = 1;
4375 image_create_info.mipLevels = 6; // full chain from 32x32 to 1x1
4376 image_create_info.arrayLayers = 1;
4377 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4378 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4379 image_create_info.usage =
4380 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4381 // Note: Some implementations expect color attachment usage for any
4382 // multisample surface
4383 image_create_info.flags = 0;
4384
4385 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4386 srcImage2D.init(&image_create_info);
4387 ASSERT_TRUE(srcImage2D.initialized());
4388
4389 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4390 dstImage2D.init(&image_create_info);
4391 ASSERT_TRUE(dstImage2D.initialized());
4392
4393 m_commandBuffer->begin();
4394
4395 VkImageResolve resolveRegion = {};
4396 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4397 resolveRegion.srcSubresource.mipLevel = 0;
4398 resolveRegion.srcSubresource.baseArrayLayer = 0;
4399 resolveRegion.srcSubresource.layerCount = 1;
4400 resolveRegion.srcOffset.x = 0;
4401 resolveRegion.srcOffset.y = 0;
4402 resolveRegion.srcOffset.z = 0;
4403 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4404 resolveRegion.dstSubresource.mipLevel = 0;
4405 resolveRegion.dstSubresource.baseArrayLayer = 0;
4406 resolveRegion.dstSubresource.layerCount = 1;
4407 resolveRegion.dstOffset.x = 0;
4408 resolveRegion.dstOffset.y = 0;
4409 resolveRegion.dstOffset.z = 0;
4410 resolveRegion.extent.width = 32;
4411 resolveRegion.extent.height = 32;
4412 resolveRegion.extent.depth = 1;
4413
4414 m_errorMonitor->ExpectSuccess();
4415 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4416 &resolveRegion);
4417 m_errorMonitor->VerifyNotFound();
4418
4419 // srcImage exceeded in x-dim
4420 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004421 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004422 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4423 &resolveRegion);
4424 m_errorMonitor->VerifyFound();
4425 resolveRegion.srcOffset.x = 0;
4426
4427 // dstImage exceeded in x-dim
4428 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004429 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004430 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4431 &resolveRegion);
4432 m_errorMonitor->VerifyFound();
4433 resolveRegion.dstOffset.x = 0;
4434
4435 // both image exceeded in y-dim because mipLevel 3 is a 4x4 size image
4436 resolveRegion.extent = {4, 8, 1};
4437 resolveRegion.srcSubresource.mipLevel = 3;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004438 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004439 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4440 &resolveRegion);
4441 m_errorMonitor->VerifyFound();
4442 resolveRegion.srcSubresource.mipLevel = 0;
4443
4444 resolveRegion.dstSubresource.mipLevel = 3;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004445 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004446 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4447 &resolveRegion);
4448 m_errorMonitor->VerifyFound();
4449 resolveRegion.dstSubresource.mipLevel = 0;
4450
4451 // srcImage exceeded in z-dim
4452 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004453 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4454 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004455 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4456 &resolveRegion);
4457 m_errorMonitor->VerifyFound();
4458 resolveRegion.srcOffset.z = 0;
4459
4460 // dstImage exceeded in z-dim
4461 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004462 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4463 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004464 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4465 &resolveRegion);
4466 m_errorMonitor->VerifyFound();
4467 resolveRegion.dstOffset.z = 0;
4468
4469 m_commandBuffer->end();
4470}
4471
unknown088160a2019-05-23 17:43:13 -06004472TEST_F(VkLayerTest, ClearImageErrors) {
4473 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4474
4475 ASSERT_NO_FATAL_FAILURE(Init());
4476 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4477
4478 m_commandBuffer->begin();
4479
4480 // Color image
4481 VkClearColorValue clear_color;
4482 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4483 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4484 const int32_t img_width = 32;
4485 const int32_t img_height = 32;
4486 VkImageCreateInfo image_create_info = {};
4487 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4488 image_create_info.pNext = NULL;
4489 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4490 image_create_info.format = color_format;
4491 image_create_info.extent.width = img_width;
4492 image_create_info.extent.height = img_height;
4493 image_create_info.extent.depth = 1;
4494 image_create_info.mipLevels = 1;
4495 image_create_info.arrayLayers = 1;
4496 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4497 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4498
4499 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4500 vk_testing::Image color_image_no_transfer;
4501 color_image_no_transfer.init(*m_device, image_create_info);
4502
4503 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4504 vk_testing::Image color_image;
4505 color_image.init(*m_device, image_create_info);
4506
4507 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4508
4509 // Depth/Stencil image
4510 VkClearDepthStencilValue clear_value = {0};
4511 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4512 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4513 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4514 ds_image_create_info.extent.width = 64;
4515 ds_image_create_info.extent.height = 64;
4516 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4517 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4518
4519 vk_testing::Image ds_image;
4520 ds_image.init(*m_device, ds_image_create_info);
4521
4522 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
4523
sfricke-samsungcd924d92020-05-20 23:51:17 -07004524 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06004525
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004526 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06004527
4528 m_errorMonitor->VerifyFound();
4529
sfricke-samsungcd924d92020-05-20 23:51:17 -07004530 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06004531
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004532 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
4533 &color_range);
unknown088160a2019-05-23 17:43:13 -06004534
4535 m_errorMonitor->VerifyFound();
4536
4537 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07004538 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07004539 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06004540
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004541 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4542 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06004543
4544 m_errorMonitor->VerifyFound();
4545}
4546
4547TEST_F(VkLayerTest, CommandQueueFlags) {
4548 TEST_DESCRIPTION(
4549 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
4550
4551 ASSERT_NO_FATAL_FAILURE(Init());
4552
4553 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4554 if (queueFamilyIndex == UINT32_MAX) {
4555 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4556 return;
4557 } else {
4558 // Create command pool on a non-graphics queue
4559 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
4560
4561 // Setup command buffer on pool
4562 VkCommandBufferObj command_buffer(m_device, &command_pool);
4563 command_buffer.begin();
4564
4565 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07004566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06004567 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4568 command_buffer.SetViewport(0, 1, &viewport);
4569 m_errorMonitor->VerifyFound();
4570 }
4571}
4572
sfricke-samsung674ba102020-08-18 22:38:49 -07004573TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
4574 TEST_DESCRIPTION(
4575 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
4576 "buffer");
4577
4578 ASSERT_NO_FATAL_FAILURE(Init());
4579
4580 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4581 if (queueFamilyIndex == UINT32_MAX) {
4582 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4583 return;
4584 } else {
4585 // Create Depth image
4586 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
4587 if (ds_format == VK_FORMAT_UNDEFINED) {
4588 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
4589 return;
4590 }
4591
4592 VkImageObj ds_image(m_device);
4593 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
4594 VK_IMAGE_TILING_OPTIMAL, 0);
4595 ASSERT_TRUE(ds_image.initialized());
4596
4597 // Allocate buffers
4598 VkBufferObj buffer;
4599 VkMemoryPropertyFlags reqs = 0;
4600 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
4601
4602 VkBufferImageCopy region = {};
4603 region.bufferRowLength = 0;
4604 region.bufferImageHeight = 0;
4605 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4606 region.imageSubresource.layerCount = 1;
4607 region.imageOffset = {0, 0, 0};
4608 region.imageExtent = {64, 64, 1};
4609 region.bufferOffset = 0;
4610
4611 // Create command pool on a non-graphics queue
4612 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
4613
4614 // Setup command buffer on pool
4615 VkCommandBufferObj command_buffer(m_device, &command_pool);
4616 command_buffer.begin();
4617
4618 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-VkBufferImageCopy-aspectMask");
4619 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4620 1, &region);
4621 m_errorMonitor->VerifyFound();
4622 }
4623}
4624
unknown088160a2019-05-23 17:43:13 -06004625TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
4626 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
4627 ASSERT_NO_FATAL_FAILURE(Init());
4628 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
4629 // never record secondary
4630
Mark Lobodzinski20310782020-02-28 14:25:17 -07004631 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06004632 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004633 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06004634 m_errorMonitor->VerifyFound();
4635 m_commandBuffer->end();
4636}
4637
4638TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
4639 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
4640
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07004641 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06004642 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
4643
4644 VkImageCreateInfo image_create_info = {};
4645 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4646 image_create_info.pNext = NULL;
4647 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4648 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4649 image_create_info.extent.width = 32;
4650 image_create_info.extent.height = 1;
4651 image_create_info.extent.depth = 1;
4652 image_create_info.mipLevels = 1;
4653 image_create_info.arrayLayers = 1;
4654 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4655 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4656 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4657 image_create_info.flags = 0;
4658
4659 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
4660 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
4661
4662 VkImageObj image(m_device);
4663 image.init(&image_create_info);
4664 ASSERT_TRUE(image.initialized());
4665 VkImageMemoryBarrier image_barrier =
4666 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
4667
4668 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
4669 image_barrier.oldLayout = old_layout;
4670 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004671 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
4672 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06004673 };
4674
4675 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
4676 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
4677 secondary.begin();
4678 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4679 secondary.end();
4680
Mark Lobodzinski20310782020-02-28 14:25:17 -07004681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06004682 m_commandBuffer->begin();
4683 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004684 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06004685 m_errorMonitor->VerifyFound();
4686
unknown088160a2019-05-23 17:43:13 -06004687 m_commandBuffer->reset();
4688 secondary.reset();
4689
4690 // Validate that UNDEFINED doesn't false positive on us
4691 secondary.begin();
4692 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4693 secondary.end();
4694 m_commandBuffer->begin();
4695 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4696 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004697 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06004698 m_errorMonitor->VerifyNotFound();
4699 m_commandBuffer->end();
4700}
4701
4702TEST_F(VkLayerTest, SetDynViewportParamTests) {
4703 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
4704
4705 SetTargetApiVersion(VK_API_VERSION_1_1);
4706 VkPhysicalDeviceFeatures features{};
4707 ASSERT_NO_FATAL_FAILURE(Init(&features));
4708
4709 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
4710 const VkViewport viewports[] = {vp, vp};
4711
4712 m_commandBuffer->begin();
4713
4714 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07004715 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004716 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06004717 m_errorMonitor->VerifyFound();
4718
Mark Lobodzinski20310782020-02-28 14:25:17 -07004719 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004720 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06004721 m_errorMonitor->VerifyFound();
4722
Mark Lobodzinski20310782020-02-28 14:25:17 -07004723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004724 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06004725 m_errorMonitor->VerifyFound();
4726
Mark Lobodzinski20310782020-02-28 14:25:17 -07004727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
4728 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004729 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06004730 m_errorMonitor->VerifyFound();
4731
Mark Lobodzinski20310782020-02-28 14:25:17 -07004732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004733 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06004734 m_errorMonitor->VerifyFound();
4735
4736 // core viewport tests
4737 using std::vector;
4738 struct TestCase {
4739 VkViewport vp;
4740 std::string veid;
4741 };
4742
4743 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
4744 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
4745 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
4746
4747 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
4748 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
4749 const auto one_before_min_bounds = NearestSmaller(min_bound);
4750 const auto one_past_max_bounds = NearestGreater(max_bound);
4751
4752 const auto below_zero = NearestSmaller(0.0f);
4753 const auto past_one = NearestGreater(1.0f);
4754
4755 vector<TestCase> test_cases = {
4756 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
4757 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
4758 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
4759 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
4760 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
4761 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
4762 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
4763 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
4764 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
4765 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
4766 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
4767 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
4768 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
4769 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
4770 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
4771 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
4772 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
4773 };
4774
4775 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
4776 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
4777 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
4778 } else {
4779 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
4780 }
4781
4782 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07004783 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004784 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06004785 m_errorMonitor->VerifyFound();
4786 }
4787}
4788
4789TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
4790 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
4791
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07004792 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06004793
4794 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
4795 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4796 } else {
4797 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
4798 return;
4799 }
4800 ASSERT_NO_FATAL_FAILURE(InitState());
4801
4802 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
4803}
4804
4805TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
4806 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
4807
4808 ASSERT_NO_FATAL_FAILURE(Init());
4809
4810 if (!m_device->phy().features().multiViewport) {
4811 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
4812 return;
4813 }
4814
unknown088160a2019-05-23 17:43:13 -06004815 m_commandBuffer->begin();
4816
Mark Lobodzinski20310782020-02-28 14:25:17 -07004817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004818 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06004819 m_errorMonitor->VerifyFound();
4820
Petr Kraus14e49492019-09-09 20:13:29 +02004821 const auto max_viewports = m_device->props.limits.maxViewports;
4822
Mark Lobodzinski20310782020-02-28 14:25:17 -07004823 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004824 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06004825 m_errorMonitor->VerifyFound();
4826
Petr Kraus14e49492019-09-09 20:13:29 +02004827 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
4828 if (max_viewports >= too_big_max_viewports) {
4829 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
4830 kSkipPrefix);
4831 } else {
4832 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
4833 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
4834
Mark Lobodzinski20310782020-02-28 14:25:17 -07004835 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004836 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02004837 m_errorMonitor->VerifyFound();
4838
Mark Lobodzinski20310782020-02-28 14:25:17 -07004839 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004840 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02004841 m_errorMonitor->VerifyFound();
4842
Mark Lobodzinski20310782020-02-28 14:25:17 -07004843 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004844 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02004845 m_errorMonitor->VerifyFound();
4846
Mark Lobodzinski20310782020-02-28 14:25:17 -07004847 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004848 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02004849 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004850 }
unknown088160a2019-05-23 17:43:13 -06004851}
4852
4853TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
4854 TEST_DESCRIPTION(
4855 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
4856
4857 ASSERT_NO_FATAL_FAILURE(Init());
4858 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4859
4860 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
4861 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
4862
4863 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
4864 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
4865 nullptr, // pNext
4866 m_renderPass,
4867 0, // subpass
4868 m_framebuffer,
4869 };
4870 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
4871 nullptr, // pNext
4872 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
4873
4874 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
4875 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
4876 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
4877 sec_cmdbuff_inside_rp.end();
4878
4879 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
4880 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
4881 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
4882 sec_cmdbuff_outside_rp.end();
4883
4884 m_commandBuffer->begin();
4885
Mark Lobodzinski20310782020-02-28 14:25:17 -07004886 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004887 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06004888 m_errorMonitor->VerifyFound();
4889
4890 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
4891 nullptr, // pNext
4892 m_renderPass,
4893 m_framebuffer,
4894 {{0, 0}, {32, 32}},
4895 static_cast<uint32_t>(m_renderPassClearValues.size()),
4896 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004897 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06004898
Mark Lobodzinski20310782020-02-28 14:25:17 -07004899 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004900 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06004901 m_errorMonitor->VerifyFound();
4902}
4903
4904TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
4905 TEST_DESCRIPTION(
4906 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
4907 ASSERT_NO_FATAL_FAILURE(Init());
4908 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4909
4910 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
4911 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
4912 command_buffer_allocate_info.commandPool = m_commandPool->handle();
4913 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
4914 command_buffer_allocate_info.commandBufferCount = 1;
4915
4916 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004917 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
unknown088160a2019-05-23 17:43:13 -06004918 VkCommandBufferBeginInfo command_buffer_begin_info = {};
4919 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
4920 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
4921 command_buffer_inheritance_info.renderPass = m_renderPass;
4922 command_buffer_inheritance_info.framebuffer = m_framebuffer;
4923
4924 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
4925 command_buffer_begin_info.flags =
4926 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
4927 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
4928
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004929 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06004930 VkClearAttachment color_attachment;
4931 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4932 color_attachment.clearValue.color.float32[0] = 0;
4933 color_attachment.clearValue.color.float32[1] = 0;
4934 color_attachment.clearValue.color.float32[2] = 0;
4935 color_attachment.clearValue.color.float32[3] = 0;
4936 color_attachment.colorAttachment = 0;
4937 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06004938 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004939 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
4940 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06004941 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004942 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06004943
Mark Lobodzinski20310782020-02-28 14:25:17 -07004944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004945 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06004946 m_errorMonitor->VerifyFound();
4947
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004948 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06004949 m_commandBuffer->end();
4950}
4951
4952TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
4953 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
4954 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
4955 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4956 } else {
4957 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
4958 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4959 return;
4960 }
4961
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07004962 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06004963 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
4964 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
4965 } else {
4966 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
4967 return;
4968 }
4969 ASSERT_NO_FATAL_FAILURE(InitState());
4970
4971 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
4972 if (push_descriptor_prop.maxPushDescriptors < 1) {
4973 // Some implementations report an invalid maxPushDescriptors of 0
4974 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
4975 return;
4976 }
4977
4978 // Create ordinary and push descriptor set layout
4979 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
4980 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
4981 ASSERT_TRUE(ds_layout.initialized());
4982 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
4983 ASSERT_TRUE(push_ds_layout.initialized());
4984
4985 // Now use the descriptor set layouts to create a pipeline layout
4986 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
4987 ASSERT_TRUE(pipeline_layout.initialized());
4988
4989 // Create a descriptor to push
4990 const uint32_t buffer_data[4] = {4, 5, 6, 7};
4991 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
4992 ASSERT_TRUE(buffer_obj.initialized());
4993
4994 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
4995 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
4996 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
4997
4998 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
4999 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5000
5001 // Find address of extension call and make the call
5002 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005003 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005004 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5005
5006 // Section 1: Queue family matching/capabilities.
5007 // Create command pool on a non-graphics queue
5008 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5009 const uint32_t transfer_only_qfi =
5010 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5011 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005012 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005013 } else {
5014 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5015
5016 VkCommandPoolObj command_pool(m_device, err_qfi);
5017 ASSERT_TRUE(command_pool.initialized());
5018 VkCommandBufferObj command_buffer(m_device, &command_pool);
5019 ASSERT_TRUE(command_buffer.initialized());
5020 command_buffer.begin();
5021
Mark Lobodzinski20310782020-02-28 14:25:17 -07005022 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5023 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005024 if (err_qfi == transfer_only_qfi) {
5025 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005026 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005027 }
5028 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5029 &descriptor_write);
5030 m_errorMonitor->VerifyFound();
5031 command_buffer.end();
5032
5033 // If we succeed in testing only one condition above, we need to test the other below.
5034 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5035 // Need to test the neither compute/gfx supported case separately.
5036 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5037 ASSERT_TRUE(tran_command_pool.initialized());
5038 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5039 ASSERT_TRUE(tran_command_buffer.initialized());
5040 tran_command_buffer.begin();
5041
5042 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005043 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5044 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5045 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005046 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5047 &descriptor_write);
5048 m_errorMonitor->VerifyFound();
5049 tran_command_buffer.end();
5050 }
5051 }
5052
5053 // Push to the non-push binding
5054 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005055 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005056 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5057 &descriptor_write);
5058 m_errorMonitor->VerifyFound();
5059
5060 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005061 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005062 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5063 &descriptor_write);
5064 m_errorMonitor->VerifyFound();
5065 m_commandBuffer->end();
5066
5067 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5068 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005069 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005070 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR()");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005071 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005072 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5073 &descriptor_write);
5074 m_errorMonitor->VerifyFound();
5075}
5076
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005077TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5078 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5079 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5080 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5081 } else {
5082 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5083 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5084 return;
5085 }
5086
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005087 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005088 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5089 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5090 } else {
5091 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5092 return;
5093 }
5094 ASSERT_NO_FATAL_FAILURE(InitState());
5095
5096 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5097 if (push_descriptor_prop.maxPushDescriptors < 1) {
5098 // Some implementations report an invalid maxPushDescriptors of 0.
5099 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5100 return;
5101 }
5102
5103 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5104 if (min_alignment == 0) {
5105 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5106 return;
5107 }
5108
5109 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5110 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5111 ASSERT_TRUE(push_ds_layout.initialized());
5112
5113 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5114 ASSERT_TRUE(pipeline_layout.initialized());
5115
5116 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5117 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5118 ASSERT_TRUE(buffer_obj.initialized());
5119
5120 // Use an invalid alignment.
5121 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5122 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5123 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5124
5125 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5126 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5127 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5128
5129 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005130 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005131 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5132 &descriptor_write);
5133 m_errorMonitor->VerifyFound();
5134
5135 m_commandBuffer->end();
5136}
5137
unknown088160a2019-05-23 17:43:13 -06005138TEST_F(VkLayerTest, SetDynScissorParamTests) {
5139 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5140
5141 VkPhysicalDeviceFeatures features{};
5142 ASSERT_NO_FATAL_FAILURE(Init(&features));
5143
5144 const VkRect2D scissor = {{0, 0}, {16, 16}};
5145 const VkRect2D scissors[] = {scissor, scissor};
5146
5147 m_commandBuffer->begin();
5148
5149 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005150 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005151 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005152 m_errorMonitor->VerifyFound();
5153
Mark Lobodzinski20310782020-02-28 14:25:17 -07005154 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005155 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005156 m_errorMonitor->VerifyFound();
5157
Mark Lobodzinski20310782020-02-28 14:25:17 -07005158 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005159 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005160 m_errorMonitor->VerifyFound();
5161
Mark Lobodzinski20310782020-02-28 14:25:17 -07005162 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005164 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005165 m_errorMonitor->VerifyFound();
5166
Mark Lobodzinski20310782020-02-28 14:25:17 -07005167 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005168 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005169 m_errorMonitor->VerifyFound();
5170
5171 struct TestCase {
5172 VkRect2D scissor;
5173 std::string vuid;
5174 };
5175
5176 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5177 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5178 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5179 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5180 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5181 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5182 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5183 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5184
5185 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005186 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005187 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005188 m_errorMonitor->VerifyFound();
5189 }
5190
5191 m_commandBuffer->end();
5192}
5193
5194TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5195 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5196
5197 ASSERT_NO_FATAL_FAILURE(Init());
5198
5199 if (!m_device->phy().features().multiViewport) {
5200 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5201 return;
5202 }
5203
unknown088160a2019-05-23 17:43:13 -06005204 m_commandBuffer->begin();
5205
Mark Lobodzinski20310782020-02-28 14:25:17 -07005206 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005207 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005208 m_errorMonitor->VerifyFound();
5209
Petr Kraus14e49492019-09-09 20:13:29 +02005210 const auto max_scissors = m_device->props.limits.maxViewports;
5211
Mark Lobodzinski20310782020-02-28 14:25:17 -07005212 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005213 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005214 m_errorMonitor->VerifyFound();
5215
Petr Kraus14e49492019-09-09 20:13:29 +02005216 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5217 if (max_scissors >= too_big_max_scissors) {
5218 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5219 kSkipPrefix);
5220 } else {
5221 const VkRect2D scissor = {{0, 0}, {16, 16}};
5222 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5223
Mark Lobodzinski20310782020-02-28 14:25:17 -07005224 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005225 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005226 m_errorMonitor->VerifyFound();
5227
Mark Lobodzinski20310782020-02-28 14:25:17 -07005228 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005229 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005230 m_errorMonitor->VerifyFound();
5231
Mark Lobodzinski20310782020-02-28 14:25:17 -07005232 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005233 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005234 m_errorMonitor->VerifyFound();
5235
Mark Lobodzinski20310782020-02-28 14:25:17 -07005236 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005237 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005238 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005239 }
unknown088160a2019-05-23 17:43:13 -06005240}
5241
5242TEST_F(VkLayerTest, DrawIndirect) {
5243 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect");
5244
5245 ASSERT_NO_FATAL_FAILURE(Init());
5246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5247
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005248 CreatePipelineHelper pipe(*this);
5249 pipe.InitInfo();
5250 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5251 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5252 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5253 dyn_state_ci.dynamicStateCount = size(dyn_states);
5254 dyn_state_ci.pDynamicStates = dyn_states;
5255 pipe.dyn_state_ci_ = dyn_state_ci;
5256 pipe.InitState();
5257 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005258
5259 m_commandBuffer->begin();
5260 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5261
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005262 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5263 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5264 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005265
5266 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005267 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005268 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005269 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005270
5271 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5272 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5273 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005274 VkBufferObj draw_buffer;
5275 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005276
5277 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07005278 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005279 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005280 m_errorMonitor->VerifyFound();
5281
5282 m_commandBuffer->EndRenderPass();
5283 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06005284}
5285
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005286TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
5287 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
5288
5289 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5290 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5291 } else {
5292 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5293 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5294 return;
5295 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005296 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005297
5298 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
5299 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5300 } else {
5301 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07005302 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005303 }
5304
5305 ASSERT_NO_FATAL_FAILURE(InitState());
5306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5307
5308 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
5309 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
5310
5311 m_commandBuffer->begin();
5312 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5313 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5314 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5315 buffer_create_info.size = 1024;
5316 VkBufferObj counter_buffer;
5317 counter_buffer.init(*m_device, buffer_create_info);
5318
5319 // VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289
Mark Lobodzinski20310782020-02-28 14:25:17 -07005320 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005321 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 0xCADECADE);
5322 m_errorMonitor->VerifyFound();
5323
5324 m_commandBuffer->EndRenderPass();
5325 m_commandBuffer->end();
5326}
5327
unknown088160a2019-05-23 17:43:13 -06005328TEST_F(VkLayerTest, DrawIndirectCountKHR) {
5329 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
5330
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005331 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005332 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
5333 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
5334 } else {
5335 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
5336 return;
5337 }
5338 ASSERT_NO_FATAL_FAILURE(InitState());
5339 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5340
5341 VkMemoryRequirements memory_requirements;
5342 VkMemoryAllocateInfo memory_allocate_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
5343
5344 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005345 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06005346
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005347 CreatePipelineHelper pipe(*this);
5348 pipe.InitInfo();
5349 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5350 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5351 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5352 dyn_state_ci.dynamicStateCount = size(dyn_states);
5353 dyn_state_ci.pDynamicStates = dyn_states;
5354 pipe.dyn_state_ci_ = dyn_state_ci;
5355 pipe.InitState();
5356 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005357
5358 m_commandBuffer->begin();
5359 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5360
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005361 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5362 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5363 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005364
5365 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005366 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005367 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005368 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005369
5370 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5371 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
5372 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5373 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005374 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06005375
5376 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5377 count_buffer_create_info.size = sizeof(uint32_t);
5378 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005379 VkBufferObj count_buffer;
5380 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005381
Mike Schuchardt65847d92019-12-20 13:50:47 -08005382 // VUID-vkCmdDrawIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07005383 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005384 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
5385 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005386 m_errorMonitor->VerifyFound();
5387
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005388 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06005389 memory_allocate_info.allocationSize = memory_requirements.size;
5390 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
5391 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005392 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
5393 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06005394
5395 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005396 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06005397
Mike Schuchardt65847d92019-12-20 13:50:47 -08005398 // VUID-vkCmdDrawIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07005399 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06005400 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
5401 m_errorMonitor->VerifyFound();
5402
Mike Schuchardt65847d92019-12-20 13:50:47 -08005403 // VUID-vkCmdDrawIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07005404 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005405 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
5406 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005407 m_errorMonitor->VerifyFound();
5408
Mike Schuchardt65847d92019-12-20 13:50:47 -08005409 // VUID-vkCmdDrawIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07005410 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005411 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
5412 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005413 m_errorMonitor->VerifyFound();
5414
Mike Schuchardt65847d92019-12-20 13:50:47 -08005415 // VUID-vkCmdDrawIndirectCount-stride-03110
Mark Lobodzinski20310782020-02-28 14:25:17 -07005416 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005417 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06005418 m_errorMonitor->VerifyFound();
5419
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005420 // 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 -06005421 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08005422 // VUID-vkCmdDrawIndirectCount-renderPass-02684
5423 // VUID-vkCmdDrawIndirectCount-subpass-02685
5424 // VUID-vkCmdDrawIndirectCount-commandBuffer-02701
unknown088160a2019-05-23 17:43:13 -06005425
5426 m_commandBuffer->EndRenderPass();
5427 m_commandBuffer->end();
5428
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005429 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
5430 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06005431
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005432 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06005433}
5434
5435TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
5436 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
5437
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005438 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005439 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
5440 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
5441 } else {
5442 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
5443 return;
5444 }
5445 ASSERT_NO_FATAL_FAILURE(InitState());
5446 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5447
unknown088160a2019-05-23 17:43:13 -06005448 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005449 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06005450
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005451 CreatePipelineHelper pipe(*this);
5452 pipe.InitInfo();
5453 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5454 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5455 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5456 dyn_state_ci.dynamicStateCount = size(dyn_states);
5457 dyn_state_ci.pDynamicStates = dyn_states;
5458 pipe.dyn_state_ci_ = dyn_state_ci;
5459 pipe.InitState();
5460 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005461
5462 m_commandBuffer->begin();
5463 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5464
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005465 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5466 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5467 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005468
5469 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005470 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005471 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005472 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005473
5474 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5475 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
5476 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005477 VkBufferObj draw_buffer;
5478 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005479
5480 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5481 count_buffer_create_info.size = sizeof(uint32_t);
5482 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005483 VkBufferObj count_buffer;
5484 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005485
5486 VkBufferCreateInfo index_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5487 index_buffer_create_info.size = sizeof(uint32_t);
5488 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005489 VkBufferObj index_buffer;
5490 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005491
Mike Schuchardt65847d92019-12-20 13:50:47 -08005492 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial - only tests whether the index buffer is bound)
Mark Lobodzinski20310782020-02-28 14:25:17 -07005493 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005494 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06005495 sizeof(VkDrawIndexedIndirectCommand));
5496 m_errorMonitor->VerifyFound();
5497
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005498 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06005499
5500 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005501 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06005502
Mike Schuchardt65847d92019-12-20 13:50:47 -08005503 // VUID-vkCmdDrawIndexedIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07005504 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005505 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06005506 sizeof(VkDrawIndexedIndirectCommand));
5507 m_errorMonitor->VerifyFound();
5508
5509 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005510 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06005511
Mike Schuchardt65847d92019-12-20 13:50:47 -08005512 // VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07005513 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005514 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06005515 sizeof(VkDrawIndexedIndirectCommand));
5516 m_errorMonitor->VerifyFound();
5517
Mike Schuchardt65847d92019-12-20 13:50:47 -08005518 // VUID-vkCmdDrawIndexedIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07005519 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005520 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06005521 sizeof(VkDrawIndexedIndirectCommand));
5522 m_errorMonitor->VerifyFound();
5523
Mike Schuchardt65847d92019-12-20 13:50:47 -08005524 // VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07005525 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005526 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06005527 sizeof(VkDrawIndexedIndirectCommand));
5528 m_errorMonitor->VerifyFound();
5529
Mike Schuchardt65847d92019-12-20 13:50:47 -08005530 // VUID-vkCmdDrawIndexedIndirectCount-stride-03142
Mark Lobodzinski20310782020-02-28 14:25:17 -07005531 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005532 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06005533 m_errorMonitor->VerifyFound();
5534
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005535 // 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 -06005536 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08005537 // VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684
5538 // VUID-vkCmdDrawIndexedIndirectCount-subpass-02685
5539 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial)
unknown088160a2019-05-23 17:43:13 -06005540
5541 m_commandBuffer->EndRenderPass();
5542 m_commandBuffer->end();
5543
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005544 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
5545 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06005546}
5547
sfricke-samsung860d3b22020-05-04 21:08:29 -07005548TEST_F(VkLayerTest, DrawIndirectCountFeature) {
5549 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
5550
5551 SetTargetApiVersion(VK_API_VERSION_1_2);
5552 ASSERT_NO_FATAL_FAILURE(Init());
5553 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5554 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
5555 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
5556 return;
5557 }
5558
5559 VkBufferObj indirect_buffer;
5560 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
5561 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
5562
5563 VkBufferObj indexed_indirect_buffer;
5564 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
5565 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
5566
5567 VkBufferObj count_buffer;
5568 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
5569
5570 VkBufferObj index_buffer;
5571 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
5572
5573 CreatePipelineHelper pipe(*this);
5574 pipe.InitInfo();
5575 pipe.InitState();
5576 pipe.CreateGraphicsPipeline();
5577
5578 // Make calls to valid commands but without the drawIndirectCount feature set
5579 m_commandBuffer->begin();
5580 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5581
5582 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5583
Shannon McPherson2c793ba2020-08-28 12:13:24 -06005584 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07005585 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
5586 sizeof(VkDrawIndirectCommand));
5587 m_errorMonitor->VerifyFound();
5588
5589 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
5590
Shannon McPherson2c793ba2020-08-28 12:13:24 -06005591 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07005592 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
5593 sizeof(VkDrawIndexedIndirectCommand));
5594 m_errorMonitor->VerifyFound();
5595
5596 m_commandBuffer->EndRenderPass();
5597 m_commandBuffer->end();
5598}
5599
unknown088160a2019-05-23 17:43:13 -06005600TEST_F(VkLayerTest, ExclusiveScissorNV) {
5601 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
5602
5603 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5604 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5605 } else {
5606 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5607 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5608 return;
5609 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005610 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005611 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
5612 for (auto device_extension : required_device_extensions) {
5613 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
5614 m_device_extension_names.push_back(device_extension);
5615 } else {
5616 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
5617 return;
5618 }
5619 }
5620
5621 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005622 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06005623 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
5624
5625 // Create a device that enables exclusive scissor but disables multiViewport
5626 auto exclusive_scissor_features = lvl_init_struct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
5627 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
5628 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
5629
5630 features2.features.multiViewport = VK_FALSE;
5631
5632 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
5633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5634
5635 if (m_device->phy().properties().limits.maxViewports) {
5636 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
5637 return;
5638 }
5639
5640 // Based on PSOViewportStateTests
5641 {
5642 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
5643 VkViewport viewports[] = {viewport, viewport};
5644 VkRect2D scissor = {{0, 0}, {64, 64}};
5645 VkRect2D scissors[100] = {scissor, scissor};
5646
5647 using std::vector;
5648 struct TestCase {
5649 uint32_t viewport_count;
5650 VkViewport *viewports;
5651 uint32_t scissor_count;
5652 VkRect2D *scissors;
5653 uint32_t exclusive_scissor_count;
5654 VkRect2D *exclusive_scissors;
5655
5656 vector<std::string> vuids;
5657 };
5658
5659 vector<TestCase> test_cases = {
5660 {1,
5661 viewports,
5662 1,
5663 scissors,
5664 2,
5665 scissors,
5666 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
5667 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
5668 {1,
5669 viewports,
5670 1,
5671 scissors,
5672 100,
5673 scissors,
5674 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
5675 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
5676 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06005677 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06005678 };
5679
5680 for (const auto &test_case : test_cases) {
5681 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc = {
5682 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV};
5683
5684 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
5685 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
5686 helper.vp_state_ci_.pViewports = test_case.viewports;
5687 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
5688 helper.vp_state_ci_.pScissors = test_case.scissors;
5689 helper.vp_state_ci_.pNext = &exc;
5690
5691 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
5692 exc.pExclusiveScissors = test_case.exclusive_scissors;
5693 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07005694 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06005695 }
5696 }
5697
5698 // Based on SetDynScissorParamTests
5699 {
5700 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005701 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06005702
5703 const VkRect2D scissor = {{0, 0}, {16, 16}};
5704 const VkRect2D scissors[] = {scissor, scissor};
5705
5706 m_commandBuffer->begin();
5707
Mark Lobodzinski20310782020-02-28 14:25:17 -07005708 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06005709 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
5710 m_errorMonitor->VerifyFound();
5711
Mark Lobodzinski20310782020-02-28 14:25:17 -07005712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005713 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
5714 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
5715 m_errorMonitor->VerifyFound();
5716
Mark Lobodzinski20310782020-02-28 14:25:17 -07005717 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06005718 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
5719 m_errorMonitor->VerifyFound();
5720
Mark Lobodzinski20310782020-02-28 14:25:17 -07005721 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005722 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06005724 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
5725 m_errorMonitor->VerifyFound();
5726
Mark Lobodzinski20310782020-02-28 14:25:17 -07005727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
5728 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06005729 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
5730 m_errorMonitor->VerifyFound();
5731
Mark Lobodzinski20310782020-02-28 14:25:17 -07005732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005733 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
5734 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
5735 m_errorMonitor->VerifyFound();
5736
5737 struct TestCase {
5738 VkRect2D scissor;
5739 std::string vuid;
5740 };
5741
5742 std::vector<TestCase> test_cases = {
5743 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
5744 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
5745 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
5746 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
5747 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
5748 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
5749 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
5750 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
5751
5752 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005753 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06005754 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
5755 m_errorMonitor->VerifyFound();
5756 }
5757
5758 m_commandBuffer->end();
5759 }
5760}
5761
5762TEST_F(VkLayerTest, MeshShaderNV) {
5763 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
5764
5765 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5766 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5767 } else {
5768 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5769 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5770 return;
5771 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005772 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005773 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
5774 for (auto device_extension : required_device_extensions) {
5775 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
5776 m_device_extension_names.push_back(device_extension);
5777 } else {
5778 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
5779 return;
5780 }
5781 }
5782
Tony-LunarG048f5012020-04-29 16:55:11 -06005783 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06005784 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
5785 return;
5786 }
5787
5788 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005789 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06005790 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
5791
5792 // Create a device that enables mesh_shader
5793 auto mesh_shader_features = lvl_init_struct<VkPhysicalDeviceMeshShaderFeaturesNV>();
5794 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
5795 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
5796 features2.features.multiDrawIndirect = VK_FALSE;
5797
5798 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
5799 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5800
5801 static const char vertShaderText[] =
5802 "#version 450\n"
5803 "vec2 vertices[3];\n"
5804 "void main() {\n"
5805 " vertices[0] = vec2(-1.0, -1.0);\n"
5806 " vertices[1] = vec2( 1.0, -1.0);\n"
5807 " vertices[2] = vec2( 0.0, 1.0);\n"
5808 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
5809 " gl_PointSize = 1.0f;\n"
5810 "}\n";
5811
5812 static const char meshShaderText[] =
5813 "#version 450\n"
5814 "#extension GL_NV_mesh_shader : require\n"
5815 "layout(local_size_x = 1) in;\n"
5816 "layout(max_vertices = 3) out;\n"
5817 "layout(max_primitives = 1) out;\n"
5818 "layout(triangles) out;\n"
5819 "void main() {\n"
5820 " gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);\n"
5821 " gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);\n"
5822 " gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);\n"
5823 " gl_PrimitiveIndicesNV[0] = 0;\n"
5824 " gl_PrimitiveIndicesNV[1] = 1;\n"
5825 " gl_PrimitiveIndicesNV[2] = 2;\n"
5826 " gl_PrimitiveCountNV = 1;\n"
5827 "}\n";
5828
5829 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
5830 VkShaderObj ms(m_device, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV, this);
5831 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5832
5833 // Test pipeline creation
5834 {
5835 // can't mix mesh with vertex
5836 const auto break_vp = [&](CreatePipelineHelper &helper) {
5837 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
5838 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07005839 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005840 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
5841
5842 // vertex or mesh must be present
5843 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07005844 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005845 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
5846
5847 // vertexinput and inputassembly must be valid when vertex stage is present
5848 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
5849 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
5850 helper.gp_ci_.pVertexInputState = nullptr;
5851 helper.gp_ci_.pInputAssemblyState = nullptr;
5852 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07005853 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005854 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
5855 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
5856 }
5857
5858 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005859 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06005860
5861 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5862 buffer_create_info.size = sizeof(uint32_t);
5863 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5864 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005865 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06005866 ASSERT_VK_SUCCESS(result);
5867
5868 m_commandBuffer->begin();
5869
Mark Lobodzinski20310782020-02-28 14:25:17 -07005870 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
5871 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06005872 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
5873 m_errorMonitor->VerifyFound();
5874
5875 m_commandBuffer->end();
5876
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005877 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06005878}
5879
5880TEST_F(VkLayerTest, MeshShaderDisabledNV) {
5881 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
5882 ASSERT_NO_FATAL_FAILURE(Init());
5883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5884
5885 VkEvent event;
5886 VkEventCreateInfo event_create_info{};
5887 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005888 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06005889
5890 m_commandBuffer->begin();
5891
Shannon McPherson93970b12020-06-12 14:34:35 -06005892 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005893 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06005894 m_errorMonitor->VerifyFound();
5895
Shannon McPherson93970b12020-06-12 14:34:35 -06005896 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005897 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06005898 m_errorMonitor->VerifyFound();
5899
Shannon McPherson93970b12020-06-12 14:34:35 -06005900 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005901 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06005902 m_errorMonitor->VerifyFound();
5903
Shannon McPherson93970b12020-06-12 14:34:35 -06005904 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005905 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06005906 m_errorMonitor->VerifyFound();
5907
Shannon McPherson93970b12020-06-12 14:34:35 -06005908 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
5909 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005910 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
5911 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005912 m_errorMonitor->VerifyFound();
5913
Shannon McPherson93970b12020-06-12 14:34:35 -06005914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
5915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005916 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
5917 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005918 m_errorMonitor->VerifyFound();
5919
Shannon McPherson93970b12020-06-12 14:34:35 -06005920 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
5921 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005922 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
5923 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005924 m_errorMonitor->VerifyFound();
5925
Shannon McPherson93970b12020-06-12 14:34:35 -06005926 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
5927 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005928 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
5929 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005930 m_errorMonitor->VerifyFound();
5931
5932 m_commandBuffer->end();
5933
5934 VkSemaphoreCreateInfo semaphore_create_info = {};
5935 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
5936 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005937 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06005938
5939 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
5940 VkSubmitInfo submit_info = {};
5941
5942 // Signal the semaphore so the next test can wait on it.
5943 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5944 submit_info.signalSemaphoreCount = 1;
5945 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005946 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06005947 m_errorMonitor->VerifyNotFound();
5948
5949 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5950 submit_info.signalSemaphoreCount = 0;
5951 submit_info.pSignalSemaphores = nullptr;
5952 submit_info.waitSemaphoreCount = 1;
5953 submit_info.pWaitSemaphores = &semaphore;
5954 submit_info.pWaitDstStageMask = &stage_flags;
5955
Mark Lobodzinski20310782020-02-28 14:25:17 -07005956 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02089");
5957 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02090");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005958 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06005959 m_errorMonitor->VerifyFound();
5960
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005961 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06005962
5963 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
5964 VkPipelineShaderStageCreateInfo meshStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
5965 meshStage = vs.GetStageCreateInfo();
5966 meshStage.stage = VK_SHADER_STAGE_MESH_BIT_NV;
5967 VkPipelineShaderStageCreateInfo taskStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
5968 taskStage = vs.GetStageCreateInfo();
5969 taskStage.stage = VK_SHADER_STAGE_TASK_BIT_NV;
5970
5971 // mesh and task shaders not supported
5972 const auto break_vp = [&](CreatePipelineHelper &helper) {
5973 helper.shader_stages_ = {meshStage, taskStage, vs.GetStageCreateInfo()};
5974 };
5975 CreatePipelineHelper::OneshotTest(
Mark Lobodzinski20310782020-02-28 14:25:17 -07005976 *this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005977 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "VUID-VkPipelineShaderStageCreateInfo-pName-00707",
5978 "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
5979 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
5980
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005981 vk::DestroyEvent(m_device->device(), event, nullptr);
5982 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06005983}
Chris Mayerc93536f2019-09-19 16:34:49 +02005984
5985TEST_F(VkLayerTest, ViewportWScalingNV) {
5986 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
5987
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005988 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02005989
5990 VkPhysicalDeviceFeatures device_features = {};
5991 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
5992
5993 if (!device_features.multiViewport) {
5994 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
5995 return;
5996 }
5997
5998 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
5999 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6000 } else {
6001 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6002 return;
6003 }
6004
6005 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6006 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6007
6008 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006009 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006010
6011 const char vs_src[] = R"(
6012 #version 450
6013 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6014 vec2( 1.0f, 1.0f),
6015 vec2(-1.0f, -1.0f),
6016 vec2( 1.0f, -1.0f) };
6017 out gl_PerVertex {
6018 vec4 gl_Position;
6019 };
6020
6021 void main() {
6022 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
6023 })";
6024
6025 const char fs_src[] = R"(
6026 #version 450
6027 layout(location = 0) out vec4 outColor;
6028
6029 void main() {
6030 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
6031 })";
6032
6033 const std::vector<VkViewport> vp = {
6034 {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}};
6035 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6036 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6037
6038 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6039
6040 VkPipelineViewportWScalingStateCreateInfoNV vpsi = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV};
6041 vpsi.viewportWScalingEnable = VK_TRUE;
6042 vpsi.viewportCount = vp_count;
6043 vpsi.pViewportWScalings = scale.data();
6044
6045 VkPipelineViewportStateCreateInfo vpci = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO};
6046 vpci.viewportCount = vp_count;
6047 vpci.pViewports = vp.data();
6048 vpci.scissorCount = vp_count;
6049 vpci.pScissors = sc.data();
6050 vpci.pNext = &vpsi;
6051
6052 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6053
6054 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006055 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006056
6057 // Create pipeline with w-scaling enabled but without a valid scaling array
6058 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006059 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006060 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6061
6062 vpsi.pViewportWScalings = scale.data();
6063
6064 // Create pipeline with w-scaling enabled but without matching viewport counts
6065 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006066 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006067 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6068
6069 const VkPipelineLayoutObj pl(m_device);
6070
6071 VkShaderObj vs(m_device, vs_src, VK_SHADER_STAGE_VERTEX_BIT, this);
6072 VkShaderObj fs(m_device, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6073
6074 VkPipelineObj pipe(m_device);
6075 pipe.AddDefaultColorAttachment();
6076 pipe.AddShader(&vs);
6077 pipe.AddShader(&fs);
6078 pipe.SetViewport(vp);
6079 pipe.SetScissor(sc);
6080 pipe.CreateVKPipeline(pl.handle(), renderPass());
6081
6082 VkPipelineObj pipeDynWScale(m_device);
6083 pipeDynWScale.AddDefaultColorAttachment();
6084 pipeDynWScale.AddShader(&vs);
6085 pipeDynWScale.AddShader(&fs);
6086 pipeDynWScale.SetViewport(vp);
6087 pipeDynWScale.SetScissor(sc);
6088 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6089 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6090
6091 m_commandBuffer->begin();
6092
6093 // Bind pipeline without dynamic w scaling enabled
6094 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006095 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006096 m_errorMonitor->VerifyNotFound();
6097
Chris Mayerc93536f2019-09-19 16:34:49 +02006098 // Bind pipeline that has dynamic w-scaling enabled
6099 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006100 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006101 m_errorMonitor->VerifyNotFound();
6102
6103 const auto max_vps = m_device->props.limits.maxViewports;
6104
Mark Lobodzinski20310782020-02-28 14:25:17 -07006105 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01323");
Chris Mayerc93536f2019-09-19 16:34:49 +02006106 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), max_vps, vp_count, scale.data());
6107 m_errorMonitor->VerifyFound();
6108
Mark Lobodzinski20310782020-02-28 14:25:17 -07006109 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006110 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6111 m_errorMonitor->VerifyFound();
6112
6113 m_errorMonitor->ExpectSuccess();
6114 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6115 m_errorMonitor->VerifyNotFound();
6116
6117 m_commandBuffer->end();
6118}
sfricke-samsung914e8002020-01-07 22:26:18 -08006119
6120TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6121 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6122
6123 // Enable Sampler YCbCr Conversion req'd extensions
6124 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6125 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6126 if (mp_extensions) {
6127 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6128 }
6129 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006130 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sfricke-samsung914e8002020-01-07 22:26:18 -08006131 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6132 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6133 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6134 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6135 if (mp_extensions) {
6136 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6137 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6138 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6139 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6140 } else {
6141 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6142 return;
6143 }
6144
6145 // Explictly not enable Ycbcr Conversion Features
6146 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {};
6147 ycbcr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
6148 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6149 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6150
6151 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6152 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6153 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6154 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6155 return;
6156 }
6157
6158 // Create Ycbcr conversion
6159 VkSamplerYcbcrConversion conversions;
6160 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6161 NULL,
6162 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6163 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6164 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6165 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6166 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6167 VK_CHROMA_LOCATION_COSITED_EVEN,
6168 VK_CHROMA_LOCATION_COSITED_EVEN,
6169 VK_FILTER_NEAREST,
6170 false};
6171
Mark Lobodzinski20310782020-02-28 14:25:17 -07006172 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006173 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6174 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006175}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006176
6177TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6178 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6179
6180 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6181 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6182 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6183 return;
6184 }
6185 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6186
6187 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6188
6189 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6190 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6191 return;
6192 }
6193 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6194
6195 {
6196 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6197 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6198 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6199
6200 auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6201 auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
6202 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6203
6204 if (!tf_features.transformFeedback) {
6205 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6206 return;
6207 }
6208 }
6209
6210 ASSERT_NO_FATAL_FAILURE(InitState());
6211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6212
6213 {
6214 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
6215 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6216 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6217
6218 auto info = lvl_init_struct<VkBufferCreateInfo>();
6219 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6220 info.size = 4;
6221 VkBufferObj buffer;
6222 buffer.init(*m_device, info);
6223 VkDeviceSize offsets[1]{};
6224
6225 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
6226 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
6227 m_errorMonitor->VerifyFound();
6228 }
6229
6230 {
6231 auto vkCmdBeginTransformFeedbackEXT =
6232 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6233 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6234
6235 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
6236 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6237 m_errorMonitor->VerifyFound();
6238 }
6239
6240 {
6241 auto vkCmdEndTransformFeedbackEXT =
6242 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6243 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6244
6245 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
6246 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
6247 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6248 m_errorMonitor->VerifyFound();
6249 }
6250}
6251
6252TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
6253 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
6254
6255 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6256 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6257 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6258 return;
6259 }
6260 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6261
6262 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6263
6264 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6265 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6266 return;
6267 }
6268 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6269
6270 {
6271 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6272 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6273 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6274
6275 auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6276 auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
6277 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6278
6279 if (!tf_features.transformFeedback) {
6280 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6281 return;
6282 }
6283
6284 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6285 }
6286
6287 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6288
6289 auto vkCmdBindTransformFeedbackBuffersEXT =
6290 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6291 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6292
6293 {
6294 auto tf_properties = lvl_init_struct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6295 auto pd_properties = lvl_init_struct<VkPhysicalDeviceProperties2>(&tf_properties);
6296 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6297
6298 auto info = lvl_init_struct<VkBufferCreateInfo>();
6299 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6300 info.size = 8;
6301 VkBufferObj const buffer_obj(*m_device, info);
6302
6303 // Request a firstBinding that is too large.
6304 {
6305 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
6306 VkDeviceSize const offsets[1]{};
6307
6308 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
6309 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6310 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
6311 nullptr);
6312 m_errorMonitor->VerifyFound();
6313 }
6314
6315 // Request too many bindings.
6316 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
6317 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
6318 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
6319
6320 std::vector<VkDeviceSize> offsets(bindingCount);
6321
6322 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6323 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
6324 nullptr);
6325 m_errorMonitor->VerifyFound();
6326 }
6327
6328 // Request a size that is larger than the maximum size.
6329 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
6330 VkDeviceSize const offsets[1]{};
6331 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
6332
6333 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
6334 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
6335 m_errorMonitor->VerifyFound();
6336 }
6337 }
6338
6339 {
6340 auto info = lvl_init_struct<VkBufferCreateInfo>();
6341 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6342 info.size = 8;
6343 VkBufferObj const buffer_obj(*m_device, info);
6344
6345 // Request an offset that is too large.
6346 {
6347 VkDeviceSize const offsets[1]{info.size + 4};
6348
6349 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
6350 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6351 m_errorMonitor->VerifyFound();
6352 }
6353
6354 // Request an offset that is not a multiple of 4.
6355 {
6356 VkDeviceSize const offsets[1]{1};
6357
6358 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
6359 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6360 m_errorMonitor->VerifyFound();
6361 }
6362
6363 // Request a size that is larger than the buffer's size.
6364 {
6365 VkDeviceSize const offsets[1]{};
6366 VkDeviceSize const sizes[1]{info.size + 1};
6367
6368 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006369 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
6370 m_errorMonitor->VerifyFound();
6371 }
6372
6373 // Request an offset and size whose sum is larger than the buffer's size.
6374 {
6375 VkDeviceSize const offsets[1]{4};
6376 VkDeviceSize const sizes[1]{info.size - 3};
6377
6378 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
6379 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
6380 m_errorMonitor->VerifyFound();
6381 }
6382
6383 // Bind while transform feedback is active.
6384 {
6385 auto vkCmdBeginTransformFeedbackEXT =
6386 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6387 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6388 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6389
6390 VkDeviceSize const offsets[1]{};
6391
6392 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
6393 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6394 m_errorMonitor->VerifyFound();
6395
6396 auto vkCmdEndTransformFeedbackEXT =
6397 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6398 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6399 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6400 }
6401 }
6402
6403 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
6404 {
6405 auto info = lvl_init_struct<VkBufferCreateInfo>();
6406 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6407 info.size = 4;
6408 VkBufferObj const buffer_obj(*m_device, info);
6409
6410 VkDeviceSize const offsets[1]{};
6411
6412 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
6413 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6414 m_errorMonitor->VerifyFound();
6415 }
6416
6417 // Don't bind memory.
6418 {
6419 VkBuffer buffer{};
6420 {
6421 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
6422 ASSERT_TRUE(vkCreateBuffer != nullptr);
6423
6424 auto info = lvl_init_struct<VkBufferCreateInfo>();
6425 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6426 info.size = 4;
6427 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
6428 }
6429
6430 VkDeviceSize const offsets[1]{};
6431
6432 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
6433 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
6434 m_errorMonitor->VerifyFound();
6435 }
6436}
6437
6438TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
6439 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
6440
6441 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6442 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6443 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6444 return;
6445 }
6446 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6447
6448 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6449
6450 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6451 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6452 return;
6453 }
6454 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6455
6456 {
6457 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6458 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6459 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6460
6461 auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6462 auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
6463 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6464
6465 if (!tf_features.transformFeedback) {
6466 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6467 return;
6468 }
6469
6470 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6471 }
6472
6473 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6474
6475 auto vkCmdBeginTransformFeedbackEXT =
6476 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6477 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6478
6479 {
6480 auto tf_properties = lvl_init_struct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6481 auto pd_properties = lvl_init_struct<VkPhysicalDeviceProperties2>(&tf_properties);
6482 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6483
6484 // Request a firstCounterBuffer that is too large.
6485 {
6486 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
6487
6488 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
6489 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
6490 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
6491 m_errorMonitor->VerifyFound();
6492 }
6493
6494 // Request too many buffers.
6495 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
6496 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
6497
6498 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
6499 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
6500 m_errorMonitor->VerifyFound();
6501 }
6502 }
6503
6504 // Request an out-of-bounds location.
6505 {
6506 auto info = lvl_init_struct<VkBufferCreateInfo>();
6507 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
6508 info.size = 4;
6509 VkBufferObj const buffer_obj(*m_device, info);
6510
6511 VkDeviceSize const offsets[1]{1};
6512
6513 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
6514 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
6515 m_errorMonitor->VerifyFound();
6516 }
6517
6518 // Request specific offsets without specifying buffers.
6519 {
6520 VkDeviceSize const offsets[1]{};
6521
6522 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
6523 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
6524 m_errorMonitor->VerifyFound();
6525 }
6526
6527 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
6528 {
6529 auto info = lvl_init_struct<VkBufferCreateInfo>();
6530 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
6531 info.size = 4;
6532 VkBufferObj const buffer_obj(*m_device, info);
6533
6534 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
6535 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
6536 m_errorMonitor->VerifyFound();
6537 }
6538
6539 // Begin while transform feedback is active.
6540 {
6541 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6542
6543 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
6544 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6545 m_errorMonitor->VerifyFound();
6546
6547 auto vkCmdEndTransformFeedbackEXT =
6548 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6549 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6550
6551 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6552 }
6553}
6554
6555TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
6556 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
6557
6558 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6559 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6560 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6561 return;
6562 }
6563 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6564
6565 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6566
6567 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6568 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6569 return;
6570 }
6571 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6572
6573 {
6574 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6575 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6576 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6577
6578 auto tf_features = lvl_init_struct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6579 auto pd_features = lvl_init_struct<VkPhysicalDeviceFeatures2>(&tf_features);
6580 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6581
6582 if (!tf_features.transformFeedback) {
6583 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6584 return;
6585 }
6586
6587 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6588 }
6589
6590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6591
6592 auto vkCmdEndTransformFeedbackEXT =
6593 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6594 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6595
6596 {
6597 // Activate transform feedback.
6598 auto vkCmdBeginTransformFeedbackEXT =
6599 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6600 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6601 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6602
6603 {
6604 auto tf_properties = lvl_init_struct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6605 auto pd_properties = lvl_init_struct<VkPhysicalDeviceProperties2>(&tf_properties);
6606 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6607
6608 // Request a firstCounterBuffer that is too large.
6609 {
6610 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
6611
6612 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
6613 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
6614 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
6615 m_errorMonitor->VerifyFound();
6616 }
6617
6618 // Request too many buffers.
6619 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
6620 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
6621
6622 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
6623 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
6624 m_errorMonitor->VerifyFound();
6625 }
6626 }
6627
6628 // Request an out-of-bounds location.
6629 {
6630 auto info = lvl_init_struct<VkBufferCreateInfo>();
6631 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
6632 info.size = 4;
6633 VkBufferObj const buffer_obj(*m_device, info);
6634
6635 VkDeviceSize const offsets[1]{1};
6636
6637 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
6638 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
6639 m_errorMonitor->VerifyFound();
6640 }
6641
6642 // Request specific offsets without specifying buffers.
6643 {
6644 VkDeviceSize const offsets[1]{};
6645
6646 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
6647 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
6648 m_errorMonitor->VerifyFound();
6649 }
6650
6651 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
6652 {
6653 auto info = lvl_init_struct<VkBufferCreateInfo>();
6654 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
6655 info.size = 4;
6656 VkBufferObj const buffer_obj(*m_device, info);
6657
6658 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
6659 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
6660 m_errorMonitor->VerifyFound();
6661 }
6662 }
6663
6664 // End while transform feedback is inactive.
6665 {
6666 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6667
6668 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
6669 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6670 m_errorMonitor->VerifyFound();
6671 }
6672}
sfricke-samsung071af2d2020-07-02 10:37:22 -07006673
sfricke-samsung39ee2442020-07-22 21:21:15 -07006674TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
6675 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07006676
6677 // protect memory added in VK 1.1
6678 SetTargetApiVersion(VK_API_VERSION_1_1);
6679
6680 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6681 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6682 } else {
6683 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6684 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6685 return;
6686 }
6687 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6688
6689 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6690 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6691 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6692
6693 auto protected_memory_features = lvl_init_struct<VkPhysicalDeviceProtectedMemoryFeatures>();
6694 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
6695 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6696
6697 if (protected_memory_features.protectedMemory == VK_FALSE) {
6698 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
6699 return;
6700 };
6701
6702 // Turns m_commandBuffer into a protected command buffer
6703 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
6704
6705 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6706 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
6707 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
6708 return;
6709 }
6710
6711 VkBufferObj indirect_buffer;
6712 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6713 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6714
6715 VkBufferObj indexed_indirect_buffer;
6716 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6717 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6718
6719 VkBufferObj index_buffer;
6720 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6721
6722 CreatePipelineHelper pipe(*this);
6723 pipe.InitInfo();
6724 pipe.InitState();
6725 pipe.CreateGraphicsPipeline();
6726
sfricke-samsung39ee2442020-07-22 21:21:15 -07006727 VkQueryPool query_pool;
6728 VkQueryPoolCreateInfo query_pool_create_info{};
6729 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
6730 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
6731 query_pool_create_info.queryCount = 1;
6732 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
6733
sfricke-samsung071af2d2020-07-02 10:37:22 -07006734 m_commandBuffer->begin();
6735 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6736
6737 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6738
6739 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
6740 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
6741 m_errorMonitor->VerifyFound();
6742
6743 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6744
6745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
6746 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
6747 sizeof(VkDrawIndexedIndirectCommand));
6748 m_errorMonitor->VerifyFound();
6749
6750 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07006751
6752 // Query should be outside renderpass
6753 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
6754
6755 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
6756 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
6757 m_errorMonitor->VerifyFound();
6758
6759 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
6760 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
6761 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
6762 m_errorMonitor->VerifyFound();
6763
sfricke-samsung071af2d2020-07-02 10:37:22 -07006764 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07006765
6766 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07006767}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07006768
6769TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
6770 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
6771
6772 SetTargetApiVersion(VK_API_VERSION_1_1);
6773
6774 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6775 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6776 } else {
6777 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6778 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6779 return;
6780 }
6781 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6782
Mark Lobodzinskic2312742020-08-05 13:57:11 -06006783 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
6784 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
6785 return;
6786 }
6787
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07006788 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6789 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6790 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6791
6792 auto protected_memory_features = lvl_init_struct<VkPhysicalDeviceProtectedMemoryFeatures>();
6793 auto features2 = lvl_init_struct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
6794 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6795
6796 if (protected_memory_features.protectedMemory == VK_FALSE) {
6797 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
6798 return;
6799 };
6800
6801 // Turns m_commandBuffer into a unprotected command buffer
6802 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6803
6804 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
6805 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
6806
6807 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
6808 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
6809 return;
6810 }
6811
6812 // Create actual protected and unprotected buffers
6813 VkBuffer buffer_protected = VK_NULL_HANDLE;
6814 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
6815 VkBufferCreateInfo buffer_create_info = {};
6816 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6817 buffer_create_info.pNext = nullptr;
6818 buffer_create_info.size = 1 << 20; // 1 MB
6819 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT;
6820 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6821
6822 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
6823 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
6824 buffer_create_info.flags = 0;
6825 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
6826
6827 // Create actual protected and unprotected images
6828 VkImageObj image_protected(m_device);
6829 VkImageObj image_unprotected(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07006830 VkImageView image_views[2];
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07006831 VkImageCreateInfo image_create_info = {};
6832 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6833 image_create_info.pNext = nullptr;
6834 image_create_info.extent = {64, 64, 1};
6835 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
6836 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6837 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6838 image_create_info.usage =
6839 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
6840 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6841 image_create_info.arrayLayers = 1;
6842 image_create_info.mipLevels = 1;
6843
6844 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
6845 image_protected.init_no_mem(*m_device, image_create_info);
6846 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07006847 image_views[0] = image_protected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07006848
6849 image_create_info.flags = 0;
6850 image_unprotected.init_no_mem(*m_device, image_create_info);
6851 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07006852 image_views[1] = image_unprotected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07006853
6854 // Create protected and unproteced memory
6855 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
6856 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
6857
6858 VkMemoryAllocateInfo alloc_info = {};
6859 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6860 alloc_info.pNext = nullptr;
6861 alloc_info.allocationSize = 0;
6862
6863 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
6864 VkMemoryRequirements mem_reqs_protected;
6865 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
6866 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
6867 VkMemoryRequirements mem_reqs_unprotected;
6868 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
6869 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
6870
6871 // Get memory index for a protected and unprotected memory
6872 VkPhysicalDeviceMemoryProperties phys_mem_props;
6873 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
6874 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
6875 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
6876 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
6877 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
6878 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
6879 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
6880 memory_type_unprotected = i;
6881 }
6882 // Check just protected bit is in type at all
6883 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
6884 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
6885 memory_type_protected = i;
6886 }
6887 }
6888 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
6889 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
6890 vk::DestroyBuffer(device(), buffer_protected, nullptr);
6891 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
6892 return;
6893 }
6894
6895 alloc_info.memoryTypeIndex = memory_type_protected;
6896 alloc_info.allocationSize = mem_reqs_protected.size;
6897 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
6898
6899 alloc_info.allocationSize = mem_reqs_unprotected.size;
6900 alloc_info.memoryTypeIndex = memory_type_unprotected;
6901 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
6902
6903 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
6904 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
6905 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
6906 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
6907
sfricke-samsungc1c43b02020-08-04 00:21:48 -07006908 // A renderpass and framebuffer that contains a protected and unprotected image view
6909 VkAttachmentDescription attachments[2] = {
6910 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
6911 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
6912 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
6913 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
6914 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
6915 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
6916 };
6917 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
6918 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
6919 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
6920 VkSubpassDependency dependency = {0,
6921 0,
6922 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
6923 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
6924 VK_ACCESS_SHADER_WRITE_BIT,
6925 VK_ACCESS_SHADER_WRITE_BIT,
6926 VK_DEPENDENCY_BY_REGION_BIT};
6927 VkRenderPassCreateInfo render_pass_create_info = {
6928 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
6929 VkRenderPass render_pass;
6930 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
6931 VkFramebufferCreateInfo framebuffer_create_info = {
6932 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
6933 VkFramebuffer framebuffer;
6934 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
6935
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07006936 // Various structs used for commands
6937 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
6938 VkImageBlit blit_region = {};
6939 blit_region.srcSubresource = image_subresource;
6940 blit_region.dstSubresource = image_subresource;
6941 blit_region.srcOffsets[0] = {0, 0, 0};
6942 blit_region.srcOffsets[1] = {8, 8, 1};
6943 blit_region.dstOffsets[0] = {0, 8, 0};
6944 blit_region.dstOffsets[1] = {8, 8, 1};
6945 VkClearColorValue clear_color = {{0, 0, 0, 0}};
6946 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
6947 VkBufferCopy buffer_copy = {0, 0, 64};
6948 VkBufferImageCopy buffer_image_copy = {};
6949 buffer_image_copy.bufferRowLength = 0;
6950 buffer_image_copy.bufferImageHeight = 0;
6951 buffer_image_copy.imageSubresource = image_subresource;
6952 buffer_image_copy.imageOffset = {0, 0, 0};
6953 buffer_image_copy.imageExtent = {1, 1, 1};
6954 buffer_image_copy.bufferOffset = 0;
6955 VkImageCopy image_copy = {};
6956 image_copy.srcSubresource = image_subresource;
6957 image_copy.srcOffset = {0, 0, 0};
6958 image_copy.dstSubresource = image_subresource;
6959 image_copy.dstOffset = {0, 0, 0};
6960 image_copy.extent = {1, 1, 1};
6961 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07006962 VkRect2D render_area = {{0, 0}, {8, 8}};
6963 VkRenderPassBeginInfo render_pass_begin = {
6964 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
6965 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
6966 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
6967 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07006968
6969 // Use protected resources in unprotected command buffer
6970 m_commandBuffer->begin();
6971
6972 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
6973 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
6974 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
6975 m_errorMonitor->VerifyFound();
6976
6977 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
6978 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
6979 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
6980 m_errorMonitor->VerifyFound();
6981
6982 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
6983 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
6984 &subresource_range);
6985 m_errorMonitor->VerifyFound();
6986
6987 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
6988 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
6989 m_errorMonitor->VerifyFound();
6990
6991 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
6992 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
6993 m_errorMonitor->VerifyFound();
6994
6995 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
6996 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
6997 &buffer_image_copy);
6998 m_errorMonitor->VerifyFound();
6999
7000 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7001 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7002 &buffer_image_copy);
7003 m_errorMonitor->VerifyFound();
7004
7005 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7006 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7007 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7008 m_errorMonitor->VerifyFound();
7009
7010 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7011 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7012 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7013 m_errorMonitor->VerifyFound();
7014
7015 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7016 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected, 1,
7017 &buffer_image_copy);
7018 m_errorMonitor->VerifyFound();
7019
7020 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7021 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected, 1,
7022 &buffer_image_copy);
7023 m_errorMonitor->VerifyFound();
7024
7025 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7026 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7027 m_errorMonitor->VerifyFound();
7028
7029 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7030 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7031 m_errorMonitor->VerifyFound();
7032
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007033 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7034
7035 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7036 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7037 m_errorMonitor->VerifyFound();
7038
7039 vk::CmdEndRenderPass(m_commandBuffer->handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007040 m_commandBuffer->end();
7041
7042 // Use unprotected resources in protected command buffer
7043 protectedCommandBuffer.begin();
7044
7045 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7046 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7047 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7048 m_errorMonitor->VerifyFound();
7049
7050 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7051 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7052 &subresource_range);
7053 m_errorMonitor->VerifyFound();
7054
7055 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7056 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7057 m_errorMonitor->VerifyFound();
7058
7059 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7060 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7061 1, &buffer_image_copy);
7062 m_errorMonitor->VerifyFound();
7063
7064 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7065 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7066 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7067 m_errorMonitor->VerifyFound();
7068
7069 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7070 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7071 1, &buffer_image_copy);
7072 m_errorMonitor->VerifyFound();
7073
7074 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7075 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7076 m_errorMonitor->VerifyFound();
7077
7078 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7079 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7080 m_errorMonitor->VerifyFound();
7081
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007082 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7083
7084 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7085 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7086 m_errorMonitor->VerifyFound();
7087
7088 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007089 protectedCommandBuffer.end();
7090
sfricke-samsung96cd9932020-08-23 20:57:11 -07007091 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7092 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7093
7094 VkProtectedSubmitInfo protected_submit_info = {};
7095 protected_submit_info.sType = VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO;
7096 protected_submit_info.pNext = nullptr;
7097
7098 VkSubmitInfo submit_info = {};
7099 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7100 submit_info.pNext = &protected_submit_info;
7101 submit_info.commandBufferCount = 2;
7102 submit_info.pCommandBuffers = comman_buffers;
7103
7104 protected_submit_info.protectedSubmit = VK_TRUE;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007105 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007106 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7107 m_errorMonitor->VerifyFound();
7108
7109 protected_submit_info.protectedSubmit = VK_FALSE;
7110 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7111 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7112 m_errorMonitor->VerifyFound();
7113
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007114 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7115 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7116 vk::FreeMemory(device(), memory_protected, nullptr);
7117 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007118 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7119 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007120}
locke-lunarg6b0de702020-08-07 17:42:13 -06007121
7122TEST_F(VkLayerTest, InvailStorageAtomicOperation) {
7123 TEST_DESCRIPTION(
7124 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7125 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7126
7127 ASSERT_NO_FATAL_FAILURE(Init());
7128
7129 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7130 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7131 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7132 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7133
7134 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7135 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7136 return;
7137 }
7138
7139 VkFormat buffer_view_format =
7140 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
7141 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7142 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
7143 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7144 return;
7145 }
7146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7147
7148 VkPhysicalDeviceFeatures device_features = {};
7149 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
7150 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
7151 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
7152 return;
7153 }
7154
7155 VkImageObj image(m_device);
7156 image.Init(image_ci);
7157 VkImageView image_view = image.targetView(image_format);
7158
7159 VkSampler sampler = VK_NULL_HANDLE;
7160 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
7161 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
7162
7163 VkBufferObj buffer;
7164 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
7165
7166 VkBufferViewCreateInfo bvci = {};
7167 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7168 bvci.buffer = buffer.handle();
7169 bvci.format = buffer_view_format;
7170 bvci.range = VK_WHOLE_SIZE;
7171 VkBufferView buffer_view;
7172 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
7173
7174 char const *fsSource =
7175 "#version 450\n"
locke-lunarg76e8dee2020-08-21 13:20:02 -06007176 "layout(set=0, binding=3, rgba8) uniform image2D si0;\n "
7177 "layout(set=0, binding=2, rgba8) uniform image2D si1[2];\n "
7178 "layout(set = 0, binding = 1, r8) uniform imageBuffer stb2;\n"
7179 "layout(set = 0, binding = 0, r8) uniform imageBuffer stb3[2];\n"
locke-lunarg6b0de702020-08-07 17:42:13 -06007180 "void main() {\n"
7181 " imageAtomicExchange(si0, ivec2(0), 1);\n"
7182 " imageAtomicExchange(si1[0], ivec2(0), 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007183 " imageAtomicExchange(si1[1], ivec2(0), 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007184 " imageAtomicExchange(stb2, 0, 1);\n"
7185 " imageAtomicExchange(stb3[0], 0, 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007186 " imageAtomicExchange(stb3[1], 0, 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007187 "}\n";
7188
7189 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7190 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7191
7192 CreatePipelineHelper g_pipe(*this);
7193 g_pipe.InitInfo();
7194 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06007195 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7196 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7197 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7198 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06007199 g_pipe.InitState();
7200 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7201
locke-lunarg76e8dee2020-08-21 13:20:02 -06007202 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007203 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007204 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007205 VK_IMAGE_LAYOUT_GENERAL, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007206 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
7207 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06007208 g_pipe.descriptor_set_->UpdateDescriptorSets();
7209
7210 m_commandBuffer->begin();
7211 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7212 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7213 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7214 &g_pipe.descriptor_set_->set_, 0, nullptr);
7215
7216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7220 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7221 m_errorMonitor->VerifyFound();
7222
7223 m_commandBuffer->EndRenderPass();
7224 m_commandBuffer->end();
7225}
locke-lunarg0d6b4442020-08-11 17:40:53 -06007226
7227TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
7228 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
7229
7230 ASSERT_NO_FATAL_FAILURE(Init());
7231 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7232
7233 char const *const vsSource =
7234 "#version 450\n"
7235 "\n"
locke-lunargb0337a52020-08-27 15:31:17 -06007236 "layout(push_constant, std430) uniform foo {\n"
7237 " bool b;\n"
7238 " float f2[2];\n"
7239 " vec3 v;\n"
7240 " vec4 v2[2];\n"
7241 " mat3 m;\n"
7242 "} constants;\n"
locke-lunarg0d6b4442020-08-11 17:40:53 -06007243 "void main(){\n"
locke-lunargb0337a52020-08-27 15:31:17 -06007244 " gl_Position = constants.v2[0];\n"
locke-lunarg0d6b4442020-08-11 17:40:53 -06007245 "}\n";
7246
7247 char const *const fsSource =
7248 "#version 450\n"
7249 "\n"
locke-lunargb0337a52020-08-27 15:31:17 -06007250 "layout(push_constant, std430) uniform foo { float x[8]; } constants;\n"
locke-lunarg0d6b4442020-08-11 17:40:53 -06007251 "layout(location=0) out vec4 o;\n"
7252 "void main(){\n"
7253 " o = vec4(constants.x[0]);\n"
7254 "}\n";
7255
7256 VkShaderObj const vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7257 VkShaderObj const fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7258
locke-lunargb0337a52020-08-27 15:31:17 -06007259 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
7260 VkPushConstantRange push_constant_range1 = {VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(float) * 10};
locke-lunarg0d6b4442020-08-11 17:40:53 -06007261
7262 VkPipelineLayoutCreateInfo pipeline_layout_info{
locke-lunargb0337a52020-08-27 15:31:17 -06007263 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &push_constant_range};
locke-lunarg0d6b4442020-08-11 17:40:53 -06007264
7265 CreatePipelineHelper g_pipe(*this);
7266 g_pipe.InitInfo();
7267 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
7268 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
7269 g_pipe.InitState();
7270 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7271
locke-lunarg0d6b4442020-08-11 17:40:53 -06007272 VkPipelineLayout pipeline_layout;
7273 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
7274
locke-lunargb0337a52020-08-27 15:31:17 -06007275 pipeline_layout_info.pPushConstantRanges = &push_constant_range1;
7276 VkPipelineLayout pipeline_layout1;
7277 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout1);
7278
locke-lunarg0d6b4442020-08-11 17:40:53 -06007279 m_commandBuffer->begin();
7280 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7281 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7282 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7283 &g_pipe.descriptor_set_->set_, 0, nullptr);
7284
7285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
7286 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7287 m_errorMonitor->VerifyFound();
7288
7289 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
locke-lunargb0337a52020-08-27 15:31:17 -06007290 const float dummy_values[128] = {};
locke-lunarg0d6b4442020-08-11 17:40:53 -06007291 vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
locke-lunargb0337a52020-08-27 15:31:17 -06007292 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
locke-lunarg0d6b4442020-08-11 17:40:53 -06007293 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7294 m_errorMonitor->VerifyFound();
7295
locke-lunargb0337a52020-08-27 15:31:17 -06007296 m_errorMonitor->ExpectSuccess();
7297 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0,
7298 100, dummy_values);
7299 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7300 m_errorMonitor->VerifyNotFound();
7301
locke-lunarg0d6b4442020-08-11 17:40:53 -06007302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
locke-lunargb0337a52020-08-27 15:31:17 -06007303 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout1, VK_SHADER_STAGE_VERTEX_BIT, 0, 4, dummy_values);
locke-lunarg0d6b4442020-08-11 17:40:53 -06007304 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7305 m_errorMonitor->VerifyFound();
7306
7307 m_commandBuffer->EndRenderPass();
7308 m_commandBuffer->end();
7309}