blob: 1db57f455155b3bf9604625dbac98324fa1ce934 [file] [log] [blame]
unknown088160a2019-05-23 17:43:13 -06001/*
sfricke-samsung6886c4b2021-01-16 08:37:35 -08002 * Copyright (c) 2015-2021 The Khronos Group Inc.
3 * Copyright (c) 2015-2021 Valve Corporation
4 * Copyright (c) 2015-2021 LunarG, Inc.
5 * Copyright (c) 2015-2021 Google, Inc.
Tobias Hector04f2ab22020-12-01 10:59:33 +00006 * Modifications Copyright (C) 2020 Advanced Micro Devices, Inc. All rights reserved.
unknown088160a2019-05-23 17:43:13 -06007 *
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
11 *
12 * http://www.apache.org/licenses/LICENSE-2.0
13 *
14 * Author: Chia-I Wu <olvaffe@gmail.com>
15 * Author: Chris Forbes <chrisf@ijw.co.nz>
16 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
17 * Author: Mark Lobodzinski <mark@lunarg.com>
18 * Author: Mike Stroyan <mike@LunarG.com>
19 * Author: Tobin Ehlis <tobine@google.com>
20 * Author: Tony Barbour <tony@LunarG.com>
21 * Author: Cody Northrop <cnorthrop@google.com>
22 * Author: Dave Houlton <daveh@lunarg.com>
23 * Author: Jeremy Kniager <jeremyk@lunarg.com>
24 * Author: Shannon McPherson <shannon@lunarg.com>
25 * Author: John Zulauf <jzulauf@lunarg.com>
Tobias Hector04f2ab22020-12-01 10:59:33 +000026 * Author: Tobias Hector <tobias.hector@amd.com>
unknown088160a2019-05-23 17:43:13 -060027 */
28
29#include "cast_utils.h"
30#include "layer_validation_tests.h"
31
32TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
33 TEST_DESCRIPTION("Allocate command buffers from one command pool and attempt to delete them from another.");
34
Mark Lobodzinski20310782020-02-28 14:25:17 -070035 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkFreeCommandBuffers-pCommandBuffers-parent");
unknown088160a2019-05-23 17:43:13 -060036
37 ASSERT_NO_FATAL_FAILURE(Init());
38 VkCommandPool command_pool_one;
39 VkCommandPool command_pool_two;
40
41 VkCommandPoolCreateInfo pool_create_info{};
42 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
43 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
44 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
45
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060046 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
unknown088160a2019-05-23 17:43:13 -060047
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060048 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
unknown088160a2019-05-23 17:43:13 -060049
50 VkCommandBuffer cb;
51 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
52 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
53 command_buffer_allocate_info.commandPool = command_pool_one;
54 command_buffer_allocate_info.commandBufferCount = 1;
55 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060056 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
unknown088160a2019-05-23 17:43:13 -060057
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060058 vk::FreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
unknown088160a2019-05-23 17:43:13 -060059
60 m_errorMonitor->VerifyFound();
61
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060062 vk::DestroyCommandPool(m_device->device(), command_pool_one, NULL);
63 vk::DestroyCommandPool(m_device->device(), command_pool_two, NULL);
unknown088160a2019-05-23 17:43:13 -060064}
65
66TEST_F(VkLayerTest, InvalidSecondaryCommandBufferBarrier) {
67 TEST_DESCRIPTION("Add an invalid image barrier in a secondary command buffer");
68 ASSERT_NO_FATAL_FAILURE(Init());
69
70 // A renderpass with a single subpass that declared a self-dependency
71 VkAttachmentDescription attach[] = {
72 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
73 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
74 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
75 };
76 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
77 VkSubpassDescription subpasses[] = {
78 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
79 };
80 VkSubpassDependency dep = {0,
81 0,
82 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
83 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
84 VK_ACCESS_SHADER_WRITE_BIT,
85 VK_ACCESS_SHADER_WRITE_BIT,
86 VK_DEPENDENCY_BY_REGION_BIT};
87 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 1, subpasses, 1, &dep};
88 VkRenderPass rp;
89
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -060090 VkResult err = vk::CreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
unknown088160a2019-05-23 17:43:13 -060091 ASSERT_VK_SUCCESS(err);
92
93 VkImageObj image(m_device);
94 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
95 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
96 // Second image that img_barrier will incorrectly use
97 VkImageObj image2(m_device);
98 image2.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
99
100 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
101 VkFramebuffer fb;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600102 err = vk::CreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
unknown088160a2019-05-23 17:43:13 -0600103 ASSERT_VK_SUCCESS(err);
104
105 m_commandBuffer->begin();
106
107 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
108 nullptr,
109 rp,
110 fb,
111 {{
112 0,
113 0,
114 },
115 {32, 32}},
116 0,
117 nullptr};
118
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600119 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -0600120
121 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
122 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
123
124 VkCommandBufferInheritanceInfo cbii = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
125 nullptr,
126 rp,
127 0,
128 VK_NULL_HANDLE, // Set to NULL FB handle intentionally to flesh out any errors
129 VK_FALSE,
130 0,
131 0};
132 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
133 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT,
134 &cbii};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600135 vk::BeginCommandBuffer(secondary.handle(), &cbbi);
unknown088160a2019-05-23 17:43:13 -0600136 VkImageMemoryBarrier img_barrier = {};
137 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
138 img_barrier.srcAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
139 img_barrier.dstAccessMask = VK_ACCESS_SHADER_WRITE_BIT;
140 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
141 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
142 img_barrier.image = image2.handle(); // Image mis-matches with FB image
143 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
144 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
145 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
146 img_barrier.subresourceRange.baseArrayLayer = 0;
147 img_barrier.subresourceRange.baseMipLevel = 0;
148 img_barrier.subresourceRange.layerCount = 1;
149 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600150 vk::CmdPipelineBarrier(secondary.handle(), VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
151 VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1, &img_barrier);
unknown088160a2019-05-23 17:43:13 -0600152 secondary.end();
153
Shannon McPherson93970b12020-06-12 14:34:35 -0600154 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-image-04073");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600155 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600156 m_errorMonitor->VerifyFound();
157
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600158 vk::DestroyFramebuffer(m_device->device(), fb, nullptr);
159 vk::DestroyRenderPass(m_device->device(), rp, nullptr);
unknown088160a2019-05-23 17:43:13 -0600160}
161
162TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
163 TEST_DESCRIPTION(
164 "Run a simple draw calls to validate failure when Depth Bias dynamic state is required but not correctly bound.");
165
166 ASSERT_NO_FATAL_FAILURE(Init());
167 // Dynamic depth bias
Mark Lobodzinski20310782020-02-28 14:25:17 -0700168 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bias state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600169 VKTriangleTest(BsoFailDepthBias);
170 m_errorMonitor->VerifyFound();
171}
172
173TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
174 TEST_DESCRIPTION(
175 "Run a simple draw calls to validate failure when Line Width dynamic state is required but not correctly bound.");
176
177 ASSERT_NO_FATAL_FAILURE(Init());
178 // Dynamic line width
Mark Lobodzinski20310782020-02-28 14:25:17 -0700179 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line width state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600180 VKTriangleTest(BsoFailLineWidth);
181 m_errorMonitor->VerifyFound();
182}
183
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500184TEST_F(VkLayerTest, DynamicLineStippleNotBound) {
185 TEST_DESCRIPTION(
186 "Run a simple draw calls to validate failure when Line Stipple dynamic state is required but not correctly bound.");
187
188 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
189 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
190 } else {
191 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
192 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
193 return;
194 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -0700195 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500196 std::array<const char *, 1> required_device_extensions = {{VK_EXT_LINE_RASTERIZATION_EXTENSION_NAME}};
197 for (auto device_extension : required_device_extensions) {
198 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
199 m_device_extension_names.push_back(device_extension);
200 } else {
201 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
202 return;
203 }
204 }
205
206 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600207 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500208 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
209
Mark Lobodzinski07d0a612020-12-30 15:42:31 -0700210 auto line_rasterization_features = LvlInitStruct<VkPhysicalDeviceLineRasterizationFeaturesEXT>();
211 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&line_rasterization_features);
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500212 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
213
214 if (!line_rasterization_features.stippledBresenhamLines || !line_rasterization_features.bresenhamLines) {
215 printf("%sStipple Bresenham lines not supported; skipped.\n", kSkipPrefix);
216 return;
217 }
218
219 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
220
Mark Lobodzinski20310782020-02-28 14:25:17 -0700221 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic line stipple state not set for this command buffer");
Jeff Bolzf390c6c2019-08-16 16:29:53 -0500222 VKTriangleTest(BsoFailLineStipple);
223 m_errorMonitor->VerifyFound();
224}
225
unknown088160a2019-05-23 17:43:13 -0600226TEST_F(VkLayerTest, DynamicViewportNotBound) {
227 TEST_DESCRIPTION(
228 "Run a simple draw calls to validate failure when Viewport dynamic state is required but not correctly bound.");
229
230 ASSERT_NO_FATAL_FAILURE(Init());
231 // Dynamic viewport state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700232 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600233 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
234 VKTriangleTest(BsoFailViewport);
235 m_errorMonitor->VerifyFound();
236}
237
238TEST_F(VkLayerTest, DynamicScissorNotBound) {
239 TEST_DESCRIPTION("Run a simple draw calls to validate failure when Scissor dynamic state is required but not correctly bound.");
240
241 ASSERT_NO_FATAL_FAILURE(Init());
242 // Dynamic scissor state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700243 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600244 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
245 VKTriangleTest(BsoFailScissor);
246 m_errorMonitor->VerifyFound();
247}
248
249TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
250 TEST_DESCRIPTION(
251 "Run a simple draw calls to validate failure when Blend Constants dynamic state is required but not correctly bound.");
252
253 ASSERT_NO_FATAL_FAILURE(Init());
254 // Dynamic blend constant state
Mark Lobodzinski20310782020-02-28 14:25:17 -0700255 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic blend constants state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600256 VKTriangleTest(BsoFailBlend);
257 m_errorMonitor->VerifyFound();
258}
259
260TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
261 TEST_DESCRIPTION(
262 "Run a simple draw calls to validate failure when Depth Bounds dynamic state is required but not correctly bound.");
263
264 ASSERT_NO_FATAL_FAILURE(Init());
265 if (!m_device->phy().features().depthBounds) {
266 printf("%s Device does not support depthBounds test; skipped.\n", kSkipPrefix);
267 return;
268 }
269 // Dynamic depth bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -0700270 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic depth bounds state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600271 VKTriangleTest(BsoFailDepthBounds);
272 m_errorMonitor->VerifyFound();
273}
274
275TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
276 TEST_DESCRIPTION(
277 "Run a simple draw calls to validate failure when Stencil Read dynamic state is required but not correctly bound.");
278
279 ASSERT_NO_FATAL_FAILURE(Init());
280 // Dynamic stencil read mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700281 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil read mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600282 VKTriangleTest(BsoFailStencilReadMask);
283 m_errorMonitor->VerifyFound();
284}
285
286TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
287 TEST_DESCRIPTION(
288 "Run a simple draw calls to validate failure when Stencil Write dynamic state is required but not correctly bound.");
289
290 ASSERT_NO_FATAL_FAILURE(Init());
291 // Dynamic stencil write mask
Mark Lobodzinski20310782020-02-28 14:25:17 -0700292 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil write mask state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600293 VKTriangleTest(BsoFailStencilWriteMask);
294 m_errorMonitor->VerifyFound();
295}
296
297TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
298 TEST_DESCRIPTION(
299 "Run a simple draw calls to validate failure when Stencil Ref dynamic state is required but not correctly bound.");
300
301 ASSERT_NO_FATAL_FAILURE(Init());
302 // Dynamic stencil reference
Mark Lobodzinski20310782020-02-28 14:25:17 -0700303 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Dynamic stencil reference state not set for this command buffer");
unknown088160a2019-05-23 17:43:13 -0600304 VKTriangleTest(BsoFailStencilReference);
305 m_errorMonitor->VerifyFound();
306}
307
308TEST_F(VkLayerTest, IndexBufferNotBound) {
309 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
310
311 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Index buffer object not bound to this command buffer when Indexed ");
unknown088160a2019-05-23 17:43:13 -0600313 VKTriangleTest(BsoFailIndexBuffer);
314 m_errorMonitor->VerifyFound();
315}
316
317TEST_F(VkLayerTest, IndexBufferBadSize) {
318 TEST_DESCRIPTION("Run indexed draw call with bad index buffer size.");
319
320 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600321 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600322 VKTriangleTest(BsoFailIndexBufferBadSize);
323 m_errorMonitor->VerifyFound();
324}
325
326TEST_F(VkLayerTest, IndexBufferBadOffset) {
327 TEST_DESCRIPTION("Run indexed draw call with bad index buffer offset.");
328
329 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600330 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600331 VKTriangleTest(BsoFailIndexBufferBadOffset);
332 m_errorMonitor->VerifyFound();
333}
334
335TEST_F(VkLayerTest, IndexBufferBadBindSize) {
336 TEST_DESCRIPTION("Run bind index buffer with a size greater than the index buffer.");
337
338 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600339 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600340 VKTriangleTest(BsoFailIndexBufferBadMapSize);
341 m_errorMonitor->VerifyFound();
342}
343
344TEST_F(VkLayerTest, IndexBufferBadBindOffset) {
345 TEST_DESCRIPTION("Run bind index buffer with an offset greater than the size of the index buffer.");
346
347 ASSERT_NO_FATAL_FAILURE(Init(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tony-LunarG4490de42021-06-21 15:49:19 -0600348 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdDrawIndexed(): index size ");
unknown088160a2019-05-23 17:43:13 -0600349 VKTriangleTest(BsoFailIndexBufferBadMapOffset);
350 m_errorMonitor->VerifyFound();
351}
352
353TEST_F(VkLayerTest, MissingClearAttachment) {
354 TEST_DESCRIPTION("Points to a wrong colorAttachment index in a VkClearAttachment structure passed to vkCmdClearAttachments");
355 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski20310782020-02-28 14:25:17 -0700356 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02501");
unknown088160a2019-05-23 17:43:13 -0600357
358 VKTriangleTest(BsoFailCmdClearAttachments);
359 m_errorMonitor->VerifyFound();
360}
361
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700362TEST_F(VkLayerTest, SecondaryCommandbufferAsPrimary) {
363 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit.");
Mark Lobodzinski20310782020-02-28 14:25:17 -0700364 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pCommandBuffers-00075");
Mark Lobodzinskicd0204c2019-11-11 16:59:18 -0700365
366 ASSERT_NO_FATAL_FAILURE(Init());
367
368 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
369 secondary.begin();
370 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
371 secondary.end();
372
373 VkSubmitInfo submit_info;
374 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
375 submit_info.pNext = NULL;
376 submit_info.waitSemaphoreCount = 0;
377 submit_info.pWaitSemaphores = NULL;
378 submit_info.pWaitDstStageMask = NULL;
379 submit_info.commandBufferCount = 1;
380 submit_info.pCommandBuffers = &secondary.handle();
381 submit_info.signalSemaphoreCount = 0;
382 submit_info.pSignalSemaphores = NULL;
383
384 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
385 m_errorMonitor->VerifyFound();
386}
387
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700388TEST_F(VkLayerTest, Sync2SecondaryCommandbufferAsPrimary) {
389 TEST_DESCRIPTION("Create a secondary command buffer and pass it to QueueSubmit2KHR.");
390 SetTargetApiVersion(VK_API_VERSION_1_2);
391 ASSERT_NO_FATAL_FAILURE(InitFramework());
392 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
393 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
394 } else {
395 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
396 return;
397 }
398
399 if (!CheckSynchronization2SupportAndInitState(this)) {
400 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
401 return;
402 }
403 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
404 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferSubmitInfoKHR-commandBuffer-03890");
405
406 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
407 secondary.begin();
408 secondary.ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
409 secondary.end();
410
411 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
412 cb_info.commandBuffer = secondary.handle();
413
414 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
415 submit_info.commandBufferInfoCount = 1;
416 submit_info.pCommandBufferInfos = &cb_info;
417
418 fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
419 m_errorMonitor->VerifyFound();
420}
421
unknown088160a2019-05-23 17:43:13 -0600422TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700423 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600424 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
425
426 ASSERT_NO_FATAL_FAILURE(Init());
427 ASSERT_NO_FATAL_FAILURE(InitViewport());
428 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
429
430 // We luck out b/c by default the framework creates CB w/ the
431 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
432 m_commandBuffer->begin();
433 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
434 m_commandBuffer->end();
435
436 // Bypass framework since it does the waits automatically
437 VkResult err = VK_SUCCESS;
438 VkSubmitInfo submit_info;
439 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
440 submit_info.pNext = NULL;
441 submit_info.waitSemaphoreCount = 0;
442 submit_info.pWaitSemaphores = NULL;
443 submit_info.pWaitDstStageMask = NULL;
444 submit_info.commandBufferCount = 1;
445 submit_info.pCommandBuffers = &m_commandBuffer->handle();
446 submit_info.signalSemaphoreCount = 0;
447 submit_info.pSignalSemaphores = NULL;
448
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600449 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -0600450 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600451 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600452
453 // Cause validation error by re-submitting cmd buffer that should only be
454 // submitted once
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600455 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
456 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600457
458 m_errorMonitor->VerifyFound();
459}
460
Jeremy Gebben1db6edc2021-02-17 15:28:40 -0700461TEST_F(VkLayerTest, Sync2CommandBufferTwoSubmits) {
462 SetTargetApiVersion(VK_API_VERSION_1_2);
463 ASSERT_NO_FATAL_FAILURE(InitFramework());
464 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME)) {
465 m_device_extension_names.push_back(VK_KHR_SYNCHRONIZATION_2_EXTENSION_NAME);
466 } else {
467 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
468 return;
469 }
470
471 if (!CheckSynchronization2SupportAndInitState(this)) {
472 printf("%s Synchronization2 not supported, skipping test\n", kSkipPrefix);
473 return;
474 }
475 auto fpQueueSubmit2KHR = (PFN_vkQueueSubmit2KHR)vk::GetDeviceProcAddr(m_device->device(), "vkQueueSubmit2KHR");
476
477 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
478 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
479 ASSERT_NO_FATAL_FAILURE(InitViewport());
480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
481
482 // We luck out b/c by default the framework creates CB w/ the
483 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
484 m_commandBuffer->begin();
485 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
486 m_commandBuffer->end();
487
488 // Bypass framework since it does the waits automatically
489 VkResult err = VK_SUCCESS;
490 auto cb_info = lvl_init_struct<VkCommandBufferSubmitInfoKHR>();
491 cb_info.commandBuffer = m_commandBuffer->handle();
492
493 auto submit_info = lvl_init_struct<VkSubmitInfo2KHR>();
494 submit_info.commandBufferInfoCount = 1;
495 submit_info.pCommandBufferInfos = &cb_info;
496
497 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
498 ASSERT_VK_SUCCESS(err);
499 vk::QueueWaitIdle(m_device->m_queue);
500
501 // Cause validation error by re-submitting cmd buffer that should only be
502 // submitted once
503 err = fpQueueSubmit2KHR(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
504 vk::QueueWaitIdle(m_device->m_queue);
505
506 m_errorMonitor->VerifyFound();
507}
508
unknown088160a2019-05-23 17:43:13 -0600509TEST_F(VkLayerTest, InvalidPushConstants) {
510 ASSERT_NO_FATAL_FAILURE(Init());
511 ASSERT_NO_FATAL_FAILURE(InitViewport());
512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
513
514 VkPipelineLayout pipeline_layout;
515 VkPushConstantRange pc_range = {};
516 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
517 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
518 pipeline_layout_ci.pushConstantRangeCount = 1;
519 pipeline_layout_ci.pPushConstantRanges = &pc_range;
520
521 //
522 // Check for invalid push constant ranges in pipeline layouts.
523 //
524 struct PipelineLayoutTestCase {
525 VkPushConstantRange const range;
526 char const *msg;
527 };
528
529 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
530 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
sfricke-samsung51303fb2021-05-09 19:09:13 -0700531 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "VUID-VkPushConstantRange-size-00296"},
532 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1}, "VUID-VkPushConstantRange-size-00297"},
533 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1}, "VUID-VkPushConstantRange-size-00297"},
534 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0}, "VUID-VkPushConstantRange-size-00296"},
535 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4}, "VUID-VkPushConstantRange-offset-00295"},
536 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big}, "VUID-VkPushConstantRange-size-00298"},
537 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big}, "VUID-VkPushConstantRange-offset-00294"},
538 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4}, "VUID-VkPushConstantRange-offset-00294"},
539 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020}, "VUID-VkPushConstantRange-offset-00294"},
540 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0}, "VUID-VkPushConstantRange-size-00298"},
unknown088160a2019-05-23 17:43:13 -0600541 }};
542
543 // Check for invalid offset and size
544 for (const auto &iter : range_tests) {
545 pc_range = iter.range;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700546 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600547 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600548 m_errorMonitor->VerifyFound();
549 }
550
551 // Check for invalid stage flag
552 pc_range.offset = 0;
553 pc_range.size = 16;
554 pc_range.stageFlags = 0;
sfricke-samsung51303fb2021-05-09 19:09:13 -0700555 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPushConstantRange-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600556 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600557 m_errorMonitor->VerifyFound();
558
559 // Check for duplicate stage flags in a list of push constant ranges.
560 // A shader can only have one push constant block and that block is mapped
561 // to the push constant range that has that shader's stage flag set.
562 // The shader's stage flag can only appear once in all the ranges, so the
563 // implementation can find the one and only range to map it to.
564 const uint32_t ranges_per_test = 5;
565 struct DuplicateStageFlagsTestCase {
566 VkPushConstantRange const ranges[ranges_per_test];
567 std::vector<char const *> const msg;
568 };
569 // Overlapping ranges are OK, but a stage flag can appear only once.
570 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
571 {
572 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
573 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
574 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
575 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
576 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
577 {
578 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
579 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
580 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
581 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
582 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
583 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
584 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
585 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
586 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
587 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
588 }},
589 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
590 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
591 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
592 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
593 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
594 {
595 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
596 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
597 }},
598 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
599 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
600 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
601 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
602 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
603 {
604 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
605 }},
606 },
607 };
608
609 for (const auto &iter : duplicate_stageFlags_tests) {
610 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
611 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700612 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg.begin(), iter.msg.end());
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600613 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600614 m_errorMonitor->VerifyFound();
615 }
616
617 //
618 // CmdPushConstants tests
619 //
620
621 // Setup a pipeline layout with ranges: [0,32) [16,80)
622 const std::vector<VkPushConstantRange> pc_range2 = {{VK_SHADER_STAGE_VERTEX_BIT, 16, 64},
623 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 32}};
624 const VkPipelineLayoutObj pipeline_layout_obj(m_device, {}, pc_range2);
625
626 const uint8_t dummy_values[100] = {};
627
628 m_commandBuffer->begin();
629 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
630
631 // Check for invalid stage flag
632 // Note that VU 00996 isn't reached due to parameter validation
sfricke-samsung51303fb2021-05-09 19:09:13 -0700633 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600634 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), 0, 0, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600635 m_errorMonitor->VerifyFound();
636
637 // Positive tests for the overlapping ranges
638 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600639 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16,
640 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600641 m_errorMonitor->VerifyNotFound();
642 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600643 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 32, 48, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600644 m_errorMonitor->VerifyNotFound();
645 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600646 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
647 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600648 m_errorMonitor->VerifyNotFound();
649
650 // Wrong cmd stages for extant range
651 // No range for all cmd stages -- "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
Mark Lobodzinski20310782020-02-28 14:25:17 -0700652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
unknown088160a2019-05-23 17:43:13 -0600653 // Missing cmd stages for found overlapping range -- "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
Mark Lobodzinski20310782020-02-28 14:25:17 -0700654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600655 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16,
656 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600657 m_errorMonitor->VerifyFound();
658
659 // Wrong no extant range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600661 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 80, 4,
662 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600663 m_errorMonitor->VerifyFound();
664
665 // Wrong overlapping extent
Mark Lobodzinski20310782020-02-28 14:25:17 -0700666 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600667 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
668 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 20, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600669 m_errorMonitor->VerifyFound();
670
671 // Wrong stage flags for valid overlapping range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700672 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600673 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600674 m_errorMonitor->VerifyFound();
675
676 m_commandBuffer->EndRenderPass();
677 m_commandBuffer->end();
678}
679
680TEST_F(VkLayerTest, NoBeginCommandBuffer) {
sfricke-samsung946027b2021-04-20 22:44:36 -0700681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-commandBuffer-00059");
unknown088160a2019-05-23 17:43:13 -0600682
683 ASSERT_NO_FATAL_FAILURE(Init());
684 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
685 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600686 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600687
688 m_errorMonitor->VerifyFound();
689}
690
691TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
692 ASSERT_NO_FATAL_FAILURE(Init());
693
694 VkCommandBufferObj cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
695
696 // Force the failure by not setting the Renderpass and Framebuffer fields
697 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
698 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
699
700 VkCommandBufferBeginInfo cmd_buf_info = {};
701 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
702 cmd_buf_info.pNext = NULL;
703 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
704 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
705
Mark Lobodzinski20310782020-02-28 14:25:17 -0700706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferBeginInfo-flags-00053");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600707 vk::BeginCommandBuffer(cb.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600708 m_errorMonitor->VerifyFound();
709}
710
711TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
712 ASSERT_NO_FATAL_FAILURE(Init());
713
Mark Lobodzinski20310782020-02-28 14:25:17 -0700714 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600715
716 // A pool we can reset in.
717 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
718 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
719
720 secondary.begin();
721 secondary.end();
722
723 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600724 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600725
726 // rerecording of secondary
727 secondary.reset(); // explicit reset here.
728 secondary.begin();
729 secondary.end();
730
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600731 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600732 m_errorMonitor->VerifyFound();
733}
734
735TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
736 ASSERT_NO_FATAL_FAILURE(Init());
737
Mark Lobodzinski20310782020-02-28 14:25:17 -0700738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600739
740 // A pool we can reset in.
741 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
742 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
743
744 secondary.begin();
745 secondary.end();
746
747 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600748 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600749
750 // rerecording of secondary
751 secondary.begin(); // implicit reset in begin
752 secondary.end();
753
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600754 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600755 m_errorMonitor->VerifyFound();
756}
757
758TEST_F(VkLayerTest, CascadedInvalidation) {
759 ASSERT_NO_FATAL_FAILURE(Init());
760
761 VkEventCreateInfo eci = {VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, nullptr, 0};
762 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600763 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600764
765 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
766 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600767 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600768 secondary.end();
769
770 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600771 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600772 m_commandBuffer->end();
773
774 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600775 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600776
Mark Lobodzinski20310782020-02-28 14:25:17 -0700777 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600778 m_commandBuffer->QueueCommandBuffer(false);
779 m_errorMonitor->VerifyFound();
780}
781
782TEST_F(VkLayerTest, CommandBufferResetErrors) {
783 // Cause error due to Begin while recording CB
784 // Then cause 2 errors for attempting to reset CB w/o having
785 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
786 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700787 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600788
789 ASSERT_NO_FATAL_FAILURE(Init());
790
791 // Calls AllocateCommandBuffers
792 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
793
794 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
795 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
796 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
797 VkCommandBufferBeginInfo cmd_buf_info = {};
798 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
799 cmd_buf_info.pNext = NULL;
800 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
801 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
802
803 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600804 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600805 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600806 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600807 m_errorMonitor->VerifyFound();
808
Mark Lobodzinski20310782020-02-28 14:25:17 -0700809 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600810 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
811 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600812 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600813 m_errorMonitor->VerifyFound();
814
Mark Lobodzinski20310782020-02-28 14:25:17 -0700815 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600816 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600817 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600818 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600819 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600820 m_errorMonitor->VerifyFound();
821}
822
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700823TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
824 ASSERT_NO_FATAL_FAILURE(Init());
825
826 // Calls AllocateCommandBuffers
827 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
828
829 VkCommandBufferBeginInfo cmd_buf_info = {};
830 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
831 cmd_buf_info.pNext = NULL;
832 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
833
834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
835 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
836 m_errorMonitor->VerifyFound();
837}
838
unknown088160a2019-05-23 17:43:13 -0600839TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
840 // Call CmdClearAttachmentss outside of an active RenderPass
841
Mark Lobodzinski20310782020-02-28 14:25:17 -0700842 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600843 "vkCmdClearAttachments(): This call must be issued inside an active render pass");
844
845 ASSERT_NO_FATAL_FAILURE(Init());
846 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
847
848 // Start no RenderPass
849 m_commandBuffer->begin();
850
851 VkClearAttachment color_attachment;
852 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
853 color_attachment.clearValue.color.float32[0] = 0;
854 color_attachment.clearValue.color.float32[1] = 0;
855 color_attachment.clearValue.color.float32[2] = 0;
856 color_attachment.clearValue.color.float32[3] = 0;
857 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600858 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600859 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600860
861 m_errorMonitor->VerifyFound();
862}
863
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600864TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
865 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
866
Mark Lobodzinski20310782020-02-28 14:25:17 -0700867 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600868
869 ASSERT_NO_FATAL_FAILURE(Init());
870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
871
872 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600873 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600874
875 VkClearAttachment color_attachment;
876 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
877 color_attachment.clearValue.color.float32[0] = 0;
878 color_attachment.clearValue.color.float32[1] = 0;
879 color_attachment.clearValue.color.float32[2] = 0;
880 color_attachment.clearValue.color.float32[3] = 0;
881 color_attachment.colorAttachment = 0;
882 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600883 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600884
885 m_errorMonitor->VerifyFound();
886}
887
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700888TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
889 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
890
891 ASSERT_NO_FATAL_FAILURE(Init());
892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
893
894 m_commandBuffer->begin();
895 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
896
897 VkClearAttachment color_attachment;
898 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
899 color_attachment.clearValue.color.float32[0] = 0;
900 color_attachment.clearValue.color.float32[1] = 0;
901 color_attachment.clearValue.color.float32[2] = 0;
902 color_attachment.clearValue.color.float32[3] = 0;
903 color_attachment.colorAttachment = 0;
904 VkClearRect clear_rect = {};
905 clear_rect.rect.offset = {0, 0};
906 clear_rect.baseArrayLayer = 0;
907 clear_rect.layerCount = 1;
908
909 clear_rect.rect.extent = {0, 1};
910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
911 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
912 m_errorMonitor->VerifyFound();
913
914 clear_rect.rect.extent = {1, 0};
915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
916 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
917 m_errorMonitor->VerifyFound();
918}
919
sfricke-samsung6141db32020-10-26 03:31:38 -0700920TEST_F(VkLayerTest, ClearAttachmentsInvalidAspectMasks) {
921 TEST_DESCRIPTION("Check VkClearAttachment invalid aspect masks.");
922
923 ASSERT_NO_FATAL_FAILURE(Init());
924 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
925
926 m_commandBuffer->begin();
927 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
928
929 VkClearAttachment attachment;
930 attachment.clearValue.color.float32[0] = 0;
931 attachment.clearValue.color.float32[1] = 0;
932 attachment.clearValue.color.float32[2] = 0;
933 attachment.clearValue.color.float32[3] = 0;
934 attachment.colorAttachment = 0;
935 VkClearRect clear_rect = {};
936 clear_rect.rect.offset = {0, 0};
937 clear_rect.rect.extent = {1, 1};
938 clear_rect.baseArrayLayer = 0;
939 clear_rect.layerCount = 1;
940
941 attachment.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
943 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
944 m_errorMonitor->VerifyFound();
945
946 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT;
947 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
948 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
949 m_errorMonitor->VerifyFound();
950
951 attachment.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
952 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
953 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
954 m_errorMonitor->VerifyFound();
955
956 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
957 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
958 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
959 m_errorMonitor->VerifyFound();
960}
961
sfricke-samsung91f4a542020-10-21 00:29:17 -0700962TEST_F(VkLayerTest, ClearAttachmentsImplicitCheck) {
963 TEST_DESCRIPTION("Check VkClearAttachment implicit VUs.");
964
965 ASSERT_NO_FATAL_FAILURE(Init());
966 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
967
968 m_commandBuffer->begin();
969 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
970
971 VkClearAttachment color_attachment;
972 color_attachment.clearValue.color.float32[0] = 0;
973 color_attachment.clearValue.color.float32[1] = 0;
974 color_attachment.clearValue.color.float32[2] = 0;
975 color_attachment.clearValue.color.float32[3] = 0;
976 color_attachment.colorAttachment = 0;
977 VkClearRect clear_rect = {};
978 clear_rect.rect.offset = {0, 0};
979 clear_rect.rect.extent = {1, 1};
980 clear_rect.baseArrayLayer = 0;
981 clear_rect.layerCount = 1;
982
983 color_attachment.aspectMask = 0;
984 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-requiredbitmask");
985 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
986 m_errorMonitor->VerifyFound();
987
988 color_attachment.aspectMask = 0xffffffff;
989 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-parameter");
990 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
991 m_errorMonitor->VerifyFound();
992}
993
sfricke-samsung87b09512020-10-26 03:35:42 -0700994TEST_F(VkLayerTest, ClearColorAttachmentsDepthStencil) {
995 TEST_DESCRIPTION("Call CmdClearAttachments with invalid depth/stencil aspect masks.");
996
997 ASSERT_NO_FATAL_FAILURE(Init());
998 // Creates a color attachment
999 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1000
1001 m_commandBuffer->begin();
1002 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
1003
1004 VkClearAttachment attachment;
1005 attachment.clearValue.color.float32[0] = 0;
1006 attachment.clearValue.color.float32[1] = 0;
1007 attachment.clearValue.color.float32[2] = 0;
1008 attachment.clearValue.color.float32[3] = 0;
1009 attachment.colorAttachment = 0;
1010 VkClearRect clear_rect = {};
1011 clear_rect.rect.offset = {0, 0};
1012 clear_rect.rect.extent = {1, 1};
1013 clear_rect.baseArrayLayer = 0;
1014 clear_rect.layerCount = 1;
1015
1016 m_errorMonitor->ExpectSuccess();
1017 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1018 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1019 m_errorMonitor->VerifyNotFound();
1020
1021 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02502");
1022 attachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
1023 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1024 m_errorMonitor->VerifyFound();
1025
1026 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02503");
1027 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
1028 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1029 m_errorMonitor->VerifyFound();
1030}
1031
unknown088160a2019-05-23 17:43:13 -06001032TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
1033 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
1034
1035 ASSERT_NO_FATAL_FAILURE(Init());
1036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1037
1038 // An empty primary command buffer
1039 VkCommandBufferObj cb(m_device, m_commandPool);
1040 cb.begin();
1041 cb.end();
1042
1043 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001044 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06001045 VkCommandBuffer handle = cb.handle();
1046
Mark Lobodzinski20310782020-02-28 14:25:17 -07001047 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001048 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -06001049 m_errorMonitor->VerifyFound();
1050
1051 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
1052
1053 m_commandBuffer->EndRenderPass();
1054 m_commandBuffer->end();
1055}
1056
Petr Kraus8e53cf02020-01-03 05:30:04 +01001057TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
1058 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
1059
1060 ASSERT_NO_FATAL_FAILURE(Init());
1061
1062 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1063 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1064 secondary_cb.begin();
1065 secondary_cb.end();
1066
1067 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +01001069 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
1070 m_errorMonitor->VerifyFound();
1071}
1072
unknown088160a2019-05-23 17:43:13 -06001073TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
1074 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
1075
1076 ASSERT_NO_FATAL_FAILURE(Init());
1077 ASSERT_NO_FATAL_FAILURE(InitViewport());
1078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1079
1080 const VkPipelineLayoutObj pipeline_layout(m_device);
1081
1082 struct VboEntry {
1083 uint16_t input0[2];
1084 uint32_t input1;
1085 float input2[4];
1086 };
1087
1088 const unsigned vbo_entry_count = 3;
1089 const VboEntry vbo_data[vbo_entry_count] = {};
1090
1091 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
1092 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1093
1094 VkVertexInputBindingDescription input_binding;
1095 input_binding.binding = 0;
1096 input_binding.stride = sizeof(VboEntry);
1097 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1098
1099 VkVertexInputAttributeDescription input_attribs[3];
1100
1101 input_attribs[0].binding = 0;
1102 // Location switch between attrib[0] and attrib[1] is intentional
1103 input_attribs[0].location = 1;
1104 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
1105 input_attribs[0].offset = offsetof(VboEntry, input1);
1106
1107 input_attribs[1].binding = 0;
1108 input_attribs[1].location = 0;
1109 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
1110 input_attribs[1].offset = offsetof(VboEntry, input0);
1111
1112 input_attribs[2].binding = 0;
1113 input_attribs[2].location = 2;
1114 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1115 input_attribs[2].offset = offsetof(VboEntry, input2);
1116
1117 char const *vsSource =
1118 "#version 450\n"
1119 "\n"
1120 "layout(location = 0) in vec2 input0;"
1121 "layout(location = 1) in vec4 input1;"
1122 "layout(location = 2) in vec4 input2;"
1123 "\n"
1124 "void main(){\n"
1125 " gl_Position = input1 + input2;\n"
1126 " gl_Position.xy += input0;\n"
1127 "}\n";
unknown088160a2019-05-23 17:43:13 -06001128
1129 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001130 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001131
1132 VkPipelineObj pipe1(m_device);
1133 pipe1.AddDefaultColorAttachment();
1134 pipe1.AddShader(&vs);
1135 pipe1.AddShader(&fs);
1136 pipe1.AddVertexInputBindings(&input_binding, 1);
1137 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
1138 pipe1.SetViewport(m_viewports);
1139 pipe1.SetScissor(m_scissors);
1140 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1141
1142 input_binding.stride = 6;
1143
1144 VkPipelineObj pipe2(m_device);
1145 pipe2.AddDefaultColorAttachment();
1146 pipe2.AddShader(&vs);
1147 pipe2.AddShader(&fs);
1148 pipe2.AddVertexInputBindings(&input_binding, 1);
1149 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
1150 pipe2.SetViewport(m_viewports);
1151 pipe2.SetScissor(m_scissors);
1152 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1153
1154 m_commandBuffer->begin();
1155 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1156
1157 // Test with invalid buffer offset
1158 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001159 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
1160 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001161 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
1162 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 1");
1163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001164 m_commandBuffer->Draw(1, 0, 0, 0);
1165 m_errorMonitor->VerifyFound();
1166
1167 // Test with invalid buffer stride
1168 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001169 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
1170 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001171 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
unknown088160a2019-05-23 17:43:13 -06001172 // Attribute[1] is aligned properly even with a wrong stride
Mark Lobodzinski20310782020-02-28 14:25:17 -07001173 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001174 m_commandBuffer->Draw(1, 0, 0, 0);
1175 m_errorMonitor->VerifyFound();
1176
1177 m_commandBuffer->EndRenderPass();
1178 m_commandBuffer->end();
1179}
1180
1181TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
1182 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -06001183 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -06001184
1185 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1186
1187 secondary.begin();
1188 secondary.end();
1189
1190 VkCommandBufferBeginInfo cbbi = {
1191 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1192 nullptr,
1193 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1194 nullptr,
1195 };
1196
1197 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001198 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001199 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001200 m_errorMonitor->VerifyFound();
1201 m_commandBuffer->end();
1202}
1203
1204TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1205 ASSERT_NO_FATAL_FAILURE(Init());
1206
John Zulauff1640d12019-08-13 15:39:58 -06001207 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001208
1209 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1210
1211 VkCommandBufferInheritanceInfo inh = {
1212 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1213 nullptr,
1214 };
1215 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1216
1217 secondary.begin(&cbbi);
1218 secondary.end();
1219
1220 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001221 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001222 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001223 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001224 m_errorMonitor->VerifyFound();
1225 m_commandBuffer->end();
1226}
1227
1228TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1229 ASSERT_NO_FATAL_FAILURE(Init());
1230
1231 // variation on previous test executing the same CB twice in the same
1232 // CmdExecuteCommands call
1233
John Zulauff1640d12019-08-13 15:39:58 -06001234 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001235
1236 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1237
1238 VkCommandBufferInheritanceInfo inh = {
1239 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1240 nullptr,
1241 };
1242 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1243
1244 secondary.begin(&cbbi);
1245 secondary.end();
1246
1247 m_commandBuffer->begin();
1248 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001249 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001250 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001251 m_errorMonitor->VerifyFound();
1252 m_commandBuffer->end();
1253}
1254
1255TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1256 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1257 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1258 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1259 ASSERT_NO_FATAL_FAILURE(Init());
1260
1261 VkCommandBuffer cmd_bufs[2];
1262 VkCommandBufferAllocateInfo alloc_info;
1263 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1264 alloc_info.pNext = NULL;
1265 alloc_info.commandBufferCount = 2;
1266 alloc_info.commandPool = m_commandPool->handle();
1267 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001268 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001269
1270 VkCommandBufferBeginInfo cb_binfo;
1271 cb_binfo.pNext = NULL;
1272 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1273 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1274 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001275 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001276 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001277 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1278 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001279 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1280
1281 VkSubmitInfo submit_info = {};
1282 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1283 submit_info.commandBufferCount = 2;
1284 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001285 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001286 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001287 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001288 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001289
1290 // Set one time use and now look for one time submit
1291 duplicates[0] = duplicates[1] = cmd_bufs[1];
1292 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 -06001293 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1294 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1295 vk::EndCommandBuffer(cmd_bufs[1]);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001296 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001297 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001298 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001299 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001300}
1301
1302TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1303 TEST_DESCRIPTION(
1304 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1305
Mark Lobodzinski20310782020-02-28 14:25:17 -07001306 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001307
1308 ASSERT_NO_FATAL_FAILURE(Init());
1309 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1310
unknown088160a2019-05-23 17:43:13 -06001311 char const *fsSource =
1312 "#version 450\n"
1313 "\n"
1314 "layout(set=0, binding=0) uniform sampler3D s;\n"
1315 "layout(location=0) out vec4 color;\n"
1316 "void main() {\n"
1317 " color = texture(s, vec3(0));\n"
1318 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001319 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001320 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1321
1322 VkPipelineObj pipe(m_device);
1323 pipe.AddShader(&vs);
1324 pipe.AddShader(&fs);
1325 pipe.AddDefaultColorAttachment();
1326
1327 VkTextureObj texture(m_device, nullptr);
1328 VkSamplerObj sampler(m_device);
1329
1330 VkDescriptorSetObj descriptorSet(m_device);
1331 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1332 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1333
1334 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1335 ASSERT_VK_SUCCESS(err);
1336
1337 m_commandBuffer->begin();
1338 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1339
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001340 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001341 m_commandBuffer->BindDescriptorSet(descriptorSet);
1342
1343 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001344 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001345 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001346 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001347
1348 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001349 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001350
1351 m_errorMonitor->VerifyFound();
1352
1353 m_commandBuffer->EndRenderPass();
1354 m_commandBuffer->end();
1355}
1356
1357TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1358 TEST_DESCRIPTION(
1359 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1360 "vice versa.");
1361
Mark Lobodzinski20310782020-02-28 14:25:17 -07001362 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001363
1364 ASSERT_NO_FATAL_FAILURE(Init());
1365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1366
unknown088160a2019-05-23 17:43:13 -06001367 char const *fsSource =
1368 "#version 450\n"
1369 "\n"
1370 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
1371 "layout(location=0) out vec4 color;\n"
1372 "void main() {\n"
1373 " color = texelFetch(s, ivec2(0), 0);\n"
1374 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001375 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001376 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1377
1378 VkPipelineObj pipe(m_device);
1379 pipe.AddShader(&vs);
1380 pipe.AddShader(&fs);
1381 pipe.AddDefaultColorAttachment();
1382
1383 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1384 VkSamplerObj sampler(m_device);
1385
1386 VkDescriptorSetObj descriptorSet(m_device);
1387 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1388 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1389
1390 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1391 ASSERT_VK_SUCCESS(err);
1392
1393 m_commandBuffer->begin();
1394 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1395
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001396 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001397 m_commandBuffer->BindDescriptorSet(descriptorSet);
1398
1399 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001400 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001401 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001402 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001403
1404 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001405 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001406
1407 m_errorMonitor->VerifyFound();
1408
1409 m_commandBuffer->EndRenderPass();
1410 m_commandBuffer->end();
1411}
1412
1413TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1414 TEST_DESCRIPTION(
1415 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1416
Mark Lobodzinski20310782020-02-28 14:25:17 -07001417 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001418
1419 ASSERT_NO_FATAL_FAILURE(Init());
1420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1421
unknown088160a2019-05-23 17:43:13 -06001422 char const *fsSource =
1423 "#version 450\n"
1424 "\n"
1425 "layout(set=0, binding=0) uniform isampler2D s;\n"
1426 "layout(location=0) out vec4 color;\n"
1427 "void main() {\n"
1428 " color = texelFetch(s, ivec2(0), 0);\n"
1429 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001430 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001431 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1432
1433 VkPipelineObj pipe(m_device);
1434 pipe.AddShader(&vs);
1435 pipe.AddShader(&fs);
1436 pipe.AddDefaultColorAttachment();
1437
1438 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1439 VkSamplerObj sampler(m_device);
1440
1441 VkDescriptorSetObj descriptorSet(m_device);
1442 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1443 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1444
1445 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1446 ASSERT_VK_SUCCESS(err);
1447
1448 m_commandBuffer->begin();
1449 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1450
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001451 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001452 m_commandBuffer->BindDescriptorSet(descriptorSet);
1453
1454 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001455 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001456 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001457 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001458
1459 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001460 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001461
1462 m_errorMonitor->VerifyFound();
1463
1464 m_commandBuffer->EndRenderPass();
1465 m_commandBuffer->end();
1466}
1467
unknown088160a2019-05-23 17:43:13 -06001468TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1469 TEST_DESCRIPTION(
1470 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001471 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1472 bool maintenance1 = false;
1473 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
1474 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1475 maintenance1 = true;
1476 }
1477 ASSERT_NO_FATAL_FAILURE(InitState());
1478
1479 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1480 VkFormatProperties format_props;
1481 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1482 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1483 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1484 return;
1485 }
unknown088160a2019-05-23 17:43:13 -06001486
1487 // Create two images to copy between
1488 VkImageObj src_image_obj(m_device);
1489 VkImageObj dst_image_obj(m_device);
1490
1491 VkImageCreateInfo image_create_info = {};
1492 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1493 image_create_info.pNext = NULL;
1494 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001495 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001496 image_create_info.extent.width = 32;
1497 image_create_info.extent.height = 32;
1498 image_create_info.extent.depth = 1;
1499 image_create_info.mipLevels = 1;
1500 image_create_info.arrayLayers = 4;
1501 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1502 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1503 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1504 image_create_info.flags = 0;
1505
1506 src_image_obj.init(&image_create_info);
1507 ASSERT_TRUE(src_image_obj.initialized());
1508
1509 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1510 dst_image_obj.init(&image_create_info);
1511 ASSERT_TRUE(dst_image_obj.initialized());
1512
1513 m_commandBuffer->begin();
1514 VkImageCopy copyRegion;
1515 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1516 copyRegion.srcSubresource.mipLevel = 0;
1517 copyRegion.srcSubresource.baseArrayLayer = 0;
1518 copyRegion.srcSubresource.layerCount = 1;
1519 copyRegion.srcOffset.x = 0;
1520 copyRegion.srcOffset.y = 0;
1521 copyRegion.srcOffset.z = 0;
1522 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1523 copyRegion.dstSubresource.mipLevel = 0;
1524 copyRegion.dstSubresource.baseArrayLayer = 0;
1525 // Introduce failure by forcing the dst layerCount to differ from src
1526 copyRegion.dstSubresource.layerCount = 3;
1527 copyRegion.dstOffset.x = 0;
1528 copyRegion.dstOffset.y = 0;
1529 copyRegion.dstOffset.z = 0;
1530 copyRegion.extent.width = 1;
1531 copyRegion.extent.height = 1;
1532 copyRegion.extent.depth = 1;
1533
sfricke-samsung30b094c2020-05-30 11:42:11 -07001534 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1535 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001536 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1537 &copyRegion);
1538 m_errorMonitor->VerifyFound();
1539}
1540
1541TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1542 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1543
Jeff Leger465acf52020-10-12 18:07:16 -04001544 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1545
1546 bool copy_commands2 = false;
1547 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1548 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1549 copy_commands2 = true;
1550 }
1551 ASSERT_NO_FATAL_FAILURE(InitState());
1552
1553 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
Jeff Leger465acf52020-10-12 18:07:16 -04001554 if (copy_commands2) {
1555 vkCmdCopyBufferToImage2Function =
1556 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
Jeff Leger465acf52020-10-12 18:07:16 -04001557 }
unknown088160a2019-05-23 17:43:13 -06001558
1559 VkPhysicalDeviceFeatures device_features = {};
1560 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1561 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1562 if (device_features.textureCompressionBC) {
1563 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1564 } else if (device_features.textureCompressionETC2) {
1565 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1566 } else if (device_features.textureCompressionASTC_LDR) {
1567 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1568 } else {
1569 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1570 return;
1571 }
1572
1573 VkImageCreateInfo ci;
1574 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1575 ci.pNext = NULL;
1576 ci.flags = 0;
1577 ci.imageType = VK_IMAGE_TYPE_2D;
1578 ci.format = compressed_format;
1579 ci.extent = {32, 32, 1};
1580 ci.mipLevels = 6;
1581 ci.arrayLayers = 1;
1582 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1583 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1584 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1585 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1586 ci.queueFamilyIndexCount = 0;
1587 ci.pQueueFamilyIndices = NULL;
1588 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1589
1590 VkImageObj image(m_device);
1591 image.init(&ci);
1592 ASSERT_TRUE(image.initialized());
1593
1594 VkImageObj odd_image(m_device);
1595 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1596 odd_image.init(&ci);
1597 ASSERT_TRUE(odd_image.initialized());
1598
1599 // Allocate buffers
1600 VkMemoryPropertyFlags reqs = 0;
1601 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1602 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1603 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1604 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1605 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1606
1607 VkBufferImageCopy region = {};
1608 region.bufferRowLength = 0;
1609 region.bufferImageHeight = 0;
1610 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1611 region.imageSubresource.layerCount = 1;
1612 region.imageOffset = {0, 0, 0};
1613 region.bufferOffset = 0;
1614
1615 // start recording
1616 m_commandBuffer->begin();
1617
locke-lunargdf00db02020-03-04 19:00:57 -07001618 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001619 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001620 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1621 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001622 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001623 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1624 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001625 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001626 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1627 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1628
unknown088160a2019-05-23 17:43:13 -06001629 // Mip level copies that work - 5 levels
1630 m_errorMonitor->ExpectSuccess();
1631
1632 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1633 region.imageExtent = {32, 32, 1};
1634 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001635 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001636
1637 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1638 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001639 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001640
1641 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1642 region.imageExtent = {8, 8, 1};
1643 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001644 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001645
1646 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1647 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001648 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001649
1650 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1651 region.imageExtent = {4, 4, 1};
1652 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001653 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001654
1655 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1656 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001657 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001658
1659 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1660 region.imageExtent = {2, 2, 1};
1661 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001662
1663 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1664 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001665 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001666
1667 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1668 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001669 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001670
1671 region.imageExtent = {1, 1, 1};
1672 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001673
1674 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1675 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001676 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001677
1678 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1679 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001680 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001681 m_errorMonitor->VerifyNotFound();
1682
1683 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001684 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001685 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001686 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001688 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001689 m_errorMonitor->VerifyFound();
1690
1691 // Copy width < compressed block size, but not the full mip width
1692 region.imageExtent = {1, 2, 1};
1693 region.imageSubresource.mipLevel = 4;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001694 // width not a multiple of compressed block width
1695 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001696 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001697 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001698 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001699 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001700
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001701 m_errorMonitor->SetDesiredFailureMsg(
1702 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00207"); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001703 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001704 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001705 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001706 m_errorMonitor->VerifyFound();
1707
1708 // Copy height < compressed block size but not the full mip height
1709 region.imageExtent = {2, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001710 m_errorMonitor->SetDesiredFailureMsg(
1711 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001713 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001714 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001715 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001716
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001717 m_errorMonitor->SetDesiredFailureMsg(
1718 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001719 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001720 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001721 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001722 m_errorMonitor->VerifyFound();
1723
1724 // Offsets must be multiple of compressed block size
1725 region.imageOffset = {1, 1, 0};
1726 region.imageExtent = {1, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001727 // imageOffset not a multiple of block size
1728 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageOffset-00205");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001729 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001730 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001731 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001732 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001733
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001734 m_errorMonitor->SetDesiredFailureMsg(
1735 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00205"); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001737 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001738 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001739 m_errorMonitor->VerifyFound();
1740
Jeff Leger465acf52020-10-12 18:07:16 -04001741 // Equivalent test using KHR_copy_commands2
1742 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1743 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1744 NULL,
1745 region.bufferOffset,
1746 region.bufferRowLength,
1747 region.bufferImageHeight,
1748 region.imageSubresource,
1749 region.imageOffset,
1750 region.imageExtent};
1751 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1752 NULL,
1753 buffer_16.handle(),
1754 image.handle(),
1755 VK_IMAGE_LAYOUT_GENERAL,
1756 1,
1757 &region2};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001758 m_errorMonitor->SetDesiredFailureMsg(
1759 kErrorBit, "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-00205"); // imageOffset not a multiple of block size
Jeff Leger465acf52020-10-12 18:07:16 -04001760 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1761 "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-01793"); // image transfer granularity
1762 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1763 m_errorMonitor->VerifyFound();
1764 }
1765
unknown088160a2019-05-23 17:43:13 -06001766 // Offset + extent width = mip width - should succeed
1767 region.imageOffset = {4, 4, 0};
1768 region.imageExtent = {3, 4, 1};
1769 region.imageSubresource.mipLevel = 2;
1770 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001771
1772 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1773 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001774 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1775 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001776
1777 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1778 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001779 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1780 &region);
unknown088160a2019-05-23 17:43:13 -06001781 m_errorMonitor->VerifyNotFound();
1782
unknown088160a2019-05-23 17:43:13 -06001783 // Offset + extent width < mip width and not a multiple of block width - should fail
1784 region.imageExtent = {3, 3, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001785 m_errorMonitor->SetDesiredFailureMsg(
1786 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001787 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001788 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001789 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1790 &region);
unknown088160a2019-05-23 17:43:13 -06001791 m_errorMonitor->VerifyFound();
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001792 m_errorMonitor->SetDesiredFailureMsg(
1793 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001794 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001795 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001796 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1797 &region);
unknown088160a2019-05-23 17:43:13 -06001798 m_errorMonitor->VerifyFound();
1799}
1800
1801TEST_F(VkLayerTest, ImageBufferCopyTests) {
1802 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001803
1804 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1805 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1806 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1807 if (mp_extensions) {
1808 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1809 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001810 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
sfricke-samsung6d97e562020-01-07 22:01:00 -08001811 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1812 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1813 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1814 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1815 if (mp_extensions) {
1816 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1817 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1818 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1819 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1820 }
1821 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001822
1823 // Bail if any dimension of transfer granularity is 0.
1824 auto index = m_device->graphics_queue_node_index_;
1825 auto queue_family_properties = m_device->phy().queue_properties();
1826 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1827 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1828 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1829 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1830 return;
1831 }
1832
sfricke-samsung6d97e562020-01-07 22:01:00 -08001833 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1834 // 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 -07001835 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1836 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001837 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001838 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1839 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1840 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1841 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1842 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001843 // compression
1844 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1845 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1846 // multi-planar
1847 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 -06001848
sfricke-samsung6d97e562020-01-07 22:01:00 -08001849 // Verify R8G8B8A8_UINT format is supported for transfer
1850 bool missing_rgba_support = false;
1851 VkFormatProperties props = {0, 0, 0};
1852 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1853 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1854 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1855 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1856
1857 if (!missing_rgba_support) {
1858 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1859 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1860 VK_IMAGE_TILING_OPTIMAL, 0);
1861 ASSERT_TRUE(image_64k.initialized());
1862
1863 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1864 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1865 VK_IMAGE_TILING_OPTIMAL, 0);
1866 ASSERT_TRUE(image_16k.initialized());
1867 }
unknown088160a2019-05-23 17:43:13 -06001868
1869 // Verify all needed Depth/Stencil formats are supported
1870 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001871 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001872 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1873 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1874 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001875 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001876 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1877 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1878 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001879 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001880 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1881 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1882 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001883 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001884 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1885 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1886 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1887
1888 if (!missing_ds_support) {
1889 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1890 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1891 ASSERT_TRUE(image_16k_depth.initialized());
1892
1893 ds_image_4D_1S.Init(
1894 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1895 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1896 VK_IMAGE_TILING_OPTIMAL, 0);
1897 ASSERT_TRUE(ds_image_4D_1S.initialized());
1898
1899 ds_image_3D_1S.Init(
1900 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1901 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1902 VK_IMAGE_TILING_OPTIMAL, 0);
1903 ASSERT_TRUE(ds_image_3D_1S.initialized());
1904
1905 ds_image_2D.Init(
1906 256, 256, 1, VK_FORMAT_D16_UNORM,
1907 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1908 VK_IMAGE_TILING_OPTIMAL, 0);
1909 ASSERT_TRUE(ds_image_2D.initialized());
1910
1911 ds_image_1S.Init(
1912 256, 256, 1, VK_FORMAT_S8_UINT,
1913 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1914 VK_IMAGE_TILING_OPTIMAL, 0);
1915 ASSERT_TRUE(ds_image_1S.initialized());
1916 }
1917
1918 // Allocate buffers
1919 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1920 VkMemoryPropertyFlags reqs = 0;
1921 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1922 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1923 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1924 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1925
1926 VkBufferImageCopy region = {};
1927 region.bufferRowLength = 0;
1928 region.bufferImageHeight = 0;
1929 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1930 region.imageSubresource.layerCount = 1;
1931 region.imageOffset = {0, 0, 0};
1932 region.imageExtent = {64, 64, 1};
1933 region.bufferOffset = 0;
1934
locke-lunargdf00db02020-03-04 19:00:57 -07001935 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001936 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001937 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1938 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001939 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001940 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1941 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001942 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001943 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1944 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1945
sfricke-samsung6d97e562020-01-07 22:01:00 -08001946 if (missing_rgba_support) {
1947 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001948
sfricke-samsung6d97e562020-01-07 22:01:00 -08001949 // start recording for future tests
1950 m_commandBuffer->begin();
1951 } else {
1952 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001953 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001954 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1955 &region);
unknown088160a2019-05-23 17:43:13 -06001956 m_errorMonitor->VerifyFound();
1957
Mark Lobodzinski20310782020-02-28 14:25:17 -07001958 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001959 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1960 &region);
1961 m_errorMonitor->VerifyFound();
1962
1963 // start recording
1964 m_commandBuffer->begin();
1965
1966 // successful copies
1967 m_errorMonitor->ExpectSuccess();
1968 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1969 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001970
1971 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1972 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001973 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1974 &region);
1975 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001976
1977 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1978 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001979 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1980 &region);
1981 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001982
1983 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1984 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001985 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1986 &region);
1987 region.imageOffset.x = 0;
1988 region.imageExtent.height = 64;
1989 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001990
1991 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1992 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001993 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1994 &region);
1995 m_errorMonitor->VerifyNotFound();
1996
1997 // image/buffer too small (extent too large) on copy to image
1998 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001999 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002000 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
2001 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2002 &region);
2003 m_errorMonitor->VerifyFound();
2004
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002005 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002007 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
2008 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2009 &region);
2010 m_errorMonitor->VerifyFound();
2011
2012 // image/buffer too small (offset) on copy to image
2013 region.imageExtent = {64, 64, 1};
2014 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07002015 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002016 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
2017 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2018 &region);
2019 m_errorMonitor->VerifyFound();
2020
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002021 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2022 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002023 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002024 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
2025 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2026 &region);
2027 m_errorMonitor->VerifyFound();
2028
2029 // image/buffer too small on copy to buffer
2030 region.imageExtent = {64, 64, 1};
2031 region.imageOffset = {0, 0, 0};
2032 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002033 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002034 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
2035 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2036 &region);
2037 m_errorMonitor->VerifyFound();
2038
2039 region.imageExtent = {64, 65, 1};
2040 region.bufferOffset = 0;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002041 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002042 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002043 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // image too small
2044 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
2045 &region);
2046 m_errorMonitor->VerifyFound();
2047
2048 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07002049 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002050 region.imageExtent = {64, 64, 1};
2051 region.bufferRowLength = 68;
2052 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2053 &region);
2054 m_errorMonitor->VerifyFound();
2055
2056 // An extent with zero area should produce a warning, but no error
Mark Lobodzinski20310782020-02-28 14:25:17 -07002057 m_errorMonitor->SetDesiredFailureMsg(kWarningBit | kErrorBit, "} has zero area");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002058 region.imageExtent.width = 0;
2059 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2060 &region);
2061 m_errorMonitor->VerifyFound();
2062
2063 // aspect bits
2064 region.imageExtent = {64, 64, 1};
2065 region.bufferRowLength = 0;
2066 region.bufferImageHeight = 0;
2067 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07002068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002069 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
2070 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
2071 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2072 buffer_16k.handle(), 1, &region);
2073 m_errorMonitor->VerifyFound();
2074
Mark Lobodzinski20310782020-02-28 14:25:17 -07002075 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002076 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002077 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2078 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2079 buffer_16k.handle(), 1, &region);
2080 m_errorMonitor->VerifyFound();
2081 }
2082
Mark Lobodzinski20310782020-02-28 14:25:17 -07002083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002084 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002085 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2086 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2087 &region);
2088 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002089 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002090
2091 // Out-of-range mip levels should fail
2092 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002094 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00197");
2095 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00198");
2096 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002097 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002098 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002099 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // unavoidable "region exceeds image bounds" for non-existent mip
2100 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2101 &region);
2102 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002103 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002104 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2105 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
2106 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002107 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002108 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002109 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // unavoidable "region exceeds image bounds" for non-existent mip
2110 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2111 &region);
2112 m_errorMonitor->VerifyFound();
2113 region.imageSubresource.mipLevel = 0;
2114
2115 // Out-of-range array layers should fail
2116 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2117 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002118 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002119 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2120 &region);
2121 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002122 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002123 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2124 &region);
2125 m_errorMonitor->VerifyFound();
2126 region.imageSubresource.baseArrayLayer = 0;
2127
2128 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002129 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002130 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2131 buffer_16k.handle(), 1, &region);
2132 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002134 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2135 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002136 m_errorMonitor->VerifyFound();
2137 }
2138
unknown088160a2019-05-23 17:43:13 -06002139 // Test Depth/Stencil copies
2140 if (missing_ds_support) {
2141 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2142 } else {
2143 VkBufferImageCopy ds_region = {};
2144 ds_region.bufferOffset = 0;
2145 ds_region.bufferRowLength = 0;
2146 ds_region.bufferImageHeight = 0;
2147 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2148 ds_region.imageSubresource.mipLevel = 0;
2149 ds_region.imageSubresource.baseArrayLayer = 0;
2150 ds_region.imageSubresource.layerCount = 1;
2151 ds_region.imageOffset = {0, 0, 0};
2152 ds_region.imageExtent = {256, 256, 1};
2153
2154 // Depth copies that should succeed
2155 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002156 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2157 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002158 m_errorMonitor->VerifyNotFound();
2159
2160 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002161 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2162 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002163 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2164 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002165 m_errorMonitor->VerifyNotFound();
2166
2167 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002168 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2169 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002170 m_errorMonitor->VerifyNotFound();
2171
2172 // Depth copies that should fail
2173 ds_region.bufferOffset = 4;
2174 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002175 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002176 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002177 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2178 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002179 m_errorMonitor->VerifyFound();
2180
2181 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002182 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002183 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002184 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002185 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002186 m_errorMonitor->VerifyFound();
2187
2188 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002189 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002190 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002191 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2192 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002193 m_errorMonitor->VerifyFound();
2194
sfricke-samsung5a019492021-01-25 10:32:08 -08002195 ds_region.bufferOffset = 5;
2196 ds_region.imageExtent = {64, 64, 1}; // need smaller so offset works
2197 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImage-04053");
2198 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2199 buffer_128k.handle(), 1, &ds_region);
2200 m_errorMonitor->VerifyFound();
2201 ds_region.imageExtent = {256, 256, 1};
2202
unknown088160a2019-05-23 17:43:13 -06002203 // Stencil copies that should succeed
2204 ds_region.bufferOffset = 0;
2205 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2206 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002207 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2208 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002209 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2210 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002211 m_errorMonitor->VerifyNotFound();
2212
2213 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002214 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2215 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002216 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2217 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002218 m_errorMonitor->VerifyNotFound();
2219
2220 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002221 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2222 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002223 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2224 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002225 m_errorMonitor->VerifyNotFound();
2226
2227 // Stencil copies that should fail
2228 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002229 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002230 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002231 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2232 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002233 m_errorMonitor->VerifyFound();
2234
2235 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002236 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002237 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2238 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002239 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2240 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002241 m_errorMonitor->VerifyFound();
2242
2243 ds_region.bufferRowLength = 0;
2244 ds_region.bufferOffset = 4;
2245 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002246 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002247 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002248 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2249 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002250 m_errorMonitor->VerifyFound();
2251 }
2252
2253 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002254 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002255 VkPhysicalDeviceFeatures device_features = {};
2256 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2257 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2258 device_features.textureCompressionASTC_LDR)) {
2259 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2260 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002261 // Verify transfer support for each compression format used blow
2262 bool missing_bc_support = false;
2263 bool missing_etc_support = false;
2264 bool missing_astc_support = false;
2265 bool missing_compression_support = false;
2266
2267 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2268 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2269 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2270 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2271
2272 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2273 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2274 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2275 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2276
2277 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2278 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2279 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2280 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2281
2282 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002283 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2284 0);
2285 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2286 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002287 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002288 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2289 VK_IMAGE_TILING_OPTIMAL, 0);
2290 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2291 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002292 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002293 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2294 VK_IMAGE_TILING_OPTIMAL, 0);
2295 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2296 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002297 } else {
2298 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002299 }
unknown088160a2019-05-23 17:43:13 -06002300
sfricke-samsung6d97e562020-01-07 22:01:00 -08002301 if (missing_compression_support) {
2302 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2303 } else {
2304 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002305 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002306 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002307 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2308 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002309 m_errorMonitor->ExpectSuccess();
2310 region.imageExtent = {128, 128, 1};
2311 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2312 buffer_16k.handle(), 1, &region);
2313 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002314
sfricke-samsung6d97e562020-01-07 22:01:00 -08002315 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002316 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002317 region.bufferOffset = 16;
2318 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2319 buffer_16k.handle(), 1, &region);
2320 m_errorMonitor->VerifyFound();
2321 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002322
sfricke-samsung6d97e562020-01-07 22:01:00 -08002323 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002324 m_errorMonitor->SetDesiredFailureMsg(
2325 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002326 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002327 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2328 region.imageExtent.width = 66;
2329 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2330 buffer_16k.handle(), 1, &region);
2331 m_errorMonitor->VerifyFound();
2332 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002333
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002334 m_errorMonitor->SetDesiredFailureMsg(
2335 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002336 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002337 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2338 region.imageExtent.height = 2;
2339 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2340 buffer_16k.handle(), 1, &region);
2341 m_errorMonitor->VerifyFound();
2342 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002343
sfricke-samsung6d97e562020-01-07 22:01:00 -08002344 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002345
sfricke-samsung6d97e562020-01-07 22:01:00 -08002346 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2347 m_errorMonitor->ExpectSuccess();
2348 region.imageExtent.width = 66;
2349 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002350 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2351 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002352 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2353 buffer_16k.handle(), 1, &region);
2354 region.imageExtent.width = 16;
2355 region.imageOffset.x = 0;
2356 region.imageExtent.height = 2;
2357 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002358 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2359 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002360 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2361 buffer_16k.handle(), 1, &region);
2362 m_errorMonitor->VerifyNotFound();
2363 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002364
sfricke-samsung6d97e562020-01-07 22:01:00 -08002365 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002366 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002367 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002368 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002369 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002370 region.imageExtent = {64, 64, 1};
2371 region.bufferOffset = 24;
2372 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2373 buffer_16k.handle(), 1, &region);
2374 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002375
sfricke-samsung6d97e562020-01-07 22:01:00 -08002376 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002377 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002378 region.bufferOffset = 0;
2379 region.bufferRowLength = 130;
2380 region.bufferImageHeight = 0;
2381 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2382 buffer_64k.handle(), 1, &region);
2383 m_errorMonitor->VerifyFound();
2384
2385 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002386 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002387 region.bufferRowLength = 0;
2388 region.bufferImageHeight = 130;
2389 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2390 buffer_64k.handle(), 1, &region);
2391 m_errorMonitor->VerifyFound();
2392 }
2393 }
2394
2395 // Test multi-planar formats, if supported
2396 if (!mp_extensions) {
2397 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2398 } else {
2399 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2400 // being required with samplerYcbcrConversion feature
2401 bool missing_mp_support = false;
2402 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2403 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2404 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2405 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2406
2407 if (missing_mp_support) {
2408 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2409 } else {
2410 VkBufferImageCopy mp_region = {};
2411 mp_region.bufferOffset = 0;
2412 mp_region.bufferRowLength = 0;
2413 mp_region.bufferImageHeight = 0;
2414 mp_region.imageSubresource.mipLevel = 0;
2415 mp_region.imageSubresource.baseArrayLayer = 0;
2416 mp_region.imageSubresource.layerCount = 1;
2417 mp_region.imageOffset = {0, 0, 0};
2418 mp_region.imageExtent = {128, 128, 1};
2419
2420 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2421 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2422 VK_IMAGE_TILING_OPTIMAL, 0);
2423 ASSERT_TRUE(image_multi_planar.initialized());
2424
2425 // Copies into a mutli-planar image aspect properly
2426 m_errorMonitor->ExpectSuccess();
2427 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002428 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2429 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002430 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2431 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2432 m_errorMonitor->VerifyNotFound();
2433
2434 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002435 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002436 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2437 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2438 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2439 m_errorMonitor->VerifyFound();
2440
2441 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002442 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002443 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2444 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2445 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2446 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002447
2448 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002449 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002450 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2451 mp_region.bufferOffset = 5;
2452 mp_region.imageExtent = {8, 8, 1};
2453 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2454 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2455 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002456 }
unknown088160a2019-05-23 17:43:13 -06002457 }
2458}
2459
2460TEST_F(VkLayerTest, MiscImageLayerTests) {
2461 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2462
2463 ASSERT_NO_FATAL_FAILURE(Init());
2464
2465 // TODO: Ideally we should check if a format is supported, before using it.
2466 VkImageObj image(m_device);
2467 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2468 ASSERT_TRUE(image.initialized());
2469 VkBufferObj buffer;
2470 VkMemoryPropertyFlags reqs = 0;
2471 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2472 VkBufferImageCopy region = {};
2473 region.bufferRowLength = 128;
2474 region.bufferImageHeight = 128;
2475 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2476 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2477 region.imageSubresource.layerCount = 1;
2478 region.imageExtent.height = 4;
2479 region.imageExtent.width = 4;
2480 region.imageExtent.depth = 1;
2481
2482 VkImageObj image2(m_device);
2483 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2484 ASSERT_TRUE(image2.initialized());
2485 VkBufferObj buffer2;
2486 VkMemoryPropertyFlags reqs2 = 0;
2487 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002488 m_commandBuffer->begin();
2489
2490 // Image must have offset.z of 0 and extent.depth of 1
2491 // Introduce failure by setting imageExtent.depth to 0
2492 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002493 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002494 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2495 &region);
unknown088160a2019-05-23 17:43:13 -06002496 m_errorMonitor->VerifyFound();
2497
2498 region.imageExtent.depth = 1;
2499
2500 // Image must have offset.z of 0 and extent.depth of 1
2501 // Introduce failure by setting imageOffset.z to 4
2502 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2503 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002504 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2505 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002506 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00172");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002507 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2508 &region);
unknown088160a2019-05-23 17:43:13 -06002509 m_errorMonitor->VerifyFound();
2510
2511 region.imageOffset.z = 0;
2512 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2513 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2514 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002515 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002516 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2517 &region);
unknown088160a2019-05-23 17:43:13 -06002518 m_errorMonitor->VerifyFound();
2519
unknown088160a2019-05-23 17:43:13 -06002520 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2521 region.bufferOffset = 0;
2522 region.imageExtent.height = 128;
2523 region.imageExtent.width = 128;
2524 // Introduce failure by setting bufferRowLength > 0 but less than width
2525 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002526 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002527 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2528 &region);
unknown088160a2019-05-23 17:43:13 -06002529 m_errorMonitor->VerifyFound();
2530
2531 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2532 region.bufferRowLength = 128;
2533 // Introduce failure by setting bufferRowHeight > 0 but less than height
2534 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002535 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002536 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2537 &region);
unknown088160a2019-05-23 17:43:13 -06002538 m_errorMonitor->VerifyFound();
2539
2540 region.bufferImageHeight = 128;
2541 VkImageObj intImage1(m_device);
2542 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2543 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2544 VkImageObj intImage2(m_device);
2545 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2546 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2547 VkImageBlit blitRegion = {};
2548 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2549 blitRegion.srcSubresource.baseArrayLayer = 0;
2550 blitRegion.srcSubresource.layerCount = 1;
2551 blitRegion.srcSubresource.mipLevel = 0;
2552 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2553 blitRegion.dstSubresource.baseArrayLayer = 0;
2554 blitRegion.dstSubresource.layerCount = 1;
2555 blitRegion.dstSubresource.mipLevel = 0;
2556 blitRegion.srcOffsets[0] = {128, 0, 0};
2557 blitRegion.srcOffsets[1] = {128, 128, 1};
2558 blitRegion.dstOffsets[0] = {0, 128, 0};
2559 blitRegion.dstOffsets[1] = {128, 128, 1};
2560
2561 // Look for NULL-blit warning
Mark Lobodzinski20310782020-02-28 14:25:17 -07002562 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].srcOffsets specify a zero-volume area.");
2563 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002564 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2565 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002566 m_errorMonitor->VerifyFound();
2567}
2568
2569TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2570 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002571 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2572
2573 bool copy_commands2 = false;
2574 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2575 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2576 copy_commands2 = true;
2577 }
2578 ASSERT_NO_FATAL_FAILURE(InitState());
2579
2580 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2581 if (copy_commands2) {
2582 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2583 }
unknown088160a2019-05-23 17:43:13 -06002584
sfricke-samsung30b094c2020-05-30 11:42:11 -07002585 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2586 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
2587 printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
2588 return;
2589 }
2590
unknown088160a2019-05-23 17:43:13 -06002591 VkImageCreateInfo ci;
2592 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2593 ci.pNext = NULL;
2594 ci.flags = 0;
2595 ci.imageType = VK_IMAGE_TYPE_1D;
2596 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2597 ci.extent = {32, 1, 1};
2598 ci.mipLevels = 1;
2599 ci.arrayLayers = 1;
2600 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2601 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2602 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2603 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2604 ci.queueFamilyIndexCount = 0;
2605 ci.pQueueFamilyIndices = NULL;
2606 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2607
2608 // Create 1D image
2609 VkImageObj image_1D(m_device);
2610 image_1D.init(&ci);
2611 ASSERT_TRUE(image_1D.initialized());
2612
2613 // 2D image
2614 ci.imageType = VK_IMAGE_TYPE_2D;
2615 ci.extent = {32, 32, 1};
2616 VkImageObj image_2D(m_device);
2617 image_2D.init(&ci);
2618 ASSERT_TRUE(image_2D.initialized());
2619
2620 // 3D image
2621 ci.imageType = VK_IMAGE_TYPE_3D;
2622 ci.extent = {32, 32, 8};
2623 VkImageObj image_3D(m_device);
2624 image_3D.init(&ci);
2625 ASSERT_TRUE(image_3D.initialized());
2626
2627 // 2D image array
2628 ci.imageType = VK_IMAGE_TYPE_2D;
2629 ci.extent = {32, 32, 1};
2630 ci.arrayLayers = 8;
2631 VkImageObj image_2D_array(m_device);
2632 image_2D_array.init(&ci);
2633 ASSERT_TRUE(image_2D_array.initialized());
2634
2635 m_commandBuffer->begin();
2636
2637 VkImageCopy copy_region;
2638 copy_region.extent = {32, 1, 1};
2639 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2640 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2641 copy_region.srcSubresource.mipLevel = 0;
2642 copy_region.dstSubresource.mipLevel = 0;
2643 copy_region.srcSubresource.baseArrayLayer = 0;
2644 copy_region.dstSubresource.baseArrayLayer = 0;
2645 copy_region.srcSubresource.layerCount = 1;
2646 copy_region.dstSubresource.layerCount = 1;
2647 copy_region.srcOffset = {0, 0, 0};
2648 copy_region.dstOffset = {0, 0, 0};
2649
2650 // Sanity check
2651 m_errorMonitor->ExpectSuccess();
2652 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2653 &copy_region);
2654 m_errorMonitor->VerifyNotFound();
2655
Jeff Leger465acf52020-10-12 18:07:16 -04002656 // Equivalent sanity check using KHR_copy_commands2
2657 if (copy_commands2 && vkCmdCopyImage2Function) {
2658 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2659 NULL,
2660 copy_region.srcSubresource,
2661 copy_region.srcOffset,
2662 copy_region.dstSubresource,
2663 copy_region.dstOffset,
2664 copy_region.extent};
2665 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2666 NULL,
2667 image_1D.image(),
2668 VK_IMAGE_LAYOUT_GENERAL,
2669 image_2D.image(),
2670 VK_IMAGE_LAYOUT_GENERAL,
2671 1,
2672 &region2};
2673 m_errorMonitor->ExpectSuccess();
2674 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2675 m_errorMonitor->VerifyNotFound();
2676 }
2677
unknown088160a2019-05-23 17:43:13 -06002678 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2679 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002682 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2683 &copy_region);
2684 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002685
2686 // Equivalent test using KHR_copy_commands2
2687 if (copy_commands2 && vkCmdCopyImage2Function) {
2688 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2689 NULL,
2690 copy_region.srcSubresource,
2691 copy_region.srcOffset,
2692 copy_region.dstSubresource,
2693 copy_region.dstOffset,
2694 copy_region.extent};
2695 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2696 NULL,
2697 image_1D.image(),
2698 VK_IMAGE_LAYOUT_GENERAL,
2699 image_2D.image(),
2700 VK_IMAGE_LAYOUT_GENERAL,
2701 1,
2702 &region2};
2703 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2704 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2705 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2706 m_errorMonitor->VerifyFound();
2707 }
2708
unknown088160a2019-05-23 17:43:13 -06002709 copy_region.srcOffset.y = 0;
2710 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002713 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2714 &copy_region);
2715 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002716
2717 // Equivalent test using KHR_copy_commands2
2718 if (copy_commands2 && vkCmdCopyImage2Function) {
2719 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2720 NULL,
2721 copy_region.srcSubresource,
2722 copy_region.srcOffset,
2723 copy_region.dstSubresource,
2724 copy_region.dstOffset,
2725 copy_region.extent};
2726 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2727 NULL,
2728 image_2D.image(),
2729 VK_IMAGE_LAYOUT_GENERAL,
2730 image_1D.image(),
2731 VK_IMAGE_LAYOUT_GENERAL,
2732 1,
2733 &region2};
2734 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2736 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2737 m_errorMonitor->VerifyFound();
2738 }
2739
unknown088160a2019-05-23 17:43:13 -06002740 copy_region.dstOffset.y = 0;
2741
2742 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2743 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002744 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002746 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2747 &copy_region);
2748 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002749
2750 // Equivalent test using KHR_copy_commands2
2751 if (copy_commands2 && vkCmdCopyImage2Function) {
2752 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2753 NULL,
2754 copy_region.srcSubresource,
2755 copy_region.srcOffset,
2756 copy_region.dstSubresource,
2757 copy_region.dstOffset,
2758 copy_region.extent};
2759 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2760 NULL,
2761 image_1D.image(),
2762 VK_IMAGE_LAYOUT_GENERAL,
2763 image_2D.image(),
2764 VK_IMAGE_LAYOUT_GENERAL,
2765 1,
2766 &region2};
2767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2769 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2770 m_errorMonitor->VerifyFound();
2771 }
2772
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002773 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2774 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002775 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2776 &copy_region);
2777 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002778
2779 // Equivalent test using KHR_copy_commands2
2780 if (copy_commands2 && vkCmdCopyImage2Function) {
2781 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2782 NULL,
2783 copy_region.srcSubresource,
2784 copy_region.srcOffset,
2785 copy_region.dstSubresource,
2786 copy_region.dstOffset,
2787 copy_region.extent};
2788 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2789 NULL,
2790 image_2D.image(),
2791 VK_IMAGE_LAYOUT_GENERAL,
2792 image_1D.image(),
2793 VK_IMAGE_LAYOUT_GENERAL,
2794 1,
2795 &region2};
2796 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2797 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2798 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2799 m_errorMonitor->VerifyFound();
2800 }
2801
unknown088160a2019-05-23 17:43:13 -06002802 copy_region.extent.height = 1;
2803
2804 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2805 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002806 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2807 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002808 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2809 &copy_region);
2810 m_errorMonitor->VerifyFound();
2811 copy_region.srcOffset.z = 0;
2812 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002813 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2814 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002815 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2816 &copy_region);
2817 m_errorMonitor->VerifyFound();
2818 copy_region.dstOffset.z = 0;
2819
2820 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2821 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002822 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002823 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002824 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002825 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002826 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002827 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002828 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002829 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2830 &copy_region);
2831 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002832 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002834 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002835 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002836 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002837 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002838 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002839 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2840 &copy_region);
2841 m_errorMonitor->VerifyFound();
2842 copy_region.extent.depth = 1;
2843
2844 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2845 copy_region.extent = {16, 16, 1};
2846 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002847 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002848 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002849 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002850 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2851 &copy_region);
2852 m_errorMonitor->VerifyFound();
2853 copy_region.srcOffset.z = 0;
2854 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002855 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002856 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002857 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002858 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2859 &copy_region);
2860 m_errorMonitor->VerifyFound();
2861 copy_region.dstOffset.z = 0;
2862
2863 // 3D texture accessing an array layer other than 0. VU 09c0011a
2864 copy_region.extent = {4, 4, 1};
2865 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002866 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002867 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002868 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2869 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2870 &copy_region);
2871 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002872 copy_region.srcSubresource.baseArrayLayer = 0;
2873
unknown088160a2019-05-23 17:43:13 -06002874 m_commandBuffer->end();
2875}
2876
2877TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2878 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002879 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06002880 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
2881 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2882 } else {
2883 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2884 return;
2885 }
2886 ASSERT_NO_FATAL_FAILURE(InitState());
2887
2888 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2889 VkFormatProperties format_props;
2890 // TODO: Remove this check if or when devsim handles extensions.
2891 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2892 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002893 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002894 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2895 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2896 return;
2897 }
2898
2899 VkImageCreateInfo ci;
2900 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2901 ci.pNext = NULL;
2902 ci.flags = 0;
2903 ci.imageType = VK_IMAGE_TYPE_1D;
2904 ci.format = image_format;
2905 ci.extent = {32, 1, 1};
2906 ci.mipLevels = 1;
2907 ci.arrayLayers = 1;
2908 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2909 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2910 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2911 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2912 ci.queueFamilyIndexCount = 0;
2913 ci.pQueueFamilyIndices = NULL;
2914 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2915
2916 // Create 1D image
2917 VkImageObj image_1D(m_device);
2918 image_1D.init(&ci);
2919 ASSERT_TRUE(image_1D.initialized());
2920
2921 // 2D image
2922 ci.imageType = VK_IMAGE_TYPE_2D;
2923 ci.extent = {32, 32, 1};
2924 VkImageObj image_2D(m_device);
2925 image_2D.init(&ci);
2926 ASSERT_TRUE(image_2D.initialized());
2927
2928 // 3D image
2929 ci.imageType = VK_IMAGE_TYPE_3D;
2930 ci.extent = {32, 32, 8};
2931 VkImageObj image_3D(m_device);
2932 image_3D.init(&ci);
2933 ASSERT_TRUE(image_3D.initialized());
2934
2935 // 2D image array
2936 ci.imageType = VK_IMAGE_TYPE_2D;
2937 ci.extent = {32, 32, 1};
2938 ci.arrayLayers = 8;
2939 VkImageObj image_2D_array(m_device);
2940 image_2D_array.init(&ci);
2941 ASSERT_TRUE(image_2D_array.initialized());
2942
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002943 // second 2D image array
2944 ci.imageType = VK_IMAGE_TYPE_2D;
2945 ci.extent = {32, 32, 1};
2946 ci.arrayLayers = 8;
2947 VkImageObj image_2D_array_2(m_device);
2948 image_2D_array_2.init(&ci);
2949 ASSERT_TRUE(image_2D_array_2.initialized());
2950
unknown088160a2019-05-23 17:43:13 -06002951 m_commandBuffer->begin();
2952
2953 VkImageCopy copy_region;
2954 copy_region.extent = {32, 1, 1};
2955 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2956 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2957 copy_region.srcSubresource.mipLevel = 0;
2958 copy_region.dstSubresource.mipLevel = 0;
2959 copy_region.srcSubresource.baseArrayLayer = 0;
2960 copy_region.dstSubresource.baseArrayLayer = 0;
2961 copy_region.srcSubresource.layerCount = 1;
2962 copy_region.dstSubresource.layerCount = 1;
2963 copy_region.srcOffset = {0, 0, 0};
2964 copy_region.dstOffset = {0, 0, 0};
2965
2966 // Copy from layer not present
2967 copy_region.srcSubresource.baseArrayLayer = 4;
2968 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002969 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002970 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2971 &copy_region);
2972 m_errorMonitor->VerifyFound();
2973 copy_region.srcSubresource.baseArrayLayer = 0;
2974 copy_region.srcSubresource.layerCount = 1;
2975
2976 // Copy to layer not present
2977 copy_region.dstSubresource.baseArrayLayer = 1;
2978 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002979 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002980 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2981 &copy_region);
2982 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002983 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002984 copy_region.dstSubresource.layerCount = 1;
2985
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002986 // both 2D and extent.depth not 1
2987 // Need two 2D array images to prevent other errors
2988 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002989 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002990 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2991 1, &copy_region);
2992 m_errorMonitor->VerifyFound();
2993 copy_region.extent = {32, 1, 1};
2994
2995 // 2D src / 3D dst and depth not equal to src layerCount
2996 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002997 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002998 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002999 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3000 &copy_region);
3001 m_errorMonitor->VerifyFound();
3002 copy_region.extent = {32, 1, 1};
3003
3004 // 3D src / 2D dst and depth not equal to dst layerCount
3005 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003007 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08003008 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3009 &copy_region);
3010 m_errorMonitor->VerifyFound();
3011 copy_region.extent = {32, 1, 1};
3012
unknown088160a2019-05-23 17:43:13 -06003013 m_commandBuffer->end();
3014}
3015
3016TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
3017 // Image copy tests on compressed images with block alignment errors
3018 SetTargetApiVersion(VK_API_VERSION_1_1);
3019 ASSERT_NO_FATAL_FAILURE(Init());
3020
3021 // Select a compressed format and verify support
3022 VkPhysicalDeviceFeatures device_features = {};
3023 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
3024 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
3025 if (device_features.textureCompressionBC) {
3026 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
3027 } else if (device_features.textureCompressionETC2) {
3028 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
3029 } else if (device_features.textureCompressionASTC_LDR) {
3030 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
3031 }
3032
3033 VkImageCreateInfo ci;
3034 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3035 ci.pNext = NULL;
3036 ci.flags = 0;
3037 ci.imageType = VK_IMAGE_TYPE_2D;
3038 ci.format = compressed_format;
3039 ci.extent = {64, 64, 1};
3040 ci.mipLevels = 1;
3041 ci.arrayLayers = 1;
3042 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3043 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3044 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3045 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3046 ci.queueFamilyIndexCount = 0;
3047 ci.pQueueFamilyIndices = NULL;
3048 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3049
3050 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003051 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
3052 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06003053 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
3054 return;
3055 }
3056
3057 // Create images
3058 VkImageObj image_1(m_device);
3059 image_1.init(&ci);
3060 ASSERT_TRUE(image_1.initialized());
3061
3062 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
3063 VkImageObj image_2(m_device);
3064 image_2.init(&ci);
3065 ASSERT_TRUE(image_2.initialized());
3066
3067 m_commandBuffer->begin();
3068
3069 VkImageCopy copy_region;
3070 copy_region.extent = {48, 48, 1};
3071 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3072 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3073 copy_region.srcSubresource.mipLevel = 0;
3074 copy_region.dstSubresource.mipLevel = 0;
3075 copy_region.srcSubresource.baseArrayLayer = 0;
3076 copy_region.dstSubresource.baseArrayLayer = 0;
3077 copy_region.srcSubresource.layerCount = 1;
3078 copy_region.dstSubresource.layerCount = 1;
3079 copy_region.srcOffset = {0, 0, 0};
3080 copy_region.dstOffset = {0, 0, 0};
3081
3082 // Sanity check
3083 m_errorMonitor->ExpectSuccess();
3084 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3085 m_errorMonitor->VerifyNotFound();
3086
3087 std::string vuid;
3088 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3089 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3090
3091 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3092 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003093 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003094 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003095 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3096 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003097 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3098 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3099 m_errorMonitor->VerifyFound();
3100 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003101 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3102 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003103 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3104 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3105 m_errorMonitor->VerifyFound();
3106 copy_region.srcOffset = {0, 0, 0};
3107
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003108 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003109 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003110 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3111 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003112 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3113 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3114 m_errorMonitor->VerifyFound();
3115 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003116 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3117 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003118 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3119 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3120 m_errorMonitor->VerifyFound();
3121 copy_region.dstOffset = {0, 0, 0};
3122
3123 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003124 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003125 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003126 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3127 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003128 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3129 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3130 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003131 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003132 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3134 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003135 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3136 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3137 m_errorMonitor->VerifyFound();
3138
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003139 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003140 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003141 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3142 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003143 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3144 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3145 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003146 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003147 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003148 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3149 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003150 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3151 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3152 m_errorMonitor->VerifyFound();
3153
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003154 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3155 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003156 // There are currently no supported compressed formats with a block depth other than 1,
3157 // so impossible to create a 'not a multiple' condition for depth.
3158 m_commandBuffer->end();
3159}
3160
3161TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3162 // Image copy tests on single-plane _422 formats with block alignment errors
3163
3164 // Enable KHR multiplane req'd extensions
3165 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3166 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3167 if (mp_extensions) {
3168 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3169 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003170 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003171 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3172 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3173 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3174 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3175 if (mp_extensions) {
3176 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3177 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3178 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3179 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3180 } else {
3181 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3182 return;
3183 }
3184 ASSERT_NO_FATAL_FAILURE(InitState());
3185
3186 // Select a _422 format and verify support
3187 VkImageCreateInfo ci = {};
3188 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3189 ci.pNext = NULL;
3190 ci.flags = 0;
3191 ci.imageType = VK_IMAGE_TYPE_2D;
3192 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3193 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3194 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3195 ci.mipLevels = 1;
3196 ci.arrayLayers = 1;
3197 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3198 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3199 ci.queueFamilyIndexCount = 0;
3200 ci.pQueueFamilyIndices = NULL;
3201 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3202
3203 // Verify formats
3204 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3205 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3206 if (!supported) {
3207 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3208 return; // Assume there's low ROI on searching for different mp formats
3209 }
3210
3211 // Create images
3212 ci.extent = {64, 64, 1};
3213 VkImageObj image_422(m_device);
3214 image_422.init(&ci);
3215 ASSERT_TRUE(image_422.initialized());
3216
3217 ci.extent = {64, 64, 1};
3218 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3219 VkImageObj image_ucmp(m_device);
3220 image_ucmp.init(&ci);
3221 ASSERT_TRUE(image_ucmp.initialized());
3222
3223 m_commandBuffer->begin();
3224
3225 VkImageCopy copy_region;
3226 copy_region.extent = {48, 48, 1};
3227 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3228 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3229 copy_region.srcSubresource.mipLevel = 0;
3230 copy_region.dstSubresource.mipLevel = 0;
3231 copy_region.srcSubresource.baseArrayLayer = 0;
3232 copy_region.dstSubresource.baseArrayLayer = 0;
3233 copy_region.srcSubresource.layerCount = 1;
3234 copy_region.dstSubresource.layerCount = 1;
3235 copy_region.srcOffset = {0, 0, 0};
3236 copy_region.dstOffset = {0, 0, 0};
3237
3238 // Src offsets must be multiples of compressed block sizes
3239 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003240 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003241 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003242 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3243 &copy_region);
3244 m_errorMonitor->VerifyFound();
3245 copy_region.srcOffset = {0, 0, 0};
3246
3247 // Dst offsets must be multiples of compressed block sizes
3248 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003249 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003250 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003251 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003252 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3253 &copy_region);
3254 m_errorMonitor->VerifyFound();
3255 copy_region.dstOffset = {0, 0, 0};
3256
3257 // Copy extent must be multiples of compressed block sizes if not full width/height
3258 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003259 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003260 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003261 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3262 &copy_region);
3263 m_errorMonitor->VerifyFound();
3264
unknown357e1782019-09-25 17:57:40 -06003265 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003266 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3267 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003268 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003269 copy_region.dstOffset = {0, 0, 0};
3270
3271 m_commandBuffer->end();
3272}
3273
3274TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3275 // Image copy tests on multiplane images with aspect errors
3276
3277 // Enable KHR multiplane req'd extensions
3278 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3279 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3280 if (mp_extensions) {
3281 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3282 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003283 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003284 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3285 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3286 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3287 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3288 if (mp_extensions) {
3289 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3290 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3291 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3292 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3293 } else {
3294 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3295 return;
3296 }
3297 ASSERT_NO_FATAL_FAILURE(InitState());
3298
3299 // Select multi-plane formats and verify support
3300 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3301 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3302
3303 VkImageCreateInfo ci = {};
3304 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3305 ci.pNext = NULL;
3306 ci.flags = 0;
3307 ci.imageType = VK_IMAGE_TYPE_2D;
3308 ci.format = mp2_format;
3309 ci.extent = {256, 256, 1};
3310 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3311 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3312 ci.mipLevels = 1;
3313 ci.arrayLayers = 1;
3314 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3315 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3316 ci.queueFamilyIndexCount = 0;
3317 ci.pQueueFamilyIndices = NULL;
3318 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3319
3320 // Verify formats
3321 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3322 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3323 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3324 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3325 ci.format = mp3_format;
3326 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3327 if (!supported) {
3328 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3329 kSkipPrefix);
3330 return; // Assume there's low ROI on searching for different mp formats
3331 }
3332
3333 // Create images
3334 VkImageObj mp3_image(m_device);
3335 mp3_image.init(&ci);
3336 ASSERT_TRUE(mp3_image.initialized());
3337
3338 ci.format = mp2_format;
3339 VkImageObj mp2_image(m_device);
3340 mp2_image.init(&ci);
3341 ASSERT_TRUE(mp2_image.initialized());
3342
3343 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3344 VkImageObj sp_image(m_device);
3345 sp_image.init(&ci);
3346 ASSERT_TRUE(sp_image.initialized());
3347
3348 m_commandBuffer->begin();
3349
3350 VkImageCopy copy_region;
3351 copy_region.extent = {128, 128, 1};
3352 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3353 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3354 copy_region.srcSubresource.mipLevel = 0;
3355 copy_region.dstSubresource.mipLevel = 0;
3356 copy_region.srcSubresource.baseArrayLayer = 0;
3357 copy_region.dstSubresource.baseArrayLayer = 0;
3358 copy_region.srcSubresource.layerCount = 1;
3359 copy_region.dstSubresource.layerCount = 1;
3360 copy_region.srcOffset = {0, 0, 0};
3361 copy_region.dstOffset = {0, 0, 0};
3362
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003363 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003364 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3365 &copy_region);
3366 m_errorMonitor->VerifyFound();
3367
unknown088160a2019-05-23 17:43:13 -06003368 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3369 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003370 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003371 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3372 &copy_region);
3373 m_errorMonitor->VerifyFound();
3374
3375 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3376 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003377 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003378 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3379 &copy_region);
3380 m_errorMonitor->VerifyFound();
3381
3382 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003383 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003384 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3385 &copy_region);
3386 m_errorMonitor->VerifyFound();
3387
3388 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003389 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003390 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003391 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3392 &copy_region);
3393 m_errorMonitor->VerifyFound();
3394
3395 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3396 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003397 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003398 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003399 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3400 &copy_region);
3401 m_errorMonitor->VerifyFound();
3402
3403 m_commandBuffer->end();
3404}
3405
3406TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3407 // Image copy with source region specified greater than src image size
3408 ASSERT_NO_FATAL_FAILURE(Init());
3409
3410 // Create images with full mip chain
3411 VkImageCreateInfo ci;
3412 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3413 ci.pNext = NULL;
3414 ci.flags = 0;
3415 ci.imageType = VK_IMAGE_TYPE_3D;
3416 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3417 ci.extent = {32, 32, 8};
3418 ci.mipLevels = 6;
3419 ci.arrayLayers = 1;
3420 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3421 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3422 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3423 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3424 ci.queueFamilyIndexCount = 0;
3425 ci.pQueueFamilyIndices = NULL;
3426 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3427
3428 VkImageObj src_image(m_device);
3429 src_image.init(&ci);
3430 ASSERT_TRUE(src_image.initialized());
3431
3432 // Dest image with one more mip level
3433 ci.extent = {64, 64, 16};
3434 ci.mipLevels = 7;
3435 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3436 VkImageObj dst_image(m_device);
3437 dst_image.init(&ci);
3438 ASSERT_TRUE(dst_image.initialized());
3439
3440 m_commandBuffer->begin();
3441
3442 VkImageCopy copy_region;
3443 copy_region.extent = {32, 32, 8};
3444 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3445 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3446 copy_region.srcSubresource.mipLevel = 0;
3447 copy_region.dstSubresource.mipLevel = 0;
3448 copy_region.srcSubresource.baseArrayLayer = 0;
3449 copy_region.dstSubresource.baseArrayLayer = 0;
3450 copy_region.srcSubresource.layerCount = 1;
3451 copy_region.dstSubresource.layerCount = 1;
3452 copy_region.srcOffset = {0, 0, 0};
3453 copy_region.dstOffset = {0, 0, 0};
3454
3455 m_errorMonitor->ExpectSuccess();
3456 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3457 &copy_region);
3458 m_errorMonitor->VerifyNotFound();
3459
3460 // Source exceeded in x-dim, VU 01202
3461 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003462 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003463 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3464 &copy_region);
3465 m_errorMonitor->VerifyFound();
3466
3467 // Source exceeded in y-dim, VU 01203
3468 copy_region.srcOffset.x = 0;
3469 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003470 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003471 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3472 &copy_region);
3473 m_errorMonitor->VerifyFound();
3474
3475 // Source exceeded in z-dim, VU 01204
3476 copy_region.extent = {4, 4, 4};
3477 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003478 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003479 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3480 &copy_region);
3481 m_errorMonitor->VerifyFound();
3482
3483 m_commandBuffer->end();
3484}
3485
3486TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3487 // Image copy with dest region specified greater than dest image size
3488 ASSERT_NO_FATAL_FAILURE(Init());
3489
3490 // Create images with full mip chain
3491 VkImageCreateInfo ci;
3492 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3493 ci.pNext = NULL;
3494 ci.flags = 0;
3495 ci.imageType = VK_IMAGE_TYPE_3D;
3496 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3497 ci.extent = {32, 32, 8};
3498 ci.mipLevels = 6;
3499 ci.arrayLayers = 1;
3500 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3501 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3502 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3503 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3504 ci.queueFamilyIndexCount = 0;
3505 ci.pQueueFamilyIndices = NULL;
3506 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3507
3508 VkImageObj dst_image(m_device);
3509 dst_image.init(&ci);
3510 ASSERT_TRUE(dst_image.initialized());
3511
3512 // Src image with one more mip level
3513 ci.extent = {64, 64, 16};
3514 ci.mipLevels = 7;
3515 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3516 VkImageObj src_image(m_device);
3517 src_image.init(&ci);
3518 ASSERT_TRUE(src_image.initialized());
3519
3520 m_commandBuffer->begin();
3521
3522 VkImageCopy copy_region;
3523 copy_region.extent = {32, 32, 8};
3524 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3525 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3526 copy_region.srcSubresource.mipLevel = 0;
3527 copy_region.dstSubresource.mipLevel = 0;
3528 copy_region.srcSubresource.baseArrayLayer = 0;
3529 copy_region.dstSubresource.baseArrayLayer = 0;
3530 copy_region.srcSubresource.layerCount = 1;
3531 copy_region.dstSubresource.layerCount = 1;
3532 copy_region.srcOffset = {0, 0, 0};
3533 copy_region.dstOffset = {0, 0, 0};
3534
3535 m_errorMonitor->ExpectSuccess();
3536 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3537 &copy_region);
3538 m_errorMonitor->VerifyNotFound();
3539
3540 // Dest exceeded in x-dim, VU 01205
3541 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003542 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003543 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3544 &copy_region);
3545 m_errorMonitor->VerifyFound();
3546
3547 // Dest exceeded in y-dim, VU 01206
3548 copy_region.dstOffset.x = 0;
3549 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003550 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003551 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3552 &copy_region);
3553 m_errorMonitor->VerifyFound();
3554
3555 // Dest exceeded in z-dim, VU 01207
3556 copy_region.extent = {4, 4, 4};
3557 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003558 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003559 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3560 &copy_region);
3561 m_errorMonitor->VerifyFound();
3562
3563 m_commandBuffer->end();
3564}
3565
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003566TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3567 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3568
3569 // Enable KHR multiplane req'd extensions
3570 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3571 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3572 if (mp_extensions == true) {
3573 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3574 }
3575 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3576 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3577 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3578 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3579 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3580 if (mp_extensions == true) {
3581 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3582 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3583 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3584 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3585 } else {
3586 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3587 return;
3588 }
3589 ASSERT_NO_FATAL_FAILURE(InitState());
3590
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003591 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3592 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003593 VkFormatProperties props = {0, 0, 0};
3594 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003595 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003596 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3597 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3598 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3599
3600 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003601 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003602 return;
3603 }
3604
3605 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3606 VkImageObj src_image(m_device);
3607 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003608 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 -08003609 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003610 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 -08003611 ASSERT_TRUE(dst_image.initialized());
3612
3613 VkImageCopy copy_region = {};
3614 copy_region.extent = {64, 64, 1}; // Size of plane 1
3615 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3616 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3617 copy_region.srcSubresource.mipLevel = 0;
3618 copy_region.dstSubresource.mipLevel = 0;
3619 copy_region.srcSubresource.baseArrayLayer = 0;
3620 copy_region.dstSubresource.baseArrayLayer = 0;
3621 copy_region.srcSubresource.layerCount = 1;
3622 copy_region.dstSubresource.layerCount = 1;
3623 copy_region.srcOffset = {0, 0, 0};
3624 copy_region.dstOffset = {0, 0, 0};
3625 VkImageCopy original_region = copy_region;
3626
3627 m_commandBuffer->begin();
3628
3629 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3630 m_errorMonitor->ExpectSuccess();
3631 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3632 &copy_region);
3633 m_errorMonitor->VerifyNotFound();
3634
3635 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3636 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3637 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3638 m_errorMonitor->ExpectSuccess();
3639 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3640 &copy_region);
3641 m_errorMonitor->VerifyNotFound();
3642
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003643 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003644 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3645 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3646
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003647 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3648 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3649 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3650 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003651 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3652 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003653 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3654 &copy_region);
3655 m_errorMonitor->VerifyNotFound();
3656
3657 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3658 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3659 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3660 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003661 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3662 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003663 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3664 &copy_region);
3665 m_errorMonitor->VerifyNotFound();
3666
3667 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3668 copy_region.extent = {128, 64, 1};
3669 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3670 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3671 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003672 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3673 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003674 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3675 &copy_region);
3676 m_errorMonitor->VerifyNotFound();
3677
3678 // 128x64 copy from plane 0 -> Plane 1
3679 copy_region.extent = {128, 64, 1};
3680 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3681 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003682 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003683 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3684 &copy_region);
3685 m_errorMonitor->VerifyFound();
3686
3687 // 128x64 copy from plane 1 -> Plane 0
3688 copy_region.extent = {128, 64, 1};
3689 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3690 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003691 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003692 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3693 &copy_region);
3694 m_errorMonitor->VerifyFound();
3695
3696 // src exceeded in y-dim from offset
3697 copy_region = original_region;
3698 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003699 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003700 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3701 &copy_region);
3702 m_errorMonitor->VerifyFound();
3703
3704 // dst exceeded in y-dim from offset
3705 copy_region = original_region;
3706 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003707 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003708 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3709 &copy_region);
3710 m_errorMonitor->VerifyFound();
3711
3712 m_commandBuffer->end();
3713}
3714
unknown088160a2019-05-23 17:43:13 -06003715TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003716 if (!EnableDeviceProfileLayer()) {
3717 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3718 return;
3719 }
unknown088160a2019-05-23 17:43:13 -06003720
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003721 // Enable KHR multiplane req'd extensions
3722 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3723 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3724 if (mp_extensions == true) {
3725 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3726 }
3727 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3728 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3729 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3730 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3731 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3732 if (mp_extensions == true) {
3733 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3734 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3735 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3736 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3737 }
3738 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003739
sfricke-samsung51067b22020-04-30 21:41:17 -07003740 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3741 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003742
sfricke-samsung51067b22020-04-30 21:41:17 -07003743 // Load required functions
3744 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3745 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3746 return;
3747 }
3748
3749 // Set transfer for all potential used formats
3750 VkFormatProperties format_props;
3751 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3752 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3753 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3754
3755 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3756 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3757 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003758
3759 VkImageCreateInfo image_create_info = {};
3760 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3761 image_create_info.pNext = NULL;
3762 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003763 image_create_info.extent.width = 32;
3764 image_create_info.extent.height = 32;
3765 image_create_info.extent.depth = 1;
3766 image_create_info.mipLevels = 1;
3767 image_create_info.arrayLayers = 1;
3768 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003769 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3770 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003771 image_create_info.flags = 0;
3772
sfricke-samsung51067b22020-04-30 21:41:17 -07003773 image_create_info.format = VK_FORMAT_R8_UNORM;
3774 VkImageObj image_8b_unorm(m_device);
3775 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003776
sfricke-samsung51067b22020-04-30 21:41:17 -07003777 image_create_info.format = VK_FORMAT_R8_UINT;
3778 VkImageObj image_8b_uint(m_device);
3779 image_8b_uint.init(&image_create_info);
3780
3781 // First try to test two single plane mismatch
3782 {
3783 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3784 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3785 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3786
3787 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3788 VkImageObj image_32b_unorm(m_device);
3789 image_32b_unorm.init(&image_create_info);
3790
3791 m_commandBuffer->begin();
3792 VkImageCopy copyRegion;
3793 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3794 copyRegion.srcSubresource.mipLevel = 0;
3795 copyRegion.srcSubresource.baseArrayLayer = 0;
3796 copyRegion.srcSubresource.layerCount = 1;
3797 copyRegion.srcOffset.x = 0;
3798 copyRegion.srcOffset.y = 0;
3799 copyRegion.srcOffset.z = 0;
3800 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3801 copyRegion.dstSubresource.mipLevel = 0;
3802 copyRegion.dstSubresource.baseArrayLayer = 0;
3803 copyRegion.dstSubresource.layerCount = 1;
3804 copyRegion.dstOffset.x = 0;
3805 copyRegion.dstOffset.y = 0;
3806 copyRegion.dstOffset.z = 0;
3807 copyRegion.extent.width = 1;
3808 copyRegion.extent.height = 1;
3809 copyRegion.extent.depth = 1;
3810
3811 // Sanity check between two 8bit formats
3812 m_errorMonitor->ExpectSuccess();
3813 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3814 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3815 m_errorMonitor->VerifyNotFound();
3816
3817 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3819 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3820 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3821 m_errorMonitor->VerifyFound();
3822
3823 // Swap src and dst
3824 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3825 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3826 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3827 m_errorMonitor->VerifyFound();
3828
3829 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003830 }
3831
sfricke-samsung51067b22020-04-30 21:41:17 -07003832 // DstImage is a mismatched plane of a multi-planar format
3833 if (mp_extensions == false) {
3834 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3835 } else {
3836 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3837 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3838 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003839
sfricke-samsung51067b22020-04-30 21:41:17 -07003840 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3841 VkImageObj image_8b_16b_420_unorm(m_device);
3842 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003843
sfricke-samsung51067b22020-04-30 21:41:17 -07003844 m_commandBuffer->begin();
3845 VkImageCopy copyRegion;
3846 copyRegion.srcSubresource.mipLevel = 0;
3847 copyRegion.srcSubresource.baseArrayLayer = 0;
3848 copyRegion.srcSubresource.layerCount = 1;
3849 copyRegion.srcOffset.x = 0;
3850 copyRegion.srcOffset.y = 0;
3851 copyRegion.srcOffset.z = 0;
3852 copyRegion.dstSubresource.mipLevel = 0;
3853 copyRegion.dstSubresource.baseArrayLayer = 0;
3854 copyRegion.dstSubresource.layerCount = 1;
3855 copyRegion.dstOffset.x = 0;
3856 copyRegion.dstOffset.y = 0;
3857 copyRegion.dstOffset.z = 0;
3858 copyRegion.extent.width = 1;
3859 copyRegion.extent.height = 1;
3860 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003861
sfricke-samsung51067b22020-04-30 21:41:17 -07003862 // First test single-plane -> multi-plan
3863 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3864 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003865
sfricke-samsung51067b22020-04-30 21:41:17 -07003866 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3867 m_errorMonitor->ExpectSuccess();
3868 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3869 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3870 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003871
locke-lunargdf00db02020-03-04 19:00:57 -07003872 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3873 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3874
sfricke-samsung51067b22020-04-30 21:41:17 -07003875 // Make sure no false postiives if Compatible format
3876 m_errorMonitor->ExpectSuccess();
3877 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3878 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3879 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003880
sfricke-samsung51067b22020-04-30 21:41:17 -07003881 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3882 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3883 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3884 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3885 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3886 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003887
sfricke-samsung51067b22020-04-30 21:41:17 -07003888 // Same tests but swap src and dst
3889 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3890 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003891
locke-lunargdf00db02020-03-04 19:00:57 -07003892 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3893 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3894 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3895 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3896
sfricke-samsung51067b22020-04-30 21:41:17 -07003897 m_errorMonitor->ExpectSuccess();
3898 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3899 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3900 m_errorMonitor->VerifyNotFound();
3901
locke-lunargdf00db02020-03-04 19:00:57 -07003902 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3903 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3904
sfricke-samsung51067b22020-04-30 21:41:17 -07003905 m_errorMonitor->ExpectSuccess();
3906 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3907 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3908 m_errorMonitor->VerifyNotFound();
3909
3910 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3911 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3912 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3913 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3914 m_errorMonitor->VerifyFound();
3915
3916 m_commandBuffer->end();
3917 }
unknown088160a2019-05-23 17:43:13 -06003918}
3919
3920TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3921 ASSERT_NO_FATAL_FAILURE(Init());
3922 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3923 if (!depth_format) {
3924 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3925 return;
3926 }
3927
3928 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003929 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003930 if (properties.optimalTilingFeatures == 0) {
3931 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3932 return;
3933 }
3934
3935 VkImageObj srcImage(m_device);
3936 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3937 ASSERT_TRUE(srcImage.initialized());
3938 VkImageObj dstImage(m_device);
3939 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3940 ASSERT_TRUE(dstImage.initialized());
3941
3942 // Create two images of different types and try to copy between them
3943
3944 m_commandBuffer->begin();
3945 VkImageCopy copyRegion;
3946 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3947 copyRegion.srcSubresource.mipLevel = 0;
3948 copyRegion.srcSubresource.baseArrayLayer = 0;
3949 copyRegion.srcSubresource.layerCount = 1;
3950 copyRegion.srcOffset.x = 0;
3951 copyRegion.srcOffset.y = 0;
3952 copyRegion.srcOffset.z = 0;
3953 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3954 copyRegion.dstSubresource.mipLevel = 0;
3955 copyRegion.dstSubresource.baseArrayLayer = 0;
3956 copyRegion.dstSubresource.layerCount = 1;
3957 copyRegion.dstOffset.x = 0;
3958 copyRegion.dstOffset.y = 0;
3959 copyRegion.dstOffset.z = 0;
3960 copyRegion.extent.width = 1;
3961 copyRegion.extent.height = 1;
3962 copyRegion.extent.depth = 1;
3963
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003964 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003965 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3966 &copyRegion);
3967 m_commandBuffer->end();
3968
3969 m_errorMonitor->VerifyFound();
3970}
3971
3972TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3973 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3974
3975 ASSERT_NO_FATAL_FAILURE(Init());
3976
3977 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003978 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3979 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3980 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003981
3982 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3983 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
3984 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
3985 return;
3986 }
3987
3988 VkImageCreateInfo ci;
3989 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3990 ci.pNext = NULL;
3991 ci.flags = 0;
3992 ci.imageType = VK_IMAGE_TYPE_2D;
3993 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3994 ci.extent = {128, 128, 1};
3995 ci.mipLevels = 1;
3996 ci.arrayLayers = 1;
3997 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3998 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3999 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4000 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4001 ci.queueFamilyIndexCount = 0;
4002 ci.pQueueFamilyIndices = NULL;
4003 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4004
4005 VkImageObj image1(m_device);
4006 image1.init(&ci);
4007 ASSERT_TRUE(image1.initialized());
4008
4009 ci.samples = VK_SAMPLE_COUNT_2_BIT;
4010 VkImageObj image2(m_device);
4011 image2.init(&ci);
4012 ASSERT_TRUE(image2.initialized());
4013
4014 ci.samples = VK_SAMPLE_COUNT_4_BIT;
4015 VkImageObj image4(m_device);
4016 image4.init(&ci);
4017 ASSERT_TRUE(image4.initialized());
4018
4019 m_commandBuffer->begin();
4020
4021 VkImageCopy copyRegion;
4022 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4023 copyRegion.srcSubresource.mipLevel = 0;
4024 copyRegion.srcSubresource.baseArrayLayer = 0;
4025 copyRegion.srcSubresource.layerCount = 1;
4026 copyRegion.srcOffset = {0, 0, 0};
4027 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4028 copyRegion.dstSubresource.mipLevel = 0;
4029 copyRegion.dstSubresource.baseArrayLayer = 0;
4030 copyRegion.dstSubresource.layerCount = 1;
4031 copyRegion.dstOffset = {0, 0, 0};
4032 copyRegion.extent = {128, 128, 1};
4033
4034 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07004035 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004036 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4037 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004038 m_errorMonitor->VerifyFound();
4039
Mark Lobodzinski20310782020-02-28 14:25:17 -07004040 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004041 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
4042 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004043 m_errorMonitor->VerifyFound();
4044
4045 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07004046 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004047 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4048 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004049 m_errorMonitor->VerifyFound();
4050
Mark Lobodzinski20310782020-02-28 14:25:17 -07004051 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004052 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
4053 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004054 m_errorMonitor->VerifyFound();
4055
4056 m_commandBuffer->end();
4057}
4058
4059TEST_F(VkLayerTest, CopyImageAspectMismatch) {
4060 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004061
4062 if (!EnableDeviceProfileLayer()) {
4063 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
4064 return;
4065 }
4066
4067 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4068 if (mp_extensions) {
4069 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4070 }
4071
4072 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4073 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4074 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4075 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4076 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4077 if (mp_extensions) {
4078 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4079 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4080 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4081 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4082 }
4083 ASSERT_NO_FATAL_FAILURE(InitState());
4084
4085 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4086 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4087
4088 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4089 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4090 return;
4091 }
4092
unknown088160a2019-05-23 17:43:13 -06004093 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4094 if (!ds_format) {
4095 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4096 return;
4097 }
4098
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004099 // Add Transfer support for all used formats
4100 VkFormatProperties formatProps;
4101 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
4102 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4103 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4104 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
4105 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4106 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4107 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4108 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4109 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4110
unknown088160a2019-05-23 17:43:13 -06004111 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4112 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4113 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4114 VK_IMAGE_TILING_OPTIMAL, 0);
4115 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4116 VK_IMAGE_TILING_OPTIMAL, 0);
4117 ASSERT_TRUE(color_image.initialized());
4118 ASSERT_TRUE(depth_image.initialized());
4119 ASSERT_TRUE(ds_image.initialized());
4120
4121 VkImageCopy copyRegion;
4122 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4123 copyRegion.srcSubresource.mipLevel = 0;
4124 copyRegion.srcSubresource.baseArrayLayer = 0;
4125 copyRegion.srcSubresource.layerCount = 1;
4126 copyRegion.srcOffset = {0, 0, 0};
4127 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4128 copyRegion.dstSubresource.mipLevel = 0;
4129 copyRegion.dstSubresource.baseArrayLayer = 0;
4130 copyRegion.dstSubresource.layerCount = 1;
4131 copyRegion.dstOffset = {64, 0, 0};
4132 copyRegion.extent = {64, 128, 1};
4133
4134 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004135 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004136 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004137 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4138 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004139 m_errorMonitor->VerifyFound();
4140
4141 m_commandBuffer->begin();
4142
4143 // Src and dest aspect masks don't match
4144 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004145 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004146 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004147 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4148 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004149 m_errorMonitor->VerifyFound();
4150 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4151
4152 // Illegal combinations of aspect bits
4153 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4154 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004155 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004156 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004157 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004158 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004159 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4160 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004161 m_errorMonitor->VerifyFound();
4162 // same test for dstSubresource
4163 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4164 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004165 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004166 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004167 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004168 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004169 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4170 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004171 m_errorMonitor->VerifyFound();
4172
4173 // Metadata aspect is illegal
4174 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4175 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004176 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004177 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004178 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004179 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4180 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004181 m_errorMonitor->VerifyFound();
4182 // same test for dstSubresource
4183 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4184 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004185 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004186 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004187 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004188 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4189 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004190 m_errorMonitor->VerifyFound();
4191
sfricke-samsung6141db32020-10-26 03:31:38 -07004192 // Aspect Memory Plane mask is illegal
4193 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4194 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4195 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4196 // These aspect/format mismatches are redundant but unavoidable here
4197 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4198 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4199 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4200 m_errorMonitor->VerifyFound();
4201
unknown088160a2019-05-23 17:43:13 -06004202 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4203 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004204 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004205
4206 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004207 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004208 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004209 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004210 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4211 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004212 m_errorMonitor->VerifyFound();
4213
4214 // Aspect mask doesn't match dest image format
4215 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4216 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004217 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004218 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004219 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004220 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4221 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004222 m_errorMonitor->VerifyFound();
4223
4224 m_commandBuffer->end();
4225}
4226
4227TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004228 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004229
4230 ASSERT_NO_FATAL_FAILURE(Init());
4231
4232 // Create two images of sample count 1 and try to Resolve between them
4233
4234 VkImageCreateInfo image_create_info = {};
4235 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4236 image_create_info.pNext = NULL;
4237 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4238 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4239 image_create_info.extent.width = 32;
4240 image_create_info.extent.height = 1;
4241 image_create_info.extent.depth = 1;
4242 image_create_info.mipLevels = 1;
4243 image_create_info.arrayLayers = 1;
4244 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4245 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4246 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4247 image_create_info.flags = 0;
4248
4249 VkImageObj srcImage(m_device);
4250 srcImage.init(&image_create_info);
4251 ASSERT_TRUE(srcImage.initialized());
4252
4253 VkImageObj dstImage(m_device);
4254 dstImage.init(&image_create_info);
4255 ASSERT_TRUE(dstImage.initialized());
4256
4257 m_commandBuffer->begin();
4258 VkImageResolve resolveRegion;
4259 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4260 resolveRegion.srcSubresource.mipLevel = 0;
4261 resolveRegion.srcSubresource.baseArrayLayer = 0;
4262 resolveRegion.srcSubresource.layerCount = 1;
4263 resolveRegion.srcOffset.x = 0;
4264 resolveRegion.srcOffset.y = 0;
4265 resolveRegion.srcOffset.z = 0;
4266 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4267 resolveRegion.dstSubresource.mipLevel = 0;
4268 resolveRegion.dstSubresource.baseArrayLayer = 0;
4269 resolveRegion.dstSubresource.layerCount = 1;
4270 resolveRegion.dstOffset.x = 0;
4271 resolveRegion.dstOffset.y = 0;
4272 resolveRegion.dstOffset.z = 0;
4273 resolveRegion.extent.width = 1;
4274 resolveRegion.extent.height = 1;
4275 resolveRegion.extent.depth = 1;
4276 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4277 &resolveRegion);
4278 m_commandBuffer->end();
4279
4280 m_errorMonitor->VerifyFound();
4281}
4282
4283TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004284 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004285
4286 ASSERT_NO_FATAL_FAILURE(Init());
4287
4288 // Create two images of sample count 4 and try to Resolve between them
4289
4290 VkImageCreateInfo image_create_info = {};
4291 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4292 image_create_info.pNext = NULL;
4293 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4294 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4295 image_create_info.extent.width = 32;
4296 image_create_info.extent.height = 1;
4297 image_create_info.extent.depth = 1;
4298 image_create_info.mipLevels = 1;
4299 image_create_info.arrayLayers = 1;
4300 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4301 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4302 // Note: Some implementations expect color attachment usage for any
4303 // multisample surface
4304 image_create_info.usage =
4305 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4306 image_create_info.flags = 0;
4307
4308 VkImageObj srcImage(m_device);
4309 srcImage.init(&image_create_info);
4310 ASSERT_TRUE(srcImage.initialized());
4311
4312 VkImageObj dstImage(m_device);
4313 dstImage.init(&image_create_info);
4314 ASSERT_TRUE(dstImage.initialized());
4315
4316 m_commandBuffer->begin();
4317 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4318 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4319 // VK_IMAGE_LAYOUT_GENERAL = 1,
4320 VkImageResolve resolveRegion;
4321 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4322 resolveRegion.srcSubresource.mipLevel = 0;
4323 resolveRegion.srcSubresource.baseArrayLayer = 0;
4324 resolveRegion.srcSubresource.layerCount = 1;
4325 resolveRegion.srcOffset.x = 0;
4326 resolveRegion.srcOffset.y = 0;
4327 resolveRegion.srcOffset.z = 0;
4328 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4329 resolveRegion.dstSubresource.mipLevel = 0;
4330 resolveRegion.dstSubresource.baseArrayLayer = 0;
4331 resolveRegion.dstSubresource.layerCount = 1;
4332 resolveRegion.dstOffset.x = 0;
4333 resolveRegion.dstOffset.y = 0;
4334 resolveRegion.dstOffset.z = 0;
4335 resolveRegion.extent.width = 1;
4336 resolveRegion.extent.height = 1;
4337 resolveRegion.extent.depth = 1;
4338 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4339 &resolveRegion);
4340 m_commandBuffer->end();
4341
4342 m_errorMonitor->VerifyFound();
4343}
4344
4345TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004346 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004347
4348 ASSERT_NO_FATAL_FAILURE(Init());
4349
4350 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004351 VkImageObj srcImage(m_device);
4352 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004353
4354 VkImageCreateInfo image_create_info = {};
4355 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4356 image_create_info.pNext = NULL;
4357 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4358 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4359 image_create_info.extent.width = 32;
4360 image_create_info.extent.height = 1;
4361 image_create_info.extent.depth = 1;
4362 image_create_info.mipLevels = 1;
4363 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004364 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004365 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4366 // Note: Some implementations expect color attachment usage for any
4367 // multisample surface
4368 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4369 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004370 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004371
4372 // Set format to something other than source image
4373 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4374 // Note: Some implementations expect color attachment usage for any
4375 // multisample surface
4376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4377 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004378 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004379
4380 m_commandBuffer->begin();
4381 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4382 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4383 // VK_IMAGE_LAYOUT_GENERAL = 1,
4384 VkImageResolve resolveRegion;
4385 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4386 resolveRegion.srcSubresource.mipLevel = 0;
4387 resolveRegion.srcSubresource.baseArrayLayer = 0;
4388 resolveRegion.srcSubresource.layerCount = 1;
4389 resolveRegion.srcOffset.x = 0;
4390 resolveRegion.srcOffset.y = 0;
4391 resolveRegion.srcOffset.z = 0;
4392 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4393 resolveRegion.dstSubresource.mipLevel = 0;
4394 resolveRegion.dstSubresource.baseArrayLayer = 0;
4395 resolveRegion.dstSubresource.layerCount = 1;
4396 resolveRegion.dstOffset.x = 0;
4397 resolveRegion.dstOffset.y = 0;
4398 resolveRegion.dstOffset.z = 0;
4399 resolveRegion.extent.width = 1;
4400 resolveRegion.extent.height = 1;
4401 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004402 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4403 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004404 m_commandBuffer->end();
4405
4406 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004407}
4408
4409TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004410 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004411
4412 ASSERT_NO_FATAL_FAILURE(Init());
4413
4414 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004415 VkImageObj srcImage(m_device);
4416 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004417
4418 VkImageCreateInfo image_create_info = {};
4419 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4420 image_create_info.pNext = NULL;
4421 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4422 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4423 image_create_info.extent.width = 32;
4424 image_create_info.extent.height = 1;
4425 image_create_info.extent.depth = 1;
4426 image_create_info.mipLevels = 1;
4427 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004428 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004429 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4430 // Note: Some implementations expect color attachment usage for any
4431 // multisample surface
4432 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4433 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004434 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004435
4436 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4437 // Note: Some implementations expect color attachment usage for any
4438 // multisample surface
4439 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4440 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004441 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004442
4443 m_commandBuffer->begin();
4444 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4445 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4446 // VK_IMAGE_LAYOUT_GENERAL = 1,
4447 VkImageResolve resolveRegion;
4448 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4449 resolveRegion.srcSubresource.mipLevel = 0;
4450 resolveRegion.srcSubresource.baseArrayLayer = 0;
4451 resolveRegion.srcSubresource.layerCount = 1;
4452 resolveRegion.srcOffset.x = 0;
4453 resolveRegion.srcOffset.y = 0;
4454 resolveRegion.srcOffset.z = 0;
4455 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4456 resolveRegion.dstSubresource.mipLevel = 0;
4457 resolveRegion.dstSubresource.baseArrayLayer = 0;
4458 resolveRegion.dstSubresource.layerCount = 1;
4459 resolveRegion.dstOffset.x = 0;
4460 resolveRegion.dstOffset.y = 0;
4461 resolveRegion.dstOffset.z = 0;
4462 resolveRegion.extent.width = 1;
4463 resolveRegion.extent.height = 1;
4464 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004465 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4466 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004467 m_commandBuffer->end();
4468
4469 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004470}
4471
4472TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4473 ASSERT_NO_FATAL_FAILURE(Init());
4474
4475 // Create two images of different types and try to copy between them
4476 VkImageObj srcImage(m_device);
4477 VkImageObj dstImage(m_device);
4478
4479 VkImageCreateInfo image_create_info = {};
4480 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4481 image_create_info.pNext = NULL;
4482 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4483 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4484 image_create_info.extent.width = 32;
4485 image_create_info.extent.height = 32;
4486 image_create_info.extent.depth = 1;
4487 image_create_info.mipLevels = 1;
4488 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004489 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004490 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4491 image_create_info.usage =
4492 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4493 // Note: Some implementations expect color attachment usage for any
4494 // multisample surface
4495 image_create_info.flags = 0;
4496 srcImage.init(&image_create_info);
4497 ASSERT_TRUE(srcImage.initialized());
4498
4499 // Note: Some implementations expect color attachment usage for any
4500 // multisample surface
4501 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4502 dstImage.init(&image_create_info);
4503 ASSERT_TRUE(dstImage.initialized());
4504
4505 m_commandBuffer->begin();
4506 // source image must have valid contents before resolve
4507 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4508 VkImageSubresourceRange subresource = {};
4509 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4510 subresource.layerCount = 1;
4511 subresource.levelCount = 1;
4512 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4513 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4514 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4515 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4516
4517 VkImageResolve resolveRegion;
4518 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4519 resolveRegion.srcSubresource.mipLevel = 0;
4520 resolveRegion.srcSubresource.baseArrayLayer = 0;
4521 resolveRegion.srcSubresource.layerCount = 1;
4522 resolveRegion.srcOffset.x = 0;
4523 resolveRegion.srcOffset.y = 0;
4524 resolveRegion.srcOffset.z = 0;
4525 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4526 resolveRegion.dstSubresource.mipLevel = 0;
4527 resolveRegion.dstSubresource.baseArrayLayer = 0;
4528 resolveRegion.dstSubresource.layerCount = 1;
4529 resolveRegion.dstOffset.x = 0;
4530 resolveRegion.dstOffset.y = 0;
4531 resolveRegion.dstOffset.z = 0;
4532 resolveRegion.extent.width = 1;
4533 resolveRegion.extent.height = 1;
4534 resolveRegion.extent.depth = 1;
4535 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004536 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004537 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4538 1, &resolveRegion);
4539 m_errorMonitor->VerifyFound();
4540 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004541 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004542 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4543 1, &resolveRegion);
4544 m_errorMonitor->VerifyFound();
4545 m_commandBuffer->end();
4546}
4547
4548TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004549 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4550
4551 bool copy_commands2 = false;
4552 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4553 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4554 copy_commands2 = true;
4555 }
4556 ASSERT_NO_FATAL_FAILURE(InitState());
4557
4558 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4559 if (copy_commands2) {
4560 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4561 }
unknown088160a2019-05-23 17:43:13 -06004562
4563 // Create two images of different types and try to copy between them
4564 VkImageObj srcImage(m_device);
4565 VkImageObj dstImage(m_device);
4566
4567 VkImageCreateInfo image_create_info = {};
4568 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4569 image_create_info.pNext = NULL;
4570 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4571 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4572 image_create_info.extent.width = 32;
4573 image_create_info.extent.height = 32;
4574 image_create_info.extent.depth = 1;
4575 image_create_info.mipLevels = 1;
4576 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004577 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004578 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4579 image_create_info.usage =
4580 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4581 // Note: Some implementations expect color attachment usage for any
4582 // multisample surface
4583 image_create_info.flags = 0;
4584 srcImage.init(&image_create_info);
4585 ASSERT_TRUE(srcImage.initialized());
4586
4587 // Note: Some implementations expect color attachment usage for any
4588 // multisample surface
4589 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4590 dstImage.init(&image_create_info);
4591 ASSERT_TRUE(dstImage.initialized());
4592
4593 m_commandBuffer->begin();
4594 // source image must have valid contents before resolve
4595 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4596 VkImageSubresourceRange subresource = {};
4597 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4598 subresource.layerCount = 1;
4599 subresource.levelCount = 1;
4600 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4601 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4602 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4603 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4604
4605 VkImageResolve resolveRegion;
4606 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4607 resolveRegion.srcSubresource.mipLevel = 0;
4608 resolveRegion.srcSubresource.baseArrayLayer = 0;
4609 resolveRegion.srcSubresource.layerCount = 1;
4610 resolveRegion.srcOffset.x = 0;
4611 resolveRegion.srcOffset.y = 0;
4612 resolveRegion.srcOffset.z = 0;
4613 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4614 resolveRegion.dstSubresource.mipLevel = 0;
4615 resolveRegion.dstSubresource.baseArrayLayer = 0;
4616 resolveRegion.dstSubresource.layerCount = 1;
4617 resolveRegion.dstOffset.x = 0;
4618 resolveRegion.dstOffset.y = 0;
4619 resolveRegion.dstOffset.z = 0;
4620 resolveRegion.extent.width = 1;
4621 resolveRegion.extent.height = 1;
4622 resolveRegion.extent.depth = 1;
4623 // invalid source mip level
4624 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004626 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4627 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4628 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004629
4630 // Equivalent test using KHR_copy_commands2
4631 if (copy_commands2 && vkCmdResolveImage2Function) {
4632 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4633 NULL,
4634 resolveRegion.srcSubresource,
4635 resolveRegion.srcOffset,
4636 resolveRegion.dstSubresource,
4637 resolveRegion.dstOffset,
4638 resolveRegion.extent};
4639 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4640 NULL,
4641 srcImage.image(),
4642 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4643 dstImage.image(),
4644 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4645 1,
4646 &resolveRegion2};
4647 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01709");
4648 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4649 m_errorMonitor->VerifyFound();
4650 }
4651
unknown088160a2019-05-23 17:43:13 -06004652 resolveRegion.srcSubresource.mipLevel = 0;
4653 // invalid dest mip level
4654 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004655 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004656 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4657 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4658 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004659
4660 // Equivalent test using KHR_copy_commands2
4661 if (copy_commands2 && vkCmdResolveImage2Function) {
4662 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4663 NULL,
4664 resolveRegion.srcSubresource,
4665 resolveRegion.srcOffset,
4666 resolveRegion.dstSubresource,
4667 resolveRegion.dstOffset,
4668 resolveRegion.extent};
4669 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4670 NULL,
4671 srcImage.image(),
4672 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4673 dstImage.image(),
4674 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4675 1,
4676 &resolveRegion2};
4677 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01710");
4678 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4679 m_errorMonitor->VerifyFound();
4680 }
4681
unknown088160a2019-05-23 17:43:13 -06004682 resolveRegion.dstSubresource.mipLevel = 0;
4683 // invalid source array layer range
4684 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004685 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004686 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4687 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4688 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004689
4690 // Equivalent test using KHR_copy_commands2
4691 if (copy_commands2 && vkCmdResolveImage2Function) {
4692 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4693 NULL,
4694 resolveRegion.srcSubresource,
4695 resolveRegion.srcOffset,
4696 resolveRegion.dstSubresource,
4697 resolveRegion.dstOffset,
4698 resolveRegion.extent};
4699 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4700 NULL,
4701 srcImage.image(),
4702 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4703 dstImage.image(),
4704 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4705 1,
4706 &resolveRegion2};
4707 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01711");
4708 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4709 m_errorMonitor->VerifyFound();
4710 }
4711
unknown088160a2019-05-23 17:43:13 -06004712 resolveRegion.srcSubresource.baseArrayLayer = 0;
4713 // invalid dest array layer range
4714 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004715 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004716 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4717 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4718 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004719
4720 // Equivalent test using KHR_copy_commands2
4721 if (copy_commands2 && vkCmdResolveImage2Function) {
4722 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4723 NULL,
4724 resolveRegion.srcSubresource,
4725 resolveRegion.srcOffset,
4726 resolveRegion.dstSubresource,
4727 resolveRegion.dstOffset,
4728 resolveRegion.extent};
4729 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4730 NULL,
4731 srcImage.image(),
4732 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4733 dstImage.image(),
4734 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4735 1,
4736 &resolveRegion2};
4737 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01712");
4738 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4739 m_errorMonitor->VerifyFound();
4740 }
4741
unknown088160a2019-05-23 17:43:13 -06004742 resolveRegion.dstSubresource.baseArrayLayer = 0;
4743
4744 m_commandBuffer->end();
4745}
4746
sfricke-samsungf78d0592020-06-11 21:34:44 -07004747TEST_F(VkLayerTest, ResolveImageImageType) {
4748 ASSERT_NO_FATAL_FAILURE(Init());
4749 // Create images of different types and try to resolve between them
4750 VkImageObj srcImage2D(m_device);
4751 VkImageObj dstImage1D(m_device);
4752 VkImageObj dstImage3D(m_device);
4753
4754 VkImageCreateInfo image_create_info = {};
4755 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4756 image_create_info.pNext = NULL;
4757 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4758 image_create_info.extent.width = 32;
4759 image_create_info.extent.height = 1;
4760 image_create_info.extent.depth = 1;
4761 image_create_info.mipLevels = 1;
4762 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
sfricke-samsungf46582f2021-03-31 02:02:37 -07004763 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
sfricke-samsungf78d0592020-06-11 21:34:44 -07004764 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4765 image_create_info.usage =
4766 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4767 // Note: Some implementations expect color attachment usage for any
4768 // multisample surface
4769 image_create_info.flags = 0;
4770
4771 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4772 srcImage2D.init(&image_create_info);
4773 ASSERT_TRUE(srcImage2D.initialized());
4774
4775 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4776 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4777 dstImage1D.init(&image_create_info);
4778 ASSERT_TRUE(dstImage1D.initialized());
4779
4780 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4781 image_create_info.extent.height = 16;
4782 image_create_info.extent.depth = 16;
4783 image_create_info.arrayLayers = 1;
4784 dstImage3D.init(&image_create_info);
4785 ASSERT_TRUE(dstImage3D.initialized());
4786
4787 m_commandBuffer->begin();
4788
4789 VkImageResolve resolveRegion;
4790 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4791 resolveRegion.srcSubresource.mipLevel = 0;
4792 resolveRegion.srcSubresource.baseArrayLayer = 0;
4793 resolveRegion.srcSubresource.layerCount = 1;
4794 resolveRegion.srcOffset.x = 0;
4795 resolveRegion.srcOffset.y = 0;
4796 resolveRegion.srcOffset.z = 0;
4797 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4798 resolveRegion.dstSubresource.mipLevel = 0;
4799 resolveRegion.dstSubresource.baseArrayLayer = 0;
4800 resolveRegion.dstSubresource.layerCount = 1;
4801 resolveRegion.dstOffset.x = 0;
4802 resolveRegion.dstOffset.y = 0;
4803 resolveRegion.dstOffset.z = 0;
4804 resolveRegion.extent.width = 1;
4805 resolveRegion.extent.height = 1;
4806 resolveRegion.extent.depth = 1;
4807
4808 // non-zero value baseArrayLayer
4809 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004810 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004811 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4812 &resolveRegion);
4813 m_errorMonitor->VerifyFound();
4814 resolveRegion.srcSubresource.baseArrayLayer = 0;
4815
4816 // Set height with 1D dstImage
4817 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004819 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004820 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004822 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4823 &resolveRegion);
4824 m_errorMonitor->VerifyFound();
4825 resolveRegion.extent.height = 1;
4826
4827 // Set depth with 1D dstImage and 2D srcImage
4828 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004829 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4830 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004831 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4832 &resolveRegion);
4833 m_errorMonitor->VerifyFound();
4834 resolveRegion.extent.depth = 1;
4835
4836 m_commandBuffer->end();
4837}
4838
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004839TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4840 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4841 ASSERT_NO_FATAL_FAILURE(Init());
4842
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004843 m_errorMonitor->ExpectSuccess();
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004844 VkImageObj srcImage2D(m_device);
4845 VkImageObj dstImage2D(m_device);
4846
4847 VkImageCreateInfo image_create_info = {};
4848 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4849 image_create_info.pNext = NULL;
4850 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4851 image_create_info.extent.width = 32;
4852 image_create_info.extent.height = 32;
4853 image_create_info.extent.depth = 1;
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004854 image_create_info.mipLevels = 1;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004855 image_create_info.arrayLayers = 1;
4856 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4857 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4858 image_create_info.usage =
4859 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4860 // Note: Some implementations expect color attachment usage for any
4861 // multisample surface
4862 image_create_info.flags = 0;
4863
4864 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4865 srcImage2D.init(&image_create_info);
4866 ASSERT_TRUE(srcImage2D.initialized());
4867
4868 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4869 dstImage2D.init(&image_create_info);
4870 ASSERT_TRUE(dstImage2D.initialized());
4871
4872 m_commandBuffer->begin();
4873
4874 VkImageResolve resolveRegion = {};
4875 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4876 resolveRegion.srcSubresource.mipLevel = 0;
4877 resolveRegion.srcSubresource.baseArrayLayer = 0;
4878 resolveRegion.srcSubresource.layerCount = 1;
4879 resolveRegion.srcOffset.x = 0;
4880 resolveRegion.srcOffset.y = 0;
4881 resolveRegion.srcOffset.z = 0;
4882 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4883 resolveRegion.dstSubresource.mipLevel = 0;
4884 resolveRegion.dstSubresource.baseArrayLayer = 0;
4885 resolveRegion.dstSubresource.layerCount = 1;
4886 resolveRegion.dstOffset.x = 0;
4887 resolveRegion.dstOffset.y = 0;
4888 resolveRegion.dstOffset.z = 0;
4889 resolveRegion.extent.width = 32;
4890 resolveRegion.extent.height = 32;
4891 resolveRegion.extent.depth = 1;
4892
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004893 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4894 &resolveRegion);
4895 m_errorMonitor->VerifyNotFound();
4896
4897 // srcImage exceeded in x-dim
4898 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004899 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004900 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4901 &resolveRegion);
4902 m_errorMonitor->VerifyFound();
4903 resolveRegion.srcOffset.x = 0;
4904
4905 // dstImage exceeded in x-dim
4906 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004907 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004908 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4909 &resolveRegion);
4910 m_errorMonitor->VerifyFound();
4911 resolveRegion.dstOffset.x = 0;
4912
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004913 // both image exceeded in y-dim
4914 resolveRegion.srcOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004916 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4917 &resolveRegion);
4918 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004919 resolveRegion.srcOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004920
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004921 resolveRegion.dstOffset.y = 32;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004922 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004923 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4924 &resolveRegion);
4925 m_errorMonitor->VerifyFound();
Tony-LunarG0f8f94b2021-06-01 13:23:09 -06004926 resolveRegion.dstOffset.y = 0;
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004927
4928 // srcImage exceeded in z-dim
4929 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004930 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4931 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004932 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4933 &resolveRegion);
4934 m_errorMonitor->VerifyFound();
4935 resolveRegion.srcOffset.z = 0;
4936
4937 // dstImage exceeded in z-dim
4938 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4940 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004941 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4942 &resolveRegion);
4943 m_errorMonitor->VerifyFound();
4944 resolveRegion.dstOffset.z = 0;
4945
4946 m_commandBuffer->end();
4947}
4948
unknown088160a2019-05-23 17:43:13 -06004949TEST_F(VkLayerTest, ClearImageErrors) {
4950 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4951
4952 ASSERT_NO_FATAL_FAILURE(Init());
4953 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4954
4955 m_commandBuffer->begin();
4956
4957 // Color image
4958 VkClearColorValue clear_color;
4959 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4960 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4961 const int32_t img_width = 32;
4962 const int32_t img_height = 32;
4963 VkImageCreateInfo image_create_info = {};
4964 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4965 image_create_info.pNext = NULL;
4966 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4967 image_create_info.format = color_format;
4968 image_create_info.extent.width = img_width;
4969 image_create_info.extent.height = img_height;
4970 image_create_info.extent.depth = 1;
4971 image_create_info.mipLevels = 1;
4972 image_create_info.arrayLayers = 1;
4973 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4974 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4975
4976 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4977 vk_testing::Image color_image_no_transfer;
4978 color_image_no_transfer.init(*m_device, image_create_info);
4979
4980 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4981 vk_testing::Image color_image;
4982 color_image.init(*m_device, image_create_info);
4983
4984 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4985
4986 // Depth/Stencil image
4987 VkClearDepthStencilValue clear_value = {0};
4988 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4989 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4990 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4991 ds_image_create_info.extent.width = 64;
4992 ds_image_create_info.extent.height = 64;
4993 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4994 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4995
4996 vk_testing::Image ds_image;
4997 ds_image.init(*m_device, ds_image_create_info);
4998
4999 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
5000
sfricke-samsungcd924d92020-05-20 23:51:17 -07005001 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06005002
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005003 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06005004
5005 m_errorMonitor->VerifyFound();
5006
sfricke-samsungcd924d92020-05-20 23:51:17 -07005007 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06005008
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005009 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
5010 &color_range);
unknown088160a2019-05-23 17:43:13 -06005011
5012 m_errorMonitor->VerifyFound();
5013
5014 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07005015 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07005016 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06005017
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005018 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5019 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06005020
5021 m_errorMonitor->VerifyFound();
5022}
5023
5024TEST_F(VkLayerTest, CommandQueueFlags) {
5025 TEST_DESCRIPTION(
5026 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
5027
5028 ASSERT_NO_FATAL_FAILURE(Init());
5029
5030 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5031 if (queueFamilyIndex == UINT32_MAX) {
5032 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5033 return;
5034 } else {
5035 // Create command pool on a non-graphics queue
5036 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5037
5038 // Setup command buffer on pool
5039 VkCommandBufferObj command_buffer(m_device, &command_pool);
5040 command_buffer.begin();
5041
5042 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07005043 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005044 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5045 command_buffer.SetViewport(0, 1, &viewport);
5046 m_errorMonitor->VerifyFound();
5047 }
5048}
5049
sfricke-samsung674ba102020-08-18 22:38:49 -07005050TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
5051 TEST_DESCRIPTION(
5052 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
5053 "buffer");
5054
5055 ASSERT_NO_FATAL_FAILURE(Init());
5056
5057 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5058 if (queueFamilyIndex == UINT32_MAX) {
5059 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5060 return;
5061 } else {
5062 // Create Depth image
5063 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
5064 if (ds_format == VK_FORMAT_UNDEFINED) {
5065 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
5066 return;
5067 }
5068
5069 VkImageObj ds_image(m_device);
5070 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
5071 VK_IMAGE_TILING_OPTIMAL, 0);
5072 ASSERT_TRUE(ds_image.initialized());
5073
5074 // Allocate buffers
5075 VkBufferObj buffer;
5076 VkMemoryPropertyFlags reqs = 0;
5077 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5078
5079 VkBufferImageCopy region = {};
5080 region.bufferRowLength = 0;
5081 region.bufferImageHeight = 0;
5082 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5083 region.imageSubresource.layerCount = 1;
5084 region.imageOffset = {0, 0, 0};
5085 region.imageExtent = {64, 64, 1};
5086 region.bufferOffset = 0;
5087
5088 // Create command pool on a non-graphics queue
5089 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5090
5091 // Setup command buffer on pool
5092 VkCommandBufferObj command_buffer(m_device, &command_pool);
5093 command_buffer.begin();
5094
sfricke-samsungea4fd142020-10-17 23:51:59 -07005095 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005096 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5097 1, &region);
5098 m_errorMonitor->VerifyFound();
5099 }
5100}
5101
sfricke-samsung5a019492021-01-25 10:32:08 -08005102TEST_F(VkLayerTest, ImageCopyTransferQueueFlags) {
5103 TEST_DESCRIPTION(
5104 "Allocate a command buffer on a queue that does not support graphics/compute and try to issue an invalid image copy to "
5105 "buffer");
5106
5107 ASSERT_NO_FATAL_FAILURE(Init());
5108
5109 // Should be left with a tranfser queue
5110 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
5111 if (queueFamilyIndex == UINT32_MAX) {
5112 printf("%s Non-graphics/compute queue family not found; skipped.\n", kSkipPrefix);
5113 return;
5114 }
5115
5116 VkImageObj image(m_device);
5117 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
5118 VK_IMAGE_TILING_OPTIMAL, 0);
5119 ASSERT_TRUE(image.initialized());
5120
5121 // Allocate buffers
5122 VkBufferObj buffer;
5123 VkMemoryPropertyFlags reqs = 0;
5124 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5125
5126 VkBufferImageCopy region = {};
5127 region.bufferRowLength = 0;
5128 region.bufferImageHeight = 0;
5129 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5130 region.imageSubresource.layerCount = 1;
5131 region.imageOffset = {0, 0, 0};
5132 region.imageExtent = {16, 16, 1};
5133 region.bufferOffset = 5;
5134
5135 // Create command pool on a non-graphics queue
5136 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5137
5138 // Setup command buffer on pool
5139 VkCommandBufferObj command_buffer(m_device, &command_pool);
5140 command_buffer.begin();
5141
5142 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
5143 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04052");
5144 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5145 &region);
5146 m_errorMonitor->VerifyFound();
5147}
5148
sfricke-samsungcb467672020-11-25 00:09:28 -08005149TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5150 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5151
5152 ASSERT_NO_FATAL_FAILURE(Init());
5153
5154 if (m_device->queue_props.size() < 2) {
5155 printf("%s Need 2 different queues for testing skipping.\n", kSkipPrefix);
5156 return;
5157 }
5158
5159 // First two queue families
5160 uint32_t queue_index_A = 0;
5161 uint32_t queue_index_B = 1;
5162
5163 VkCommandPoolCreateInfo pool_create_info = {};
5164 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5165 pool_create_info.pNext = nullptr;
5166 pool_create_info.flags = 0;
5167
5168 VkCommandPool command_pool_A;
5169 pool_create_info.queueFamilyIndex = queue_index_A;
5170 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_A);
5171
5172 VkCommandPool command_pool_B;
5173 pool_create_info.queueFamilyIndex = queue_index_B;
5174 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_B);
5175
5176 VkCommandBuffer command_buffer[2]; // [0] primary and [1] secondary
5177 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5178 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5179 command_buffer_allocate_info.commandBufferCount = 1;
5180 command_buffer_allocate_info.commandPool = command_pool_A;
5181 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5182 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[0]);
5183
5184 command_buffer_allocate_info.commandPool = command_pool_B;
5185 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5186 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[1]);
5187
5188 VkCommandBufferBeginInfo begin_info = {};
5189 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5190
5191 // secondary
5192 vk::BeginCommandBuffer(command_buffer[1], &begin_info);
5193 vk::EndCommandBuffer(command_buffer[1]);
5194
5195 // Try using different pool's command buffer as secondary
5196 vk::BeginCommandBuffer(command_buffer[0], &begin_info);
5197 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
5198 vk::CmdExecuteCommands(command_buffer[0], 1, &command_buffer[1]);
5199 m_errorMonitor->VerifyFound();
5200 vk::EndCommandBuffer(command_buffer[0]);
5201
5202 vk::DestroyCommandPool(m_device->device(), command_pool_A, NULL);
5203 vk::DestroyCommandPool(m_device->device(), command_pool_B, NULL);
5204}
5205
unknown088160a2019-05-23 17:43:13 -06005206TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5207 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5208 ASSERT_NO_FATAL_FAILURE(Init());
5209 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5210 // never record secondary
5211
Mark Lobodzinski20310782020-02-28 14:25:17 -07005212 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005213 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005214 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005215 m_errorMonitor->VerifyFound();
5216 m_commandBuffer->end();
5217}
5218
5219TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5220 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5221
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005222 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005223 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5224
5225 VkImageCreateInfo image_create_info = {};
5226 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5227 image_create_info.pNext = NULL;
5228 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5229 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5230 image_create_info.extent.width = 32;
5231 image_create_info.extent.height = 1;
5232 image_create_info.extent.depth = 1;
5233 image_create_info.mipLevels = 1;
5234 image_create_info.arrayLayers = 1;
5235 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5236 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5237 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5238 image_create_info.flags = 0;
5239
5240 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5241 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5242
5243 VkImageObj image(m_device);
5244 image.init(&image_create_info);
5245 ASSERT_TRUE(image.initialized());
5246 VkImageMemoryBarrier image_barrier =
5247 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5248
5249 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5250 image_barrier.oldLayout = old_layout;
5251 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005252 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5253 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005254 };
5255
5256 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5257 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5258 secondary.begin();
5259 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5260 secondary.end();
5261
Mark Lobodzinski20310782020-02-28 14:25:17 -07005262 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005263 m_commandBuffer->begin();
5264 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005265 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005266 m_errorMonitor->VerifyFound();
5267
unknown088160a2019-05-23 17:43:13 -06005268 m_commandBuffer->reset();
5269 secondary.reset();
5270
5271 // Validate that UNDEFINED doesn't false positive on us
5272 secondary.begin();
5273 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5274 secondary.end();
5275 m_commandBuffer->begin();
5276 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5277 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005278 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005279 m_errorMonitor->VerifyNotFound();
5280 m_commandBuffer->end();
5281}
5282
5283TEST_F(VkLayerTest, SetDynViewportParamTests) {
5284 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5285
5286 SetTargetApiVersion(VK_API_VERSION_1_1);
5287 VkPhysicalDeviceFeatures features{};
5288 ASSERT_NO_FATAL_FAILURE(Init(&features));
5289
5290 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5291 const VkViewport viewports[] = {vp, vp};
5292
5293 m_commandBuffer->begin();
5294
5295 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005296 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005297 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005298 m_errorMonitor->VerifyFound();
5299
Mark Lobodzinski20310782020-02-28 14:25:17 -07005300 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005301 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005302 m_errorMonitor->VerifyFound();
5303
Mark Lobodzinski20310782020-02-28 14:25:17 -07005304 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005305 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005306 m_errorMonitor->VerifyFound();
5307
Mark Lobodzinski20310782020-02-28 14:25:17 -07005308 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5309 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005310 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005311 m_errorMonitor->VerifyFound();
5312
Mark Lobodzinski20310782020-02-28 14:25:17 -07005313 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005314 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005315 m_errorMonitor->VerifyFound();
5316
5317 // core viewport tests
5318 using std::vector;
5319 struct TestCase {
5320 VkViewport vp;
5321 std::string veid;
5322 };
5323
5324 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5325 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5326 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5327
5328 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5329 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5330 const auto one_before_min_bounds = NearestSmaller(min_bound);
5331 const auto one_past_max_bounds = NearestGreater(max_bound);
5332
5333 const auto below_zero = NearestSmaller(0.0f);
5334 const auto past_one = NearestGreater(1.0f);
5335
5336 vector<TestCase> test_cases = {
5337 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5338 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5339 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5340 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5341 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5342 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5343 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5344 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5345 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5346 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5347 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5348 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5349 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5350 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5351 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5352 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5353 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5354 };
5355
5356 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5357 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5358 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5359 } else {
5360 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5361 }
5362
5363 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005364 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005365 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005366 m_errorMonitor->VerifyFound();
5367 }
5368}
5369
5370TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5371 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5372
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005373 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005374
5375 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
5376 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
5377 } else {
5378 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5379 return;
5380 }
5381 ASSERT_NO_FATAL_FAILURE(InitState());
5382
5383 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5384}
5385
5386TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5387 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5388
5389 ASSERT_NO_FATAL_FAILURE(Init());
5390
5391 if (!m_device->phy().features().multiViewport) {
5392 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5393 return;
5394 }
5395
unknown088160a2019-05-23 17:43:13 -06005396 m_commandBuffer->begin();
5397
Mark Lobodzinski20310782020-02-28 14:25:17 -07005398 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005399 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005400 m_errorMonitor->VerifyFound();
5401
Petr Kraus14e49492019-09-09 20:13:29 +02005402 const auto max_viewports = m_device->props.limits.maxViewports;
5403
Mark Lobodzinski20310782020-02-28 14:25:17 -07005404 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005405 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005406 m_errorMonitor->VerifyFound();
5407
Petr Kraus14e49492019-09-09 20:13:29 +02005408 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5409 if (max_viewports >= too_big_max_viewports) {
5410 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5411 kSkipPrefix);
5412 } else {
5413 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5414 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5415
Mark Lobodzinski20310782020-02-28 14:25:17 -07005416 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005417 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005418 m_errorMonitor->VerifyFound();
5419
Mark Lobodzinski20310782020-02-28 14:25:17 -07005420 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005421 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005422 m_errorMonitor->VerifyFound();
5423
Mark Lobodzinski20310782020-02-28 14:25:17 -07005424 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005425 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005426 m_errorMonitor->VerifyFound();
5427
Mark Lobodzinski20310782020-02-28 14:25:17 -07005428 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005429 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005430 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005431 }
unknown088160a2019-05-23 17:43:13 -06005432}
5433
5434TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5435 TEST_DESCRIPTION(
5436 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5437
5438 ASSERT_NO_FATAL_FAILURE(Init());
5439 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5440
5441 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5442 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5443
5444 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5445 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5446 nullptr, // pNext
5447 m_renderPass,
5448 0, // subpass
5449 m_framebuffer,
5450 };
5451 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5452 nullptr, // pNext
5453 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5454
5455 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5456 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5457 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5458 sec_cmdbuff_inside_rp.end();
5459
5460 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5461 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5462 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5463 sec_cmdbuff_outside_rp.end();
5464
5465 m_commandBuffer->begin();
5466
Mark Lobodzinski20310782020-02-28 14:25:17 -07005467 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005468 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005469 m_errorMonitor->VerifyFound();
5470
5471 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5472 nullptr, // pNext
5473 m_renderPass,
5474 m_framebuffer,
5475 {{0, 0}, {32, 32}},
5476 static_cast<uint32_t>(m_renderPassClearValues.size()),
5477 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005478 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005479
Mark Lobodzinski20310782020-02-28 14:25:17 -07005480 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005481 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005482 m_errorMonitor->VerifyFound();
5483}
5484
5485TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5486 TEST_DESCRIPTION(
5487 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5488 ASSERT_NO_FATAL_FAILURE(Init());
5489 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5490
5491 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
5492 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5493 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5494 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5495 command_buffer_allocate_info.commandBufferCount = 1;
5496
5497 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005498 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
unknown088160a2019-05-23 17:43:13 -06005499 VkCommandBufferBeginInfo command_buffer_begin_info = {};
5500 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
5501 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5502 command_buffer_inheritance_info.renderPass = m_renderPass;
5503 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5504
5505 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5506 command_buffer_begin_info.flags =
5507 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5508 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5509
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005510 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005511 VkClearAttachment color_attachment;
5512 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5513 color_attachment.clearValue.color.float32[0] = 0;
5514 color_attachment.clearValue.color.float32[1] = 0;
5515 color_attachment.clearValue.color.float32[2] = 0;
5516 color_attachment.clearValue.color.float32[3] = 0;
5517 color_attachment.colorAttachment = 0;
5518 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005519 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005520 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5521 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005522 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005523 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005524
Mark Lobodzinski20310782020-02-28 14:25:17 -07005525 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005526 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005527 m_errorMonitor->VerifyFound();
5528
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005529 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005530 m_commandBuffer->end();
5531}
5532
5533TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5534 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
5535 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5536 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5537 } else {
5538 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5539 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5540 return;
5541 }
5542
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005543 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005544 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5545 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5546 } else {
5547 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5548 return;
5549 }
5550 ASSERT_NO_FATAL_FAILURE(InitState());
5551
5552 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5553 if (push_descriptor_prop.maxPushDescriptors < 1) {
5554 // Some implementations report an invalid maxPushDescriptors of 0
5555 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5556 return;
5557 }
5558
5559 // Create ordinary and push descriptor set layout
5560 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5561 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5562 ASSERT_TRUE(ds_layout.initialized());
5563 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5564 ASSERT_TRUE(push_ds_layout.initialized());
5565
5566 // Now use the descriptor set layouts to create a pipeline layout
5567 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5568 ASSERT_TRUE(pipeline_layout.initialized());
5569
5570 // Create a descriptor to push
5571 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5572 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5573 ASSERT_TRUE(buffer_obj.initialized());
5574
5575 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5576 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5577 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5578
5579 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5580 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5581
5582 // Find address of extension call and make the call
5583 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005584 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005585 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5586
5587 // Section 1: Queue family matching/capabilities.
5588 // Create command pool on a non-graphics queue
5589 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5590 const uint32_t transfer_only_qfi =
5591 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5592 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005593 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005594 } else {
5595 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5596
5597 VkCommandPoolObj command_pool(m_device, err_qfi);
5598 ASSERT_TRUE(command_pool.initialized());
5599 VkCommandBufferObj command_buffer(m_device, &command_pool);
5600 ASSERT_TRUE(command_buffer.initialized());
5601 command_buffer.begin();
5602
Mark Lobodzinski20310782020-02-28 14:25:17 -07005603 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5604 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005605 if (err_qfi == transfer_only_qfi) {
5606 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005607 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005608 }
5609 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5610 &descriptor_write);
5611 m_errorMonitor->VerifyFound();
5612 command_buffer.end();
5613
5614 // If we succeed in testing only one condition above, we need to test the other below.
5615 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5616 // Need to test the neither compute/gfx supported case separately.
5617 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5618 ASSERT_TRUE(tran_command_pool.initialized());
5619 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5620 ASSERT_TRUE(tran_command_buffer.initialized());
5621 tran_command_buffer.begin();
5622
5623 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005624 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5626 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005627 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5628 &descriptor_write);
5629 m_errorMonitor->VerifyFound();
5630 tran_command_buffer.end();
5631 }
5632 }
5633
5634 // Push to the non-push binding
5635 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005636 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005637 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5638 &descriptor_write);
5639 m_errorMonitor->VerifyFound();
5640
5641 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005642 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005643 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5644 &descriptor_write);
5645 m_errorMonitor->VerifyFound();
5646 m_commandBuffer->end();
5647
5648 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5649 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005650 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005651 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR()");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005653 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5654 &descriptor_write);
5655 m_errorMonitor->VerifyFound();
5656}
5657
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005658TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5659 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5660 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5661 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5662 } else {
5663 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5664 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5665 return;
5666 }
5667
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005668 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005669 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5670 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5671 } else {
5672 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5673 return;
5674 }
5675 ASSERT_NO_FATAL_FAILURE(InitState());
5676
5677 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5678 if (push_descriptor_prop.maxPushDescriptors < 1) {
5679 // Some implementations report an invalid maxPushDescriptors of 0.
5680 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5681 return;
5682 }
5683
5684 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5685 if (min_alignment == 0) {
5686 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5687 return;
5688 }
5689
5690 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5691 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5692 ASSERT_TRUE(push_ds_layout.initialized());
5693
5694 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5695 ASSERT_TRUE(pipeline_layout.initialized());
5696
5697 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5698 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5699 ASSERT_TRUE(buffer_obj.initialized());
5700
5701 // Use an invalid alignment.
5702 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5703 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5704 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5705
5706 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5707 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5708 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5709
5710 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005712 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5713 &descriptor_write);
5714 m_errorMonitor->VerifyFound();
5715
5716 m_commandBuffer->end();
5717}
5718
unknown088160a2019-05-23 17:43:13 -06005719TEST_F(VkLayerTest, SetDynScissorParamTests) {
5720 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5721
5722 VkPhysicalDeviceFeatures features{};
5723 ASSERT_NO_FATAL_FAILURE(Init(&features));
5724
5725 const VkRect2D scissor = {{0, 0}, {16, 16}};
5726 const VkRect2D scissors[] = {scissor, scissor};
5727
5728 m_commandBuffer->begin();
5729
5730 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005731 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005732 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005733 m_errorMonitor->VerifyFound();
5734
Mark Lobodzinski20310782020-02-28 14:25:17 -07005735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005736 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005737 m_errorMonitor->VerifyFound();
5738
Mark Lobodzinski20310782020-02-28 14:25:17 -07005739 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005740 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005741 m_errorMonitor->VerifyFound();
5742
Mark Lobodzinski20310782020-02-28 14:25:17 -07005743 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5744 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005745 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005746 m_errorMonitor->VerifyFound();
5747
Mark Lobodzinski20310782020-02-28 14:25:17 -07005748 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005749 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005750 m_errorMonitor->VerifyFound();
5751
5752 struct TestCase {
5753 VkRect2D scissor;
5754 std::string vuid;
5755 };
5756
5757 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5758 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5759 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5760 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5761 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5762 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5763 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5764 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5765
5766 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005768 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005769 m_errorMonitor->VerifyFound();
5770 }
5771
5772 m_commandBuffer->end();
5773}
5774
5775TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5776 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5777
5778 ASSERT_NO_FATAL_FAILURE(Init());
5779
5780 if (!m_device->phy().features().multiViewport) {
5781 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5782 return;
5783 }
5784
unknown088160a2019-05-23 17:43:13 -06005785 m_commandBuffer->begin();
5786
Mark Lobodzinski20310782020-02-28 14:25:17 -07005787 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005788 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005789 m_errorMonitor->VerifyFound();
5790
Petr Kraus14e49492019-09-09 20:13:29 +02005791 const auto max_scissors = m_device->props.limits.maxViewports;
5792
Mark Lobodzinski20310782020-02-28 14:25:17 -07005793 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005794 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005795 m_errorMonitor->VerifyFound();
5796
Petr Kraus14e49492019-09-09 20:13:29 +02005797 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5798 if (max_scissors >= too_big_max_scissors) {
5799 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5800 kSkipPrefix);
5801 } else {
5802 const VkRect2D scissor = {{0, 0}, {16, 16}};
5803 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5804
Mark Lobodzinski20310782020-02-28 14:25:17 -07005805 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005806 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005807 m_errorMonitor->VerifyFound();
5808
Mark Lobodzinski20310782020-02-28 14:25:17 -07005809 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005810 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005811 m_errorMonitor->VerifyFound();
5812
Mark Lobodzinski20310782020-02-28 14:25:17 -07005813 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005814 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005815 m_errorMonitor->VerifyFound();
5816
Mark Lobodzinski20310782020-02-28 14:25:17 -07005817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005818 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005819 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005820 }
unknown088160a2019-05-23 17:43:13 -06005821}
5822
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005823TEST_F(VkLayerTest, IndirectDrawTests) {
5824 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06005825
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005826 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5827 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5828 } else {
5829 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5830 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5831 return;
5832 }
5833 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5834
5835 if (IsPlatform(kMockICD) || DeviceSimulation()) {
5836 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
5837 return;
5838 }
5839
5840 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
5841 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
5842 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
5843
5844 // Create a device and ensure multiDrawIndirect is disabled
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005845 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
5846 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005847 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
5848 features2.features.multiDrawIndirect = VK_FALSE;
5849
5850 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
unknown088160a2019-05-23 17:43:13 -06005851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5852
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005853 CreatePipelineHelper pipe(*this);
5854 pipe.InitInfo();
5855 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5856 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5857 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5858 dyn_state_ci.dynamicStateCount = size(dyn_states);
5859 dyn_state_ci.pDynamicStates = dyn_states;
5860 pipe.dyn_state_ci_ = dyn_state_ci;
5861 pipe.InitState();
5862 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005863
5864 m_commandBuffer->begin();
5865 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5866
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005867 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5868 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5869 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005870
5871 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005872 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005873 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005874 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005875
5876 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5877 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5878 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005879 VkBufferObj draw_buffer;
5880 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005881
5882 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07005883 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005884 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005885 m_errorMonitor->VerifyFound();
5886
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005887 // VUID-vkCmdDrawIndirect-drawCount-02718
5888 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-02718");
5889 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
5890 m_errorMonitor->VerifyFound();
5891
5892 // VUID-vkCmdDrawIndexedIndirect-drawCount-02718
5893 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-02718");
5894 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
5895 m_errorMonitor->VerifyFound();
5896
unknown088160a2019-05-23 17:43:13 -06005897 m_commandBuffer->EndRenderPass();
5898 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06005899}
5900
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005901TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
5902 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
5903
5904 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5905 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5906 } else {
5907 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5908 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5909 return;
5910 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005911 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005912
5913 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
5914 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5915 } else {
5916 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07005917 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005918 }
5919
5920 ASSERT_NO_FATAL_FAILURE(InitState());
5921 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5922
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005923 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
5924 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005925 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
5926
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005927 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
5928 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
5929
5930 m_commandBuffer->begin();
5931 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5932 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5933 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5934 buffer_create_info.size = 1024;
5935 VkBufferObj counter_buffer;
5936 counter_buffer.init(*m_device, buffer_create_info);
5937
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005938 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07005939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005940 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005941 m_errorMonitor->VerifyFound();
5942
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005943 // some mock ICD json files are missing a valid stride value
5944 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
5945 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08005946 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005947 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
5948 m_errorMonitor->VerifyFound();
5949 }
5950
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005951 m_commandBuffer->EndRenderPass();
5952 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07005953
5954 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
5955 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
5956 return;
5957 }
5958
5959 std::vector<const char *> device_extension_names;
5960 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5961 VkDeviceObj test_device(0, gpu(), device_extension_names);
5962 VkCommandPoolObj commandPool(&test_device, 0);
5963 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
5964 VkBufferObj counter_buffer2;
5965 counter_buffer2.init(test_device, buffer_create_info);
5966 VkPipelineLayoutObj pipelineLayout(&test_device);
5967 VkRenderPass renderpass;
5968 VkRenderPassCreateInfo rp_info = {};
5969 VkSubpassDescription subpass = {};
5970 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5971 rp_info.pSubpasses = &subpass;
5972 rp_info.subpassCount = 1;
5973 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
5974 VkPipelineObj pipeline(&test_device);
5975 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
5976 pipeline.AddShader(&vs);
5977 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
5978 m_renderPassBeginInfo.renderPass = renderpass;
5979 VkFramebuffer fb;
5980 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
5981 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
5982 m_renderPassBeginInfo.framebuffer = fb;
5983 m_renderPassBeginInfo.renderPass = renderpass;
5984 commandBuffer.begin();
5985 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5986 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
5987 VkRect2D scissor = {{0, 0}, {16, 16}};
5988 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
5989 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
5990 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
5991 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08005992 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07005993 }
5994 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
5995 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
5996 m_errorMonitor->VerifyFound();
5997 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
5998 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005999}
6000
unknown088160a2019-05-23 17:43:13 -06006001TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6002 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6003
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006004 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006005 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6006 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6007 } else {
6008 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6009 return;
6010 }
6011 ASSERT_NO_FATAL_FAILURE(InitState());
6012 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6013
6014 VkMemoryRequirements memory_requirements;
6015 VkMemoryAllocateInfo memory_allocate_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
6016
6017 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006018 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006019
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006020 CreatePipelineHelper pipe(*this);
6021 pipe.InitInfo();
6022 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6023 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6024 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6025 dyn_state_ci.dynamicStateCount = size(dyn_states);
6026 dyn_state_ci.pDynamicStates = dyn_states;
6027 pipe.dyn_state_ci_ = dyn_state_ci;
6028 pipe.InitState();
6029 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006030
6031 m_commandBuffer->begin();
6032 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6033
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006034 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6035 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6036 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006037
6038 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006039 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006040 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006041 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006042
6043 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6044 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6045 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6046 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006047 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06006048
6049 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6050 count_buffer_create_info.size = sizeof(uint32_t);
6051 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006052 VkBufferObj count_buffer;
6053 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006054
Mike Schuchardt65847d92019-12-20 13:50:47 -08006055 // VUID-vkCmdDrawIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006056 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006057 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
6058 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006059 m_errorMonitor->VerifyFound();
6060
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006061 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06006062 memory_allocate_info.allocationSize = memory_requirements.size;
6063 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6064 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006065 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
6066 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006067
6068 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006069 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006070
Mike Schuchardt65847d92019-12-20 13:50:47 -08006071 // VUID-vkCmdDrawIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006072 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06006073 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
6074 m_errorMonitor->VerifyFound();
6075
Mike Schuchardt65847d92019-12-20 13:50:47 -08006076 // VUID-vkCmdDrawIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006077 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006078 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
6079 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006080 m_errorMonitor->VerifyFound();
6081
Mike Schuchardt65847d92019-12-20 13:50:47 -08006082 // VUID-vkCmdDrawIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006084 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
6085 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006086 m_errorMonitor->VerifyFound();
6087
Mike Schuchardt65847d92019-12-20 13:50:47 -08006088 // VUID-vkCmdDrawIndirectCount-stride-03110
Mark Lobodzinski20310782020-02-28 14:25:17 -07006089 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006090 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006091 m_errorMonitor->VerifyFound();
6092
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006093 // 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 -06006094 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006095 // VUID-vkCmdDrawIndirectCount-renderPass-02684
6096 // VUID-vkCmdDrawIndirectCount-subpass-02685
6097 // VUID-vkCmdDrawIndirectCount-commandBuffer-02701
unknown088160a2019-05-23 17:43:13 -06006098
6099 m_commandBuffer->EndRenderPass();
6100 m_commandBuffer->end();
6101
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006102 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
6103 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006104
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006105 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006106}
6107
6108TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6109 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6110
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006111 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006112 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6113 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6114 } else {
6115 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6116 return;
6117 }
6118 ASSERT_NO_FATAL_FAILURE(InitState());
6119 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6120
unknown088160a2019-05-23 17:43:13 -06006121 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006122 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006123
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006124 CreatePipelineHelper pipe(*this);
6125 pipe.InitInfo();
6126 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6127 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6128 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6129 dyn_state_ci.dynamicStateCount = size(dyn_states);
6130 dyn_state_ci.pDynamicStates = dyn_states;
6131 pipe.dyn_state_ci_ = dyn_state_ci;
6132 pipe.InitState();
6133 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006134
6135 m_commandBuffer->begin();
6136 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6137
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006138 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6139 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6140 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006141
6142 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006143 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006144 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006145 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006146
6147 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6148 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6149 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006150 VkBufferObj draw_buffer;
6151 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006152
6153 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6154 count_buffer_create_info.size = sizeof(uint32_t);
6155 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006156 VkBufferObj count_buffer;
6157 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006158
6159 VkBufferCreateInfo index_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6160 index_buffer_create_info.size = sizeof(uint32_t);
6161 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006162 VkBufferObj index_buffer;
6163 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006164
Mike Schuchardt65847d92019-12-20 13:50:47 -08006165 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial - only tests whether the index buffer is bound)
Mark Lobodzinski20310782020-02-28 14:25:17 -07006166 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006167 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006168 sizeof(VkDrawIndexedIndirectCommand));
6169 m_errorMonitor->VerifyFound();
6170
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006171 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006172
6173 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006174 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006175
Mike Schuchardt65847d92019-12-20 13:50:47 -08006176 // VUID-vkCmdDrawIndexedIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006177 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006178 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006179 sizeof(VkDrawIndexedIndirectCommand));
6180 m_errorMonitor->VerifyFound();
6181
6182 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006183 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006184
Mike Schuchardt65847d92019-12-20 13:50:47 -08006185 // VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006186 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006187 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06006188 sizeof(VkDrawIndexedIndirectCommand));
6189 m_errorMonitor->VerifyFound();
6190
Mike Schuchardt65847d92019-12-20 13:50:47 -08006191 // VUID-vkCmdDrawIndexedIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006192 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006193 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006194 sizeof(VkDrawIndexedIndirectCommand));
6195 m_errorMonitor->VerifyFound();
6196
Mike Schuchardt65847d92019-12-20 13:50:47 -08006197 // VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006198 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006199 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006200 sizeof(VkDrawIndexedIndirectCommand));
6201 m_errorMonitor->VerifyFound();
6202
Mike Schuchardt65847d92019-12-20 13:50:47 -08006203 // VUID-vkCmdDrawIndexedIndirectCount-stride-03142
Mark Lobodzinski20310782020-02-28 14:25:17 -07006204 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006205 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006206 m_errorMonitor->VerifyFound();
6207
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006208 // 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 -06006209 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006210 // VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684
6211 // VUID-vkCmdDrawIndexedIndirectCount-subpass-02685
6212 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial)
unknown088160a2019-05-23 17:43:13 -06006213
6214 m_commandBuffer->EndRenderPass();
6215 m_commandBuffer->end();
6216
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006217 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
6218 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006219}
6220
sfricke-samsung860d3b22020-05-04 21:08:29 -07006221TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6222 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6223
6224 SetTargetApiVersion(VK_API_VERSION_1_2);
6225 ASSERT_NO_FATAL_FAILURE(Init());
6226 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6227 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
6228 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
6229 return;
6230 }
6231
6232 VkBufferObj indirect_buffer;
6233 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6234 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6235
6236 VkBufferObj indexed_indirect_buffer;
6237 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6238 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6239
6240 VkBufferObj count_buffer;
6241 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6242
6243 VkBufferObj index_buffer;
6244 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6245
6246 CreatePipelineHelper pipe(*this);
6247 pipe.InitInfo();
6248 pipe.InitState();
6249 pipe.CreateGraphicsPipeline();
6250
6251 // Make calls to valid commands but without the drawIndirectCount feature set
6252 m_commandBuffer->begin();
6253 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6254
6255 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6256
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006257 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006258 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6259 sizeof(VkDrawIndirectCommand));
6260 m_errorMonitor->VerifyFound();
6261
6262 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6263
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006264 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006265 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6266 sizeof(VkDrawIndexedIndirectCommand));
6267 m_errorMonitor->VerifyFound();
6268
6269 m_commandBuffer->EndRenderPass();
6270 m_commandBuffer->end();
6271}
6272
unknown088160a2019-05-23 17:43:13 -06006273TEST_F(VkLayerTest, ExclusiveScissorNV) {
6274 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6275
6276 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6277 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6278 } else {
6279 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6280 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6281 return;
6282 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006283 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006284 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6285 for (auto device_extension : required_device_extensions) {
6286 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6287 m_device_extension_names.push_back(device_extension);
6288 } else {
6289 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6290 return;
6291 }
6292 }
6293
6294 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006295 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006296 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6297
6298 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006299 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6300 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006301 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6302
6303 features2.features.multiViewport = VK_FALSE;
6304
6305 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6307
6308 if (m_device->phy().properties().limits.maxViewports) {
6309 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6310 return;
6311 }
6312
6313 // Based on PSOViewportStateTests
6314 {
6315 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6316 VkViewport viewports[] = {viewport, viewport};
6317 VkRect2D scissor = {{0, 0}, {64, 64}};
6318 VkRect2D scissors[100] = {scissor, scissor};
6319
6320 using std::vector;
6321 struct TestCase {
6322 uint32_t viewport_count;
6323 VkViewport *viewports;
6324 uint32_t scissor_count;
6325 VkRect2D *scissors;
6326 uint32_t exclusive_scissor_count;
6327 VkRect2D *exclusive_scissors;
6328
6329 vector<std::string> vuids;
6330 };
6331
6332 vector<TestCase> test_cases = {
6333 {1,
6334 viewports,
6335 1,
6336 scissors,
6337 2,
6338 scissors,
6339 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6340 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6341 {1,
6342 viewports,
6343 1,
6344 scissors,
6345 100,
6346 scissors,
6347 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6348 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6349 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006350 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006351 };
6352
6353 for (const auto &test_case : test_cases) {
6354 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc = {
6355 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV};
6356
6357 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6358 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6359 helper.vp_state_ci_.pViewports = test_case.viewports;
6360 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6361 helper.vp_state_ci_.pScissors = test_case.scissors;
6362 helper.vp_state_ci_.pNext = &exc;
6363
6364 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6365 exc.pExclusiveScissors = test_case.exclusive_scissors;
6366 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006367 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006368 }
6369 }
6370
6371 // Based on SetDynScissorParamTests
6372 {
6373 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006374 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006375
6376 const VkRect2D scissor = {{0, 0}, {16, 16}};
6377 const VkRect2D scissors[] = {scissor, scissor};
6378
6379 m_commandBuffer->begin();
6380
Mark Lobodzinski20310782020-02-28 14:25:17 -07006381 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006382 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6383 m_errorMonitor->VerifyFound();
6384
Mark Lobodzinski20310782020-02-28 14:25:17 -07006385 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006386 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6387 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6388 m_errorMonitor->VerifyFound();
6389
Mark Lobodzinski20310782020-02-28 14:25:17 -07006390 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006391 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6392 m_errorMonitor->VerifyFound();
6393
Mark Lobodzinski20310782020-02-28 14:25:17 -07006394 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006395 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006396 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006397 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6398 m_errorMonitor->VerifyFound();
6399
Mark Lobodzinski20310782020-02-28 14:25:17 -07006400 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6401 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006402 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6403 m_errorMonitor->VerifyFound();
6404
Mark Lobodzinski20310782020-02-28 14:25:17 -07006405 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006406 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6407 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6408 m_errorMonitor->VerifyFound();
6409
6410 struct TestCase {
6411 VkRect2D scissor;
6412 std::string vuid;
6413 };
6414
6415 std::vector<TestCase> test_cases = {
6416 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6417 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6418 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6419 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6420 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6421 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6422 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6423 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6424
6425 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006426 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006427 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6428 m_errorMonitor->VerifyFound();
6429 }
6430
6431 m_commandBuffer->end();
6432 }
6433}
6434
6435TEST_F(VkLayerTest, MeshShaderNV) {
6436 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6437
6438 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6439 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6440 } else {
6441 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6442 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6443 return;
6444 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006445 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006446 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
6447 for (auto device_extension : required_device_extensions) {
6448 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6449 m_device_extension_names.push_back(device_extension);
6450 } else {
6451 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6452 return;
6453 }
6454 }
6455
Tony-LunarG048f5012020-04-29 16:55:11 -06006456 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006457 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6458 return;
6459 }
6460
6461 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006462 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006463 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6464
6465 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006466 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6467 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006468 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6469 features2.features.multiDrawIndirect = VK_FALSE;
6470
6471 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6472 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6473
6474 static const char vertShaderText[] =
6475 "#version 450\n"
6476 "vec2 vertices[3];\n"
6477 "void main() {\n"
6478 " vertices[0] = vec2(-1.0, -1.0);\n"
6479 " vertices[1] = vec2( 1.0, -1.0);\n"
6480 " vertices[2] = vec2( 0.0, 1.0);\n"
6481 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
6482 " gl_PointSize = 1.0f;\n"
6483 "}\n";
6484
6485 static const char meshShaderText[] =
6486 "#version 450\n"
6487 "#extension GL_NV_mesh_shader : require\n"
6488 "layout(local_size_x = 1) in;\n"
6489 "layout(max_vertices = 3) out;\n"
6490 "layout(max_primitives = 1) out;\n"
6491 "layout(triangles) out;\n"
6492 "void main() {\n"
6493 " gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);\n"
6494 " gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);\n"
6495 " gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);\n"
6496 " gl_PrimitiveIndicesNV[0] = 0;\n"
6497 " gl_PrimitiveIndicesNV[1] = 1;\n"
6498 " gl_PrimitiveIndicesNV[2] = 2;\n"
6499 " gl_PrimitiveCountNV = 1;\n"
6500 "}\n";
6501
6502 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6503 VkShaderObj ms(m_device, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV, this);
6504 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6505
6506 // Test pipeline creation
6507 {
6508 // can't mix mesh with vertex
6509 const auto break_vp = [&](CreatePipelineHelper &helper) {
6510 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6511 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006512 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006513 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6514
6515 // vertex or mesh must be present
6516 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006517 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006518 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6519
6520 // vertexinput and inputassembly must be valid when vertex stage is present
6521 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6522 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6523 helper.gp_ci_.pVertexInputState = nullptr;
6524 helper.gp_ci_.pInputAssemblyState = nullptr;
6525 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006526 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006527 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6528 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6529 }
6530
6531 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006532 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006533
6534 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6535 buffer_create_info.size = sizeof(uint32_t);
6536 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6537 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006538 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006539 ASSERT_VK_SUCCESS(result);
6540
6541 m_commandBuffer->begin();
6542
Mark Lobodzinski20310782020-02-28 14:25:17 -07006543 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6544 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006545 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6546 m_errorMonitor->VerifyFound();
6547
6548 m_commandBuffer->end();
6549
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006550 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006551}
6552
6553TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6554 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
6555 ASSERT_NO_FATAL_FAILURE(Init());
6556 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6557
6558 VkEvent event;
6559 VkEventCreateInfo event_create_info{};
6560 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006561 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006562
6563 m_commandBuffer->begin();
6564
Shannon McPherson93970b12020-06-12 14:34:35 -06006565 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006566 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006567 m_errorMonitor->VerifyFound();
6568
Shannon McPherson93970b12020-06-12 14:34:35 -06006569 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006570 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006571 m_errorMonitor->VerifyFound();
6572
Shannon McPherson93970b12020-06-12 14:34:35 -06006573 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006574 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006575 m_errorMonitor->VerifyFound();
6576
Shannon McPherson93970b12020-06-12 14:34:35 -06006577 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006578 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006579 m_errorMonitor->VerifyFound();
6580
Shannon McPherson93970b12020-06-12 14:34:35 -06006581 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6582 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006583 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6584 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006585 m_errorMonitor->VerifyFound();
6586
Shannon McPherson93970b12020-06-12 14:34:35 -06006587 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6588 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006589 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6590 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006591 m_errorMonitor->VerifyFound();
6592
Shannon McPherson93970b12020-06-12 14:34:35 -06006593 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6594 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006595 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6596 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006597 m_errorMonitor->VerifyFound();
6598
Shannon McPherson93970b12020-06-12 14:34:35 -06006599 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6600 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006601 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6602 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006603 m_errorMonitor->VerifyFound();
6604
6605 m_commandBuffer->end();
6606
6607 VkSemaphoreCreateInfo semaphore_create_info = {};
6608 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6609 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006610 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006611
6612 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
6613 VkSubmitInfo submit_info = {};
6614
6615 // Signal the semaphore so the next test can wait on it.
6616 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6617 submit_info.signalSemaphoreCount = 1;
6618 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006619 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006620 m_errorMonitor->VerifyNotFound();
6621
6622 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6623 submit_info.signalSemaphoreCount = 0;
6624 submit_info.pSignalSemaphores = nullptr;
6625 submit_info.waitSemaphoreCount = 1;
6626 submit_info.pWaitSemaphores = &semaphore;
6627 submit_info.pWaitDstStageMask = &stage_flags;
6628
Mark Lobodzinski20310782020-02-28 14:25:17 -07006629 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02089");
6630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02090");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006631 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006632 m_errorMonitor->VerifyFound();
6633
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006634 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006635
6636 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6637 VkPipelineShaderStageCreateInfo meshStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6638 meshStage = vs.GetStageCreateInfo();
6639 meshStage.stage = VK_SHADER_STAGE_MESH_BIT_NV;
6640 VkPipelineShaderStageCreateInfo taskStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6641 taskStage = vs.GetStageCreateInfo();
6642 taskStage.stage = VK_SHADER_STAGE_TASK_BIT_NV;
6643
6644 // mesh and task shaders not supported
6645 const auto break_vp = [&](CreatePipelineHelper &helper) {
6646 helper.shader_stages_ = {meshStage, taskStage, vs.GetStageCreateInfo()};
6647 };
6648 CreatePipelineHelper::OneshotTest(
Mark Lobodzinski20310782020-02-28 14:25:17 -07006649 *this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006650 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "VUID-VkPipelineShaderStageCreateInfo-pName-00707",
6651 "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6652 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
6653
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006654 vk::DestroyEvent(m_device->device(), event, nullptr);
6655 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006656}
Chris Mayerc93536f2019-09-19 16:34:49 +02006657
6658TEST_F(VkLayerTest, ViewportWScalingNV) {
6659 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6660
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006661 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006662
6663 VkPhysicalDeviceFeatures device_features = {};
6664 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6665
6666 if (!device_features.multiViewport) {
6667 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6668 return;
6669 }
6670
6671 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6672 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6673 } else {
6674 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6675 return;
6676 }
6677
6678 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6679 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6680
6681 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006682 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006683
6684 const char vs_src[] = R"(
6685 #version 450
6686 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6687 vec2( 1.0f, 1.0f),
6688 vec2(-1.0f, -1.0f),
6689 vec2( 1.0f, -1.0f) };
6690 out gl_PerVertex {
6691 vec4 gl_Position;
6692 };
6693
6694 void main() {
6695 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
6696 })";
6697
6698 const char fs_src[] = R"(
6699 #version 450
6700 layout(location = 0) out vec4 outColor;
6701
6702 void main() {
6703 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
6704 })";
6705
6706 const std::vector<VkViewport> vp = {
6707 {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}};
6708 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6709 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6710
6711 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6712
6713 VkPipelineViewportWScalingStateCreateInfoNV vpsi = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV};
6714 vpsi.viewportWScalingEnable = VK_TRUE;
6715 vpsi.viewportCount = vp_count;
6716 vpsi.pViewportWScalings = scale.data();
6717
6718 VkPipelineViewportStateCreateInfo vpci = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO};
6719 vpci.viewportCount = vp_count;
6720 vpci.pViewports = vp.data();
6721 vpci.scissorCount = vp_count;
6722 vpci.pScissors = sc.data();
6723 vpci.pNext = &vpsi;
6724
6725 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6726
6727 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006728 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006729
6730 // Create pipeline with w-scaling enabled but without a valid scaling array
6731 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006732 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006733 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6734
6735 vpsi.pViewportWScalings = scale.data();
6736
6737 // Create pipeline with w-scaling enabled but without matching viewport counts
6738 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006739 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006740 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6741
6742 const VkPipelineLayoutObj pl(m_device);
6743
6744 VkShaderObj vs(m_device, vs_src, VK_SHADER_STAGE_VERTEX_BIT, this);
6745 VkShaderObj fs(m_device, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6746
6747 VkPipelineObj pipe(m_device);
6748 pipe.AddDefaultColorAttachment();
6749 pipe.AddShader(&vs);
6750 pipe.AddShader(&fs);
6751 pipe.SetViewport(vp);
6752 pipe.SetScissor(sc);
6753 pipe.CreateVKPipeline(pl.handle(), renderPass());
6754
6755 VkPipelineObj pipeDynWScale(m_device);
6756 pipeDynWScale.AddDefaultColorAttachment();
6757 pipeDynWScale.AddShader(&vs);
6758 pipeDynWScale.AddShader(&fs);
6759 pipeDynWScale.SetViewport(vp);
6760 pipeDynWScale.SetScissor(sc);
6761 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6762 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6763
6764 m_commandBuffer->begin();
6765
6766 // Bind pipeline without dynamic w scaling enabled
6767 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006768 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006769 m_errorMonitor->VerifyNotFound();
6770
Chris Mayerc93536f2019-09-19 16:34:49 +02006771 // Bind pipeline that has dynamic w-scaling enabled
6772 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006773 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006774 m_errorMonitor->VerifyNotFound();
6775
6776 const auto max_vps = m_device->props.limits.maxViewports;
6777
Mark Lobodzinski20310782020-02-28 14:25:17 -07006778 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006779 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6780 m_errorMonitor->VerifyFound();
6781
6782 m_errorMonitor->ExpectSuccess();
6783 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6784 m_errorMonitor->VerifyNotFound();
6785
6786 m_commandBuffer->end();
6787}
sfricke-samsung914e8002020-01-07 22:26:18 -08006788
6789TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6790 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6791
6792 // Enable Sampler YCbCr Conversion req'd extensions
6793 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6794 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6795 if (mp_extensions) {
6796 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6797 }
6798 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006799 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sfricke-samsung914e8002020-01-07 22:26:18 -08006800 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6801 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6802 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6803 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6804 if (mp_extensions) {
6805 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6806 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6807 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6808 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6809 } else {
6810 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6811 return;
6812 }
6813
6814 // Explictly not enable Ycbcr Conversion Features
6815 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {};
6816 ycbcr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
6817 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6818 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6819
6820 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6821 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6822 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6823 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6824 return;
6825 }
6826
6827 // Create Ycbcr conversion
6828 VkSamplerYcbcrConversion conversions;
6829 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6830 NULL,
6831 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6832 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6833 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6834 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6835 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6836 VK_CHROMA_LOCATION_COSITED_EVEN,
6837 VK_CHROMA_LOCATION_COSITED_EVEN,
6838 VK_FILTER_NEAREST,
6839 false};
6840
Mark Lobodzinski20310782020-02-28 14:25:17 -07006841 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006842 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6843 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006844}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006845
6846TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6847 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6848
6849 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6850 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6851 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6852 return;
6853 }
6854 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6855
6856 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6857
6858 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6859 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6860 return;
6861 }
6862 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6863
6864 {
6865 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6866 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6867 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6868
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006869 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6870 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006871 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6872
6873 if (!tf_features.transformFeedback) {
6874 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6875 return;
6876 }
6877 }
6878
6879 ASSERT_NO_FATAL_FAILURE(InitState());
6880 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6881
6882 {
6883 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
6884 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6885 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6886
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006887 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006888 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6889 info.size = 4;
6890 VkBufferObj buffer;
6891 buffer.init(*m_device, info);
6892 VkDeviceSize offsets[1]{};
6893
6894 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
6895 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
6896 m_errorMonitor->VerifyFound();
6897 }
6898
6899 {
6900 auto vkCmdBeginTransformFeedbackEXT =
6901 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6902 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6903
6904 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
6905 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6906 m_errorMonitor->VerifyFound();
6907 }
6908
6909 {
6910 auto vkCmdEndTransformFeedbackEXT =
6911 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6912 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6913
6914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
6915 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
6916 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6917 m_errorMonitor->VerifyFound();
6918 }
6919}
6920
6921TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
6922 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
6923
6924 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6925 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6926 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6927 return;
6928 }
6929 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6930
6931 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6932
6933 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6934 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6935 return;
6936 }
6937 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6938
6939 {
6940 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6941 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6942 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6943
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006944 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6945 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006946 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6947
6948 if (!tf_features.transformFeedback) {
6949 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6950 return;
6951 }
6952
6953 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6954 }
6955
6956 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6957
6958 auto vkCmdBindTransformFeedbackBuffersEXT =
6959 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6960 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6961
6962 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006963 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6964 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006965 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6966
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006967 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006968 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6969 info.size = 8;
6970 VkBufferObj const buffer_obj(*m_device, info);
6971
6972 // Request a firstBinding that is too large.
6973 {
6974 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
6975 VkDeviceSize const offsets[1]{};
6976
6977 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
6978 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6979 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
6980 nullptr);
6981 m_errorMonitor->VerifyFound();
6982 }
6983
6984 // Request too many bindings.
6985 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
6986 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
6987 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
6988
6989 std::vector<VkDeviceSize> offsets(bindingCount);
6990
6991 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6992 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
6993 nullptr);
6994 m_errorMonitor->VerifyFound();
6995 }
6996
6997 // Request a size that is larger than the maximum size.
6998 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
6999 VkDeviceSize const offsets[1]{};
7000 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7001
7002 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7003 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7004 m_errorMonitor->VerifyFound();
7005 }
7006 }
7007
7008 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007009 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007010 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7011 info.size = 8;
7012 VkBufferObj const buffer_obj(*m_device, info);
7013
7014 // Request an offset that is too large.
7015 {
7016 VkDeviceSize const offsets[1]{info.size + 4};
7017
7018 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7019 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7020 m_errorMonitor->VerifyFound();
7021 }
7022
7023 // Request an offset that is not a multiple of 4.
7024 {
7025 VkDeviceSize const offsets[1]{1};
7026
7027 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7028 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7029 m_errorMonitor->VerifyFound();
7030 }
7031
7032 // Request a size that is larger than the buffer's size.
7033 {
7034 VkDeviceSize const offsets[1]{};
7035 VkDeviceSize const sizes[1]{info.size + 1};
7036
7037 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007038 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7039 m_errorMonitor->VerifyFound();
7040 }
7041
7042 // Request an offset and size whose sum is larger than the buffer's size.
7043 {
7044 VkDeviceSize const offsets[1]{4};
7045 VkDeviceSize const sizes[1]{info.size - 3};
7046
7047 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7048 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7049 m_errorMonitor->VerifyFound();
7050 }
7051
7052 // Bind while transform feedback is active.
7053 {
7054 auto vkCmdBeginTransformFeedbackEXT =
7055 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7056 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7057 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7058
7059 VkDeviceSize const offsets[1]{};
7060
7061 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7062 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7063 m_errorMonitor->VerifyFound();
7064
7065 auto vkCmdEndTransformFeedbackEXT =
7066 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7067 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7068 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7069 }
7070 }
7071
7072 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7073 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007074 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007075 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7076 info.size = 4;
7077 VkBufferObj const buffer_obj(*m_device, info);
7078
7079 VkDeviceSize const offsets[1]{};
7080
7081 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7082 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7083 m_errorMonitor->VerifyFound();
7084 }
7085
7086 // Don't bind memory.
7087 {
7088 VkBuffer buffer{};
7089 {
7090 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
7091 ASSERT_TRUE(vkCreateBuffer != nullptr);
7092
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007093 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007094 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7095 info.size = 4;
7096 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
7097 }
7098
7099 VkDeviceSize const offsets[1]{};
7100
7101 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
7102 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
7103 m_errorMonitor->VerifyFound();
7104 }
7105}
7106
7107TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7108 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7109
7110 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7111 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7112 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7113 return;
7114 }
7115 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7116
7117 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7118
7119 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7120 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7121 return;
7122 }
7123 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7124
7125 {
7126 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7127 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7128 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7129
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007130 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7131 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007132 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7133
7134 if (!tf_features.transformFeedback) {
7135 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7136 return;
7137 }
7138
7139 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7140 }
7141
7142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7143
7144 auto vkCmdBeginTransformFeedbackEXT =
7145 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7146 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7147
7148 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007149 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7150 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007151 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7152
7153 // Request a firstCounterBuffer that is too large.
7154 {
7155 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7156
7157 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7158 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7159 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7160 m_errorMonitor->VerifyFound();
7161 }
7162
7163 // Request too many buffers.
7164 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7165 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7166
7167 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7168 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7169 m_errorMonitor->VerifyFound();
7170 }
7171 }
7172
7173 // Request an out-of-bounds location.
7174 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007175 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007176 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7177 info.size = 4;
7178 VkBufferObj const buffer_obj(*m_device, info);
7179
7180 VkDeviceSize const offsets[1]{1};
7181
7182 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7183 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7184 m_errorMonitor->VerifyFound();
7185 }
7186
7187 // Request specific offsets without specifying buffers.
7188 {
7189 VkDeviceSize const offsets[1]{};
7190
7191 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7192 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7193 m_errorMonitor->VerifyFound();
7194 }
7195
7196 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7197 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007198 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007199 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7200 info.size = 4;
7201 VkBufferObj const buffer_obj(*m_device, info);
7202
7203 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7204 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7205 m_errorMonitor->VerifyFound();
7206 }
7207
7208 // Begin while transform feedback is active.
7209 {
7210 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7211
7212 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7213 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7214 m_errorMonitor->VerifyFound();
7215
7216 auto vkCmdEndTransformFeedbackEXT =
7217 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7218 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7219
7220 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7221 }
7222}
7223
7224TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7225 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7226
7227 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7228 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7229 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7230 return;
7231 }
7232 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7233
7234 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7235
7236 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7237 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7238 return;
7239 }
7240 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7241
7242 {
7243 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7244 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7245 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7246
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007247 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7248 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007249 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7250
7251 if (!tf_features.transformFeedback) {
7252 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7253 return;
7254 }
7255
7256 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7257 }
7258
7259 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7260
7261 auto vkCmdEndTransformFeedbackEXT =
7262 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7263 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7264
7265 {
7266 // Activate transform feedback.
7267 auto vkCmdBeginTransformFeedbackEXT =
7268 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7269 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7270 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7271
7272 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007273 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7274 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007275 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7276
7277 // Request a firstCounterBuffer that is too large.
7278 {
7279 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7280
7281 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7282 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7283 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7284 m_errorMonitor->VerifyFound();
7285 }
7286
7287 // Request too many buffers.
7288 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7289 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7290
7291 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7292 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7293 m_errorMonitor->VerifyFound();
7294 }
7295 }
7296
7297 // Request an out-of-bounds location.
7298 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007299 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007300 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7301 info.size = 4;
7302 VkBufferObj const buffer_obj(*m_device, info);
7303
7304 VkDeviceSize const offsets[1]{1};
7305
7306 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7307 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7308 m_errorMonitor->VerifyFound();
7309 }
7310
7311 // Request specific offsets without specifying buffers.
7312 {
7313 VkDeviceSize const offsets[1]{};
7314
7315 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7316 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7317 m_errorMonitor->VerifyFound();
7318 }
7319
7320 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7321 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007322 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007323 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7324 info.size = 4;
7325 VkBufferObj const buffer_obj(*m_device, info);
7326
7327 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7328 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7329 m_errorMonitor->VerifyFound();
7330 }
7331 }
7332
7333 // End while transform feedback is inactive.
7334 {
7335 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7336
7337 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7338 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7339 m_errorMonitor->VerifyFound();
7340 }
7341}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007342
sfricke-samsung39ee2442020-07-22 21:21:15 -07007343TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7344 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007345
7346 // protect memory added in VK 1.1
7347 SetTargetApiVersion(VK_API_VERSION_1_1);
7348
7349 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7350 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7351 } else {
7352 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7353 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7354 return;
7355 }
7356 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7357
7358 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7359 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7360 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7361
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007362 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7363 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007364 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7365
7366 if (protected_memory_features.protectedMemory == VK_FALSE) {
7367 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7368 return;
7369 };
7370
7371 // Turns m_commandBuffer into a protected command buffer
7372 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7373
7374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7375 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7376 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7377 return;
7378 }
7379
7380 VkBufferObj indirect_buffer;
7381 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7382 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7383
7384 VkBufferObj indexed_indirect_buffer;
7385 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7386 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7387
7388 VkBufferObj index_buffer;
7389 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7390
7391 CreatePipelineHelper pipe(*this);
7392 pipe.InitInfo();
7393 pipe.InitState();
7394 pipe.CreateGraphicsPipeline();
7395
sfricke-samsung39ee2442020-07-22 21:21:15 -07007396 VkQueryPool query_pool;
7397 VkQueryPoolCreateInfo query_pool_create_info{};
7398 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7399 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7400 query_pool_create_info.queryCount = 1;
7401 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7402
sfricke-samsung071af2d2020-07-02 10:37:22 -07007403 m_commandBuffer->begin();
7404 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7405
7406 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7407
7408 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7409 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7410 m_errorMonitor->VerifyFound();
7411
7412 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7413
7414 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7415 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7416 sizeof(VkDrawIndexedIndirectCommand));
7417 m_errorMonitor->VerifyFound();
7418
7419 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007420
7421 // Query should be outside renderpass
7422 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7423
7424 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7425 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7426 m_errorMonitor->VerifyFound();
7427
7428 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7429 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7430 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7431 m_errorMonitor->VerifyFound();
7432
sfricke-samsung071af2d2020-07-02 10:37:22 -07007433 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007434
7435 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007436}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007437
7438TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7439 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7440
7441 SetTargetApiVersion(VK_API_VERSION_1_1);
7442
7443 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7444 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7445 } else {
7446 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7447 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7448 return;
7449 }
7450 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7451
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007452 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7453 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7454 return;
7455 }
7456
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007457 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7458 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7459 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7460
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007461 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7462 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007463 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7464
7465 if (protected_memory_features.protectedMemory == VK_FALSE) {
7466 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7467 return;
7468 };
7469
7470 // Turns m_commandBuffer into a unprotected command buffer
7471 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7472
7473 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7474 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7475
7476 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7477 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7478 return;
7479 }
7480
7481 // Create actual protected and unprotected buffers
7482 VkBuffer buffer_protected = VK_NULL_HANDLE;
7483 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
7484 VkBufferCreateInfo buffer_create_info = {};
7485 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7486 buffer_create_info.pNext = nullptr;
7487 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007488 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7489 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7490 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007491 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7492
7493 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7494 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7495 buffer_create_info.flags = 0;
7496 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7497
7498 // Create actual protected and unprotected images
7499 VkImageObj image_protected(m_device);
7500 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007501 VkImageObj image_protected_descriptor(m_device);
7502 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007503 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007504 VkImageView image_views_descriptor[2];
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007505 VkImageCreateInfo image_create_info = {};
7506 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7507 image_create_info.pNext = nullptr;
7508 image_create_info.extent = {64, 64, 1};
7509 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
7510 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7511 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007512 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7513 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007514 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7515 image_create_info.arrayLayers = 1;
7516 image_create_info.mipLevels = 1;
7517
7518 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7519 image_protected.init_no_mem(*m_device, image_create_info);
7520 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007521 image_views[0] = image_protected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007522
locke-lunarg0de02522020-10-27 22:55:17 -06007523 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
7524 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7525 image_views_descriptor[0] = image_protected_descriptor.targetView(VK_FORMAT_R8G8B8A8_UNORM);
7526
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007527 image_create_info.flags = 0;
7528 image_unprotected.init_no_mem(*m_device, image_create_info);
7529 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007530 image_views[1] = image_unprotected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007531
locke-lunarg0de02522020-10-27 22:55:17 -06007532 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
7533 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7534 image_views_descriptor[1] = image_unprotected_descriptor.targetView(VK_FORMAT_R8G8B8A8_UNORM);
7535
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007536 // Create protected and unproteced memory
7537 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7538 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7539
7540 VkMemoryAllocateInfo alloc_info = {};
7541 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7542 alloc_info.pNext = nullptr;
7543 alloc_info.allocationSize = 0;
7544
7545 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7546 VkMemoryRequirements mem_reqs_protected;
7547 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7548 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7549 VkMemoryRequirements mem_reqs_unprotected;
7550 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7551 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7552
7553 // Get memory index for a protected and unprotected memory
7554 VkPhysicalDeviceMemoryProperties phys_mem_props;
7555 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7556 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7557 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7558 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7559 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7560 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7561 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7562 memory_type_unprotected = i;
7563 }
7564 // Check just protected bit is in type at all
7565 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7566 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7567 memory_type_protected = i;
7568 }
7569 }
7570 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7571 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7572 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7573 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7574 return;
7575 }
7576
7577 alloc_info.memoryTypeIndex = memory_type_protected;
7578 alloc_info.allocationSize = mem_reqs_protected.size;
7579 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7580
7581 alloc_info.allocationSize = mem_reqs_unprotected.size;
7582 alloc_info.memoryTypeIndex = memory_type_unprotected;
7583 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7584
7585 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7586 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7587 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7588 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
7589
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007590 // A renderpass and framebuffer that contains a protected and unprotected image view
7591 VkAttachmentDescription attachments[2] = {
7592 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7593 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7594 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7595 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7596 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7597 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7598 };
7599 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7600 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7601 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7602 VkSubpassDependency dependency = {0,
7603 0,
7604 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7605 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7606 VK_ACCESS_SHADER_WRITE_BIT,
7607 VK_ACCESS_SHADER_WRITE_BIT,
7608 VK_DEPENDENCY_BY_REGION_BIT};
7609 VkRenderPassCreateInfo render_pass_create_info = {
7610 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7611 VkRenderPass render_pass;
7612 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7613 VkFramebufferCreateInfo framebuffer_create_info = {
7614 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7615 VkFramebuffer framebuffer;
7616 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7617
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007618 // Various structs used for commands
7619 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7620 VkImageBlit blit_region = {};
7621 blit_region.srcSubresource = image_subresource;
7622 blit_region.dstSubresource = image_subresource;
7623 blit_region.srcOffsets[0] = {0, 0, 0};
7624 blit_region.srcOffsets[1] = {8, 8, 1};
7625 blit_region.dstOffsets[0] = {0, 8, 0};
7626 blit_region.dstOffsets[1] = {8, 8, 1};
7627 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7628 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7629 VkBufferCopy buffer_copy = {0, 0, 64};
7630 VkBufferImageCopy buffer_image_copy = {};
7631 buffer_image_copy.bufferRowLength = 0;
7632 buffer_image_copy.bufferImageHeight = 0;
7633 buffer_image_copy.imageSubresource = image_subresource;
7634 buffer_image_copy.imageOffset = {0, 0, 0};
7635 buffer_image_copy.imageExtent = {1, 1, 1};
7636 buffer_image_copy.bufferOffset = 0;
7637 VkImageCopy image_copy = {};
7638 image_copy.srcSubresource = image_subresource;
7639 image_copy.srcOffset = {0, 0, 0};
7640 image_copy.dstSubresource = image_subresource;
7641 image_copy.dstOffset = {0, 0, 0};
7642 image_copy.extent = {1, 1, 1};
7643 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007644 VkRect2D render_area = {{0, 0}, {8, 8}};
7645 VkRenderPassBeginInfo render_pass_begin = {
7646 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7647 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7648 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7649 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007650
locke-lunarg0de02522020-10-27 22:55:17 -06007651 const char fsSource[] =
7652 "#version 450\n"
7653 "layout(set=0, binding=0) uniform foo { int x; int y; } bar;\n"
7654 "layout(set=0, binding=1, rgba8) uniform image2D si1;\n"
7655 "layout(location=0) out vec4 x;\n"
7656 "void main(){\n"
7657 " x = vec4(bar.y);\n"
7658 " imageStore(si1, ivec2(0), vec4(0));\n"
7659 "}\n";
7660 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7661
7662 CreatePipelineHelper g_pipe(*this);
7663 g_pipe.InitInfo();
7664 g_pipe.gp_ci_.renderPass = render_pass;
7665 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7666 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7667 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
7668 std::array<VkPipelineColorBlendAttachmentState, 2> color_blend_attachments;
7669 color_blend_attachments[0] = g_pipe.cb_attachments_;
7670 color_blend_attachments[1] = g_pipe.cb_attachments_;
7671 g_pipe.cb_ci_.attachmentCount = color_blend_attachments.size();
7672 g_pipe.cb_ci_.pAttachments = color_blend_attachments.data();
7673 g_pipe.InitState();
7674 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7675
7676 VkSampler sampler;
7677 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7678 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7679 ASSERT_VK_SUCCESS(err);
7680
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007681 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007682 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007683 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7684 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7685 g_pipe.descriptor_set_->UpdateDescriptorSets();
7686
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007687 m_commandBuffer->begin();
7688
7689 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7690 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7691 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7692 m_errorMonitor->VerifyFound();
7693
7694 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7695 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7696 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7697 m_errorMonitor->VerifyFound();
7698
7699 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7700 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7701 &subresource_range);
7702 m_errorMonitor->VerifyFound();
7703
7704 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7705 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7706 m_errorMonitor->VerifyFound();
7707
7708 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7709 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7710 m_errorMonitor->VerifyFound();
7711
7712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7713 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7714 &buffer_image_copy);
7715 m_errorMonitor->VerifyFound();
7716
7717 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7718 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7719 &buffer_image_copy);
7720 m_errorMonitor->VerifyFound();
7721
7722 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7723 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7724 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7725 m_errorMonitor->VerifyFound();
7726
7727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7728 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7729 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7730 m_errorMonitor->VerifyFound();
7731
7732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7733 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected, 1,
7734 &buffer_image_copy);
7735 m_errorMonitor->VerifyFound();
7736
7737 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7738 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected, 1,
7739 &buffer_image_copy);
7740 m_errorMonitor->VerifyFound();
7741
7742 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7743 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7744 m_errorMonitor->VerifyFound();
7745
7746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7747 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7748 m_errorMonitor->VerifyFound();
7749
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007750 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7751
7752 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7753 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7754 m_errorMonitor->VerifyFound();
7755
locke-lunarg0de02522020-10-27 22:55:17 -06007756 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7757 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7758 &g_pipe.descriptor_set_->set_, 0, nullptr);
7759 VkDeviceSize offset = 0;
7760 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7761 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
7762
7763 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7764 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7765 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7766 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
7768
7769 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7770 m_errorMonitor->VerifyFound();
7771
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007772 vk::CmdEndRenderPass(m_commandBuffer->handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007773 m_commandBuffer->end();
7774
7775 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007776 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007777 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7778 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007779 g_pipe.descriptor_set_->UpdateDescriptorSets();
7780
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007781 protectedCommandBuffer.begin();
7782
7783 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7784 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7785 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7786 m_errorMonitor->VerifyFound();
7787
7788 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7789 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7790 &subresource_range);
7791 m_errorMonitor->VerifyFound();
7792
7793 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7794 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7795 m_errorMonitor->VerifyFound();
7796
7797 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7798 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7799 1, &buffer_image_copy);
7800 m_errorMonitor->VerifyFound();
7801
7802 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7803 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7804 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7805 m_errorMonitor->VerifyFound();
7806
7807 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7808 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7809 1, &buffer_image_copy);
7810 m_errorMonitor->VerifyFound();
7811
7812 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7813 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7814 m_errorMonitor->VerifyFound();
7815
7816 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7817 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7818 m_errorMonitor->VerifyFound();
7819
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007820 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7821
7822 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7823 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7824 m_errorMonitor->VerifyFound();
7825
locke-lunarg0de02522020-10-27 22:55:17 -06007826 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7827 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7828 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7829 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7830 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
7831
7832 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7834 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7835 m_errorMonitor->VerifyFound();
7836
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007837 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007838 protectedCommandBuffer.end();
7839
sfricke-samsung96cd9932020-08-23 20:57:11 -07007840 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7841 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7842
7843 VkProtectedSubmitInfo protected_submit_info = {};
7844 protected_submit_info.sType = VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO;
7845 protected_submit_info.pNext = nullptr;
7846
7847 VkSubmitInfo submit_info = {};
7848 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7849 submit_info.pNext = &protected_submit_info;
7850 submit_info.commandBufferCount = 2;
7851 submit_info.pCommandBuffers = comman_buffers;
7852
7853 protected_submit_info.protectedSubmit = VK_TRUE;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007854 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007855 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7856 m_errorMonitor->VerifyFound();
7857
7858 protected_submit_info.protectedSubmit = VK_FALSE;
7859 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7860 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7861 m_errorMonitor->VerifyFound();
7862
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007863 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7864 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7865 vk::FreeMemory(device(), memory_protected, nullptr);
7866 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007867 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7868 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007869}
locke-lunarg6b0de702020-08-07 17:42:13 -06007870
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007871TEST_F(VkLayerTest, InvalidStorageAtomicOperation) {
locke-lunarg6b0de702020-08-07 17:42:13 -06007872 TEST_DESCRIPTION(
7873 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7874 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7875
7876 ASSERT_NO_FATAL_FAILURE(Init());
7877
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007878 m_errorMonitor->ExpectSuccess();
locke-lunarg6b0de702020-08-07 17:42:13 -06007879 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7880 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7881 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7882 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7883
7884 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7885 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7886 return;
7887 }
7888
7889 VkFormat buffer_view_format =
7890 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
7891 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7892 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
7893 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7894 return;
7895 }
7896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7897
7898 VkPhysicalDeviceFeatures device_features = {};
7899 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
7900 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
7901 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
7902 return;
7903 }
7904
7905 VkImageObj image(m_device);
7906 image.Init(image_ci);
7907 VkImageView image_view = image.targetView(image_format);
7908
7909 VkSampler sampler = VK_NULL_HANDLE;
7910 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
7911 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
7912
7913 VkBufferObj buffer;
7914 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
7915
7916 VkBufferViewCreateInfo bvci = {};
7917 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7918 bvci.buffer = buffer.handle();
7919 bvci.format = buffer_view_format;
7920 bvci.range = VK_WHOLE_SIZE;
7921 VkBufferView buffer_view;
7922 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
7923
7924 char const *fsSource =
7925 "#version 450\n"
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007926 "layout(set=0, binding=3, r32f) uniform image2D si0;\n "
7927 "layout(set=0, binding=2, r32f) uniform image2D si1[2];\n "
7928 "layout(set = 0, binding = 1, r32f) uniform imageBuffer stb2;\n"
7929 "layout(set = 0, binding = 0, r32f) uniform imageBuffer stb3[2];\n"
locke-lunarg6b0de702020-08-07 17:42:13 -06007930 "void main() {\n"
7931 " imageAtomicExchange(si0, ivec2(0), 1);\n"
7932 " imageAtomicExchange(si1[0], ivec2(0), 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007933 " imageAtomicExchange(si1[1], ivec2(0), 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007934 " imageAtomicExchange(stb2, 0, 1);\n"
7935 " imageAtomicExchange(stb3[0], 0, 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007936 " imageAtomicExchange(stb3[1], 0, 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007937 "}\n";
7938
7939 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7940 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7941
7942 CreatePipelineHelper g_pipe(*this);
7943 g_pipe.InitInfo();
7944 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06007945 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7946 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7947 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7948 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06007949 g_pipe.InitState();
7950 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7951
locke-lunarg76e8dee2020-08-21 13:20:02 -06007952 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007953 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007954 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08007955 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007956 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08007957 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06007958 g_pipe.descriptor_set_->UpdateDescriptorSets();
7959
7960 m_commandBuffer->begin();
7961 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7962 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7963 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7964 &g_pipe.descriptor_set_->set_, 0, nullptr);
7965
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007966 m_errorMonitor->VerifyNotFound();
locke-lunarg6b0de702020-08-07 17:42:13 -06007967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7971 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7972 m_errorMonitor->VerifyFound();
7973
7974 m_commandBuffer->EndRenderPass();
7975 m_commandBuffer->end();
Tony-LunarG1ed322e2021-06-04 12:59:27 -06007976 vk::DestroyBufferView(m_device->handle(), buffer_view, nullptr);
7977 vk::DestroySampler(m_device->handle(), sampler, nullptr);
locke-lunarg6b0de702020-08-07 17:42:13 -06007978}
locke-lunargae1bbab2020-09-10 11:55:56 -06007979
7980TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
7981 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
7982
7983 ASSERT_NO_FATAL_FAILURE(Init());
7984 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7985
7986 // push constant range: 0-99
7987 char const *const vsSource =
7988 "#version 450\n"
7989 "\n"
7990 "layout(push_constant, std430) uniform foo {\n"
7991 " bool b;\n"
7992 " float f2[3];\n"
7993 " vec3 v;\n"
7994 " vec4 v2[2];\n"
7995 " mat3 m;\n"
7996 "} constants;\n"
7997 "void func1( float f ){\n"
7998 // use the whole v2[1]. byte: 48-63.
7999 " vec2 v2 = constants.v2[1].yz;\n"
8000 "}\n"
8001 "void main(){\n"
8002 // use only v2[0].z. byte: 40-43.
8003 " func1( constants.v2[0].z);\n"
8004 // index of m is variable. The all m is used. byte: 64-99.
8005 " for(int i=1;i<2;++i) {\n"
8006 " vec3 v3 = constants.m[i]; \n"
8007 " }\n"
8008 "}\n";
8009
8010 // push constant range: 0 - 95
8011 char const *const fsSource =
8012 "#version 450\n"
8013 "\n"
8014 "struct foo1{\n"
8015 " int i[4];"
8016 "}f;\n"
8017 "layout(push_constant, std430) uniform foo {\n"
8018 " float x[2][2][2];\n"
8019 " foo1 s;\n"
8020 " foo1 ss[3];\n"
8021 "} constants;\n"
8022 "void main(){\n"
8023 // use s. byte: 32-47.
8024 " f = constants.s;\n"
8025 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8026 " for(int i=1;i<2;++i) {\n"
8027 " int ii = constants.ss[i].i[3]; \n"
8028 " }\n"
8029 "}\n";
8030
8031 VkShaderObj const vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8032 VkShaderObj const fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8033
8034 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8035 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8036
8037 VkPipelineLayoutCreateInfo pipeline_layout_info{
8038 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &push_constant_range};
8039
8040 VkPipelineLayout pipeline_layout;
8041 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8042
8043 CreatePipelineHelper g_pipe(*this);
8044 g_pipe.InitInfo();
8045 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8046 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8047 g_pipe.InitState();
8048 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8049
8050 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8051 VkPipelineLayout pipeline_layout_small;
8052 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8053
8054 CreatePipelineHelper g_pipe_small_range(*this);
8055 g_pipe_small_range.InitInfo();
8056 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8057 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8058 g_pipe_small_range.InitState();
8059
sfricke-samsung7699b912021-04-12 23:01:51 -07008060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008062 g_pipe_small_range.CreateGraphicsPipeline();
8063 m_errorMonitor->VerifyFound();
8064
8065 m_commandBuffer->begin();
8066 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8067
8068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8069 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8070 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8071 &g_pipe.descriptor_set_->set_, 0, nullptr);
8072 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8073 m_errorMonitor->VerifyFound();
8074
locke-lunargae1bbab2020-09-10 11:55:56 -06008075 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008076
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008077 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8078 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8079 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8080 // for more details.
8081 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8082 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8083 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8084 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8085 // m_errorMonitor->VerifyFound();
8086
8087 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8088 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8089 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8090 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008091
8092 m_errorMonitor->ExpectSuccess();
8093 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8094 68, dummy_values);
8095 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8096 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06008097}
8098
8099TEST_F(VkLayerTest, VerifyVertextBinding) {
8100 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8101
8102 ASSERT_NO_FATAL_FAILURE(Init());
8103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8104
8105 VkBufferObj vtx_buf;
8106 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8107 vtx_buf.init(*m_device, info);
8108
8109 CreatePipelineHelper pipe(*this);
8110 pipe.InitInfo();
8111 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8112 VkVertexInputBindingDescription vtx_binding_des[3] = {
8113 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8114
8115 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8116 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8117 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8118 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8119 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8120 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8121 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8122 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8123 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8124 pipe.InitState();
8125 pipe.CreateGraphicsPipeline();
8126
8127 m_commandBuffer->begin();
8128 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8129 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8130 VkDeviceSize offset = 0;
8131 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8132
8133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8136 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8138 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8139 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008140
8141 m_commandBuffer->EndRenderPass();
8142 m_commandBuffer->end();
8143}
locke-lunargd7a08e92020-10-21 00:24:00 -06008144
8145TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8146 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8147 ASSERT_NO_FATAL_FAILURE(Init());
8148 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8149
8150 CreatePipelineHelper pipe(*this);
8151 pipe.InitInfo();
8152
8153 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8154
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008155 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008156 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8157 dyn_state_ci.pDynamicStates = dyn_states.data();
8158 pipe.dyn_state_ci_ = dyn_state_ci;
8159 pipe.InitState();
8160 pipe.CreateGraphicsPipeline();
8161
8162 m_commandBuffer->begin();
8163 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8164 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8165
8166 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8167 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8168 VkRect2D scissor = {{0, 0}, {16, 16}};
8169 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8170 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8171
8172 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8173 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8174 m_errorMonitor->VerifyFound();
8175
8176 m_commandBuffer->EndRenderPass();
8177 m_commandBuffer->end();
8178}
locke-lunarg0de02522020-10-27 22:55:17 -06008179
8180TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8181 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
8182 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8183 if (version < VK_API_VERSION_1_1) {
8184 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8185 return;
8186 }
8187 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8188
8189 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FILTER_CUBIC_EXTENSION_NAME)) {
8190 m_device_extension_names.push_back(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8191 } else {
8192 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8193 return;
8194 }
8195
8196 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8197 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8198
8199 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8200 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008201
8202 VkFormatProperties format_props;
8203 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8204 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
8205 printf("%s SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.\n", kSkipPrefix);
8206 return;
8207 }
8208
locke-lunarg0de02522020-10-27 22:55:17 -06008209 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8210 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8211
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008212 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008213 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008214 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008215 image_format_info.type = image_ci.imageType;
8216 image_format_info.format = image_ci.format;
8217 image_format_info.tiling = image_ci.tiling;
8218 image_format_info.usage = image_ci.usage;
8219 image_format_info.flags = image_ci.flags;
8220
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008221 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8222 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008223
8224 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8225
8226 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
8227 printf("%s Image and ImageView supports filter cubic ; skipped.\n", kSkipPrefix);
8228 return;
8229 }
8230
8231 VkImageObj image(m_device);
8232 image.Init(image_ci);
8233 VkImageView imageView = image.targetView(format, imageViewType);
8234
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008235 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008236 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8237 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8238 VkSampler sampler;
8239 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8240
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008241 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008242 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8243 sampler_ci.pNext = &reduction_mode_ci;
8244 VkSampler sampler_rediction;
8245 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler_rediction);
8246
8247 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8248
8249 CreatePipelineHelper g_pipe(*this);
8250 g_pipe.InitInfo();
8251 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8252 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8253 g_pipe.InitState();
8254 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8255
8256 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_rediction);
8257 g_pipe.descriptor_set_->UpdateDescriptorSets();
8258
8259 m_commandBuffer->begin();
8260 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8261 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8262 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8263 &g_pipe.descriptor_set_->set_, 0, nullptr);
8264
8265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8266 m_commandBuffer->Draw(1, 0, 0, 0);
8267 m_errorMonitor->VerifyFound();
8268
8269 m_commandBuffer->EndRenderPass();
8270 m_commandBuffer->end();
8271 m_commandBuffer->reset();
8272
8273 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8274 g_pipe.descriptor_set_->UpdateDescriptorSets();
8275
8276 m_commandBuffer->begin();
8277 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8278 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8279 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8280 &g_pipe.descriptor_set_->set_, 0, nullptr);
8281
8282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8283 m_commandBuffer->Draw(1, 0, 0, 0);
8284 m_errorMonitor->VerifyFound();
8285
8286 m_commandBuffer->EndRenderPass();
8287 m_commandBuffer->end();
8288}
8289
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008290TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008291 TEST_DESCRIPTION("Verify if sampler is filter cubic with the VK_IMG_filter cubic extension that it's a valid ImageViewType.");
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008292 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8293
8294 if (DeviceExtensionSupported(gpu(), nullptr, VK_IMG_FILTER_CUBIC_EXTENSION_NAME)) {
8295 m_device_extension_names.push_back(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8296 } else {
8297 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8298 return;
8299 }
8300
8301 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8303
8304 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8305 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
8306 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8307 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8308
8309 VkImageObj image(m_device);
8310 image.Init(image_ci);
8311 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8312 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8313
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008314 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008315 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8316 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8317 VkSampler sampler;
8318 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8319
8320 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8321
8322 CreatePipelineHelper g_pipe(*this);
8323 g_pipe.InitInfo();
8324 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8325 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8326 g_pipe.InitState();
8327 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8328
8329 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8330 g_pipe.descriptor_set_->UpdateDescriptorSets();
8331
8332 m_commandBuffer->begin();
8333 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8334 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8335 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8336 &g_pipe.descriptor_set_->set_, 0, nullptr);
8337
8338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8339 m_commandBuffer->Draw(1, 0, 0, 0);
8340 m_errorMonitor->VerifyFound();
8341
8342 m_commandBuffer->EndRenderPass();
8343 m_commandBuffer->end();
8344}
8345
locke-lunarg0de02522020-10-27 22:55:17 -06008346TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8347 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
8348 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8349 if (version < VK_API_VERSION_1_1) {
8350 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8351 return;
8352 }
8353 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8354 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8355 } else {
8356 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8357 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8358 return;
8359 }
8360 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8361
8362 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
8363 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8364 } else {
8365 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8366 return;
8367 }
8368
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008369 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008370 multiview_features.multiview = VK_TRUE;
8371 VkPhysicalDeviceFeatures2 pd_features2 = {};
8372 pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8373 pd_features2.pNext = &multiview_features;
8374
8375 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8377
8378 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8379 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8380 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008381 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8382 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008383 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8384 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8385 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8386 return;
8387 }
8388 CreatePipelineHelper pipe(*this);
8389 pipe.InitInfo();
8390 pipe.InitState();
8391 pipe.CreateGraphicsPipeline();
8392
8393 m_commandBuffer->begin();
8394 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8395 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8396
8397 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8398 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8399 m_errorMonitor->VerifyFound();
8400
8401 m_commandBuffer->EndRenderPass();
8402 m_commandBuffer->end();
8403}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008404
8405TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8406 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8407
8408 // Enable KHR_fragment_shading_rate and all of its required extensions
8409 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8410 if (fsr_extensions) {
8411 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8412 }
8413 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8414
8415 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8416 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8417 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8418 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8419 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8420 if (fsr_extensions) {
8421 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8422 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8423 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8424 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8425 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8426 } else {
8427 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8428 return;
8429 }
8430
8431 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = {};
8432 fsr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
8433 fsr_features.pipelineFragmentShadingRate = true;
8434
8435 VkPhysicalDeviceFeatures2 device_features = {};
8436 device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8437 device_features.pNext = &fsr_features;
8438
8439 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8440
8441 // Find address of extension call and make the call
8442 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8443 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8444 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8445
8446 VkExtent2D fragmentSize = {1, 1};
8447 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8448 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8449
8450 m_commandBuffer->begin();
8451 fragmentSize.width = 0;
8452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8453 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8454 m_errorMonitor->VerifyFound();
8455 fragmentSize.width = 1;
8456
8457 fragmentSize.height = 0;
8458 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8459 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8460 m_errorMonitor->VerifyFound();
8461 fragmentSize.height = 1;
8462
8463 fragmentSize.width = 3;
8464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8465 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8466 m_errorMonitor->VerifyFound();
8467 fragmentSize.width = 1;
8468
8469 fragmentSize.height = 3;
8470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8471 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8472 m_errorMonitor->VerifyFound();
8473 fragmentSize.height = 1;
8474
8475 fragmentSize.width = 8;
8476 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8477 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8478 m_errorMonitor->VerifyFound();
8479 fragmentSize.width = 1;
8480
8481 fragmentSize.height = 8;
8482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8483 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8484 m_errorMonitor->VerifyFound();
8485 fragmentSize.height = 1;
8486 m_commandBuffer->end();
8487}
8488
8489TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8490 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8491
8492 // Enable KHR_fragment_shading_rate and all of its required extensions
8493 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8494 if (fsr_extensions) {
8495 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8496 }
8497 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8498
8499 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8500 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8501 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8502 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8503 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8504 if (fsr_extensions) {
8505 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8506 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8507 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8508 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8509 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8510 } else {
8511 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8512 return;
8513 }
8514
8515 ASSERT_NO_FATAL_FAILURE(InitState());
8516 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8517
8518 // Find address of extension call and make the call
8519 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8520 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8521 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8522
8523 VkExtent2D fragmentSize = {1, 1};
8524 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8525 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8526
8527 m_commandBuffer->begin();
8528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8529 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8530 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8531 m_errorMonitor->VerifyFound();
8532 m_commandBuffer->end();
8533}
8534
8535TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8536 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8537
8538 // Enable KHR_fragment_shading_rate and all of its required extensions
8539 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8540 if (fsr_extensions) {
8541 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8542 }
8543 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8544
8545 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8546 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8547 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8548 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8549 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8550 if (fsr_extensions) {
8551 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8552 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8553 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8554 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8555 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8556 } else {
8557 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8558 return;
8559 }
8560
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008561 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8562 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008563
8564 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8565 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8566 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8567
8568 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8569 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8570
8571 // Find address of extension call and make the call
8572 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8573 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8574 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8575
8576 VkExtent2D fragmentSize = {1, 1};
8577 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8578 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8579
8580 m_commandBuffer->begin();
8581
8582 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8584 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8585 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8586 m_errorMonitor->VerifyFound();
8587 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8588
8589 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8591 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8592 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8593 m_errorMonitor->VerifyFound();
8594 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8595
8596 m_commandBuffer->end();
8597}
8598
8599TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8600 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8601
8602 // Enable KHR_fragment_shading_rate and all of its required extensions
8603 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8604 if (fsr_extensions) {
8605 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8606 }
8607 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8608
8609 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8610 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8611 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8612 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8613 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8614 if (fsr_extensions) {
8615 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8616 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8617 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8618 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8619 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8620 } else {
8621 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8622 return;
8623 }
8624
8625 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8626 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8627 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008628 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8629 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008630 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8631
8632 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8633 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8634 return;
8635 }
8636
8637 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8638
8639 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8640 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8641
8642 // Find address of extension call and make the call
8643 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8644 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8645 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8646
8647 VkExtent2D fragmentSize = {1, 1};
8648 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8649 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8650
8651 m_commandBuffer->begin();
8652 fragmentSize.width = 2;
8653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8654 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8655 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8656 m_errorMonitor->VerifyFound();
8657 fragmentSize.width = 1;
8658
8659 fragmentSize.height = 2;
8660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8661 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8662 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8663 m_errorMonitor->VerifyFound();
8664 fragmentSize.height = 1;
8665}
8666
8667TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8668 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8669
8670 // Enable KHR_fragment_shading_rate and all of its required extensions
8671 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8672 if (fsr_extensions) {
8673 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8674 }
8675 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8676
8677 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8678 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8679 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8680 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8681 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8682 if (fsr_extensions) {
8683 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8684 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8685 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8686 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8687 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8688 } else {
8689 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8690 return;
8691 }
8692
8693 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8694 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8695 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8696 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008697 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8698 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008699 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8700
8701 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8702 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8703 return;
8704 }
8705
8706 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8707 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8708 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008709 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8710 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008711 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8712
8713 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8714 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8715 return;
8716 }
8717
8718 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8719 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8720
8721 // Find address of extension call and make the call
8722 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8723 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8724 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8725
8726 VkExtent2D fragmentSize = {1, 1};
8727 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8728 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8729
8730 m_commandBuffer->begin();
8731 if (fsr_features.primitiveFragmentShadingRate) {
8732 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8734 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8735 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8736 m_errorMonitor->VerifyFound();
8737 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8738 }
8739
8740 if (fsr_features.attachmentFragmentShadingRate) {
8741 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8743 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8744 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8745 m_errorMonitor->VerifyFound();
8746 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8747 }
8748 m_commandBuffer->end();
8749}
8750
8751TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8752 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8753
8754 // Enable KHR_fragment_shading_rate and all of its required extensions
8755 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8756 if (fsr_extensions) {
8757 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8758 }
8759 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8760
8761 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8762 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8763 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8764 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8765 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8766 if (fsr_extensions) {
8767 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8768 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8769 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8770 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8771 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8772 } else {
8773 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8774 return;
8775 }
8776
8777 bool eds_extension = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8778 if (eds_extension) {
8779 m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8780 } else {
8781 printf("%s requires VK_EXT_extended_dynamic_state.\n", kSkipPrefix);
8782 return;
8783 }
8784
8785 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8786 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8787 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8788 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008789 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8790 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008791 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8792
8793 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
8794 printf("%s requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.\n", kSkipPrefix);
8795 return;
8796 }
8797
8798 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8799 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8800 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008801 VkPhysicalDeviceExtendedDynamicStateFeaturesEXT eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008802 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008803 LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8804 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008805 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8806
8807 if (!fsr_features.primitiveFragmentShadingRate) {
8808 printf("%s requires primitiveFragmentShadingRate to be supported.\n", kSkipPrefix);
8809 return;
8810 }
8811
8812 if (!features2.features.multiViewport) {
8813 printf("%s requires multiViewport to be supported.\n", kSkipPrefix);
8814 return;
8815 }
8816
8817 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8818 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8819
8820 char const *vsSource =
8821 "#version 450\n"
8822 "#extension GL_EXT_fragment_shading_rate : enable\n"
8823 "void main() {\n"
8824 " gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;\n"
8825 "}\n";
8826
Tobias Hector04f2ab22020-12-01 10:59:33 +00008827 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8828
8829 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008830 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8831 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008832 pipe.AddShader(&fs);
8833 pipe.AddDefaultColorAttachment();
8834 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008835 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008836 {
8837 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8838 pipe.AddShader(&vs);
8839 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8840 ASSERT_VK_SUCCESS(err);
8841 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00008842 m_commandBuffer->begin();
8843 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8844
8845 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8846
8847 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8848 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
8849 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
8850 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
8851
8852 // error produced here.
8853 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
8854
8855 m_errorMonitor->VerifyFound();
8856
8857 m_commandBuffer->EndRenderPass();
8858 m_commandBuffer->end();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008859}