blob: 422cc9b52df98f8e13081d6d96e89fb1762317cf [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));
Mark Lobodzinski20310782020-02-28 14:25:17 -0700321 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));
Mark Lobodzinski20310782020-02-28 14:25:17 -0700330 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));
Mark Lobodzinski20310782020-02-28 14:25:17 -0700339 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));
Mark Lobodzinski20310782020-02-28 14:25:17 -0700348 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 = {{
531 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCreatePipelineLayout() call has push constants index 0 with size 0."},
532 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1}, "vkCreatePipelineLayout() call has push constants index 0 with size 1."},
533 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1}, "vkCreatePipelineLayout() call has push constants index 0 with size 1."},
534 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0}, "vkCreatePipelineLayout() call has push constants index 0 with size 0."},
535 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4}, "vkCreatePipelineLayout() call has push constants index 0 with offset 1. Offset must"},
536 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big}, "vkCreatePipelineLayout() call has push constants index 0 with offset "},
537 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big}, "vkCreatePipelineLayout() call has push constants index 0 with offset "},
538 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4}, "vkCreatePipelineLayout() call has push constants index 0 with offset "},
539 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
540 "vkCreatePipelineLayout() call has push constants index 0 with offset "},
541 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
542 "vkCreatePipelineLayout() call has push constants index 0 with offset "},
543 }};
544
545 // Check for invalid offset and size
546 for (const auto &iter : range_tests) {
547 pc_range = iter.range;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700548 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600549 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600550 m_errorMonitor->VerifyFound();
551 }
552
553 // Check for invalid stage flag
554 pc_range.offset = 0;
555 pc_range.size = 16;
556 pc_range.stageFlags = 0;
557 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -0700558 kErrorBit, "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600559 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600560 m_errorMonitor->VerifyFound();
561
562 // Check for duplicate stage flags in a list of push constant ranges.
563 // A shader can only have one push constant block and that block is mapped
564 // to the push constant range that has that shader's stage flag set.
565 // The shader's stage flag can only appear once in all the ranges, so the
566 // implementation can find the one and only range to map it to.
567 const uint32_t ranges_per_test = 5;
568 struct DuplicateStageFlagsTestCase {
569 VkPushConstantRange const ranges[ranges_per_test];
570 std::vector<char const *> const msg;
571 };
572 // Overlapping ranges are OK, but a stage flag can appear only once.
573 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
574 {
575 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
576 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
577 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
578 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
579 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
580 {
581 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
582 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
583 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
584 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
585 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
586 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
587 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
588 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
589 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
590 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
591 }},
592 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
593 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
594 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
595 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
596 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
597 {
598 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
599 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
600 }},
601 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
602 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
603 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
604 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
605 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
606 {
607 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
608 }},
609 },
610 };
611
612 for (const auto &iter : duplicate_stageFlags_tests) {
613 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
614 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700615 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg.begin(), iter.msg.end());
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600616 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600617 m_errorMonitor->VerifyFound();
618 }
619
620 //
621 // CmdPushConstants tests
622 //
623
624 // Setup a pipeline layout with ranges: [0,32) [16,80)
625 const std::vector<VkPushConstantRange> pc_range2 = {{VK_SHADER_STAGE_VERTEX_BIT, 16, 64},
626 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 32}};
627 const VkPipelineLayoutObj pipeline_layout_obj(m_device, {}, pc_range2);
628
629 const uint8_t dummy_values[100] = {};
630
631 m_commandBuffer->begin();
632 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
633
634 // Check for invalid stage flag
635 // Note that VU 00996 isn't reached due to parameter validation
Mark Lobodzinski20310782020-02-28 14:25:17 -0700636 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600637 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), 0, 0, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600638 m_errorMonitor->VerifyFound();
639
640 // Positive tests for the overlapping ranges
641 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600642 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16,
643 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(), VK_SHADER_STAGE_VERTEX_BIT, 32, 48, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600647 m_errorMonitor->VerifyNotFound();
648 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600649 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
650 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600651 m_errorMonitor->VerifyNotFound();
652
653 // Wrong cmd stages for extant range
654 // No range for all cmd stages -- "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
Mark Lobodzinski20310782020-02-28 14:25:17 -0700655 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
unknown088160a2019-05-23 17:43:13 -0600656 // Missing cmd stages for found overlapping range -- "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
Mark Lobodzinski20310782020-02-28 14:25:17 -0700657 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600658 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16,
659 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600660 m_errorMonitor->VerifyFound();
661
662 // Wrong no extant range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700663 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600664 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 80, 4,
665 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600666 m_errorMonitor->VerifyFound();
667
668 // Wrong overlapping extent
Mark Lobodzinski20310782020-02-28 14:25:17 -0700669 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600670 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
671 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 20, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600672 m_errorMonitor->VerifyFound();
673
674 // Wrong stage flags for valid overlapping range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700675 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600676 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600677 m_errorMonitor->VerifyFound();
678
679 m_commandBuffer->EndRenderPass();
680 m_commandBuffer->end();
681}
682
683TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700684 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "You must call vkBeginCommandBuffer() before this call to ");
unknown088160a2019-05-23 17:43:13 -0600685
686 ASSERT_NO_FATAL_FAILURE(Init());
687 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
688 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600689 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600690
691 m_errorMonitor->VerifyFound();
692}
693
694TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
695 ASSERT_NO_FATAL_FAILURE(Init());
696
697 VkCommandBufferObj cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
698
699 // Force the failure by not setting the Renderpass and Framebuffer fields
700 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
701 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
702
703 VkCommandBufferBeginInfo cmd_buf_info = {};
704 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
705 cmd_buf_info.pNext = NULL;
706 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
707 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
708
Mark Lobodzinski20310782020-02-28 14:25:17 -0700709 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferBeginInfo-flags-00053");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600710 vk::BeginCommandBuffer(cb.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600711 m_errorMonitor->VerifyFound();
712}
713
714TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
715 ASSERT_NO_FATAL_FAILURE(Init());
716
Mark Lobodzinski20310782020-02-28 14:25:17 -0700717 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600718
719 // A pool we can reset in.
720 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
721 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
722
723 secondary.begin();
724 secondary.end();
725
726 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600727 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600728
729 // rerecording of secondary
730 secondary.reset(); // explicit reset here.
731 secondary.begin();
732 secondary.end();
733
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600734 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600735 m_errorMonitor->VerifyFound();
736}
737
738TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
739 ASSERT_NO_FATAL_FAILURE(Init());
740
Mark Lobodzinski20310782020-02-28 14:25:17 -0700741 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600742
743 // A pool we can reset in.
744 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
745 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
746
747 secondary.begin();
748 secondary.end();
749
750 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600751 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600752
753 // rerecording of secondary
754 secondary.begin(); // implicit reset in begin
755 secondary.end();
756
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600757 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600758 m_errorMonitor->VerifyFound();
759}
760
761TEST_F(VkLayerTest, CascadedInvalidation) {
762 ASSERT_NO_FATAL_FAILURE(Init());
763
764 VkEventCreateInfo eci = {VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, nullptr, 0};
765 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600766 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600767
768 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
769 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600770 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600771 secondary.end();
772
773 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600774 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600775 m_commandBuffer->end();
776
777 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600778 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600779
Mark Lobodzinski20310782020-02-28 14:25:17 -0700780 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600781 m_commandBuffer->QueueCommandBuffer(false);
782 m_errorMonitor->VerifyFound();
783}
784
785TEST_F(VkLayerTest, CommandBufferResetErrors) {
786 // Cause error due to Begin while recording CB
787 // Then cause 2 errors for attempting to reset CB w/o having
788 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
789 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700790 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600791
792 ASSERT_NO_FATAL_FAILURE(Init());
793
794 // Calls AllocateCommandBuffers
795 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
796
797 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
798 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
799 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
800 VkCommandBufferBeginInfo cmd_buf_info = {};
801 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
802 cmd_buf_info.pNext = NULL;
803 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
804 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
805
806 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600807 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600808 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600809 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600810 m_errorMonitor->VerifyFound();
811
Mark Lobodzinski20310782020-02-28 14:25:17 -0700812 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600813 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
814 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600815 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600816 m_errorMonitor->VerifyFound();
817
Mark Lobodzinski20310782020-02-28 14:25:17 -0700818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600819 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600820 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600821 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600822 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600823 m_errorMonitor->VerifyFound();
824}
825
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700826TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
827 ASSERT_NO_FATAL_FAILURE(Init());
828
829 // Calls AllocateCommandBuffers
830 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
831
832 VkCommandBufferBeginInfo cmd_buf_info = {};
833 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
834 cmd_buf_info.pNext = NULL;
835 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
836
837 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
838 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
839 m_errorMonitor->VerifyFound();
840}
841
unknown088160a2019-05-23 17:43:13 -0600842TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
843 // Call CmdClearAttachmentss outside of an active RenderPass
844
Mark Lobodzinski20310782020-02-28 14:25:17 -0700845 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600846 "vkCmdClearAttachments(): This call must be issued inside an active render pass");
847
848 ASSERT_NO_FATAL_FAILURE(Init());
849 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
850
851 // Start no RenderPass
852 m_commandBuffer->begin();
853
854 VkClearAttachment color_attachment;
855 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
856 color_attachment.clearValue.color.float32[0] = 0;
857 color_attachment.clearValue.color.float32[1] = 0;
858 color_attachment.clearValue.color.float32[2] = 0;
859 color_attachment.clearValue.color.float32[3] = 0;
860 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600861 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600862 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600863
864 m_errorMonitor->VerifyFound();
865}
866
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600867TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
868 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
869
Mark Lobodzinski20310782020-02-28 14:25:17 -0700870 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600871
872 ASSERT_NO_FATAL_FAILURE(Init());
873 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
874
875 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600876 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600877
878 VkClearAttachment color_attachment;
879 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
880 color_attachment.clearValue.color.float32[0] = 0;
881 color_attachment.clearValue.color.float32[1] = 0;
882 color_attachment.clearValue.color.float32[2] = 0;
883 color_attachment.clearValue.color.float32[3] = 0;
884 color_attachment.colorAttachment = 0;
885 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600886 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600887
888 m_errorMonitor->VerifyFound();
889}
890
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700891TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
892 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
893
894 ASSERT_NO_FATAL_FAILURE(Init());
895 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
896
897 m_commandBuffer->begin();
898 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
899
900 VkClearAttachment color_attachment;
901 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
902 color_attachment.clearValue.color.float32[0] = 0;
903 color_attachment.clearValue.color.float32[1] = 0;
904 color_attachment.clearValue.color.float32[2] = 0;
905 color_attachment.clearValue.color.float32[3] = 0;
906 color_attachment.colorAttachment = 0;
907 VkClearRect clear_rect = {};
908 clear_rect.rect.offset = {0, 0};
909 clear_rect.baseArrayLayer = 0;
910 clear_rect.layerCount = 1;
911
912 clear_rect.rect.extent = {0, 1};
913 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
914 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
915 m_errorMonitor->VerifyFound();
916
917 clear_rect.rect.extent = {1, 0};
918 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
919 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
920 m_errorMonitor->VerifyFound();
921}
922
sfricke-samsung6141db32020-10-26 03:31:38 -0700923TEST_F(VkLayerTest, ClearAttachmentsInvalidAspectMasks) {
924 TEST_DESCRIPTION("Check VkClearAttachment invalid aspect masks.");
925
926 ASSERT_NO_FATAL_FAILURE(Init());
927 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
928
929 m_commandBuffer->begin();
930 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
931
932 VkClearAttachment attachment;
933 attachment.clearValue.color.float32[0] = 0;
934 attachment.clearValue.color.float32[1] = 0;
935 attachment.clearValue.color.float32[2] = 0;
936 attachment.clearValue.color.float32[3] = 0;
937 attachment.colorAttachment = 0;
938 VkClearRect clear_rect = {};
939 clear_rect.rect.offset = {0, 0};
940 clear_rect.rect.extent = {1, 1};
941 clear_rect.baseArrayLayer = 0;
942 clear_rect.layerCount = 1;
943
944 attachment.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
945 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
946 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
947 m_errorMonitor->VerifyFound();
948
949 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT;
950 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
951 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
952 m_errorMonitor->VerifyFound();
953
954 attachment.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
955 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
956 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
957 m_errorMonitor->VerifyFound();
958
959 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
960 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
961 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
962 m_errorMonitor->VerifyFound();
963}
964
sfricke-samsung91f4a542020-10-21 00:29:17 -0700965TEST_F(VkLayerTest, ClearAttachmentsImplicitCheck) {
966 TEST_DESCRIPTION("Check VkClearAttachment implicit VUs.");
967
968 ASSERT_NO_FATAL_FAILURE(Init());
969 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
970
971 m_commandBuffer->begin();
972 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
973
974 VkClearAttachment color_attachment;
975 color_attachment.clearValue.color.float32[0] = 0;
976 color_attachment.clearValue.color.float32[1] = 0;
977 color_attachment.clearValue.color.float32[2] = 0;
978 color_attachment.clearValue.color.float32[3] = 0;
979 color_attachment.colorAttachment = 0;
980 VkClearRect clear_rect = {};
981 clear_rect.rect.offset = {0, 0};
982 clear_rect.rect.extent = {1, 1};
983 clear_rect.baseArrayLayer = 0;
984 clear_rect.layerCount = 1;
985
986 color_attachment.aspectMask = 0;
987 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-requiredbitmask");
988 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
989 m_errorMonitor->VerifyFound();
990
991 color_attachment.aspectMask = 0xffffffff;
992 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-parameter");
993 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
994 m_errorMonitor->VerifyFound();
995}
996
sfricke-samsung87b09512020-10-26 03:35:42 -0700997TEST_F(VkLayerTest, ClearColorAttachmentsDepthStencil) {
998 TEST_DESCRIPTION("Call CmdClearAttachments with invalid depth/stencil aspect masks.");
999
1000 ASSERT_NO_FATAL_FAILURE(Init());
1001 // Creates a color attachment
1002 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1003
1004 m_commandBuffer->begin();
1005 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
1006
1007 VkClearAttachment attachment;
1008 attachment.clearValue.color.float32[0] = 0;
1009 attachment.clearValue.color.float32[1] = 0;
1010 attachment.clearValue.color.float32[2] = 0;
1011 attachment.clearValue.color.float32[3] = 0;
1012 attachment.colorAttachment = 0;
1013 VkClearRect clear_rect = {};
1014 clear_rect.rect.offset = {0, 0};
1015 clear_rect.rect.extent = {1, 1};
1016 clear_rect.baseArrayLayer = 0;
1017 clear_rect.layerCount = 1;
1018
1019 m_errorMonitor->ExpectSuccess();
1020 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1021 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1022 m_errorMonitor->VerifyNotFound();
1023
1024 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02502");
1025 attachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
1026 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1027 m_errorMonitor->VerifyFound();
1028
1029 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02503");
1030 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
1031 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1032 m_errorMonitor->VerifyFound();
1033}
1034
unknown088160a2019-05-23 17:43:13 -06001035TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
1036 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
1037
1038 ASSERT_NO_FATAL_FAILURE(Init());
1039 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1040
1041 // An empty primary command buffer
1042 VkCommandBufferObj cb(m_device, m_commandPool);
1043 cb.begin();
1044 cb.end();
1045
1046 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001047 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06001048 VkCommandBuffer handle = cb.handle();
1049
Mark Lobodzinski20310782020-02-28 14:25:17 -07001050 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001051 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -06001052 m_errorMonitor->VerifyFound();
1053
1054 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
1055
1056 m_commandBuffer->EndRenderPass();
1057 m_commandBuffer->end();
1058}
1059
Petr Kraus8e53cf02020-01-03 05:30:04 +01001060TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
1061 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
1062
1063 ASSERT_NO_FATAL_FAILURE(Init());
1064
1065 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1066 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1067 secondary_cb.begin();
1068 secondary_cb.end();
1069
1070 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001071 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +01001072 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
1073 m_errorMonitor->VerifyFound();
1074}
1075
unknown088160a2019-05-23 17:43:13 -06001076TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
1077 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
1078
1079 ASSERT_NO_FATAL_FAILURE(Init());
1080 ASSERT_NO_FATAL_FAILURE(InitViewport());
1081 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1082
1083 const VkPipelineLayoutObj pipeline_layout(m_device);
1084
1085 struct VboEntry {
1086 uint16_t input0[2];
1087 uint32_t input1;
1088 float input2[4];
1089 };
1090
1091 const unsigned vbo_entry_count = 3;
1092 const VboEntry vbo_data[vbo_entry_count] = {};
1093
1094 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
1095 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1096
1097 VkVertexInputBindingDescription input_binding;
1098 input_binding.binding = 0;
1099 input_binding.stride = sizeof(VboEntry);
1100 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1101
1102 VkVertexInputAttributeDescription input_attribs[3];
1103
1104 input_attribs[0].binding = 0;
1105 // Location switch between attrib[0] and attrib[1] is intentional
1106 input_attribs[0].location = 1;
1107 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
1108 input_attribs[0].offset = offsetof(VboEntry, input1);
1109
1110 input_attribs[1].binding = 0;
1111 input_attribs[1].location = 0;
1112 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
1113 input_attribs[1].offset = offsetof(VboEntry, input0);
1114
1115 input_attribs[2].binding = 0;
1116 input_attribs[2].location = 2;
1117 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1118 input_attribs[2].offset = offsetof(VboEntry, input2);
1119
1120 char const *vsSource =
1121 "#version 450\n"
1122 "\n"
1123 "layout(location = 0) in vec2 input0;"
1124 "layout(location = 1) in vec4 input1;"
1125 "layout(location = 2) in vec4 input2;"
1126 "\n"
1127 "void main(){\n"
1128 " gl_Position = input1 + input2;\n"
1129 " gl_Position.xy += input0;\n"
1130 "}\n";
unknown088160a2019-05-23 17:43:13 -06001131
1132 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001133 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001134
1135 VkPipelineObj pipe1(m_device);
1136 pipe1.AddDefaultColorAttachment();
1137 pipe1.AddShader(&vs);
1138 pipe1.AddShader(&fs);
1139 pipe1.AddVertexInputBindings(&input_binding, 1);
1140 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
1141 pipe1.SetViewport(m_viewports);
1142 pipe1.SetScissor(m_scissors);
1143 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1144
1145 input_binding.stride = 6;
1146
1147 VkPipelineObj pipe2(m_device);
1148 pipe2.AddDefaultColorAttachment();
1149 pipe2.AddShader(&vs);
1150 pipe2.AddShader(&fs);
1151 pipe2.AddVertexInputBindings(&input_binding, 1);
1152 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
1153 pipe2.SetViewport(m_viewports);
1154 pipe2.SetScissor(m_scissors);
1155 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1156
1157 m_commandBuffer->begin();
1158 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1159
1160 // Test with invalid buffer offset
1161 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001162 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
1163 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001164 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
1165 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 1");
1166 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001167 m_commandBuffer->Draw(1, 0, 0, 0);
1168 m_errorMonitor->VerifyFound();
1169
1170 // Test with invalid buffer stride
1171 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001172 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
1173 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001174 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
unknown088160a2019-05-23 17:43:13 -06001175 // Attribute[1] is aligned properly even with a wrong stride
Mark Lobodzinski20310782020-02-28 14:25:17 -07001176 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001177 m_commandBuffer->Draw(1, 0, 0, 0);
1178 m_errorMonitor->VerifyFound();
1179
1180 m_commandBuffer->EndRenderPass();
1181 m_commandBuffer->end();
1182}
1183
1184TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
1185 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -06001186 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -06001187
1188 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1189
1190 secondary.begin();
1191 secondary.end();
1192
1193 VkCommandBufferBeginInfo cbbi = {
1194 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1195 nullptr,
1196 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1197 nullptr,
1198 };
1199
1200 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001201 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001202 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001203 m_errorMonitor->VerifyFound();
1204 m_commandBuffer->end();
1205}
1206
1207TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1208 ASSERT_NO_FATAL_FAILURE(Init());
1209
John Zulauff1640d12019-08-13 15:39:58 -06001210 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001211
1212 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1213
1214 VkCommandBufferInheritanceInfo inh = {
1215 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1216 nullptr,
1217 };
1218 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1219
1220 secondary.begin(&cbbi);
1221 secondary.end();
1222
1223 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001224 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001225 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001226 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001227 m_errorMonitor->VerifyFound();
1228 m_commandBuffer->end();
1229}
1230
1231TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1232 ASSERT_NO_FATAL_FAILURE(Init());
1233
1234 // variation on previous test executing the same CB twice in the same
1235 // CmdExecuteCommands call
1236
John Zulauff1640d12019-08-13 15:39:58 -06001237 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001238
1239 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1240
1241 VkCommandBufferInheritanceInfo inh = {
1242 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1243 nullptr,
1244 };
1245 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1246
1247 secondary.begin(&cbbi);
1248 secondary.end();
1249
1250 m_commandBuffer->begin();
1251 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001252 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001253 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001254 m_errorMonitor->VerifyFound();
1255 m_commandBuffer->end();
1256}
1257
1258TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1259 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1260 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1261 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1262 ASSERT_NO_FATAL_FAILURE(Init());
1263
1264 VkCommandBuffer cmd_bufs[2];
1265 VkCommandBufferAllocateInfo alloc_info;
1266 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1267 alloc_info.pNext = NULL;
1268 alloc_info.commandBufferCount = 2;
1269 alloc_info.commandPool = m_commandPool->handle();
1270 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001271 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001272
1273 VkCommandBufferBeginInfo cb_binfo;
1274 cb_binfo.pNext = NULL;
1275 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1276 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1277 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001278 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001279 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001280 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1281 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001282 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1283
1284 VkSubmitInfo submit_info = {};
1285 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1286 submit_info.commandBufferCount = 2;
1287 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001288 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001289 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001290 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001291 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001292
1293 // Set one time use and now look for one time submit
1294 duplicates[0] = duplicates[1] = cmd_bufs[1];
1295 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 -06001296 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1297 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1298 vk::EndCommandBuffer(cmd_bufs[1]);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001299 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001300 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001301 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001302 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001303}
1304
1305TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1306 TEST_DESCRIPTION(
1307 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1308
Mark Lobodzinski20310782020-02-28 14:25:17 -07001309 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001310
1311 ASSERT_NO_FATAL_FAILURE(Init());
1312 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1313
unknown088160a2019-05-23 17:43:13 -06001314 char const *fsSource =
1315 "#version 450\n"
1316 "\n"
1317 "layout(set=0, binding=0) uniform sampler3D s;\n"
1318 "layout(location=0) out vec4 color;\n"
1319 "void main() {\n"
1320 " color = texture(s, vec3(0));\n"
1321 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001322 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001323 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1324
1325 VkPipelineObj pipe(m_device);
1326 pipe.AddShader(&vs);
1327 pipe.AddShader(&fs);
1328 pipe.AddDefaultColorAttachment();
1329
1330 VkTextureObj texture(m_device, nullptr);
1331 VkSamplerObj sampler(m_device);
1332
1333 VkDescriptorSetObj descriptorSet(m_device);
1334 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1335 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1336
1337 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1338 ASSERT_VK_SUCCESS(err);
1339
1340 m_commandBuffer->begin();
1341 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1342
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001343 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001344 m_commandBuffer->BindDescriptorSet(descriptorSet);
1345
1346 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001347 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001348 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001349 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001350
1351 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001352 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001353
1354 m_errorMonitor->VerifyFound();
1355
1356 m_commandBuffer->EndRenderPass();
1357 m_commandBuffer->end();
1358}
1359
1360TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1361 TEST_DESCRIPTION(
1362 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1363 "vice versa.");
1364
Mark Lobodzinski20310782020-02-28 14:25:17 -07001365 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001366
1367 ASSERT_NO_FATAL_FAILURE(Init());
1368 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1369
unknown088160a2019-05-23 17:43:13 -06001370 char const *fsSource =
1371 "#version 450\n"
1372 "\n"
1373 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
1374 "layout(location=0) out vec4 color;\n"
1375 "void main() {\n"
1376 " color = texelFetch(s, ivec2(0), 0);\n"
1377 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001378 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001379 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1380
1381 VkPipelineObj pipe(m_device);
1382 pipe.AddShader(&vs);
1383 pipe.AddShader(&fs);
1384 pipe.AddDefaultColorAttachment();
1385
1386 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1387 VkSamplerObj sampler(m_device);
1388
1389 VkDescriptorSetObj descriptorSet(m_device);
1390 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1391 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1392
1393 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1394 ASSERT_VK_SUCCESS(err);
1395
1396 m_commandBuffer->begin();
1397 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1398
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001399 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001400 m_commandBuffer->BindDescriptorSet(descriptorSet);
1401
1402 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001403 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001404 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001405 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001406
1407 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001408 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001409
1410 m_errorMonitor->VerifyFound();
1411
1412 m_commandBuffer->EndRenderPass();
1413 m_commandBuffer->end();
1414}
1415
1416TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1417 TEST_DESCRIPTION(
1418 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1419
Mark Lobodzinski20310782020-02-28 14:25:17 -07001420 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001421
1422 ASSERT_NO_FATAL_FAILURE(Init());
1423 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1424
unknown088160a2019-05-23 17:43:13 -06001425 char const *fsSource =
1426 "#version 450\n"
1427 "\n"
1428 "layout(set=0, binding=0) uniform isampler2D s;\n"
1429 "layout(location=0) out vec4 color;\n"
1430 "void main() {\n"
1431 " color = texelFetch(s, ivec2(0), 0);\n"
1432 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001433 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001434 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1435
1436 VkPipelineObj pipe(m_device);
1437 pipe.AddShader(&vs);
1438 pipe.AddShader(&fs);
1439 pipe.AddDefaultColorAttachment();
1440
1441 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1442 VkSamplerObj sampler(m_device);
1443
1444 VkDescriptorSetObj descriptorSet(m_device);
1445 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1446 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1447
1448 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1449 ASSERT_VK_SUCCESS(err);
1450
1451 m_commandBuffer->begin();
1452 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1453
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001454 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001455 m_commandBuffer->BindDescriptorSet(descriptorSet);
1456
1457 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001458 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001459 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001460 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001461
1462 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001463 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001464
1465 m_errorMonitor->VerifyFound();
1466
1467 m_commandBuffer->EndRenderPass();
1468 m_commandBuffer->end();
1469}
1470
unknown088160a2019-05-23 17:43:13 -06001471TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1472 TEST_DESCRIPTION(
1473 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001474 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1475 bool maintenance1 = false;
1476 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
1477 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1478 maintenance1 = true;
1479 }
1480 ASSERT_NO_FATAL_FAILURE(InitState());
1481
1482 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1483 VkFormatProperties format_props;
1484 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1485 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1486 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1487 return;
1488 }
unknown088160a2019-05-23 17:43:13 -06001489
1490 // Create two images to copy between
1491 VkImageObj src_image_obj(m_device);
1492 VkImageObj dst_image_obj(m_device);
1493
1494 VkImageCreateInfo image_create_info = {};
1495 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1496 image_create_info.pNext = NULL;
1497 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001498 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001499 image_create_info.extent.width = 32;
1500 image_create_info.extent.height = 32;
1501 image_create_info.extent.depth = 1;
1502 image_create_info.mipLevels = 1;
1503 image_create_info.arrayLayers = 4;
1504 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1505 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1506 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1507 image_create_info.flags = 0;
1508
1509 src_image_obj.init(&image_create_info);
1510 ASSERT_TRUE(src_image_obj.initialized());
1511
1512 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1513 dst_image_obj.init(&image_create_info);
1514 ASSERT_TRUE(dst_image_obj.initialized());
1515
1516 m_commandBuffer->begin();
1517 VkImageCopy copyRegion;
1518 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1519 copyRegion.srcSubresource.mipLevel = 0;
1520 copyRegion.srcSubresource.baseArrayLayer = 0;
1521 copyRegion.srcSubresource.layerCount = 1;
1522 copyRegion.srcOffset.x = 0;
1523 copyRegion.srcOffset.y = 0;
1524 copyRegion.srcOffset.z = 0;
1525 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1526 copyRegion.dstSubresource.mipLevel = 0;
1527 copyRegion.dstSubresource.baseArrayLayer = 0;
1528 // Introduce failure by forcing the dst layerCount to differ from src
1529 copyRegion.dstSubresource.layerCount = 3;
1530 copyRegion.dstOffset.x = 0;
1531 copyRegion.dstOffset.y = 0;
1532 copyRegion.dstOffset.z = 0;
1533 copyRegion.extent.width = 1;
1534 copyRegion.extent.height = 1;
1535 copyRegion.extent.depth = 1;
1536
sfricke-samsung30b094c2020-05-30 11:42:11 -07001537 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1538 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001539 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1540 &copyRegion);
1541 m_errorMonitor->VerifyFound();
1542}
1543
1544TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1545 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1546
Jeff Leger465acf52020-10-12 18:07:16 -04001547 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1548
1549 bool copy_commands2 = false;
1550 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1551 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1552 copy_commands2 = true;
1553 }
1554 ASSERT_NO_FATAL_FAILURE(InitState());
1555
1556 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
Jeff Leger465acf52020-10-12 18:07:16 -04001557 if (copy_commands2) {
1558 vkCmdCopyBufferToImage2Function =
1559 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
Jeff Leger465acf52020-10-12 18:07:16 -04001560 }
unknown088160a2019-05-23 17:43:13 -06001561
1562 VkPhysicalDeviceFeatures device_features = {};
1563 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1564 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1565 if (device_features.textureCompressionBC) {
1566 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1567 } else if (device_features.textureCompressionETC2) {
1568 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1569 } else if (device_features.textureCompressionASTC_LDR) {
1570 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1571 } else {
1572 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1573 return;
1574 }
1575
1576 VkImageCreateInfo ci;
1577 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1578 ci.pNext = NULL;
1579 ci.flags = 0;
1580 ci.imageType = VK_IMAGE_TYPE_2D;
1581 ci.format = compressed_format;
1582 ci.extent = {32, 32, 1};
1583 ci.mipLevels = 6;
1584 ci.arrayLayers = 1;
1585 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1586 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1587 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1588 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1589 ci.queueFamilyIndexCount = 0;
1590 ci.pQueueFamilyIndices = NULL;
1591 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1592
1593 VkImageObj image(m_device);
1594 image.init(&ci);
1595 ASSERT_TRUE(image.initialized());
1596
1597 VkImageObj odd_image(m_device);
1598 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1599 odd_image.init(&ci);
1600 ASSERT_TRUE(odd_image.initialized());
1601
1602 // Allocate buffers
1603 VkMemoryPropertyFlags reqs = 0;
1604 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1605 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1606 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1607 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1608 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1609
1610 VkBufferImageCopy region = {};
1611 region.bufferRowLength = 0;
1612 region.bufferImageHeight = 0;
1613 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1614 region.imageSubresource.layerCount = 1;
1615 region.imageOffset = {0, 0, 0};
1616 region.bufferOffset = 0;
1617
1618 // start recording
1619 m_commandBuffer->begin();
1620
locke-lunargdf00db02020-03-04 19:00:57 -07001621 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001622 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001623 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1624 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001625 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001626 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1627 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001628 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001629 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1630 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1631
unknown088160a2019-05-23 17:43:13 -06001632 // Mip level copies that work - 5 levels
1633 m_errorMonitor->ExpectSuccess();
1634
1635 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1636 region.imageExtent = {32, 32, 1};
1637 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001638 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001639
1640 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1641 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001642 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001643
1644 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1645 region.imageExtent = {8, 8, 1};
1646 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001647 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001648
1649 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1650 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001651 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001652
1653 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1654 region.imageExtent = {4, 4, 1};
1655 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001656 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001657
1658 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1659 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001660 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001661
1662 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1663 region.imageExtent = {2, 2, 1};
1664 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001665
1666 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1667 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001668 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001669
1670 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1671 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001672 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001673
1674 region.imageExtent = {1, 1, 1};
1675 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001676
1677 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1678 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001679 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001680
1681 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1682 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001683 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001684 m_errorMonitor->VerifyNotFound();
1685
1686 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001688 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001689 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001690 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001691 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001692 m_errorMonitor->VerifyFound();
1693
1694 // Copy width < compressed block size, but not the full mip width
1695 region.imageExtent = {1, 2, 1};
1696 region.imageSubresource.mipLevel = 4;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001697 // width not a multiple of compressed block width
1698 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001699 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001700 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001701 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001702 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001703
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001704 m_errorMonitor->SetDesiredFailureMsg(
1705 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00207"); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001707 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001708 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001709 m_errorMonitor->VerifyFound();
1710
1711 // Copy height < compressed block size but not the full mip height
1712 region.imageExtent = {2, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001713 m_errorMonitor->SetDesiredFailureMsg(
1714 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001715 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001716 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001717 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001718 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001719
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001720 m_errorMonitor->SetDesiredFailureMsg(
1721 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001722 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001723 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001724 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001725 m_errorMonitor->VerifyFound();
1726
1727 // Offsets must be multiple of compressed block size
1728 region.imageOffset = {1, 1, 0};
1729 region.imageExtent = {1, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001730 // imageOffset not a multiple of block size
1731 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageOffset-00205");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001733 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001734 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001735 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001736
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001737 m_errorMonitor->SetDesiredFailureMsg(
1738 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00205"); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001739 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001740 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001741 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001742 m_errorMonitor->VerifyFound();
1743
Jeff Leger465acf52020-10-12 18:07:16 -04001744 // Equivalent test using KHR_copy_commands2
1745 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1746 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1747 NULL,
1748 region.bufferOffset,
1749 region.bufferRowLength,
1750 region.bufferImageHeight,
1751 region.imageSubresource,
1752 region.imageOffset,
1753 region.imageExtent};
1754 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1755 NULL,
1756 buffer_16.handle(),
1757 image.handle(),
1758 VK_IMAGE_LAYOUT_GENERAL,
1759 1,
1760 &region2};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001761 m_errorMonitor->SetDesiredFailureMsg(
1762 kErrorBit, "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-00205"); // imageOffset not a multiple of block size
Jeff Leger465acf52020-10-12 18:07:16 -04001763 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1764 "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-01793"); // image transfer granularity
1765 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1766 m_errorMonitor->VerifyFound();
1767 }
1768
unknown088160a2019-05-23 17:43:13 -06001769 // Offset + extent width = mip width - should succeed
1770 region.imageOffset = {4, 4, 0};
1771 region.imageExtent = {3, 4, 1};
1772 region.imageSubresource.mipLevel = 2;
1773 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001774
1775 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1776 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001777 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1778 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001779
1780 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1781 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001782 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1783 &region);
unknown088160a2019-05-23 17:43:13 -06001784 m_errorMonitor->VerifyNotFound();
1785
unknown088160a2019-05-23 17:43:13 -06001786 // Offset + extent width < mip width and not a multiple of block width - should fail
1787 region.imageExtent = {3, 3, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001788 m_errorMonitor->SetDesiredFailureMsg(
1789 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001790 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001791 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001792 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1793 &region);
unknown088160a2019-05-23 17:43:13 -06001794 m_errorMonitor->VerifyFound();
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001795 m_errorMonitor->SetDesiredFailureMsg(
1796 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001797 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001798 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001799 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1800 &region);
unknown088160a2019-05-23 17:43:13 -06001801 m_errorMonitor->VerifyFound();
1802}
1803
1804TEST_F(VkLayerTest, ImageBufferCopyTests) {
1805 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001806
1807 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1808 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1809 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1810 if (mp_extensions) {
1811 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1812 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001813 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
sfricke-samsung6d97e562020-01-07 22:01:00 -08001814 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1815 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1816 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1817 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1818 if (mp_extensions) {
1819 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1820 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1821 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1822 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1823 }
1824 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001825
1826 // Bail if any dimension of transfer granularity is 0.
1827 auto index = m_device->graphics_queue_node_index_;
1828 auto queue_family_properties = m_device->phy().queue_properties();
1829 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1830 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1831 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1832 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1833 return;
1834 }
1835
sfricke-samsung6d97e562020-01-07 22:01:00 -08001836 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1837 // 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 -07001838 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1839 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001840 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001841 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1842 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1843 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1844 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1845 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001846 // compression
1847 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1848 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1849 // multi-planar
1850 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 -06001851
sfricke-samsung6d97e562020-01-07 22:01:00 -08001852 // Verify R8G8B8A8_UINT format is supported for transfer
1853 bool missing_rgba_support = false;
1854 VkFormatProperties props = {0, 0, 0};
1855 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1856 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1857 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1858 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1859
1860 if (!missing_rgba_support) {
1861 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1862 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1863 VK_IMAGE_TILING_OPTIMAL, 0);
1864 ASSERT_TRUE(image_64k.initialized());
1865
1866 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1867 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1868 VK_IMAGE_TILING_OPTIMAL, 0);
1869 ASSERT_TRUE(image_16k.initialized());
1870 }
unknown088160a2019-05-23 17:43:13 -06001871
1872 // Verify all needed Depth/Stencil formats are supported
1873 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001874 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001875 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1876 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1877 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001878 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001879 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1880 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1881 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001882 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001883 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1884 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1885 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001886 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001887 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1888 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1889 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1890
1891 if (!missing_ds_support) {
1892 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1893 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1894 ASSERT_TRUE(image_16k_depth.initialized());
1895
1896 ds_image_4D_1S.Init(
1897 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1898 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1899 VK_IMAGE_TILING_OPTIMAL, 0);
1900 ASSERT_TRUE(ds_image_4D_1S.initialized());
1901
1902 ds_image_3D_1S.Init(
1903 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1904 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1905 VK_IMAGE_TILING_OPTIMAL, 0);
1906 ASSERT_TRUE(ds_image_3D_1S.initialized());
1907
1908 ds_image_2D.Init(
1909 256, 256, 1, VK_FORMAT_D16_UNORM,
1910 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1911 VK_IMAGE_TILING_OPTIMAL, 0);
1912 ASSERT_TRUE(ds_image_2D.initialized());
1913
1914 ds_image_1S.Init(
1915 256, 256, 1, VK_FORMAT_S8_UINT,
1916 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1917 VK_IMAGE_TILING_OPTIMAL, 0);
1918 ASSERT_TRUE(ds_image_1S.initialized());
1919 }
1920
1921 // Allocate buffers
1922 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1923 VkMemoryPropertyFlags reqs = 0;
1924 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1925 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1926 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1927 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1928
1929 VkBufferImageCopy region = {};
1930 region.bufferRowLength = 0;
1931 region.bufferImageHeight = 0;
1932 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1933 region.imageSubresource.layerCount = 1;
1934 region.imageOffset = {0, 0, 0};
1935 region.imageExtent = {64, 64, 1};
1936 region.bufferOffset = 0;
1937
locke-lunargdf00db02020-03-04 19:00:57 -07001938 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001939 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001940 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1941 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001942 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001943 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1944 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001945 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001946 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1947 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1948
sfricke-samsung6d97e562020-01-07 22:01:00 -08001949 if (missing_rgba_support) {
1950 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001951
sfricke-samsung6d97e562020-01-07 22:01:00 -08001952 // start recording for future tests
1953 m_commandBuffer->begin();
1954 } else {
1955 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001956 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001957 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1958 &region);
unknown088160a2019-05-23 17:43:13 -06001959 m_errorMonitor->VerifyFound();
1960
Mark Lobodzinski20310782020-02-28 14:25:17 -07001961 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001962 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1963 &region);
1964 m_errorMonitor->VerifyFound();
1965
1966 // start recording
1967 m_commandBuffer->begin();
1968
1969 // successful copies
1970 m_errorMonitor->ExpectSuccess();
1971 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1972 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001973
1974 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1975 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001976 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1977 &region);
1978 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001979
1980 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1981 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001982 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1983 &region);
1984 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001985
1986 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1987 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001988 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1989 &region);
1990 region.imageOffset.x = 0;
1991 region.imageExtent.height = 64;
1992 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001993
1994 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1995 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001996 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1997 &region);
1998 m_errorMonitor->VerifyNotFound();
1999
2000 // image/buffer too small (extent too large) on copy to image
2001 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07002002 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002003 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
2004 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2005 &region);
2006 m_errorMonitor->VerifyFound();
2007
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002008 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002009 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002010 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
2011 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2012 &region);
2013 m_errorMonitor->VerifyFound();
2014
2015 // image/buffer too small (offset) on copy to image
2016 region.imageExtent = {64, 64, 1};
2017 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07002018 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002019 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
2020 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2021 &region);
2022 m_errorMonitor->VerifyFound();
2023
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002024 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2025 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002026 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002027 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
2028 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2029 &region);
2030 m_errorMonitor->VerifyFound();
2031
2032 // image/buffer too small on copy to buffer
2033 region.imageExtent = {64, 64, 1};
2034 region.imageOffset = {0, 0, 0};
2035 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002036 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002037 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
2038 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2039 &region);
2040 m_errorMonitor->VerifyFound();
2041
2042 region.imageExtent = {64, 65, 1};
2043 region.bufferOffset = 0;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002044 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002045 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002046 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // image too small
2047 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
2048 &region);
2049 m_errorMonitor->VerifyFound();
2050
2051 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07002052 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002053 region.imageExtent = {64, 64, 1};
2054 region.bufferRowLength = 68;
2055 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2056 &region);
2057 m_errorMonitor->VerifyFound();
2058
2059 // An extent with zero area should produce a warning, but no error
Mark Lobodzinski20310782020-02-28 14:25:17 -07002060 m_errorMonitor->SetDesiredFailureMsg(kWarningBit | kErrorBit, "} has zero area");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002061 region.imageExtent.width = 0;
2062 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2063 &region);
2064 m_errorMonitor->VerifyFound();
2065
2066 // aspect bits
2067 region.imageExtent = {64, 64, 1};
2068 region.bufferRowLength = 0;
2069 region.bufferImageHeight = 0;
2070 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07002071 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002072 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
2073 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
2074 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2075 buffer_16k.handle(), 1, &region);
2076 m_errorMonitor->VerifyFound();
2077
Mark Lobodzinski20310782020-02-28 14:25:17 -07002078 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002079 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002080 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2081 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2082 buffer_16k.handle(), 1, &region);
2083 m_errorMonitor->VerifyFound();
2084 }
2085
Mark Lobodzinski20310782020-02-28 14:25:17 -07002086 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002087 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002088 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2089 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2090 &region);
2091 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002092 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002093
2094 // Out-of-range mip levels should fail
2095 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002096 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002097 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00197");
2098 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00198");
2099 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002100 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002101 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002102 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // unavoidable "region exceeds image bounds" for non-existent mip
2103 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2104 &region);
2105 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002106 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002107 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2108 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
2109 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002110 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002111 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002112 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // unavoidable "region exceeds image bounds" for non-existent mip
2113 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2114 &region);
2115 m_errorMonitor->VerifyFound();
2116 region.imageSubresource.mipLevel = 0;
2117
2118 // Out-of-range array layers should fail
2119 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2120 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002121 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002122 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2123 &region);
2124 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002125 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002126 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2127 &region);
2128 m_errorMonitor->VerifyFound();
2129 region.imageSubresource.baseArrayLayer = 0;
2130
2131 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002132 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002133 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2134 buffer_16k.handle(), 1, &region);
2135 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002136 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002137 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2138 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002139 m_errorMonitor->VerifyFound();
2140 }
2141
unknown088160a2019-05-23 17:43:13 -06002142 // Test Depth/Stencil copies
2143 if (missing_ds_support) {
2144 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2145 } else {
2146 VkBufferImageCopy ds_region = {};
2147 ds_region.bufferOffset = 0;
2148 ds_region.bufferRowLength = 0;
2149 ds_region.bufferImageHeight = 0;
2150 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2151 ds_region.imageSubresource.mipLevel = 0;
2152 ds_region.imageSubresource.baseArrayLayer = 0;
2153 ds_region.imageSubresource.layerCount = 1;
2154 ds_region.imageOffset = {0, 0, 0};
2155 ds_region.imageExtent = {256, 256, 1};
2156
2157 // Depth copies that should succeed
2158 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002159 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2160 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002161 m_errorMonitor->VerifyNotFound();
2162
2163 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002164 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2165 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002166 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2167 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002168 m_errorMonitor->VerifyNotFound();
2169
2170 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002171 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2172 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002173 m_errorMonitor->VerifyNotFound();
2174
2175 // Depth copies that should fail
2176 ds_region.bufferOffset = 4;
2177 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002178 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002179 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002180 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2181 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002182 m_errorMonitor->VerifyFound();
2183
2184 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002185 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002186 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002187 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002188 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002189 m_errorMonitor->VerifyFound();
2190
2191 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002192 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002193 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002194 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2195 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002196 m_errorMonitor->VerifyFound();
2197
sfricke-samsung5a019492021-01-25 10:32:08 -08002198 ds_region.bufferOffset = 5;
2199 ds_region.imageExtent = {64, 64, 1}; // need smaller so offset works
2200 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImage-04053");
2201 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2202 buffer_128k.handle(), 1, &ds_region);
2203 m_errorMonitor->VerifyFound();
2204 ds_region.imageExtent = {256, 256, 1};
2205
unknown088160a2019-05-23 17:43:13 -06002206 // Stencil copies that should succeed
2207 ds_region.bufferOffset = 0;
2208 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2209 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002210 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2211 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002212 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2213 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002214 m_errorMonitor->VerifyNotFound();
2215
2216 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002217 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2218 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002219 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2220 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002221 m_errorMonitor->VerifyNotFound();
2222
2223 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002224 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2225 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002226 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2227 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002228 m_errorMonitor->VerifyNotFound();
2229
2230 // Stencil copies that should fail
2231 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002232 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002233 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002234 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2235 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002236 m_errorMonitor->VerifyFound();
2237
2238 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002239 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002240 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2241 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002242 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2243 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002244 m_errorMonitor->VerifyFound();
2245
2246 ds_region.bufferRowLength = 0;
2247 ds_region.bufferOffset = 4;
2248 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002249 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002250 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002251 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2252 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002253 m_errorMonitor->VerifyFound();
2254 }
2255
2256 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002257 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002258 VkPhysicalDeviceFeatures device_features = {};
2259 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2260 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2261 device_features.textureCompressionASTC_LDR)) {
2262 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2263 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002264 // Verify transfer support for each compression format used blow
2265 bool missing_bc_support = false;
2266 bool missing_etc_support = false;
2267 bool missing_astc_support = false;
2268 bool missing_compression_support = false;
2269
2270 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2271 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2272 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2273 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2274
2275 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2276 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2277 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2278 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2279
2280 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2281 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2282 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2283 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2284
2285 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002286 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2287 0);
2288 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2289 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002290 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002291 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2292 VK_IMAGE_TILING_OPTIMAL, 0);
2293 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2294 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002295 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002296 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2297 VK_IMAGE_TILING_OPTIMAL, 0);
2298 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2299 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002300 } else {
2301 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002302 }
unknown088160a2019-05-23 17:43:13 -06002303
sfricke-samsung6d97e562020-01-07 22:01:00 -08002304 if (missing_compression_support) {
2305 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2306 } else {
2307 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002308 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002309 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002310 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2311 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002312 m_errorMonitor->ExpectSuccess();
2313 region.imageExtent = {128, 128, 1};
2314 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2315 buffer_16k.handle(), 1, &region);
2316 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002317
sfricke-samsung6d97e562020-01-07 22:01:00 -08002318 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002319 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002320 region.bufferOffset = 16;
2321 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2322 buffer_16k.handle(), 1, &region);
2323 m_errorMonitor->VerifyFound();
2324 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002325
sfricke-samsung6d97e562020-01-07 22:01:00 -08002326 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002327 m_errorMonitor->SetDesiredFailureMsg(
2328 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002329 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002330 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2331 region.imageExtent.width = 66;
2332 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2333 buffer_16k.handle(), 1, &region);
2334 m_errorMonitor->VerifyFound();
2335 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002336
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002337 m_errorMonitor->SetDesiredFailureMsg(
2338 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002339 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002340 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2341 region.imageExtent.height = 2;
2342 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2343 buffer_16k.handle(), 1, &region);
2344 m_errorMonitor->VerifyFound();
2345 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002346
sfricke-samsung6d97e562020-01-07 22:01:00 -08002347 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002348
sfricke-samsung6d97e562020-01-07 22:01:00 -08002349 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2350 m_errorMonitor->ExpectSuccess();
2351 region.imageExtent.width = 66;
2352 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002353 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2354 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002355 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2356 buffer_16k.handle(), 1, &region);
2357 region.imageExtent.width = 16;
2358 region.imageOffset.x = 0;
2359 region.imageExtent.height = 2;
2360 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002361 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2362 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002363 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2364 buffer_16k.handle(), 1, &region);
2365 m_errorMonitor->VerifyNotFound();
2366 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002367
sfricke-samsung6d97e562020-01-07 22:01:00 -08002368 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002369 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002370 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002371 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002372 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002373 region.imageExtent = {64, 64, 1};
2374 region.bufferOffset = 24;
2375 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2376 buffer_16k.handle(), 1, &region);
2377 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002378
sfricke-samsung6d97e562020-01-07 22:01:00 -08002379 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002380 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002381 region.bufferOffset = 0;
2382 region.bufferRowLength = 130;
2383 region.bufferImageHeight = 0;
2384 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2385 buffer_64k.handle(), 1, &region);
2386 m_errorMonitor->VerifyFound();
2387
2388 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002389 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002390 region.bufferRowLength = 0;
2391 region.bufferImageHeight = 130;
2392 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2393 buffer_64k.handle(), 1, &region);
2394 m_errorMonitor->VerifyFound();
2395 }
2396 }
2397
2398 // Test multi-planar formats, if supported
2399 if (!mp_extensions) {
2400 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2401 } else {
2402 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2403 // being required with samplerYcbcrConversion feature
2404 bool missing_mp_support = false;
2405 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2406 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2407 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2408 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2409
2410 if (missing_mp_support) {
2411 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2412 } else {
2413 VkBufferImageCopy mp_region = {};
2414 mp_region.bufferOffset = 0;
2415 mp_region.bufferRowLength = 0;
2416 mp_region.bufferImageHeight = 0;
2417 mp_region.imageSubresource.mipLevel = 0;
2418 mp_region.imageSubresource.baseArrayLayer = 0;
2419 mp_region.imageSubresource.layerCount = 1;
2420 mp_region.imageOffset = {0, 0, 0};
2421 mp_region.imageExtent = {128, 128, 1};
2422
2423 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2424 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2425 VK_IMAGE_TILING_OPTIMAL, 0);
2426 ASSERT_TRUE(image_multi_planar.initialized());
2427
2428 // Copies into a mutli-planar image aspect properly
2429 m_errorMonitor->ExpectSuccess();
2430 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002431 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2432 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002433 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2434 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2435 m_errorMonitor->VerifyNotFound();
2436
2437 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002438 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002439 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2440 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2441 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2442 m_errorMonitor->VerifyFound();
2443
2444 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002445 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002446 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2447 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2448 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2449 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002450
2451 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002452 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002453 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2454 mp_region.bufferOffset = 5;
2455 mp_region.imageExtent = {8, 8, 1};
2456 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2457 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2458 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002459 }
unknown088160a2019-05-23 17:43:13 -06002460 }
2461}
2462
2463TEST_F(VkLayerTest, MiscImageLayerTests) {
2464 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2465
2466 ASSERT_NO_FATAL_FAILURE(Init());
2467
2468 // TODO: Ideally we should check if a format is supported, before using it.
2469 VkImageObj image(m_device);
2470 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2471 ASSERT_TRUE(image.initialized());
2472 VkBufferObj buffer;
2473 VkMemoryPropertyFlags reqs = 0;
2474 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2475 VkBufferImageCopy region = {};
2476 region.bufferRowLength = 128;
2477 region.bufferImageHeight = 128;
2478 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2479 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2480 region.imageSubresource.layerCount = 1;
2481 region.imageExtent.height = 4;
2482 region.imageExtent.width = 4;
2483 region.imageExtent.depth = 1;
2484
2485 VkImageObj image2(m_device);
2486 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2487 ASSERT_TRUE(image2.initialized());
2488 VkBufferObj buffer2;
2489 VkMemoryPropertyFlags reqs2 = 0;
2490 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002491 m_commandBuffer->begin();
2492
2493 // Image must have offset.z of 0 and extent.depth of 1
2494 // Introduce failure by setting imageExtent.depth to 0
2495 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002496 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002497 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2498 &region);
unknown088160a2019-05-23 17:43:13 -06002499 m_errorMonitor->VerifyFound();
2500
2501 region.imageExtent.depth = 1;
2502
2503 // Image must have offset.z of 0 and extent.depth of 1
2504 // Introduce failure by setting imageOffset.z to 4
2505 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2506 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002507 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2508 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002509 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00172");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002510 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2511 &region);
unknown088160a2019-05-23 17:43:13 -06002512 m_errorMonitor->VerifyFound();
2513
2514 region.imageOffset.z = 0;
2515 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2516 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2517 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002518 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002519 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2520 &region);
unknown088160a2019-05-23 17:43:13 -06002521 m_errorMonitor->VerifyFound();
2522
unknown088160a2019-05-23 17:43:13 -06002523 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2524 region.bufferOffset = 0;
2525 region.imageExtent.height = 128;
2526 region.imageExtent.width = 128;
2527 // Introduce failure by setting bufferRowLength > 0 but less than width
2528 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002529 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002530 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2531 &region);
unknown088160a2019-05-23 17:43:13 -06002532 m_errorMonitor->VerifyFound();
2533
2534 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2535 region.bufferRowLength = 128;
2536 // Introduce failure by setting bufferRowHeight > 0 but less than height
2537 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002538 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002539 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2540 &region);
unknown088160a2019-05-23 17:43:13 -06002541 m_errorMonitor->VerifyFound();
2542
2543 region.bufferImageHeight = 128;
2544 VkImageObj intImage1(m_device);
2545 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2546 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2547 VkImageObj intImage2(m_device);
2548 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2549 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2550 VkImageBlit blitRegion = {};
2551 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2552 blitRegion.srcSubresource.baseArrayLayer = 0;
2553 blitRegion.srcSubresource.layerCount = 1;
2554 blitRegion.srcSubresource.mipLevel = 0;
2555 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2556 blitRegion.dstSubresource.baseArrayLayer = 0;
2557 blitRegion.dstSubresource.layerCount = 1;
2558 blitRegion.dstSubresource.mipLevel = 0;
2559 blitRegion.srcOffsets[0] = {128, 0, 0};
2560 blitRegion.srcOffsets[1] = {128, 128, 1};
2561 blitRegion.dstOffsets[0] = {0, 128, 0};
2562 blitRegion.dstOffsets[1] = {128, 128, 1};
2563
2564 // Look for NULL-blit warning
Mark Lobodzinski20310782020-02-28 14:25:17 -07002565 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].srcOffsets specify a zero-volume area.");
2566 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002567 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2568 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002569 m_errorMonitor->VerifyFound();
2570}
2571
2572TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2573 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002574 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2575
2576 bool copy_commands2 = false;
2577 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2578 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2579 copy_commands2 = true;
2580 }
2581 ASSERT_NO_FATAL_FAILURE(InitState());
2582
2583 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2584 if (copy_commands2) {
2585 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2586 }
unknown088160a2019-05-23 17:43:13 -06002587
sfricke-samsung30b094c2020-05-30 11:42:11 -07002588 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2589 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
2590 printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
2591 return;
2592 }
2593
unknown088160a2019-05-23 17:43:13 -06002594 VkImageCreateInfo ci;
2595 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2596 ci.pNext = NULL;
2597 ci.flags = 0;
2598 ci.imageType = VK_IMAGE_TYPE_1D;
2599 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2600 ci.extent = {32, 1, 1};
2601 ci.mipLevels = 1;
2602 ci.arrayLayers = 1;
2603 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2604 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2605 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2606 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2607 ci.queueFamilyIndexCount = 0;
2608 ci.pQueueFamilyIndices = NULL;
2609 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2610
2611 // Create 1D image
2612 VkImageObj image_1D(m_device);
2613 image_1D.init(&ci);
2614 ASSERT_TRUE(image_1D.initialized());
2615
2616 // 2D image
2617 ci.imageType = VK_IMAGE_TYPE_2D;
2618 ci.extent = {32, 32, 1};
2619 VkImageObj image_2D(m_device);
2620 image_2D.init(&ci);
2621 ASSERT_TRUE(image_2D.initialized());
2622
2623 // 3D image
2624 ci.imageType = VK_IMAGE_TYPE_3D;
2625 ci.extent = {32, 32, 8};
2626 VkImageObj image_3D(m_device);
2627 image_3D.init(&ci);
2628 ASSERT_TRUE(image_3D.initialized());
2629
2630 // 2D image array
2631 ci.imageType = VK_IMAGE_TYPE_2D;
2632 ci.extent = {32, 32, 1};
2633 ci.arrayLayers = 8;
2634 VkImageObj image_2D_array(m_device);
2635 image_2D_array.init(&ci);
2636 ASSERT_TRUE(image_2D_array.initialized());
2637
2638 m_commandBuffer->begin();
2639
2640 VkImageCopy copy_region;
2641 copy_region.extent = {32, 1, 1};
2642 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2643 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2644 copy_region.srcSubresource.mipLevel = 0;
2645 copy_region.dstSubresource.mipLevel = 0;
2646 copy_region.srcSubresource.baseArrayLayer = 0;
2647 copy_region.dstSubresource.baseArrayLayer = 0;
2648 copy_region.srcSubresource.layerCount = 1;
2649 copy_region.dstSubresource.layerCount = 1;
2650 copy_region.srcOffset = {0, 0, 0};
2651 copy_region.dstOffset = {0, 0, 0};
2652
2653 // Sanity check
2654 m_errorMonitor->ExpectSuccess();
2655 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2656 &copy_region);
2657 m_errorMonitor->VerifyNotFound();
2658
Jeff Leger465acf52020-10-12 18:07:16 -04002659 // Equivalent sanity check using KHR_copy_commands2
2660 if (copy_commands2 && vkCmdCopyImage2Function) {
2661 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2662 NULL,
2663 copy_region.srcSubresource,
2664 copy_region.srcOffset,
2665 copy_region.dstSubresource,
2666 copy_region.dstOffset,
2667 copy_region.extent};
2668 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2669 NULL,
2670 image_1D.image(),
2671 VK_IMAGE_LAYOUT_GENERAL,
2672 image_2D.image(),
2673 VK_IMAGE_LAYOUT_GENERAL,
2674 1,
2675 &region2};
2676 m_errorMonitor->ExpectSuccess();
2677 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2678 m_errorMonitor->VerifyNotFound();
2679 }
2680
unknown088160a2019-05-23 17:43:13 -06002681 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2682 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002683 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2684 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002685 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2686 &copy_region);
2687 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002688
2689 // Equivalent test using KHR_copy_commands2
2690 if (copy_commands2 && vkCmdCopyImage2Function) {
2691 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2692 NULL,
2693 copy_region.srcSubresource,
2694 copy_region.srcOffset,
2695 copy_region.dstSubresource,
2696 copy_region.dstOffset,
2697 copy_region.extent};
2698 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2699 NULL,
2700 image_1D.image(),
2701 VK_IMAGE_LAYOUT_GENERAL,
2702 image_2D.image(),
2703 VK_IMAGE_LAYOUT_GENERAL,
2704 1,
2705 &region2};
2706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2707 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2708 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2709 m_errorMonitor->VerifyFound();
2710 }
2711
unknown088160a2019-05-23 17:43:13 -06002712 copy_region.srcOffset.y = 0;
2713 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002714 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2715 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002716 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2717 &copy_region);
2718 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002719
2720 // Equivalent test using KHR_copy_commands2
2721 if (copy_commands2 && vkCmdCopyImage2Function) {
2722 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2723 NULL,
2724 copy_region.srcSubresource,
2725 copy_region.srcOffset,
2726 copy_region.dstSubresource,
2727 copy_region.dstOffset,
2728 copy_region.extent};
2729 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2730 NULL,
2731 image_2D.image(),
2732 VK_IMAGE_LAYOUT_GENERAL,
2733 image_1D.image(),
2734 VK_IMAGE_LAYOUT_GENERAL,
2735 1,
2736 &region2};
2737 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2739 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2740 m_errorMonitor->VerifyFound();
2741 }
2742
unknown088160a2019-05-23 17:43:13 -06002743 copy_region.dstOffset.y = 0;
2744
2745 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2746 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002747 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2748 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002749 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2750 &copy_region);
2751 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002752
2753 // Equivalent test using KHR_copy_commands2
2754 if (copy_commands2 && vkCmdCopyImage2Function) {
2755 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2756 NULL,
2757 copy_region.srcSubresource,
2758 copy_region.srcOffset,
2759 copy_region.dstSubresource,
2760 copy_region.dstOffset,
2761 copy_region.extent};
2762 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2763 NULL,
2764 image_1D.image(),
2765 VK_IMAGE_LAYOUT_GENERAL,
2766 image_2D.image(),
2767 VK_IMAGE_LAYOUT_GENERAL,
2768 1,
2769 &region2};
2770 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2771 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2772 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2773 m_errorMonitor->VerifyFound();
2774 }
2775
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002776 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2777 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002778 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2779 &copy_region);
2780 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002781
2782 // Equivalent test using KHR_copy_commands2
2783 if (copy_commands2 && vkCmdCopyImage2Function) {
2784 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2785 NULL,
2786 copy_region.srcSubresource,
2787 copy_region.srcOffset,
2788 copy_region.dstSubresource,
2789 copy_region.dstOffset,
2790 copy_region.extent};
2791 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2792 NULL,
2793 image_2D.image(),
2794 VK_IMAGE_LAYOUT_GENERAL,
2795 image_1D.image(),
2796 VK_IMAGE_LAYOUT_GENERAL,
2797 1,
2798 &region2};
2799 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2800 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2801 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2802 m_errorMonitor->VerifyFound();
2803 }
2804
unknown088160a2019-05-23 17:43:13 -06002805 copy_region.extent.height = 1;
2806
2807 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2808 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002809 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2810 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002811 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2812 &copy_region);
2813 m_errorMonitor->VerifyFound();
2814 copy_region.srcOffset.z = 0;
2815 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002816 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002818 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2819 &copy_region);
2820 m_errorMonitor->VerifyFound();
2821 copy_region.dstOffset.z = 0;
2822
2823 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2824 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002825 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002826 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002827 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002828 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002829 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002830 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002831 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002832 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2833 &copy_region);
2834 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002835 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002836 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002837 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002838 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002839 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002840 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002841 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002842 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2843 &copy_region);
2844 m_errorMonitor->VerifyFound();
2845 copy_region.extent.depth = 1;
2846
2847 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2848 copy_region.extent = {16, 16, 1};
2849 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002850 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002851 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002852 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002853 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2854 &copy_region);
2855 m_errorMonitor->VerifyFound();
2856 copy_region.srcOffset.z = 0;
2857 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002858 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002859 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002860 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002861 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2862 &copy_region);
2863 m_errorMonitor->VerifyFound();
2864 copy_region.dstOffset.z = 0;
2865
2866 // 3D texture accessing an array layer other than 0. VU 09c0011a
2867 copy_region.extent = {4, 4, 1};
2868 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002869 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002870 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002871 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2872 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2873 &copy_region);
2874 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002875 copy_region.srcSubresource.baseArrayLayer = 0;
2876
unknown088160a2019-05-23 17:43:13 -06002877 m_commandBuffer->end();
2878}
2879
2880TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2881 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002882 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06002883 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
2884 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2885 } else {
2886 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2887 return;
2888 }
2889 ASSERT_NO_FATAL_FAILURE(InitState());
2890
2891 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2892 VkFormatProperties format_props;
2893 // TODO: Remove this check if or when devsim handles extensions.
2894 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2895 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002896 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002897 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2898 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2899 return;
2900 }
2901
2902 VkImageCreateInfo ci;
2903 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2904 ci.pNext = NULL;
2905 ci.flags = 0;
2906 ci.imageType = VK_IMAGE_TYPE_1D;
2907 ci.format = image_format;
2908 ci.extent = {32, 1, 1};
2909 ci.mipLevels = 1;
2910 ci.arrayLayers = 1;
2911 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2912 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2913 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2914 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2915 ci.queueFamilyIndexCount = 0;
2916 ci.pQueueFamilyIndices = NULL;
2917 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2918
2919 // Create 1D image
2920 VkImageObj image_1D(m_device);
2921 image_1D.init(&ci);
2922 ASSERT_TRUE(image_1D.initialized());
2923
2924 // 2D image
2925 ci.imageType = VK_IMAGE_TYPE_2D;
2926 ci.extent = {32, 32, 1};
2927 VkImageObj image_2D(m_device);
2928 image_2D.init(&ci);
2929 ASSERT_TRUE(image_2D.initialized());
2930
2931 // 3D image
2932 ci.imageType = VK_IMAGE_TYPE_3D;
2933 ci.extent = {32, 32, 8};
2934 VkImageObj image_3D(m_device);
2935 image_3D.init(&ci);
2936 ASSERT_TRUE(image_3D.initialized());
2937
2938 // 2D image array
2939 ci.imageType = VK_IMAGE_TYPE_2D;
2940 ci.extent = {32, 32, 1};
2941 ci.arrayLayers = 8;
2942 VkImageObj image_2D_array(m_device);
2943 image_2D_array.init(&ci);
2944 ASSERT_TRUE(image_2D_array.initialized());
2945
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002946 // second 2D image array
2947 ci.imageType = VK_IMAGE_TYPE_2D;
2948 ci.extent = {32, 32, 1};
2949 ci.arrayLayers = 8;
2950 VkImageObj image_2D_array_2(m_device);
2951 image_2D_array_2.init(&ci);
2952 ASSERT_TRUE(image_2D_array_2.initialized());
2953
unknown088160a2019-05-23 17:43:13 -06002954 m_commandBuffer->begin();
2955
2956 VkImageCopy copy_region;
2957 copy_region.extent = {32, 1, 1};
2958 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2959 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2960 copy_region.srcSubresource.mipLevel = 0;
2961 copy_region.dstSubresource.mipLevel = 0;
2962 copy_region.srcSubresource.baseArrayLayer = 0;
2963 copy_region.dstSubresource.baseArrayLayer = 0;
2964 copy_region.srcSubresource.layerCount = 1;
2965 copy_region.dstSubresource.layerCount = 1;
2966 copy_region.srcOffset = {0, 0, 0};
2967 copy_region.dstOffset = {0, 0, 0};
2968
2969 // Copy from layer not present
2970 copy_region.srcSubresource.baseArrayLayer = 4;
2971 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002972 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002973 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2974 &copy_region);
2975 m_errorMonitor->VerifyFound();
2976 copy_region.srcSubresource.baseArrayLayer = 0;
2977 copy_region.srcSubresource.layerCount = 1;
2978
2979 // Copy to layer not present
2980 copy_region.dstSubresource.baseArrayLayer = 1;
2981 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002982 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002983 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2984 &copy_region);
2985 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002986 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002987 copy_region.dstSubresource.layerCount = 1;
2988
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002989 // both 2D and extent.depth not 1
2990 // Need two 2D array images to prevent other errors
2991 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002992 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002993 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2994 1, &copy_region);
2995 m_errorMonitor->VerifyFound();
2996 copy_region.extent = {32, 1, 1};
2997
2998 // 2D src / 3D dst and depth not equal to src layerCount
2999 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003000 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003001 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08003002 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3003 &copy_region);
3004 m_errorMonitor->VerifyFound();
3005 copy_region.extent = {32, 1, 1};
3006
3007 // 3D src / 2D dst and depth not equal to dst layerCount
3008 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003009 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003010 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08003011 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3012 &copy_region);
3013 m_errorMonitor->VerifyFound();
3014 copy_region.extent = {32, 1, 1};
3015
unknown088160a2019-05-23 17:43:13 -06003016 m_commandBuffer->end();
3017}
3018
3019TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
3020 // Image copy tests on compressed images with block alignment errors
3021 SetTargetApiVersion(VK_API_VERSION_1_1);
3022 ASSERT_NO_FATAL_FAILURE(Init());
3023
3024 // Select a compressed format and verify support
3025 VkPhysicalDeviceFeatures device_features = {};
3026 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
3027 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
3028 if (device_features.textureCompressionBC) {
3029 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
3030 } else if (device_features.textureCompressionETC2) {
3031 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
3032 } else if (device_features.textureCompressionASTC_LDR) {
3033 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
3034 }
3035
3036 VkImageCreateInfo ci;
3037 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3038 ci.pNext = NULL;
3039 ci.flags = 0;
3040 ci.imageType = VK_IMAGE_TYPE_2D;
3041 ci.format = compressed_format;
3042 ci.extent = {64, 64, 1};
3043 ci.mipLevels = 1;
3044 ci.arrayLayers = 1;
3045 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3046 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3047 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3048 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3049 ci.queueFamilyIndexCount = 0;
3050 ci.pQueueFamilyIndices = NULL;
3051 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3052
3053 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003054 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
3055 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06003056 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
3057 return;
3058 }
3059
3060 // Create images
3061 VkImageObj image_1(m_device);
3062 image_1.init(&ci);
3063 ASSERT_TRUE(image_1.initialized());
3064
3065 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
3066 VkImageObj image_2(m_device);
3067 image_2.init(&ci);
3068 ASSERT_TRUE(image_2.initialized());
3069
3070 m_commandBuffer->begin();
3071
3072 VkImageCopy copy_region;
3073 copy_region.extent = {48, 48, 1};
3074 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3075 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3076 copy_region.srcSubresource.mipLevel = 0;
3077 copy_region.dstSubresource.mipLevel = 0;
3078 copy_region.srcSubresource.baseArrayLayer = 0;
3079 copy_region.dstSubresource.baseArrayLayer = 0;
3080 copy_region.srcSubresource.layerCount = 1;
3081 copy_region.dstSubresource.layerCount = 1;
3082 copy_region.srcOffset = {0, 0, 0};
3083 copy_region.dstOffset = {0, 0, 0};
3084
3085 // Sanity check
3086 m_errorMonitor->ExpectSuccess();
3087 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3088 m_errorMonitor->VerifyNotFound();
3089
3090 std::string vuid;
3091 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3092 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3093
3094 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3095 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003096 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003097 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003098 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3099 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003100 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3101 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3102 m_errorMonitor->VerifyFound();
3103 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003104 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3105 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003106 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3107 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3108 m_errorMonitor->VerifyFound();
3109 copy_region.srcOffset = {0, 0, 0};
3110
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003111 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003112 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003113 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3114 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003115 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3116 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3117 m_errorMonitor->VerifyFound();
3118 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003119 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3120 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003121 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3122 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3123 m_errorMonitor->VerifyFound();
3124 copy_region.dstOffset = {0, 0, 0};
3125
3126 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003127 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003128 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003129 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3130 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003131 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3132 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3133 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003134 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003135 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003136 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3137 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003138 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3139 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3140 m_errorMonitor->VerifyFound();
3141
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003142 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003143 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003144 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3145 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003146 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3147 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3148 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003149 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003150 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003151 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3152 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003153 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3154 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3155 m_errorMonitor->VerifyFound();
3156
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003157 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3158 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003159 // There are currently no supported compressed formats with a block depth other than 1,
3160 // so impossible to create a 'not a multiple' condition for depth.
3161 m_commandBuffer->end();
3162}
3163
3164TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3165 // Image copy tests on single-plane _422 formats with block alignment errors
3166
3167 // Enable KHR multiplane req'd extensions
3168 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3169 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3170 if (mp_extensions) {
3171 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3172 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003173 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003174 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3175 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3176 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3177 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3178 if (mp_extensions) {
3179 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3180 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3181 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3182 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3183 } else {
3184 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3185 return;
3186 }
3187 ASSERT_NO_FATAL_FAILURE(InitState());
3188
3189 // Select a _422 format and verify support
3190 VkImageCreateInfo ci = {};
3191 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3192 ci.pNext = NULL;
3193 ci.flags = 0;
3194 ci.imageType = VK_IMAGE_TYPE_2D;
3195 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3196 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3197 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3198 ci.mipLevels = 1;
3199 ci.arrayLayers = 1;
3200 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3201 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3202 ci.queueFamilyIndexCount = 0;
3203 ci.pQueueFamilyIndices = NULL;
3204 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3205
3206 // Verify formats
3207 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3208 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3209 if (!supported) {
3210 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3211 return; // Assume there's low ROI on searching for different mp formats
3212 }
3213
3214 // Create images
3215 ci.extent = {64, 64, 1};
3216 VkImageObj image_422(m_device);
3217 image_422.init(&ci);
3218 ASSERT_TRUE(image_422.initialized());
3219
3220 ci.extent = {64, 64, 1};
3221 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3222 VkImageObj image_ucmp(m_device);
3223 image_ucmp.init(&ci);
3224 ASSERT_TRUE(image_ucmp.initialized());
3225
3226 m_commandBuffer->begin();
3227
3228 VkImageCopy copy_region;
3229 copy_region.extent = {48, 48, 1};
3230 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3231 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3232 copy_region.srcSubresource.mipLevel = 0;
3233 copy_region.dstSubresource.mipLevel = 0;
3234 copy_region.srcSubresource.baseArrayLayer = 0;
3235 copy_region.dstSubresource.baseArrayLayer = 0;
3236 copy_region.srcSubresource.layerCount = 1;
3237 copy_region.dstSubresource.layerCount = 1;
3238 copy_region.srcOffset = {0, 0, 0};
3239 copy_region.dstOffset = {0, 0, 0};
3240
3241 // Src offsets must be multiples of compressed block sizes
3242 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003243 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003244 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003245 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3246 &copy_region);
3247 m_errorMonitor->VerifyFound();
3248 copy_region.srcOffset = {0, 0, 0};
3249
3250 // Dst offsets must be multiples of compressed block sizes
3251 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003252 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003253 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003254 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003255 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3256 &copy_region);
3257 m_errorMonitor->VerifyFound();
3258 copy_region.dstOffset = {0, 0, 0};
3259
3260 // Copy extent must be multiples of compressed block sizes if not full width/height
3261 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003262 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003263 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003264 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3265 &copy_region);
3266 m_errorMonitor->VerifyFound();
3267
unknown357e1782019-09-25 17:57:40 -06003268 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003269 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3270 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003271 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003272 copy_region.dstOffset = {0, 0, 0};
3273
3274 m_commandBuffer->end();
3275}
3276
3277TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3278 // Image copy tests on multiplane images with aspect errors
3279
3280 // Enable KHR multiplane req'd extensions
3281 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3282 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3283 if (mp_extensions) {
3284 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3285 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003286 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003287 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3288 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3289 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3290 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3291 if (mp_extensions) {
3292 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3293 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3294 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3295 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3296 } else {
3297 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3298 return;
3299 }
3300 ASSERT_NO_FATAL_FAILURE(InitState());
3301
3302 // Select multi-plane formats and verify support
3303 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3304 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3305
3306 VkImageCreateInfo ci = {};
3307 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3308 ci.pNext = NULL;
3309 ci.flags = 0;
3310 ci.imageType = VK_IMAGE_TYPE_2D;
3311 ci.format = mp2_format;
3312 ci.extent = {256, 256, 1};
3313 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3314 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3315 ci.mipLevels = 1;
3316 ci.arrayLayers = 1;
3317 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3318 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3319 ci.queueFamilyIndexCount = 0;
3320 ci.pQueueFamilyIndices = NULL;
3321 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3322
3323 // Verify formats
3324 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3325 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3326 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3327 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3328 ci.format = mp3_format;
3329 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3330 if (!supported) {
3331 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3332 kSkipPrefix);
3333 return; // Assume there's low ROI on searching for different mp formats
3334 }
3335
3336 // Create images
3337 VkImageObj mp3_image(m_device);
3338 mp3_image.init(&ci);
3339 ASSERT_TRUE(mp3_image.initialized());
3340
3341 ci.format = mp2_format;
3342 VkImageObj mp2_image(m_device);
3343 mp2_image.init(&ci);
3344 ASSERT_TRUE(mp2_image.initialized());
3345
3346 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3347 VkImageObj sp_image(m_device);
3348 sp_image.init(&ci);
3349 ASSERT_TRUE(sp_image.initialized());
3350
3351 m_commandBuffer->begin();
3352
3353 VkImageCopy copy_region;
3354 copy_region.extent = {128, 128, 1};
3355 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3356 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3357 copy_region.srcSubresource.mipLevel = 0;
3358 copy_region.dstSubresource.mipLevel = 0;
3359 copy_region.srcSubresource.baseArrayLayer = 0;
3360 copy_region.dstSubresource.baseArrayLayer = 0;
3361 copy_region.srcSubresource.layerCount = 1;
3362 copy_region.dstSubresource.layerCount = 1;
3363 copy_region.srcOffset = {0, 0, 0};
3364 copy_region.dstOffset = {0, 0, 0};
3365
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003366 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003367 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3368 &copy_region);
3369 m_errorMonitor->VerifyFound();
3370
unknown088160a2019-05-23 17:43:13 -06003371 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3372 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003373 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003374 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3375 &copy_region);
3376 m_errorMonitor->VerifyFound();
3377
3378 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3379 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003380 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003381 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3382 &copy_region);
3383 m_errorMonitor->VerifyFound();
3384
3385 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003386 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003387 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3388 &copy_region);
3389 m_errorMonitor->VerifyFound();
3390
3391 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003392 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003393 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003394 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3395 &copy_region);
3396 m_errorMonitor->VerifyFound();
3397
3398 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3399 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003400 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003401 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003402 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3403 &copy_region);
3404 m_errorMonitor->VerifyFound();
3405
3406 m_commandBuffer->end();
3407}
3408
3409TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3410 // Image copy with source region specified greater than src image size
3411 ASSERT_NO_FATAL_FAILURE(Init());
3412
3413 // Create images with full mip chain
3414 VkImageCreateInfo ci;
3415 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3416 ci.pNext = NULL;
3417 ci.flags = 0;
3418 ci.imageType = VK_IMAGE_TYPE_3D;
3419 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3420 ci.extent = {32, 32, 8};
3421 ci.mipLevels = 6;
3422 ci.arrayLayers = 1;
3423 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3424 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3425 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3426 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3427 ci.queueFamilyIndexCount = 0;
3428 ci.pQueueFamilyIndices = NULL;
3429 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3430
3431 VkImageObj src_image(m_device);
3432 src_image.init(&ci);
3433 ASSERT_TRUE(src_image.initialized());
3434
3435 // Dest image with one more mip level
3436 ci.extent = {64, 64, 16};
3437 ci.mipLevels = 7;
3438 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3439 VkImageObj dst_image(m_device);
3440 dst_image.init(&ci);
3441 ASSERT_TRUE(dst_image.initialized());
3442
3443 m_commandBuffer->begin();
3444
3445 VkImageCopy copy_region;
3446 copy_region.extent = {32, 32, 8};
3447 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3448 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3449 copy_region.srcSubresource.mipLevel = 0;
3450 copy_region.dstSubresource.mipLevel = 0;
3451 copy_region.srcSubresource.baseArrayLayer = 0;
3452 copy_region.dstSubresource.baseArrayLayer = 0;
3453 copy_region.srcSubresource.layerCount = 1;
3454 copy_region.dstSubresource.layerCount = 1;
3455 copy_region.srcOffset = {0, 0, 0};
3456 copy_region.dstOffset = {0, 0, 0};
3457
3458 m_errorMonitor->ExpectSuccess();
3459 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3460 &copy_region);
3461 m_errorMonitor->VerifyNotFound();
3462
3463 // Source exceeded in x-dim, VU 01202
3464 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003465 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003466 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3467 &copy_region);
3468 m_errorMonitor->VerifyFound();
3469
3470 // Source exceeded in y-dim, VU 01203
3471 copy_region.srcOffset.x = 0;
3472 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003473 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003474 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3475 &copy_region);
3476 m_errorMonitor->VerifyFound();
3477
3478 // Source exceeded in z-dim, VU 01204
3479 copy_region.extent = {4, 4, 4};
3480 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003481 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003482 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3483 &copy_region);
3484 m_errorMonitor->VerifyFound();
3485
3486 m_commandBuffer->end();
3487}
3488
3489TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3490 // Image copy with dest region specified greater than dest image size
3491 ASSERT_NO_FATAL_FAILURE(Init());
3492
3493 // Create images with full mip chain
3494 VkImageCreateInfo ci;
3495 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3496 ci.pNext = NULL;
3497 ci.flags = 0;
3498 ci.imageType = VK_IMAGE_TYPE_3D;
3499 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3500 ci.extent = {32, 32, 8};
3501 ci.mipLevels = 6;
3502 ci.arrayLayers = 1;
3503 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3504 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3505 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3506 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3507 ci.queueFamilyIndexCount = 0;
3508 ci.pQueueFamilyIndices = NULL;
3509 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3510
3511 VkImageObj dst_image(m_device);
3512 dst_image.init(&ci);
3513 ASSERT_TRUE(dst_image.initialized());
3514
3515 // Src image with one more mip level
3516 ci.extent = {64, 64, 16};
3517 ci.mipLevels = 7;
3518 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3519 VkImageObj src_image(m_device);
3520 src_image.init(&ci);
3521 ASSERT_TRUE(src_image.initialized());
3522
3523 m_commandBuffer->begin();
3524
3525 VkImageCopy copy_region;
3526 copy_region.extent = {32, 32, 8};
3527 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3528 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3529 copy_region.srcSubresource.mipLevel = 0;
3530 copy_region.dstSubresource.mipLevel = 0;
3531 copy_region.srcSubresource.baseArrayLayer = 0;
3532 copy_region.dstSubresource.baseArrayLayer = 0;
3533 copy_region.srcSubresource.layerCount = 1;
3534 copy_region.dstSubresource.layerCount = 1;
3535 copy_region.srcOffset = {0, 0, 0};
3536 copy_region.dstOffset = {0, 0, 0};
3537
3538 m_errorMonitor->ExpectSuccess();
3539 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3540 &copy_region);
3541 m_errorMonitor->VerifyNotFound();
3542
3543 // Dest exceeded in x-dim, VU 01205
3544 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003545 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003546 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3547 &copy_region);
3548 m_errorMonitor->VerifyFound();
3549
3550 // Dest exceeded in y-dim, VU 01206
3551 copy_region.dstOffset.x = 0;
3552 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003553 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003554 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3555 &copy_region);
3556 m_errorMonitor->VerifyFound();
3557
3558 // Dest exceeded in z-dim, VU 01207
3559 copy_region.extent = {4, 4, 4};
3560 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003561 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003562 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3563 &copy_region);
3564 m_errorMonitor->VerifyFound();
3565
3566 m_commandBuffer->end();
3567}
3568
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003569TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3570 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3571
3572 // Enable KHR multiplane req'd extensions
3573 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3574 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3575 if (mp_extensions == true) {
3576 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3577 }
3578 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3579 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3580 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3581 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3582 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3583 if (mp_extensions == true) {
3584 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3585 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3586 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3587 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3588 } else {
3589 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3590 return;
3591 }
3592 ASSERT_NO_FATAL_FAILURE(InitState());
3593
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003594 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3595 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003596 VkFormatProperties props = {0, 0, 0};
3597 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003598 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003599 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3600 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3601 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3602
3603 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003604 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003605 return;
3606 }
3607
3608 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3609 VkImageObj src_image(m_device);
3610 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003611 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 -08003612 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003613 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 -08003614 ASSERT_TRUE(dst_image.initialized());
3615
3616 VkImageCopy copy_region = {};
3617 copy_region.extent = {64, 64, 1}; // Size of plane 1
3618 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3619 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3620 copy_region.srcSubresource.mipLevel = 0;
3621 copy_region.dstSubresource.mipLevel = 0;
3622 copy_region.srcSubresource.baseArrayLayer = 0;
3623 copy_region.dstSubresource.baseArrayLayer = 0;
3624 copy_region.srcSubresource.layerCount = 1;
3625 copy_region.dstSubresource.layerCount = 1;
3626 copy_region.srcOffset = {0, 0, 0};
3627 copy_region.dstOffset = {0, 0, 0};
3628 VkImageCopy original_region = copy_region;
3629
3630 m_commandBuffer->begin();
3631
3632 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3633 m_errorMonitor->ExpectSuccess();
3634 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3635 &copy_region);
3636 m_errorMonitor->VerifyNotFound();
3637
3638 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3639 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3640 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3641 m_errorMonitor->ExpectSuccess();
3642 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3643 &copy_region);
3644 m_errorMonitor->VerifyNotFound();
3645
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003646 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003647 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3648 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3649
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003650 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3651 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3652 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3653 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003654 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3655 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003656 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3657 &copy_region);
3658 m_errorMonitor->VerifyNotFound();
3659
3660 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3661 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3662 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3663 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003664 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3665 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003666 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3667 &copy_region);
3668 m_errorMonitor->VerifyNotFound();
3669
3670 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3671 copy_region.extent = {128, 64, 1};
3672 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3673 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3674 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003675 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3676 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003677 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3678 &copy_region);
3679 m_errorMonitor->VerifyNotFound();
3680
3681 // 128x64 copy from plane 0 -> Plane 1
3682 copy_region.extent = {128, 64, 1};
3683 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3684 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003685 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003686 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3687 &copy_region);
3688 m_errorMonitor->VerifyFound();
3689
3690 // 128x64 copy from plane 1 -> Plane 0
3691 copy_region.extent = {128, 64, 1};
3692 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3693 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003694 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003695 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3696 &copy_region);
3697 m_errorMonitor->VerifyFound();
3698
3699 // src exceeded in y-dim from offset
3700 copy_region = original_region;
3701 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003702 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003703 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3704 &copy_region);
3705 m_errorMonitor->VerifyFound();
3706
3707 // dst exceeded in y-dim from offset
3708 copy_region = original_region;
3709 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003711 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3712 &copy_region);
3713 m_errorMonitor->VerifyFound();
3714
3715 m_commandBuffer->end();
3716}
3717
unknown088160a2019-05-23 17:43:13 -06003718TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003719 if (!EnableDeviceProfileLayer()) {
3720 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3721 return;
3722 }
unknown088160a2019-05-23 17:43:13 -06003723
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003724 // Enable KHR multiplane req'd extensions
3725 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3726 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3727 if (mp_extensions == true) {
3728 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3729 }
3730 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3731 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3732 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3733 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3734 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3735 if (mp_extensions == true) {
3736 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3737 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3738 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3739 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3740 }
3741 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003742
sfricke-samsung51067b22020-04-30 21:41:17 -07003743 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3744 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003745
sfricke-samsung51067b22020-04-30 21:41:17 -07003746 // Load required functions
3747 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3748 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3749 return;
3750 }
3751
3752 // Set transfer for all potential used formats
3753 VkFormatProperties format_props;
3754 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3755 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3756 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3757
3758 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3759 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3760 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003761
3762 VkImageCreateInfo image_create_info = {};
3763 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3764 image_create_info.pNext = NULL;
3765 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003766 image_create_info.extent.width = 32;
3767 image_create_info.extent.height = 32;
3768 image_create_info.extent.depth = 1;
3769 image_create_info.mipLevels = 1;
3770 image_create_info.arrayLayers = 1;
3771 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003772 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3773 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003774 image_create_info.flags = 0;
3775
sfricke-samsung51067b22020-04-30 21:41:17 -07003776 image_create_info.format = VK_FORMAT_R8_UNORM;
3777 VkImageObj image_8b_unorm(m_device);
3778 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003779
sfricke-samsung51067b22020-04-30 21:41:17 -07003780 image_create_info.format = VK_FORMAT_R8_UINT;
3781 VkImageObj image_8b_uint(m_device);
3782 image_8b_uint.init(&image_create_info);
3783
3784 // First try to test two single plane mismatch
3785 {
3786 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3787 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3788 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3789
3790 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3791 VkImageObj image_32b_unorm(m_device);
3792 image_32b_unorm.init(&image_create_info);
3793
3794 m_commandBuffer->begin();
3795 VkImageCopy copyRegion;
3796 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3797 copyRegion.srcSubresource.mipLevel = 0;
3798 copyRegion.srcSubresource.baseArrayLayer = 0;
3799 copyRegion.srcSubresource.layerCount = 1;
3800 copyRegion.srcOffset.x = 0;
3801 copyRegion.srcOffset.y = 0;
3802 copyRegion.srcOffset.z = 0;
3803 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3804 copyRegion.dstSubresource.mipLevel = 0;
3805 copyRegion.dstSubresource.baseArrayLayer = 0;
3806 copyRegion.dstSubresource.layerCount = 1;
3807 copyRegion.dstOffset.x = 0;
3808 copyRegion.dstOffset.y = 0;
3809 copyRegion.dstOffset.z = 0;
3810 copyRegion.extent.width = 1;
3811 copyRegion.extent.height = 1;
3812 copyRegion.extent.depth = 1;
3813
3814 // Sanity check between two 8bit formats
3815 m_errorMonitor->ExpectSuccess();
3816 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3817 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3818 m_errorMonitor->VerifyNotFound();
3819
3820 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3822 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3823 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3824 m_errorMonitor->VerifyFound();
3825
3826 // Swap src and dst
3827 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3828 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3829 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3830 m_errorMonitor->VerifyFound();
3831
3832 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003833 }
3834
sfricke-samsung51067b22020-04-30 21:41:17 -07003835 // DstImage is a mismatched plane of a multi-planar format
3836 if (mp_extensions == false) {
3837 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3838 } else {
3839 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3840 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3841 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003842
sfricke-samsung51067b22020-04-30 21:41:17 -07003843 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3844 VkImageObj image_8b_16b_420_unorm(m_device);
3845 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003846
sfricke-samsung51067b22020-04-30 21:41:17 -07003847 m_commandBuffer->begin();
3848 VkImageCopy copyRegion;
3849 copyRegion.srcSubresource.mipLevel = 0;
3850 copyRegion.srcSubresource.baseArrayLayer = 0;
3851 copyRegion.srcSubresource.layerCount = 1;
3852 copyRegion.srcOffset.x = 0;
3853 copyRegion.srcOffset.y = 0;
3854 copyRegion.srcOffset.z = 0;
3855 copyRegion.dstSubresource.mipLevel = 0;
3856 copyRegion.dstSubresource.baseArrayLayer = 0;
3857 copyRegion.dstSubresource.layerCount = 1;
3858 copyRegion.dstOffset.x = 0;
3859 copyRegion.dstOffset.y = 0;
3860 copyRegion.dstOffset.z = 0;
3861 copyRegion.extent.width = 1;
3862 copyRegion.extent.height = 1;
3863 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003864
sfricke-samsung51067b22020-04-30 21:41:17 -07003865 // First test single-plane -> multi-plan
3866 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3867 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003868
sfricke-samsung51067b22020-04-30 21:41:17 -07003869 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3870 m_errorMonitor->ExpectSuccess();
3871 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3872 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3873 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003874
locke-lunargdf00db02020-03-04 19:00:57 -07003875 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3876 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3877
sfricke-samsung51067b22020-04-30 21:41:17 -07003878 // Make sure no false postiives if Compatible format
3879 m_errorMonitor->ExpectSuccess();
3880 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3881 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3882 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003883
sfricke-samsung51067b22020-04-30 21:41:17 -07003884 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3885 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3886 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3887 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3888 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3889 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003890
sfricke-samsung51067b22020-04-30 21:41:17 -07003891 // Same tests but swap src and dst
3892 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3893 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003894
locke-lunargdf00db02020-03-04 19:00:57 -07003895 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3896 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3897 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3898 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3899
sfricke-samsung51067b22020-04-30 21:41:17 -07003900 m_errorMonitor->ExpectSuccess();
3901 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3902 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3903 m_errorMonitor->VerifyNotFound();
3904
locke-lunargdf00db02020-03-04 19:00:57 -07003905 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3906 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3907
sfricke-samsung51067b22020-04-30 21:41:17 -07003908 m_errorMonitor->ExpectSuccess();
3909 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3910 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3911 m_errorMonitor->VerifyNotFound();
3912
3913 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3915 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3916 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3917 m_errorMonitor->VerifyFound();
3918
3919 m_commandBuffer->end();
3920 }
unknown088160a2019-05-23 17:43:13 -06003921}
3922
3923TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3924 ASSERT_NO_FATAL_FAILURE(Init());
3925 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3926 if (!depth_format) {
3927 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3928 return;
3929 }
3930
3931 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003932 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003933 if (properties.optimalTilingFeatures == 0) {
3934 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3935 return;
3936 }
3937
3938 VkImageObj srcImage(m_device);
3939 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3940 ASSERT_TRUE(srcImage.initialized());
3941 VkImageObj dstImage(m_device);
3942 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3943 ASSERT_TRUE(dstImage.initialized());
3944
3945 // Create two images of different types and try to copy between them
3946
3947 m_commandBuffer->begin();
3948 VkImageCopy copyRegion;
3949 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3950 copyRegion.srcSubresource.mipLevel = 0;
3951 copyRegion.srcSubresource.baseArrayLayer = 0;
3952 copyRegion.srcSubresource.layerCount = 1;
3953 copyRegion.srcOffset.x = 0;
3954 copyRegion.srcOffset.y = 0;
3955 copyRegion.srcOffset.z = 0;
3956 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3957 copyRegion.dstSubresource.mipLevel = 0;
3958 copyRegion.dstSubresource.baseArrayLayer = 0;
3959 copyRegion.dstSubresource.layerCount = 1;
3960 copyRegion.dstOffset.x = 0;
3961 copyRegion.dstOffset.y = 0;
3962 copyRegion.dstOffset.z = 0;
3963 copyRegion.extent.width = 1;
3964 copyRegion.extent.height = 1;
3965 copyRegion.extent.depth = 1;
3966
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003967 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003968 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3969 &copyRegion);
3970 m_commandBuffer->end();
3971
3972 m_errorMonitor->VerifyFound();
3973}
3974
3975TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3976 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3977
3978 ASSERT_NO_FATAL_FAILURE(Init());
3979
3980 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003981 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3982 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3983 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003984
3985 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3986 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
3987 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
3988 return;
3989 }
3990
3991 VkImageCreateInfo ci;
3992 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3993 ci.pNext = NULL;
3994 ci.flags = 0;
3995 ci.imageType = VK_IMAGE_TYPE_2D;
3996 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3997 ci.extent = {128, 128, 1};
3998 ci.mipLevels = 1;
3999 ci.arrayLayers = 1;
4000 ci.samples = VK_SAMPLE_COUNT_1_BIT;
4001 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
4002 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4003 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4004 ci.queueFamilyIndexCount = 0;
4005 ci.pQueueFamilyIndices = NULL;
4006 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4007
4008 VkImageObj image1(m_device);
4009 image1.init(&ci);
4010 ASSERT_TRUE(image1.initialized());
4011
4012 ci.samples = VK_SAMPLE_COUNT_2_BIT;
4013 VkImageObj image2(m_device);
4014 image2.init(&ci);
4015 ASSERT_TRUE(image2.initialized());
4016
4017 ci.samples = VK_SAMPLE_COUNT_4_BIT;
4018 VkImageObj image4(m_device);
4019 image4.init(&ci);
4020 ASSERT_TRUE(image4.initialized());
4021
4022 m_commandBuffer->begin();
4023
4024 VkImageCopy copyRegion;
4025 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4026 copyRegion.srcSubresource.mipLevel = 0;
4027 copyRegion.srcSubresource.baseArrayLayer = 0;
4028 copyRegion.srcSubresource.layerCount = 1;
4029 copyRegion.srcOffset = {0, 0, 0};
4030 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4031 copyRegion.dstSubresource.mipLevel = 0;
4032 copyRegion.dstSubresource.baseArrayLayer = 0;
4033 copyRegion.dstSubresource.layerCount = 1;
4034 copyRegion.dstOffset = {0, 0, 0};
4035 copyRegion.extent = {128, 128, 1};
4036
4037 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07004038 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004039 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4040 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004041 m_errorMonitor->VerifyFound();
4042
Mark Lobodzinski20310782020-02-28 14:25:17 -07004043 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004044 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
4045 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004046 m_errorMonitor->VerifyFound();
4047
4048 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07004049 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004050 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4051 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004052 m_errorMonitor->VerifyFound();
4053
Mark Lobodzinski20310782020-02-28 14:25:17 -07004054 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004055 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
4056 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004057 m_errorMonitor->VerifyFound();
4058
4059 m_commandBuffer->end();
4060}
4061
4062TEST_F(VkLayerTest, CopyImageAspectMismatch) {
4063 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004064
4065 if (!EnableDeviceProfileLayer()) {
4066 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
4067 return;
4068 }
4069
4070 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4071 if (mp_extensions) {
4072 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4073 }
4074
4075 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4076 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4077 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4078 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4079 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4080 if (mp_extensions) {
4081 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4082 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4083 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4084 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4085 }
4086 ASSERT_NO_FATAL_FAILURE(InitState());
4087
4088 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4089 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4090
4091 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4092 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4093 return;
4094 }
4095
unknown088160a2019-05-23 17:43:13 -06004096 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4097 if (!ds_format) {
4098 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4099 return;
4100 }
4101
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004102 // Add Transfer support for all used formats
4103 VkFormatProperties formatProps;
4104 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_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(), VK_FORMAT_D32_SFLOAT, &formatProps);
4108 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4109 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4110 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4111 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4112 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4113
unknown088160a2019-05-23 17:43:13 -06004114 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4115 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4116 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4117 VK_IMAGE_TILING_OPTIMAL, 0);
4118 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4119 VK_IMAGE_TILING_OPTIMAL, 0);
4120 ASSERT_TRUE(color_image.initialized());
4121 ASSERT_TRUE(depth_image.initialized());
4122 ASSERT_TRUE(ds_image.initialized());
4123
4124 VkImageCopy copyRegion;
4125 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4126 copyRegion.srcSubresource.mipLevel = 0;
4127 copyRegion.srcSubresource.baseArrayLayer = 0;
4128 copyRegion.srcSubresource.layerCount = 1;
4129 copyRegion.srcOffset = {0, 0, 0};
4130 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4131 copyRegion.dstSubresource.mipLevel = 0;
4132 copyRegion.dstSubresource.baseArrayLayer = 0;
4133 copyRegion.dstSubresource.layerCount = 1;
4134 copyRegion.dstOffset = {64, 0, 0};
4135 copyRegion.extent = {64, 128, 1};
4136
4137 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004138 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004139 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004140 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4141 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004142 m_errorMonitor->VerifyFound();
4143
4144 m_commandBuffer->begin();
4145
4146 // Src and dest aspect masks don't match
4147 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004148 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004149 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004150 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4151 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004152 m_errorMonitor->VerifyFound();
4153 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4154
4155 // Illegal combinations of aspect bits
4156 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4157 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004158 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004159 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004160 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004161 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004162 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4163 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004164 m_errorMonitor->VerifyFound();
4165 // same test for dstSubresource
4166 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4167 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004168 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004169 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004170 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004171 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004172 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4173 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004174 m_errorMonitor->VerifyFound();
4175
4176 // Metadata aspect is illegal
4177 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4178 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004179 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004180 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004181 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004182 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4183 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004184 m_errorMonitor->VerifyFound();
4185 // same test for dstSubresource
4186 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4187 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004188 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004189 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004190 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004191 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4192 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004193 m_errorMonitor->VerifyFound();
4194
sfricke-samsung6141db32020-10-26 03:31:38 -07004195 // Aspect Memory Plane mask is illegal
4196 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4197 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4198 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4199 // These aspect/format mismatches are redundant but unavoidable here
4200 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4201 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4202 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4203 m_errorMonitor->VerifyFound();
4204
unknown088160a2019-05-23 17:43:13 -06004205 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4206 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004207 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004208
4209 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004210 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004211 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004212 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004213 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4214 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004215 m_errorMonitor->VerifyFound();
4216
4217 // Aspect mask doesn't match dest image format
4218 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4219 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004220 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004221 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004222 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004223 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4224 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004225 m_errorMonitor->VerifyFound();
4226
4227 m_commandBuffer->end();
4228}
4229
4230TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004231 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004232
4233 ASSERT_NO_FATAL_FAILURE(Init());
4234
4235 // Create two images of sample count 1 and try to Resolve between them
4236
4237 VkImageCreateInfo image_create_info = {};
4238 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4239 image_create_info.pNext = NULL;
4240 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4241 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4242 image_create_info.extent.width = 32;
4243 image_create_info.extent.height = 1;
4244 image_create_info.extent.depth = 1;
4245 image_create_info.mipLevels = 1;
4246 image_create_info.arrayLayers = 1;
4247 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4248 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4249 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4250 image_create_info.flags = 0;
4251
4252 VkImageObj srcImage(m_device);
4253 srcImage.init(&image_create_info);
4254 ASSERT_TRUE(srcImage.initialized());
4255
4256 VkImageObj dstImage(m_device);
4257 dstImage.init(&image_create_info);
4258 ASSERT_TRUE(dstImage.initialized());
4259
4260 m_commandBuffer->begin();
4261 VkImageResolve resolveRegion;
4262 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4263 resolveRegion.srcSubresource.mipLevel = 0;
4264 resolveRegion.srcSubresource.baseArrayLayer = 0;
4265 resolveRegion.srcSubresource.layerCount = 1;
4266 resolveRegion.srcOffset.x = 0;
4267 resolveRegion.srcOffset.y = 0;
4268 resolveRegion.srcOffset.z = 0;
4269 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4270 resolveRegion.dstSubresource.mipLevel = 0;
4271 resolveRegion.dstSubresource.baseArrayLayer = 0;
4272 resolveRegion.dstSubresource.layerCount = 1;
4273 resolveRegion.dstOffset.x = 0;
4274 resolveRegion.dstOffset.y = 0;
4275 resolveRegion.dstOffset.z = 0;
4276 resolveRegion.extent.width = 1;
4277 resolveRegion.extent.height = 1;
4278 resolveRegion.extent.depth = 1;
4279 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4280 &resolveRegion);
4281 m_commandBuffer->end();
4282
4283 m_errorMonitor->VerifyFound();
4284}
4285
4286TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004287 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004288
4289 ASSERT_NO_FATAL_FAILURE(Init());
4290
4291 // Create two images of sample count 4 and try to Resolve between them
4292
4293 VkImageCreateInfo image_create_info = {};
4294 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4295 image_create_info.pNext = NULL;
4296 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4297 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4298 image_create_info.extent.width = 32;
4299 image_create_info.extent.height = 1;
4300 image_create_info.extent.depth = 1;
4301 image_create_info.mipLevels = 1;
4302 image_create_info.arrayLayers = 1;
4303 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4304 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4305 // Note: Some implementations expect color attachment usage for any
4306 // multisample surface
4307 image_create_info.usage =
4308 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4309 image_create_info.flags = 0;
4310
4311 VkImageObj srcImage(m_device);
4312 srcImage.init(&image_create_info);
4313 ASSERT_TRUE(srcImage.initialized());
4314
4315 VkImageObj dstImage(m_device);
4316 dstImage.init(&image_create_info);
4317 ASSERT_TRUE(dstImage.initialized());
4318
4319 m_commandBuffer->begin();
4320 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4321 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4322 // VK_IMAGE_LAYOUT_GENERAL = 1,
4323 VkImageResolve resolveRegion;
4324 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4325 resolveRegion.srcSubresource.mipLevel = 0;
4326 resolveRegion.srcSubresource.baseArrayLayer = 0;
4327 resolveRegion.srcSubresource.layerCount = 1;
4328 resolveRegion.srcOffset.x = 0;
4329 resolveRegion.srcOffset.y = 0;
4330 resolveRegion.srcOffset.z = 0;
4331 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4332 resolveRegion.dstSubresource.mipLevel = 0;
4333 resolveRegion.dstSubresource.baseArrayLayer = 0;
4334 resolveRegion.dstSubresource.layerCount = 1;
4335 resolveRegion.dstOffset.x = 0;
4336 resolveRegion.dstOffset.y = 0;
4337 resolveRegion.dstOffset.z = 0;
4338 resolveRegion.extent.width = 1;
4339 resolveRegion.extent.height = 1;
4340 resolveRegion.extent.depth = 1;
4341 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4342 &resolveRegion);
4343 m_commandBuffer->end();
4344
4345 m_errorMonitor->VerifyFound();
4346}
4347
4348TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004349 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004350
4351 ASSERT_NO_FATAL_FAILURE(Init());
4352
4353 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004354 VkImageObj srcImage(m_device);
4355 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004356
4357 VkImageCreateInfo image_create_info = {};
4358 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4359 image_create_info.pNext = NULL;
4360 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4361 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4362 image_create_info.extent.width = 32;
4363 image_create_info.extent.height = 1;
4364 image_create_info.extent.depth = 1;
4365 image_create_info.mipLevels = 1;
4366 image_create_info.arrayLayers = 1;
4367 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4368 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4369 // Note: Some implementations expect color attachment usage for any
4370 // multisample surface
4371 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4372 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004373 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004374
4375 // Set format to something other than source image
4376 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4377 // Note: Some implementations expect color attachment usage for any
4378 // multisample surface
4379 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4380 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004381 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004382
4383 m_commandBuffer->begin();
4384 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4385 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4386 // VK_IMAGE_LAYOUT_GENERAL = 1,
4387 VkImageResolve resolveRegion;
4388 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4389 resolveRegion.srcSubresource.mipLevel = 0;
4390 resolveRegion.srcSubresource.baseArrayLayer = 0;
4391 resolveRegion.srcSubresource.layerCount = 1;
4392 resolveRegion.srcOffset.x = 0;
4393 resolveRegion.srcOffset.y = 0;
4394 resolveRegion.srcOffset.z = 0;
4395 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4396 resolveRegion.dstSubresource.mipLevel = 0;
4397 resolveRegion.dstSubresource.baseArrayLayer = 0;
4398 resolveRegion.dstSubresource.layerCount = 1;
4399 resolveRegion.dstOffset.x = 0;
4400 resolveRegion.dstOffset.y = 0;
4401 resolveRegion.dstOffset.z = 0;
4402 resolveRegion.extent.width = 1;
4403 resolveRegion.extent.height = 1;
4404 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004405 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4406 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004407 m_commandBuffer->end();
4408
4409 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004410}
4411
4412TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004413 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004414
4415 ASSERT_NO_FATAL_FAILURE(Init());
4416
4417 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004418 VkImageObj srcImage(m_device);
4419 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004420
4421 VkImageCreateInfo image_create_info = {};
4422 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4423 image_create_info.pNext = NULL;
4424 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4425 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4426 image_create_info.extent.width = 32;
4427 image_create_info.extent.height = 1;
4428 image_create_info.extent.depth = 1;
4429 image_create_info.mipLevels = 1;
4430 image_create_info.arrayLayers = 1;
4431 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4432 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4433 // Note: Some implementations expect color attachment usage for any
4434 // multisample surface
4435 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4436 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004437 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004438
4439 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4440 // Note: Some implementations expect color attachment usage for any
4441 // multisample surface
4442 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4443 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004444 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004445
4446 m_commandBuffer->begin();
4447 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4448 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4449 // VK_IMAGE_LAYOUT_GENERAL = 1,
4450 VkImageResolve resolveRegion;
4451 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4452 resolveRegion.srcSubresource.mipLevel = 0;
4453 resolveRegion.srcSubresource.baseArrayLayer = 0;
4454 resolveRegion.srcSubresource.layerCount = 1;
4455 resolveRegion.srcOffset.x = 0;
4456 resolveRegion.srcOffset.y = 0;
4457 resolveRegion.srcOffset.z = 0;
4458 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4459 resolveRegion.dstSubresource.mipLevel = 0;
4460 resolveRegion.dstSubresource.baseArrayLayer = 0;
4461 resolveRegion.dstSubresource.layerCount = 1;
4462 resolveRegion.dstOffset.x = 0;
4463 resolveRegion.dstOffset.y = 0;
4464 resolveRegion.dstOffset.z = 0;
4465 resolveRegion.extent.width = 1;
4466 resolveRegion.extent.height = 1;
4467 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004468 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4469 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004470 m_commandBuffer->end();
4471
4472 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004473}
4474
4475TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4476 ASSERT_NO_FATAL_FAILURE(Init());
4477
4478 // Create two images of different types and try to copy between them
4479 VkImageObj srcImage(m_device);
4480 VkImageObj dstImage(m_device);
4481
4482 VkImageCreateInfo image_create_info = {};
4483 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4484 image_create_info.pNext = NULL;
4485 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4486 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4487 image_create_info.extent.width = 32;
4488 image_create_info.extent.height = 32;
4489 image_create_info.extent.depth = 1;
4490 image_create_info.mipLevels = 1;
4491 image_create_info.arrayLayers = 1;
4492 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4493 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4494 image_create_info.usage =
4495 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4496 // Note: Some implementations expect color attachment usage for any
4497 // multisample surface
4498 image_create_info.flags = 0;
4499 srcImage.init(&image_create_info);
4500 ASSERT_TRUE(srcImage.initialized());
4501
4502 // Note: Some implementations expect color attachment usage for any
4503 // multisample surface
4504 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4505 dstImage.init(&image_create_info);
4506 ASSERT_TRUE(dstImage.initialized());
4507
4508 m_commandBuffer->begin();
4509 // source image must have valid contents before resolve
4510 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4511 VkImageSubresourceRange subresource = {};
4512 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4513 subresource.layerCount = 1;
4514 subresource.levelCount = 1;
4515 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4516 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4517 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4518 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4519
4520 VkImageResolve resolveRegion;
4521 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4522 resolveRegion.srcSubresource.mipLevel = 0;
4523 resolveRegion.srcSubresource.baseArrayLayer = 0;
4524 resolveRegion.srcSubresource.layerCount = 1;
4525 resolveRegion.srcOffset.x = 0;
4526 resolveRegion.srcOffset.y = 0;
4527 resolveRegion.srcOffset.z = 0;
4528 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4529 resolveRegion.dstSubresource.mipLevel = 0;
4530 resolveRegion.dstSubresource.baseArrayLayer = 0;
4531 resolveRegion.dstSubresource.layerCount = 1;
4532 resolveRegion.dstOffset.x = 0;
4533 resolveRegion.dstOffset.y = 0;
4534 resolveRegion.dstOffset.z = 0;
4535 resolveRegion.extent.width = 1;
4536 resolveRegion.extent.height = 1;
4537 resolveRegion.extent.depth = 1;
4538 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004539 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004540 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4541 1, &resolveRegion);
4542 m_errorMonitor->VerifyFound();
4543 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004544 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004545 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4546 1, &resolveRegion);
4547 m_errorMonitor->VerifyFound();
4548 m_commandBuffer->end();
4549}
4550
4551TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004552 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4553
4554 bool copy_commands2 = false;
4555 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4556 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4557 copy_commands2 = true;
4558 }
4559 ASSERT_NO_FATAL_FAILURE(InitState());
4560
4561 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4562 if (copy_commands2) {
4563 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4564 }
unknown088160a2019-05-23 17:43:13 -06004565
4566 // Create two images of different types and try to copy between them
4567 VkImageObj srcImage(m_device);
4568 VkImageObj dstImage(m_device);
4569
4570 VkImageCreateInfo image_create_info = {};
4571 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4572 image_create_info.pNext = NULL;
4573 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4574 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4575 image_create_info.extent.width = 32;
4576 image_create_info.extent.height = 32;
4577 image_create_info.extent.depth = 1;
4578 image_create_info.mipLevels = 1;
4579 image_create_info.arrayLayers = 1;
4580 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4581 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4582 image_create_info.usage =
4583 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4584 // Note: Some implementations expect color attachment usage for any
4585 // multisample surface
4586 image_create_info.flags = 0;
4587 srcImage.init(&image_create_info);
4588 ASSERT_TRUE(srcImage.initialized());
4589
4590 // Note: Some implementations expect color attachment usage for any
4591 // multisample surface
4592 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4593 dstImage.init(&image_create_info);
4594 ASSERT_TRUE(dstImage.initialized());
4595
4596 m_commandBuffer->begin();
4597 // source image must have valid contents before resolve
4598 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4599 VkImageSubresourceRange subresource = {};
4600 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4601 subresource.layerCount = 1;
4602 subresource.levelCount = 1;
4603 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4604 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4605 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4606 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4607
4608 VkImageResolve resolveRegion;
4609 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4610 resolveRegion.srcSubresource.mipLevel = 0;
4611 resolveRegion.srcSubresource.baseArrayLayer = 0;
4612 resolveRegion.srcSubresource.layerCount = 1;
4613 resolveRegion.srcOffset.x = 0;
4614 resolveRegion.srcOffset.y = 0;
4615 resolveRegion.srcOffset.z = 0;
4616 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4617 resolveRegion.dstSubresource.mipLevel = 0;
4618 resolveRegion.dstSubresource.baseArrayLayer = 0;
4619 resolveRegion.dstSubresource.layerCount = 1;
4620 resolveRegion.dstOffset.x = 0;
4621 resolveRegion.dstOffset.y = 0;
4622 resolveRegion.dstOffset.z = 0;
4623 resolveRegion.extent.width = 1;
4624 resolveRegion.extent.height = 1;
4625 resolveRegion.extent.depth = 1;
4626 // invalid source mip level
4627 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004628 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004629 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4630 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4631 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004632
4633 // Equivalent test using KHR_copy_commands2
4634 if (copy_commands2 && vkCmdResolveImage2Function) {
4635 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4636 NULL,
4637 resolveRegion.srcSubresource,
4638 resolveRegion.srcOffset,
4639 resolveRegion.dstSubresource,
4640 resolveRegion.dstOffset,
4641 resolveRegion.extent};
4642 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4643 NULL,
4644 srcImage.image(),
4645 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4646 dstImage.image(),
4647 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4648 1,
4649 &resolveRegion2};
4650 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01709");
4651 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4652 m_errorMonitor->VerifyFound();
4653 }
4654
unknown088160a2019-05-23 17:43:13 -06004655 resolveRegion.srcSubresource.mipLevel = 0;
4656 // invalid dest mip level
4657 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004658 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004659 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4660 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4661 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004662
4663 // Equivalent test using KHR_copy_commands2
4664 if (copy_commands2 && vkCmdResolveImage2Function) {
4665 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4666 NULL,
4667 resolveRegion.srcSubresource,
4668 resolveRegion.srcOffset,
4669 resolveRegion.dstSubresource,
4670 resolveRegion.dstOffset,
4671 resolveRegion.extent};
4672 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4673 NULL,
4674 srcImage.image(),
4675 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4676 dstImage.image(),
4677 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4678 1,
4679 &resolveRegion2};
4680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01710");
4681 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4682 m_errorMonitor->VerifyFound();
4683 }
4684
unknown088160a2019-05-23 17:43:13 -06004685 resolveRegion.dstSubresource.mipLevel = 0;
4686 // invalid source array layer range
4687 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004688 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004689 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4690 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4691 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004692
4693 // Equivalent test using KHR_copy_commands2
4694 if (copy_commands2 && vkCmdResolveImage2Function) {
4695 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4696 NULL,
4697 resolveRegion.srcSubresource,
4698 resolveRegion.srcOffset,
4699 resolveRegion.dstSubresource,
4700 resolveRegion.dstOffset,
4701 resolveRegion.extent};
4702 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4703 NULL,
4704 srcImage.image(),
4705 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4706 dstImage.image(),
4707 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4708 1,
4709 &resolveRegion2};
4710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01711");
4711 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4712 m_errorMonitor->VerifyFound();
4713 }
4714
unknown088160a2019-05-23 17:43:13 -06004715 resolveRegion.srcSubresource.baseArrayLayer = 0;
4716 // invalid dest array layer range
4717 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004718 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004719 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4720 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4721 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004722
4723 // Equivalent test using KHR_copy_commands2
4724 if (copy_commands2 && vkCmdResolveImage2Function) {
4725 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4726 NULL,
4727 resolveRegion.srcSubresource,
4728 resolveRegion.srcOffset,
4729 resolveRegion.dstSubresource,
4730 resolveRegion.dstOffset,
4731 resolveRegion.extent};
4732 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4733 NULL,
4734 srcImage.image(),
4735 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4736 dstImage.image(),
4737 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4738 1,
4739 &resolveRegion2};
4740 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01712");
4741 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4742 m_errorMonitor->VerifyFound();
4743 }
4744
unknown088160a2019-05-23 17:43:13 -06004745 resolveRegion.dstSubresource.baseArrayLayer = 0;
4746
4747 m_commandBuffer->end();
4748}
4749
sfricke-samsungf78d0592020-06-11 21:34:44 -07004750TEST_F(VkLayerTest, ResolveImageImageType) {
4751 ASSERT_NO_FATAL_FAILURE(Init());
4752 // Create images of different types and try to resolve between them
4753 VkImageObj srcImage2D(m_device);
4754 VkImageObj dstImage1D(m_device);
4755 VkImageObj dstImage3D(m_device);
4756
4757 VkImageCreateInfo image_create_info = {};
4758 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4759 image_create_info.pNext = NULL;
4760 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4761 image_create_info.extent.width = 32;
4762 image_create_info.extent.height = 1;
4763 image_create_info.extent.depth = 1;
4764 image_create_info.mipLevels = 1;
4765 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
4766 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4767 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4768 image_create_info.usage =
4769 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4770 // Note: Some implementations expect color attachment usage for any
4771 // multisample surface
4772 image_create_info.flags = 0;
4773
4774 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4775 srcImage2D.init(&image_create_info);
4776 ASSERT_TRUE(srcImage2D.initialized());
4777
4778 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4779 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4780 dstImage1D.init(&image_create_info);
4781 ASSERT_TRUE(dstImage1D.initialized());
4782
4783 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4784 image_create_info.extent.height = 16;
4785 image_create_info.extent.depth = 16;
4786 image_create_info.arrayLayers = 1;
4787 dstImage3D.init(&image_create_info);
4788 ASSERT_TRUE(dstImage3D.initialized());
4789
4790 m_commandBuffer->begin();
4791
4792 VkImageResolve resolveRegion;
4793 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4794 resolveRegion.srcSubresource.mipLevel = 0;
4795 resolveRegion.srcSubresource.baseArrayLayer = 0;
4796 resolveRegion.srcSubresource.layerCount = 1;
4797 resolveRegion.srcOffset.x = 0;
4798 resolveRegion.srcOffset.y = 0;
4799 resolveRegion.srcOffset.z = 0;
4800 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4801 resolveRegion.dstSubresource.mipLevel = 0;
4802 resolveRegion.dstSubresource.baseArrayLayer = 0;
4803 resolveRegion.dstSubresource.layerCount = 1;
4804 resolveRegion.dstOffset.x = 0;
4805 resolveRegion.dstOffset.y = 0;
4806 resolveRegion.dstOffset.z = 0;
4807 resolveRegion.extent.width = 1;
4808 resolveRegion.extent.height = 1;
4809 resolveRegion.extent.depth = 1;
4810
4811 // non-zero value baseArrayLayer
4812 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004813 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004814 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4815 &resolveRegion);
4816 m_errorMonitor->VerifyFound();
4817 resolveRegion.srcSubresource.baseArrayLayer = 0;
4818
4819 // Set height with 1D dstImage
4820 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004822 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004823 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4824 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004825 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4826 &resolveRegion);
4827 m_errorMonitor->VerifyFound();
4828 resolveRegion.extent.height = 1;
4829
4830 // Set depth with 1D dstImage and 2D srcImage
4831 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004832 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004834 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4835 &resolveRegion);
4836 m_errorMonitor->VerifyFound();
4837 resolveRegion.extent.depth = 1;
4838
4839 m_commandBuffer->end();
4840}
4841
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004842TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4843 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4844 ASSERT_NO_FATAL_FAILURE(Init());
4845
4846 VkImageObj srcImage2D(m_device);
4847 VkImageObj dstImage2D(m_device);
4848
4849 VkImageCreateInfo image_create_info = {};
4850 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4851 image_create_info.pNext = NULL;
4852 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4853 image_create_info.extent.width = 32;
4854 image_create_info.extent.height = 32;
4855 image_create_info.extent.depth = 1;
4856 image_create_info.mipLevels = 6; // full chain from 32x32 to 1x1
4857 image_create_info.arrayLayers = 1;
4858 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4859 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4860 image_create_info.usage =
4861 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4862 // Note: Some implementations expect color attachment usage for any
4863 // multisample surface
4864 image_create_info.flags = 0;
4865
4866 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4867 srcImage2D.init(&image_create_info);
4868 ASSERT_TRUE(srcImage2D.initialized());
4869
4870 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4871 dstImage2D.init(&image_create_info);
4872 ASSERT_TRUE(dstImage2D.initialized());
4873
4874 m_commandBuffer->begin();
4875
4876 VkImageResolve resolveRegion = {};
4877 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4878 resolveRegion.srcSubresource.mipLevel = 0;
4879 resolveRegion.srcSubresource.baseArrayLayer = 0;
4880 resolveRegion.srcSubresource.layerCount = 1;
4881 resolveRegion.srcOffset.x = 0;
4882 resolveRegion.srcOffset.y = 0;
4883 resolveRegion.srcOffset.z = 0;
4884 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4885 resolveRegion.dstSubresource.mipLevel = 0;
4886 resolveRegion.dstSubresource.baseArrayLayer = 0;
4887 resolveRegion.dstSubresource.layerCount = 1;
4888 resolveRegion.dstOffset.x = 0;
4889 resolveRegion.dstOffset.y = 0;
4890 resolveRegion.dstOffset.z = 0;
4891 resolveRegion.extent.width = 32;
4892 resolveRegion.extent.height = 32;
4893 resolveRegion.extent.depth = 1;
4894
4895 m_errorMonitor->ExpectSuccess();
4896 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4897 &resolveRegion);
4898 m_errorMonitor->VerifyNotFound();
4899
4900 // srcImage exceeded in x-dim
4901 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004902 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004903 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4904 &resolveRegion);
4905 m_errorMonitor->VerifyFound();
4906 resolveRegion.srcOffset.x = 0;
4907
4908 // dstImage exceeded in x-dim
4909 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004911 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4912 &resolveRegion);
4913 m_errorMonitor->VerifyFound();
4914 resolveRegion.dstOffset.x = 0;
4915
4916 // both image exceeded in y-dim because mipLevel 3 is a 4x4 size image
4917 resolveRegion.extent = {4, 8, 1};
4918 resolveRegion.srcSubresource.mipLevel = 3;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004919 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004920 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4921 &resolveRegion);
4922 m_errorMonitor->VerifyFound();
4923 resolveRegion.srcSubresource.mipLevel = 0;
4924
4925 resolveRegion.dstSubresource.mipLevel = 3;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004926 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004927 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4928 &resolveRegion);
4929 m_errorMonitor->VerifyFound();
4930 resolveRegion.dstSubresource.mipLevel = 0;
4931
4932 // srcImage exceeded in z-dim
4933 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004934 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4935 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004936 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4937 &resolveRegion);
4938 m_errorMonitor->VerifyFound();
4939 resolveRegion.srcOffset.z = 0;
4940
4941 // dstImage exceeded in z-dim
4942 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004943 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004945 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4946 &resolveRegion);
4947 m_errorMonitor->VerifyFound();
4948 resolveRegion.dstOffset.z = 0;
4949
4950 m_commandBuffer->end();
4951}
4952
unknown088160a2019-05-23 17:43:13 -06004953TEST_F(VkLayerTest, ClearImageErrors) {
4954 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4955
4956 ASSERT_NO_FATAL_FAILURE(Init());
4957 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4958
4959 m_commandBuffer->begin();
4960
4961 // Color image
4962 VkClearColorValue clear_color;
4963 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4964 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4965 const int32_t img_width = 32;
4966 const int32_t img_height = 32;
4967 VkImageCreateInfo image_create_info = {};
4968 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4969 image_create_info.pNext = NULL;
4970 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4971 image_create_info.format = color_format;
4972 image_create_info.extent.width = img_width;
4973 image_create_info.extent.height = img_height;
4974 image_create_info.extent.depth = 1;
4975 image_create_info.mipLevels = 1;
4976 image_create_info.arrayLayers = 1;
4977 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4978 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4979
4980 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4981 vk_testing::Image color_image_no_transfer;
4982 color_image_no_transfer.init(*m_device, image_create_info);
4983
4984 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4985 vk_testing::Image color_image;
4986 color_image.init(*m_device, image_create_info);
4987
4988 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4989
4990 // Depth/Stencil image
4991 VkClearDepthStencilValue clear_value = {0};
4992 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4993 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4994 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4995 ds_image_create_info.extent.width = 64;
4996 ds_image_create_info.extent.height = 64;
4997 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4998 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4999
5000 vk_testing::Image ds_image;
5001 ds_image.init(*m_device, ds_image_create_info);
5002
5003 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
5004
sfricke-samsungcd924d92020-05-20 23:51:17 -07005005 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06005006
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005007 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06005008
5009 m_errorMonitor->VerifyFound();
5010
sfricke-samsungcd924d92020-05-20 23:51:17 -07005011 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06005012
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005013 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
5014 &color_range);
unknown088160a2019-05-23 17:43:13 -06005015
5016 m_errorMonitor->VerifyFound();
5017
5018 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07005019 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07005020 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06005021
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005022 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5023 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06005024
5025 m_errorMonitor->VerifyFound();
5026}
5027
5028TEST_F(VkLayerTest, CommandQueueFlags) {
5029 TEST_DESCRIPTION(
5030 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
5031
5032 ASSERT_NO_FATAL_FAILURE(Init());
5033
5034 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5035 if (queueFamilyIndex == UINT32_MAX) {
5036 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5037 return;
5038 } else {
5039 // Create command pool on a non-graphics queue
5040 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5041
5042 // Setup command buffer on pool
5043 VkCommandBufferObj command_buffer(m_device, &command_pool);
5044 command_buffer.begin();
5045
5046 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07005047 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005048 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5049 command_buffer.SetViewport(0, 1, &viewport);
5050 m_errorMonitor->VerifyFound();
5051 }
5052}
5053
sfricke-samsung674ba102020-08-18 22:38:49 -07005054TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
5055 TEST_DESCRIPTION(
5056 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
5057 "buffer");
5058
5059 ASSERT_NO_FATAL_FAILURE(Init());
5060
5061 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5062 if (queueFamilyIndex == UINT32_MAX) {
5063 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5064 return;
5065 } else {
5066 // Create Depth image
5067 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
5068 if (ds_format == VK_FORMAT_UNDEFINED) {
5069 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
5070 return;
5071 }
5072
5073 VkImageObj ds_image(m_device);
5074 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
5075 VK_IMAGE_TILING_OPTIMAL, 0);
5076 ASSERT_TRUE(ds_image.initialized());
5077
5078 // Allocate buffers
5079 VkBufferObj buffer;
5080 VkMemoryPropertyFlags reqs = 0;
5081 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5082
5083 VkBufferImageCopy region = {};
5084 region.bufferRowLength = 0;
5085 region.bufferImageHeight = 0;
5086 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5087 region.imageSubresource.layerCount = 1;
5088 region.imageOffset = {0, 0, 0};
5089 region.imageExtent = {64, 64, 1};
5090 region.bufferOffset = 0;
5091
5092 // Create command pool on a non-graphics queue
5093 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5094
5095 // Setup command buffer on pool
5096 VkCommandBufferObj command_buffer(m_device, &command_pool);
5097 command_buffer.begin();
5098
sfricke-samsungea4fd142020-10-17 23:51:59 -07005099 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005100 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5101 1, &region);
5102 m_errorMonitor->VerifyFound();
5103 }
5104}
5105
sfricke-samsung5a019492021-01-25 10:32:08 -08005106TEST_F(VkLayerTest, ImageCopyTransferQueueFlags) {
5107 TEST_DESCRIPTION(
5108 "Allocate a command buffer on a queue that does not support graphics/compute and try to issue an invalid image copy to "
5109 "buffer");
5110
5111 ASSERT_NO_FATAL_FAILURE(Init());
5112
5113 // Should be left with a tranfser queue
5114 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
5115 if (queueFamilyIndex == UINT32_MAX) {
5116 printf("%s Non-graphics/compute queue family not found; skipped.\n", kSkipPrefix);
5117 return;
5118 }
5119
5120 VkImageObj image(m_device);
5121 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
5122 VK_IMAGE_TILING_OPTIMAL, 0);
5123 ASSERT_TRUE(image.initialized());
5124
5125 // Allocate buffers
5126 VkBufferObj buffer;
5127 VkMemoryPropertyFlags reqs = 0;
5128 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5129
5130 VkBufferImageCopy region = {};
5131 region.bufferRowLength = 0;
5132 region.bufferImageHeight = 0;
5133 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5134 region.imageSubresource.layerCount = 1;
5135 region.imageOffset = {0, 0, 0};
5136 region.imageExtent = {16, 16, 1};
5137 region.bufferOffset = 5;
5138
5139 // Create command pool on a non-graphics queue
5140 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5141
5142 // Setup command buffer on pool
5143 VkCommandBufferObj command_buffer(m_device, &command_pool);
5144 command_buffer.begin();
5145
5146 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
5147 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04052");
5148 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5149 &region);
5150 m_errorMonitor->VerifyFound();
5151}
5152
sfricke-samsungcb467672020-11-25 00:09:28 -08005153TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5154 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5155
5156 ASSERT_NO_FATAL_FAILURE(Init());
5157
5158 if (m_device->queue_props.size() < 2) {
5159 printf("%s Need 2 different queues for testing skipping.\n", kSkipPrefix);
5160 return;
5161 }
5162
5163 // First two queue families
5164 uint32_t queue_index_A = 0;
5165 uint32_t queue_index_B = 1;
5166
5167 VkCommandPoolCreateInfo pool_create_info = {};
5168 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5169 pool_create_info.pNext = nullptr;
5170 pool_create_info.flags = 0;
5171
5172 VkCommandPool command_pool_A;
5173 pool_create_info.queueFamilyIndex = queue_index_A;
5174 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_A);
5175
5176 VkCommandPool command_pool_B;
5177 pool_create_info.queueFamilyIndex = queue_index_B;
5178 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_B);
5179
5180 VkCommandBuffer command_buffer[2]; // [0] primary and [1] secondary
5181 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5182 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5183 command_buffer_allocate_info.commandBufferCount = 1;
5184 command_buffer_allocate_info.commandPool = command_pool_A;
5185 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5186 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[0]);
5187
5188 command_buffer_allocate_info.commandPool = command_pool_B;
5189 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5190 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[1]);
5191
5192 VkCommandBufferBeginInfo begin_info = {};
5193 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5194
5195 // secondary
5196 vk::BeginCommandBuffer(command_buffer[1], &begin_info);
5197 vk::EndCommandBuffer(command_buffer[1]);
5198
5199 // Try using different pool's command buffer as secondary
5200 vk::BeginCommandBuffer(command_buffer[0], &begin_info);
5201 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
5202 vk::CmdExecuteCommands(command_buffer[0], 1, &command_buffer[1]);
5203 m_errorMonitor->VerifyFound();
5204 vk::EndCommandBuffer(command_buffer[0]);
5205
5206 vk::DestroyCommandPool(m_device->device(), command_pool_A, NULL);
5207 vk::DestroyCommandPool(m_device->device(), command_pool_B, NULL);
5208}
5209
unknown088160a2019-05-23 17:43:13 -06005210TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5211 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5212 ASSERT_NO_FATAL_FAILURE(Init());
5213 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5214 // never record secondary
5215
Mark Lobodzinski20310782020-02-28 14:25:17 -07005216 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005217 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005218 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005219 m_errorMonitor->VerifyFound();
5220 m_commandBuffer->end();
5221}
5222
5223TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5224 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5225
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005226 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005227 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5228
5229 VkImageCreateInfo image_create_info = {};
5230 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5231 image_create_info.pNext = NULL;
5232 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5233 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5234 image_create_info.extent.width = 32;
5235 image_create_info.extent.height = 1;
5236 image_create_info.extent.depth = 1;
5237 image_create_info.mipLevels = 1;
5238 image_create_info.arrayLayers = 1;
5239 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5240 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5241 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5242 image_create_info.flags = 0;
5243
5244 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5245 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5246
5247 VkImageObj image(m_device);
5248 image.init(&image_create_info);
5249 ASSERT_TRUE(image.initialized());
5250 VkImageMemoryBarrier image_barrier =
5251 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5252
5253 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5254 image_barrier.oldLayout = old_layout;
5255 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005256 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5257 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005258 };
5259
5260 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5261 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5262 secondary.begin();
5263 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5264 secondary.end();
5265
Mark Lobodzinski20310782020-02-28 14:25:17 -07005266 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005267 m_commandBuffer->begin();
5268 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005269 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005270 m_errorMonitor->VerifyFound();
5271
unknown088160a2019-05-23 17:43:13 -06005272 m_commandBuffer->reset();
5273 secondary.reset();
5274
5275 // Validate that UNDEFINED doesn't false positive on us
5276 secondary.begin();
5277 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5278 secondary.end();
5279 m_commandBuffer->begin();
5280 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5281 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005282 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005283 m_errorMonitor->VerifyNotFound();
5284 m_commandBuffer->end();
5285}
5286
5287TEST_F(VkLayerTest, SetDynViewportParamTests) {
5288 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5289
5290 SetTargetApiVersion(VK_API_VERSION_1_1);
5291 VkPhysicalDeviceFeatures features{};
5292 ASSERT_NO_FATAL_FAILURE(Init(&features));
5293
5294 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5295 const VkViewport viewports[] = {vp, vp};
5296
5297 m_commandBuffer->begin();
5298
5299 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005300 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005301 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
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-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005305 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
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-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005309 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005310 m_errorMonitor->VerifyFound();
5311
Mark Lobodzinski20310782020-02-28 14:25:17 -07005312 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5313 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005314 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005315 m_errorMonitor->VerifyFound();
5316
Mark Lobodzinski20310782020-02-28 14:25:17 -07005317 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005318 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005319 m_errorMonitor->VerifyFound();
5320
5321 // core viewport tests
5322 using std::vector;
5323 struct TestCase {
5324 VkViewport vp;
5325 std::string veid;
5326 };
5327
5328 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5329 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5330 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5331
5332 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5333 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5334 const auto one_before_min_bounds = NearestSmaller(min_bound);
5335 const auto one_past_max_bounds = NearestGreater(max_bound);
5336
5337 const auto below_zero = NearestSmaller(0.0f);
5338 const auto past_one = NearestGreater(1.0f);
5339
5340 vector<TestCase> test_cases = {
5341 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5342 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5343 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5344 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5345 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5346 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5347 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5348 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5349 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5350 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5351 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5352 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5353 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5354 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5355 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5356 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5357 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5358 };
5359
5360 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5361 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5362 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5363 } else {
5364 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5365 }
5366
5367 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005368 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005369 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005370 m_errorMonitor->VerifyFound();
5371 }
5372}
5373
5374TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5375 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5376
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005377 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005378
5379 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
5380 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
5381 } else {
5382 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5383 return;
5384 }
5385 ASSERT_NO_FATAL_FAILURE(InitState());
5386
5387 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5388}
5389
5390TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5391 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5392
5393 ASSERT_NO_FATAL_FAILURE(Init());
5394
5395 if (!m_device->phy().features().multiViewport) {
5396 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5397 return;
5398 }
5399
unknown088160a2019-05-23 17:43:13 -06005400 m_commandBuffer->begin();
5401
Mark Lobodzinski20310782020-02-28 14:25:17 -07005402 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005403 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005404 m_errorMonitor->VerifyFound();
5405
Petr Kraus14e49492019-09-09 20:13:29 +02005406 const auto max_viewports = m_device->props.limits.maxViewports;
5407
Mark Lobodzinski20310782020-02-28 14:25:17 -07005408 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005409 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005410 m_errorMonitor->VerifyFound();
5411
Petr Kraus14e49492019-09-09 20:13:29 +02005412 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5413 if (max_viewports >= too_big_max_viewports) {
5414 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5415 kSkipPrefix);
5416 } else {
5417 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5418 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
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(), 0, 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(), max_viewports, 1, 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-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005429 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005430 m_errorMonitor->VerifyFound();
5431
Mark Lobodzinski20310782020-02-28 14:25:17 -07005432 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005433 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005434 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005435 }
unknown088160a2019-05-23 17:43:13 -06005436}
5437
5438TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5439 TEST_DESCRIPTION(
5440 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5441
5442 ASSERT_NO_FATAL_FAILURE(Init());
5443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5444
5445 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5446 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5447
5448 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5449 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5450 nullptr, // pNext
5451 m_renderPass,
5452 0, // subpass
5453 m_framebuffer,
5454 };
5455 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5456 nullptr, // pNext
5457 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5458
5459 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5460 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5461 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5462 sec_cmdbuff_inside_rp.end();
5463
5464 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5465 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5466 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5467 sec_cmdbuff_outside_rp.end();
5468
5469 m_commandBuffer->begin();
5470
Mark Lobodzinski20310782020-02-28 14:25:17 -07005471 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005472 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005473 m_errorMonitor->VerifyFound();
5474
5475 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5476 nullptr, // pNext
5477 m_renderPass,
5478 m_framebuffer,
5479 {{0, 0}, {32, 32}},
5480 static_cast<uint32_t>(m_renderPassClearValues.size()),
5481 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005482 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005483
Mark Lobodzinski20310782020-02-28 14:25:17 -07005484 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005485 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005486 m_errorMonitor->VerifyFound();
5487}
5488
5489TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5490 TEST_DESCRIPTION(
5491 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5492 ASSERT_NO_FATAL_FAILURE(Init());
5493 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5494
5495 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
5496 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5497 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5498 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5499 command_buffer_allocate_info.commandBufferCount = 1;
5500
5501 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005502 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
unknown088160a2019-05-23 17:43:13 -06005503 VkCommandBufferBeginInfo command_buffer_begin_info = {};
5504 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
5505 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5506 command_buffer_inheritance_info.renderPass = m_renderPass;
5507 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5508
5509 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5510 command_buffer_begin_info.flags =
5511 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5512 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5513
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005514 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005515 VkClearAttachment color_attachment;
5516 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5517 color_attachment.clearValue.color.float32[0] = 0;
5518 color_attachment.clearValue.color.float32[1] = 0;
5519 color_attachment.clearValue.color.float32[2] = 0;
5520 color_attachment.clearValue.color.float32[3] = 0;
5521 color_attachment.colorAttachment = 0;
5522 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005523 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005524 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5525 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005526 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005527 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005528
Mark Lobodzinski20310782020-02-28 14:25:17 -07005529 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005530 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005531 m_errorMonitor->VerifyFound();
5532
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005533 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005534 m_commandBuffer->end();
5535}
5536
5537TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5538 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
5539 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5540 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5541 } else {
5542 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5543 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5544 return;
5545 }
5546
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005547 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005548 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5549 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5550 } else {
5551 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5552 return;
5553 }
5554 ASSERT_NO_FATAL_FAILURE(InitState());
5555
5556 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5557 if (push_descriptor_prop.maxPushDescriptors < 1) {
5558 // Some implementations report an invalid maxPushDescriptors of 0
5559 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5560 return;
5561 }
5562
5563 // Create ordinary and push descriptor set layout
5564 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5565 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5566 ASSERT_TRUE(ds_layout.initialized());
5567 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5568 ASSERT_TRUE(push_ds_layout.initialized());
5569
5570 // Now use the descriptor set layouts to create a pipeline layout
5571 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5572 ASSERT_TRUE(pipeline_layout.initialized());
5573
5574 // Create a descriptor to push
5575 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5576 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5577 ASSERT_TRUE(buffer_obj.initialized());
5578
5579 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5580 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5581 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5582
5583 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5584 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5585
5586 // Find address of extension call and make the call
5587 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005588 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005589 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5590
5591 // Section 1: Queue family matching/capabilities.
5592 // Create command pool on a non-graphics queue
5593 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5594 const uint32_t transfer_only_qfi =
5595 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5596 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005597 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005598 } else {
5599 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5600
5601 VkCommandPoolObj command_pool(m_device, err_qfi);
5602 ASSERT_TRUE(command_pool.initialized());
5603 VkCommandBufferObj command_buffer(m_device, &command_pool);
5604 ASSERT_TRUE(command_buffer.initialized());
5605 command_buffer.begin();
5606
Mark Lobodzinski20310782020-02-28 14:25:17 -07005607 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5608 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005609 if (err_qfi == transfer_only_qfi) {
5610 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005611 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005612 }
5613 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5614 &descriptor_write);
5615 m_errorMonitor->VerifyFound();
5616 command_buffer.end();
5617
5618 // If we succeed in testing only one condition above, we need to test the other below.
5619 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5620 // Need to test the neither compute/gfx supported case separately.
5621 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5622 ASSERT_TRUE(tran_command_pool.initialized());
5623 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5624 ASSERT_TRUE(tran_command_buffer.initialized());
5625 tran_command_buffer.begin();
5626
5627 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005628 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5629 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005631 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5632 &descriptor_write);
5633 m_errorMonitor->VerifyFound();
5634 tran_command_buffer.end();
5635 }
5636 }
5637
5638 // Push to the non-push binding
5639 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005640 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005641 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5642 &descriptor_write);
5643 m_errorMonitor->VerifyFound();
5644
5645 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005646 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005647 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5648 &descriptor_write);
5649 m_errorMonitor->VerifyFound();
5650 m_commandBuffer->end();
5651
5652 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5653 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005655 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR()");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005656 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005657 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5658 &descriptor_write);
5659 m_errorMonitor->VerifyFound();
5660}
5661
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005662TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5663 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5664 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5665 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5666 } else {
5667 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5668 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5669 return;
5670 }
5671
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005672 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005673 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5674 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5675 } else {
5676 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5677 return;
5678 }
5679 ASSERT_NO_FATAL_FAILURE(InitState());
5680
5681 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5682 if (push_descriptor_prop.maxPushDescriptors < 1) {
5683 // Some implementations report an invalid maxPushDescriptors of 0.
5684 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5685 return;
5686 }
5687
5688 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5689 if (min_alignment == 0) {
5690 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5691 return;
5692 }
5693
5694 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5695 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5696 ASSERT_TRUE(push_ds_layout.initialized());
5697
5698 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5699 ASSERT_TRUE(pipeline_layout.initialized());
5700
5701 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5702 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5703 ASSERT_TRUE(buffer_obj.initialized());
5704
5705 // Use an invalid alignment.
5706 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5707 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5708 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5709
5710 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5711 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5712 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5713
5714 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005715 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005716 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5717 &descriptor_write);
5718 m_errorMonitor->VerifyFound();
5719
5720 m_commandBuffer->end();
5721}
5722
unknown088160a2019-05-23 17:43:13 -06005723TEST_F(VkLayerTest, SetDynScissorParamTests) {
5724 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5725
5726 VkPhysicalDeviceFeatures features{};
5727 ASSERT_NO_FATAL_FAILURE(Init(&features));
5728
5729 const VkRect2D scissor = {{0, 0}, {16, 16}};
5730 const VkRect2D scissors[] = {scissor, scissor};
5731
5732 m_commandBuffer->begin();
5733
5734 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005736 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
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-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005740 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
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-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005744 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005745 m_errorMonitor->VerifyFound();
5746
Mark Lobodzinski20310782020-02-28 14:25:17 -07005747 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5748 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005749 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005750 m_errorMonitor->VerifyFound();
5751
Mark Lobodzinski20310782020-02-28 14:25:17 -07005752 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005753 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005754 m_errorMonitor->VerifyFound();
5755
5756 struct TestCase {
5757 VkRect2D scissor;
5758 std::string vuid;
5759 };
5760
5761 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5762 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5763 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5764 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5765 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5766 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5767 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5768 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5769
5770 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005771 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005772 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005773 m_errorMonitor->VerifyFound();
5774 }
5775
5776 m_commandBuffer->end();
5777}
5778
5779TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5780 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5781
5782 ASSERT_NO_FATAL_FAILURE(Init());
5783
5784 if (!m_device->phy().features().multiViewport) {
5785 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5786 return;
5787 }
5788
unknown088160a2019-05-23 17:43:13 -06005789 m_commandBuffer->begin();
5790
Mark Lobodzinski20310782020-02-28 14:25:17 -07005791 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005792 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005793 m_errorMonitor->VerifyFound();
5794
Petr Kraus14e49492019-09-09 20:13:29 +02005795 const auto max_scissors = m_device->props.limits.maxViewports;
5796
Mark Lobodzinski20310782020-02-28 14:25:17 -07005797 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005798 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005799 m_errorMonitor->VerifyFound();
5800
Petr Kraus14e49492019-09-09 20:13:29 +02005801 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5802 if (max_scissors >= too_big_max_scissors) {
5803 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5804 kSkipPrefix);
5805 } else {
5806 const VkRect2D scissor = {{0, 0}, {16, 16}};
5807 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
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(), 0, 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(), max_scissors, 1, 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-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005818 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005819 m_errorMonitor->VerifyFound();
5820
Mark Lobodzinski20310782020-02-28 14:25:17 -07005821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005822 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005823 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005824 }
unknown088160a2019-05-23 17:43:13 -06005825}
5826
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005827TEST_F(VkLayerTest, IndirectDrawTests) {
5828 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06005829
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005830 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5831 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5832 } else {
5833 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5834 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5835 return;
5836 }
5837 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5838
5839 if (IsPlatform(kMockICD) || DeviceSimulation()) {
5840 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
5841 return;
5842 }
5843
5844 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
5845 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
5846 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
5847
5848 // Create a device and ensure multiDrawIndirect is disabled
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005849 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
5850 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005851 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
5852 features2.features.multiDrawIndirect = VK_FALSE;
5853
5854 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
unknown088160a2019-05-23 17:43:13 -06005855 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5856
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005857 CreatePipelineHelper pipe(*this);
5858 pipe.InitInfo();
5859 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5860 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5861 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5862 dyn_state_ci.dynamicStateCount = size(dyn_states);
5863 dyn_state_ci.pDynamicStates = dyn_states;
5864 pipe.dyn_state_ci_ = dyn_state_ci;
5865 pipe.InitState();
5866 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005867
5868 m_commandBuffer->begin();
5869 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5870
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005871 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5872 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5873 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005874
5875 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005876 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005877 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005878 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005879
5880 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5881 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5882 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005883 VkBufferObj draw_buffer;
5884 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005885
5886 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07005887 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005888 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005889 m_errorMonitor->VerifyFound();
5890
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005891 // VUID-vkCmdDrawIndirect-drawCount-02718
5892 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-02718");
5893 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
5894 m_errorMonitor->VerifyFound();
5895
5896 // VUID-vkCmdDrawIndexedIndirect-drawCount-02718
5897 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-02718");
5898 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
5899 m_errorMonitor->VerifyFound();
5900
unknown088160a2019-05-23 17:43:13 -06005901 m_commandBuffer->EndRenderPass();
5902 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06005903}
5904
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005905TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
5906 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
5907
5908 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5909 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5910 } else {
5911 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5912 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5913 return;
5914 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005915 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005916
5917 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
5918 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5919 } else {
5920 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07005921 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005922 }
5923
5924 ASSERT_NO_FATAL_FAILURE(InitState());
5925 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5926
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005927 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
5928 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005929 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
5930
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005931 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
5932 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
5933
5934 m_commandBuffer->begin();
5935 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5936 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5937 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5938 buffer_create_info.size = 1024;
5939 VkBufferObj counter_buffer;
5940 counter_buffer.init(*m_device, buffer_create_info);
5941
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005942 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07005943 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005944 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005945 m_errorMonitor->VerifyFound();
5946
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005947 // some mock ICD json files are missing a valid stride value
5948 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
5949 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08005950 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005951 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
5952 m_errorMonitor->VerifyFound();
5953 }
5954
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005955 m_commandBuffer->EndRenderPass();
5956 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07005957
5958 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
5959 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
5960 return;
5961 }
5962
5963 std::vector<const char *> device_extension_names;
5964 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5965 VkDeviceObj test_device(0, gpu(), device_extension_names);
5966 VkCommandPoolObj commandPool(&test_device, 0);
5967 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
5968 VkBufferObj counter_buffer2;
5969 counter_buffer2.init(test_device, buffer_create_info);
5970 VkPipelineLayoutObj pipelineLayout(&test_device);
5971 VkRenderPass renderpass;
5972 VkRenderPassCreateInfo rp_info = {};
5973 VkSubpassDescription subpass = {};
5974 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5975 rp_info.pSubpasses = &subpass;
5976 rp_info.subpassCount = 1;
5977 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
5978 VkPipelineObj pipeline(&test_device);
5979 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
5980 pipeline.AddShader(&vs);
5981 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
5982 m_renderPassBeginInfo.renderPass = renderpass;
5983 VkFramebuffer fb;
5984 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
5985 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
5986 m_renderPassBeginInfo.framebuffer = fb;
5987 m_renderPassBeginInfo.renderPass = renderpass;
5988 commandBuffer.begin();
5989 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5990 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
5991 VkRect2D scissor = {{0, 0}, {16, 16}};
5992 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
5993 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
5994 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
5995 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08005996 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07005997 }
5998 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
5999 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
6000 m_errorMonitor->VerifyFound();
6001 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
6002 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006003}
6004
unknown088160a2019-05-23 17:43:13 -06006005TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6006 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6007
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006008 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006009 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6010 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6011 } else {
6012 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6013 return;
6014 }
6015 ASSERT_NO_FATAL_FAILURE(InitState());
6016 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6017
6018 VkMemoryRequirements memory_requirements;
6019 VkMemoryAllocateInfo memory_allocate_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
6020
6021 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006022 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006023
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006024 CreatePipelineHelper pipe(*this);
6025 pipe.InitInfo();
6026 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6027 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6028 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6029 dyn_state_ci.dynamicStateCount = size(dyn_states);
6030 dyn_state_ci.pDynamicStates = dyn_states;
6031 pipe.dyn_state_ci_ = dyn_state_ci;
6032 pipe.InitState();
6033 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006034
6035 m_commandBuffer->begin();
6036 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6037
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006038 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6039 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6040 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006041
6042 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006043 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006044 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006045 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006046
6047 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6048 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6049 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6050 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006051 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06006052
6053 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6054 count_buffer_create_info.size = sizeof(uint32_t);
6055 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006056 VkBufferObj count_buffer;
6057 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006058
Mike Schuchardt65847d92019-12-20 13:50:47 -08006059 // VUID-vkCmdDrawIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006060 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006061 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
6062 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006063 m_errorMonitor->VerifyFound();
6064
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006065 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06006066 memory_allocate_info.allocationSize = memory_requirements.size;
6067 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6068 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006069 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
6070 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006071
6072 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006073 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006074
Mike Schuchardt65847d92019-12-20 13:50:47 -08006075 // VUID-vkCmdDrawIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006076 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06006077 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
6078 m_errorMonitor->VerifyFound();
6079
Mike Schuchardt65847d92019-12-20 13:50:47 -08006080 // VUID-vkCmdDrawIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006081 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006082 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
6083 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006084 m_errorMonitor->VerifyFound();
6085
Mike Schuchardt65847d92019-12-20 13:50:47 -08006086 // VUID-vkCmdDrawIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006087 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006088 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
6089 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006090 m_errorMonitor->VerifyFound();
6091
Mike Schuchardt65847d92019-12-20 13:50:47 -08006092 // VUID-vkCmdDrawIndirectCount-stride-03110
Mark Lobodzinski20310782020-02-28 14:25:17 -07006093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006094 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006095 m_errorMonitor->VerifyFound();
6096
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006097 // 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 -06006098 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006099 // VUID-vkCmdDrawIndirectCount-renderPass-02684
6100 // VUID-vkCmdDrawIndirectCount-subpass-02685
6101 // VUID-vkCmdDrawIndirectCount-commandBuffer-02701
unknown088160a2019-05-23 17:43:13 -06006102
6103 m_commandBuffer->EndRenderPass();
6104 m_commandBuffer->end();
6105
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006106 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
6107 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006108
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006109 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006110}
6111
6112TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6113 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6114
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006115 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006116 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6117 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6118 } else {
6119 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6120 return;
6121 }
6122 ASSERT_NO_FATAL_FAILURE(InitState());
6123 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6124
unknown088160a2019-05-23 17:43:13 -06006125 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006126 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006127
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006128 CreatePipelineHelper pipe(*this);
6129 pipe.InitInfo();
6130 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6131 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6132 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6133 dyn_state_ci.dynamicStateCount = size(dyn_states);
6134 dyn_state_ci.pDynamicStates = dyn_states;
6135 pipe.dyn_state_ci_ = dyn_state_ci;
6136 pipe.InitState();
6137 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006138
6139 m_commandBuffer->begin();
6140 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6141
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006142 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6143 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6144 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006145
6146 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006147 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006148 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006149 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006150
6151 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6152 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6153 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006154 VkBufferObj draw_buffer;
6155 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006156
6157 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6158 count_buffer_create_info.size = sizeof(uint32_t);
6159 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006160 VkBufferObj count_buffer;
6161 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006162
6163 VkBufferCreateInfo index_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6164 index_buffer_create_info.size = sizeof(uint32_t);
6165 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006166 VkBufferObj index_buffer;
6167 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006168
Mike Schuchardt65847d92019-12-20 13:50:47 -08006169 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial - only tests whether the index buffer is bound)
Mark Lobodzinski20310782020-02-28 14:25:17 -07006170 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006171 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006172 sizeof(VkDrawIndexedIndirectCommand));
6173 m_errorMonitor->VerifyFound();
6174
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006175 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006176
6177 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006178 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006179
Mike Schuchardt65847d92019-12-20 13:50:47 -08006180 // VUID-vkCmdDrawIndexedIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006181 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006182 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006183 sizeof(VkDrawIndexedIndirectCommand));
6184 m_errorMonitor->VerifyFound();
6185
6186 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006187 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006188
Mike Schuchardt65847d92019-12-20 13:50:47 -08006189 // VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006190 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006191 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06006192 sizeof(VkDrawIndexedIndirectCommand));
6193 m_errorMonitor->VerifyFound();
6194
Mike Schuchardt65847d92019-12-20 13:50:47 -08006195 // VUID-vkCmdDrawIndexedIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006196 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006197 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006198 sizeof(VkDrawIndexedIndirectCommand));
6199 m_errorMonitor->VerifyFound();
6200
Mike Schuchardt65847d92019-12-20 13:50:47 -08006201 // VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006202 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006203 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006204 sizeof(VkDrawIndexedIndirectCommand));
6205 m_errorMonitor->VerifyFound();
6206
Mike Schuchardt65847d92019-12-20 13:50:47 -08006207 // VUID-vkCmdDrawIndexedIndirectCount-stride-03142
Mark Lobodzinski20310782020-02-28 14:25:17 -07006208 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006209 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006210 m_errorMonitor->VerifyFound();
6211
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006212 // 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 -06006213 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006214 // VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684
6215 // VUID-vkCmdDrawIndexedIndirectCount-subpass-02685
6216 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial)
unknown088160a2019-05-23 17:43:13 -06006217
6218 m_commandBuffer->EndRenderPass();
6219 m_commandBuffer->end();
6220
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006221 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
6222 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006223}
6224
sfricke-samsung860d3b22020-05-04 21:08:29 -07006225TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6226 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6227
6228 SetTargetApiVersion(VK_API_VERSION_1_2);
6229 ASSERT_NO_FATAL_FAILURE(Init());
6230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6231 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
6232 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
6233 return;
6234 }
6235
6236 VkBufferObj indirect_buffer;
6237 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6238 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6239
6240 VkBufferObj indexed_indirect_buffer;
6241 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6242 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6243
6244 VkBufferObj count_buffer;
6245 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6246
6247 VkBufferObj index_buffer;
6248 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6249
6250 CreatePipelineHelper pipe(*this);
6251 pipe.InitInfo();
6252 pipe.InitState();
6253 pipe.CreateGraphicsPipeline();
6254
6255 // Make calls to valid commands but without the drawIndirectCount feature set
6256 m_commandBuffer->begin();
6257 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6258
6259 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6260
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006261 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006262 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6263 sizeof(VkDrawIndirectCommand));
6264 m_errorMonitor->VerifyFound();
6265
6266 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6267
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006268 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006269 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6270 sizeof(VkDrawIndexedIndirectCommand));
6271 m_errorMonitor->VerifyFound();
6272
6273 m_commandBuffer->EndRenderPass();
6274 m_commandBuffer->end();
6275}
6276
unknown088160a2019-05-23 17:43:13 -06006277TEST_F(VkLayerTest, ExclusiveScissorNV) {
6278 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6279
6280 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6281 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6282 } else {
6283 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6284 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6285 return;
6286 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006287 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006288 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6289 for (auto device_extension : required_device_extensions) {
6290 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6291 m_device_extension_names.push_back(device_extension);
6292 } else {
6293 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6294 return;
6295 }
6296 }
6297
6298 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006299 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006300 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6301
6302 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006303 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6304 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006305 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6306
6307 features2.features.multiViewport = VK_FALSE;
6308
6309 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6311
6312 if (m_device->phy().properties().limits.maxViewports) {
6313 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6314 return;
6315 }
6316
6317 // Based on PSOViewportStateTests
6318 {
6319 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6320 VkViewport viewports[] = {viewport, viewport};
6321 VkRect2D scissor = {{0, 0}, {64, 64}};
6322 VkRect2D scissors[100] = {scissor, scissor};
6323
6324 using std::vector;
6325 struct TestCase {
6326 uint32_t viewport_count;
6327 VkViewport *viewports;
6328 uint32_t scissor_count;
6329 VkRect2D *scissors;
6330 uint32_t exclusive_scissor_count;
6331 VkRect2D *exclusive_scissors;
6332
6333 vector<std::string> vuids;
6334 };
6335
6336 vector<TestCase> test_cases = {
6337 {1,
6338 viewports,
6339 1,
6340 scissors,
6341 2,
6342 scissors,
6343 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6344 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6345 {1,
6346 viewports,
6347 1,
6348 scissors,
6349 100,
6350 scissors,
6351 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6352 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6353 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006354 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006355 };
6356
6357 for (const auto &test_case : test_cases) {
6358 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc = {
6359 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV};
6360
6361 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6362 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6363 helper.vp_state_ci_.pViewports = test_case.viewports;
6364 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6365 helper.vp_state_ci_.pScissors = test_case.scissors;
6366 helper.vp_state_ci_.pNext = &exc;
6367
6368 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6369 exc.pExclusiveScissors = test_case.exclusive_scissors;
6370 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006371 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006372 }
6373 }
6374
6375 // Based on SetDynScissorParamTests
6376 {
6377 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006378 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006379
6380 const VkRect2D scissor = {{0, 0}, {16, 16}};
6381 const VkRect2D scissors[] = {scissor, scissor};
6382
6383 m_commandBuffer->begin();
6384
Mark Lobodzinski20310782020-02-28 14:25:17 -07006385 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006386 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6387 m_errorMonitor->VerifyFound();
6388
Mark Lobodzinski20310782020-02-28 14:25:17 -07006389 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006390 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6391 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6392 m_errorMonitor->VerifyFound();
6393
Mark Lobodzinski20310782020-02-28 14:25:17 -07006394 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006395 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6396 m_errorMonitor->VerifyFound();
6397
Mark Lobodzinski20310782020-02-28 14:25:17 -07006398 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006399 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006400 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006401 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6402 m_errorMonitor->VerifyFound();
6403
Mark Lobodzinski20310782020-02-28 14:25:17 -07006404 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6405 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006406 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6407 m_errorMonitor->VerifyFound();
6408
Mark Lobodzinski20310782020-02-28 14:25:17 -07006409 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006410 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6411 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6412 m_errorMonitor->VerifyFound();
6413
6414 struct TestCase {
6415 VkRect2D scissor;
6416 std::string vuid;
6417 };
6418
6419 std::vector<TestCase> test_cases = {
6420 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6421 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6422 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6423 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6424 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6425 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6426 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6427 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6428
6429 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006430 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006431 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6432 m_errorMonitor->VerifyFound();
6433 }
6434
6435 m_commandBuffer->end();
6436 }
6437}
6438
6439TEST_F(VkLayerTest, MeshShaderNV) {
6440 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6441
6442 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6443 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6444 } else {
6445 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6446 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6447 return;
6448 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006449 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006450 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
6451 for (auto device_extension : required_device_extensions) {
6452 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6453 m_device_extension_names.push_back(device_extension);
6454 } else {
6455 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6456 return;
6457 }
6458 }
6459
Tony-LunarG048f5012020-04-29 16:55:11 -06006460 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006461 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6462 return;
6463 }
6464
6465 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006466 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006467 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6468
6469 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006470 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6471 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006472 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6473 features2.features.multiDrawIndirect = VK_FALSE;
6474
6475 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6476 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6477
6478 static const char vertShaderText[] =
6479 "#version 450\n"
6480 "vec2 vertices[3];\n"
6481 "void main() {\n"
6482 " vertices[0] = vec2(-1.0, -1.0);\n"
6483 " vertices[1] = vec2( 1.0, -1.0);\n"
6484 " vertices[2] = vec2( 0.0, 1.0);\n"
6485 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
6486 " gl_PointSize = 1.0f;\n"
6487 "}\n";
6488
6489 static const char meshShaderText[] =
6490 "#version 450\n"
6491 "#extension GL_NV_mesh_shader : require\n"
6492 "layout(local_size_x = 1) in;\n"
6493 "layout(max_vertices = 3) out;\n"
6494 "layout(max_primitives = 1) out;\n"
6495 "layout(triangles) out;\n"
6496 "void main() {\n"
6497 " gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);\n"
6498 " gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);\n"
6499 " gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);\n"
6500 " gl_PrimitiveIndicesNV[0] = 0;\n"
6501 " gl_PrimitiveIndicesNV[1] = 1;\n"
6502 " gl_PrimitiveIndicesNV[2] = 2;\n"
6503 " gl_PrimitiveCountNV = 1;\n"
6504 "}\n";
6505
6506 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6507 VkShaderObj ms(m_device, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV, this);
6508 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6509
6510 // Test pipeline creation
6511 {
6512 // can't mix mesh with vertex
6513 const auto break_vp = [&](CreatePipelineHelper &helper) {
6514 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6515 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006516 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006517 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6518
6519 // vertex or mesh must be present
6520 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006521 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006522 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6523
6524 // vertexinput and inputassembly must be valid when vertex stage is present
6525 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6526 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6527 helper.gp_ci_.pVertexInputState = nullptr;
6528 helper.gp_ci_.pInputAssemblyState = nullptr;
6529 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006530 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006531 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6532 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6533 }
6534
6535 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006536 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006537
6538 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6539 buffer_create_info.size = sizeof(uint32_t);
6540 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6541 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006542 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006543 ASSERT_VK_SUCCESS(result);
6544
6545 m_commandBuffer->begin();
6546
Mark Lobodzinski20310782020-02-28 14:25:17 -07006547 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6548 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006549 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6550 m_errorMonitor->VerifyFound();
6551
6552 m_commandBuffer->end();
6553
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006554 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006555}
6556
6557TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6558 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
6559 ASSERT_NO_FATAL_FAILURE(Init());
6560 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6561
6562 VkEvent event;
6563 VkEventCreateInfo event_create_info{};
6564 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006565 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006566
6567 m_commandBuffer->begin();
6568
Shannon McPherson93970b12020-06-12 14:34:35 -06006569 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006570 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_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-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006574 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_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-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006578 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_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-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006582 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006583 m_errorMonitor->VerifyFound();
6584
Shannon McPherson93970b12020-06-12 14:34:35 -06006585 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6586 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006587 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6588 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006589 m_errorMonitor->VerifyFound();
6590
Shannon McPherson93970b12020-06-12 14:34:35 -06006591 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6592 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006593 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6594 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006595 m_errorMonitor->VerifyFound();
6596
Shannon McPherson93970b12020-06-12 14:34:35 -06006597 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6598 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006599 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6600 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006601 m_errorMonitor->VerifyFound();
6602
Shannon McPherson93970b12020-06-12 14:34:35 -06006603 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6604 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006605 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6606 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006607 m_errorMonitor->VerifyFound();
6608
6609 m_commandBuffer->end();
6610
6611 VkSemaphoreCreateInfo semaphore_create_info = {};
6612 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6613 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006614 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006615
6616 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
6617 VkSubmitInfo submit_info = {};
6618
6619 // Signal the semaphore so the next test can wait on it.
6620 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6621 submit_info.signalSemaphoreCount = 1;
6622 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006623 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006624 m_errorMonitor->VerifyNotFound();
6625
6626 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6627 submit_info.signalSemaphoreCount = 0;
6628 submit_info.pSignalSemaphores = nullptr;
6629 submit_info.waitSemaphoreCount = 1;
6630 submit_info.pWaitSemaphores = &semaphore;
6631 submit_info.pWaitDstStageMask = &stage_flags;
6632
Mark Lobodzinski20310782020-02-28 14:25:17 -07006633 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02089");
6634 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02090");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006635 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006636 m_errorMonitor->VerifyFound();
6637
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006638 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006639
6640 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6641 VkPipelineShaderStageCreateInfo meshStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6642 meshStage = vs.GetStageCreateInfo();
6643 meshStage.stage = VK_SHADER_STAGE_MESH_BIT_NV;
6644 VkPipelineShaderStageCreateInfo taskStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6645 taskStage = vs.GetStageCreateInfo();
6646 taskStage.stage = VK_SHADER_STAGE_TASK_BIT_NV;
6647
6648 // mesh and task shaders not supported
6649 const auto break_vp = [&](CreatePipelineHelper &helper) {
6650 helper.shader_stages_ = {meshStage, taskStage, vs.GetStageCreateInfo()};
6651 };
6652 CreatePipelineHelper::OneshotTest(
Mark Lobodzinski20310782020-02-28 14:25:17 -07006653 *this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006654 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "VUID-VkPipelineShaderStageCreateInfo-pName-00707",
6655 "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6656 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
6657
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006658 vk::DestroyEvent(m_device->device(), event, nullptr);
6659 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006660}
Chris Mayerc93536f2019-09-19 16:34:49 +02006661
6662TEST_F(VkLayerTest, ViewportWScalingNV) {
6663 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6664
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006665 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006666
6667 VkPhysicalDeviceFeatures device_features = {};
6668 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6669
6670 if (!device_features.multiViewport) {
6671 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6672 return;
6673 }
6674
6675 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6676 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6677 } else {
6678 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6679 return;
6680 }
6681
6682 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6683 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6684
6685 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006686 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006687
6688 const char vs_src[] = R"(
6689 #version 450
6690 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6691 vec2( 1.0f, 1.0f),
6692 vec2(-1.0f, -1.0f),
6693 vec2( 1.0f, -1.0f) };
6694 out gl_PerVertex {
6695 vec4 gl_Position;
6696 };
6697
6698 void main() {
6699 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
6700 })";
6701
6702 const char fs_src[] = R"(
6703 #version 450
6704 layout(location = 0) out vec4 outColor;
6705
6706 void main() {
6707 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
6708 })";
6709
6710 const std::vector<VkViewport> vp = {
6711 {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}};
6712 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6713 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6714
6715 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6716
6717 VkPipelineViewportWScalingStateCreateInfoNV vpsi = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV};
6718 vpsi.viewportWScalingEnable = VK_TRUE;
6719 vpsi.viewportCount = vp_count;
6720 vpsi.pViewportWScalings = scale.data();
6721
6722 VkPipelineViewportStateCreateInfo vpci = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO};
6723 vpci.viewportCount = vp_count;
6724 vpci.pViewports = vp.data();
6725 vpci.scissorCount = vp_count;
6726 vpci.pScissors = sc.data();
6727 vpci.pNext = &vpsi;
6728
6729 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6730
6731 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006732 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006733
6734 // Create pipeline with w-scaling enabled but without a valid scaling array
6735 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006736 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006737 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6738
6739 vpsi.pViewportWScalings = scale.data();
6740
6741 // Create pipeline with w-scaling enabled but without matching viewport counts
6742 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006743 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006744 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6745
6746 const VkPipelineLayoutObj pl(m_device);
6747
6748 VkShaderObj vs(m_device, vs_src, VK_SHADER_STAGE_VERTEX_BIT, this);
6749 VkShaderObj fs(m_device, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6750
6751 VkPipelineObj pipe(m_device);
6752 pipe.AddDefaultColorAttachment();
6753 pipe.AddShader(&vs);
6754 pipe.AddShader(&fs);
6755 pipe.SetViewport(vp);
6756 pipe.SetScissor(sc);
6757 pipe.CreateVKPipeline(pl.handle(), renderPass());
6758
6759 VkPipelineObj pipeDynWScale(m_device);
6760 pipeDynWScale.AddDefaultColorAttachment();
6761 pipeDynWScale.AddShader(&vs);
6762 pipeDynWScale.AddShader(&fs);
6763 pipeDynWScale.SetViewport(vp);
6764 pipeDynWScale.SetScissor(sc);
6765 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6766 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6767
6768 m_commandBuffer->begin();
6769
6770 // Bind pipeline without dynamic w scaling enabled
6771 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006772 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006773 m_errorMonitor->VerifyNotFound();
6774
Chris Mayerc93536f2019-09-19 16:34:49 +02006775 // Bind pipeline that has dynamic w-scaling enabled
6776 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006777 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006778 m_errorMonitor->VerifyNotFound();
6779
6780 const auto max_vps = m_device->props.limits.maxViewports;
6781
Mark Lobodzinski20310782020-02-28 14:25:17 -07006782 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006783 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6784 m_errorMonitor->VerifyFound();
6785
6786 m_errorMonitor->ExpectSuccess();
6787 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6788 m_errorMonitor->VerifyNotFound();
6789
6790 m_commandBuffer->end();
6791}
sfricke-samsung914e8002020-01-07 22:26:18 -08006792
6793TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6794 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6795
6796 // Enable Sampler YCbCr Conversion req'd extensions
6797 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6798 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6799 if (mp_extensions) {
6800 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6801 }
6802 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006803 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sfricke-samsung914e8002020-01-07 22:26:18 -08006804 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6805 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6806 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6807 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6808 if (mp_extensions) {
6809 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6810 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6811 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6812 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6813 } else {
6814 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6815 return;
6816 }
6817
6818 // Explictly not enable Ycbcr Conversion Features
6819 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {};
6820 ycbcr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
6821 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6822 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6823
6824 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6825 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6826 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6827 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6828 return;
6829 }
6830
6831 // Create Ycbcr conversion
6832 VkSamplerYcbcrConversion conversions;
6833 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6834 NULL,
6835 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6836 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6837 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6838 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6839 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6840 VK_CHROMA_LOCATION_COSITED_EVEN,
6841 VK_CHROMA_LOCATION_COSITED_EVEN,
6842 VK_FILTER_NEAREST,
6843 false};
6844
Mark Lobodzinski20310782020-02-28 14:25:17 -07006845 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006846 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6847 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006848}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006849
6850TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6851 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6852
6853 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6854 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6855 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6856 return;
6857 }
6858 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6859
6860 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6861
6862 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6863 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6864 return;
6865 }
6866 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6867
6868 {
6869 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6870 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6871 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6872
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006873 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6874 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006875 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6876
6877 if (!tf_features.transformFeedback) {
6878 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6879 return;
6880 }
6881 }
6882
6883 ASSERT_NO_FATAL_FAILURE(InitState());
6884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6885
6886 {
6887 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
6888 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6889 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6890
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006891 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006892 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6893 info.size = 4;
6894 VkBufferObj buffer;
6895 buffer.init(*m_device, info);
6896 VkDeviceSize offsets[1]{};
6897
6898 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
6899 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
6900 m_errorMonitor->VerifyFound();
6901 }
6902
6903 {
6904 auto vkCmdBeginTransformFeedbackEXT =
6905 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6906 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6907
6908 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
6909 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6910 m_errorMonitor->VerifyFound();
6911 }
6912
6913 {
6914 auto vkCmdEndTransformFeedbackEXT =
6915 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6916 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6917
6918 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
6919 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
6920 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6921 m_errorMonitor->VerifyFound();
6922 }
6923}
6924
6925TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
6926 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
6927
6928 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6929 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6930 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6931 return;
6932 }
6933 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6934
6935 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6936
6937 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6938 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6939 return;
6940 }
6941 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6942
6943 {
6944 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6945 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6946 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6947
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006948 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6949 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006950 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6951
6952 if (!tf_features.transformFeedback) {
6953 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6954 return;
6955 }
6956
6957 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6958 }
6959
6960 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6961
6962 auto vkCmdBindTransformFeedbackBuffersEXT =
6963 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6964 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6965
6966 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006967 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6968 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006969 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6970
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006971 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006972 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6973 info.size = 8;
6974 VkBufferObj const buffer_obj(*m_device, info);
6975
6976 // Request a firstBinding that is too large.
6977 {
6978 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
6979 VkDeviceSize const offsets[1]{};
6980
6981 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
6982 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6983 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
6984 nullptr);
6985 m_errorMonitor->VerifyFound();
6986 }
6987
6988 // Request too many bindings.
6989 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
6990 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
6991 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
6992
6993 std::vector<VkDeviceSize> offsets(bindingCount);
6994
6995 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6996 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
6997 nullptr);
6998 m_errorMonitor->VerifyFound();
6999 }
7000
7001 // Request a size that is larger than the maximum size.
7002 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7003 VkDeviceSize const offsets[1]{};
7004 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7005
7006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7007 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7008 m_errorMonitor->VerifyFound();
7009 }
7010 }
7011
7012 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007013 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007014 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7015 info.size = 8;
7016 VkBufferObj const buffer_obj(*m_device, info);
7017
7018 // Request an offset that is too large.
7019 {
7020 VkDeviceSize const offsets[1]{info.size + 4};
7021
7022 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7023 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7024 m_errorMonitor->VerifyFound();
7025 }
7026
7027 // Request an offset that is not a multiple of 4.
7028 {
7029 VkDeviceSize const offsets[1]{1};
7030
7031 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7032 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7033 m_errorMonitor->VerifyFound();
7034 }
7035
7036 // Request a size that is larger than the buffer's size.
7037 {
7038 VkDeviceSize const offsets[1]{};
7039 VkDeviceSize const sizes[1]{info.size + 1};
7040
7041 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007042 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7043 m_errorMonitor->VerifyFound();
7044 }
7045
7046 // Request an offset and size whose sum is larger than the buffer's size.
7047 {
7048 VkDeviceSize const offsets[1]{4};
7049 VkDeviceSize const sizes[1]{info.size - 3};
7050
7051 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7052 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7053 m_errorMonitor->VerifyFound();
7054 }
7055
7056 // Bind while transform feedback is active.
7057 {
7058 auto vkCmdBeginTransformFeedbackEXT =
7059 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7060 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7061 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7062
7063 VkDeviceSize const offsets[1]{};
7064
7065 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7066 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7067 m_errorMonitor->VerifyFound();
7068
7069 auto vkCmdEndTransformFeedbackEXT =
7070 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7071 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7072 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7073 }
7074 }
7075
7076 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7077 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007078 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007079 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7080 info.size = 4;
7081 VkBufferObj const buffer_obj(*m_device, info);
7082
7083 VkDeviceSize const offsets[1]{};
7084
7085 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7086 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7087 m_errorMonitor->VerifyFound();
7088 }
7089
7090 // Don't bind memory.
7091 {
7092 VkBuffer buffer{};
7093 {
7094 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
7095 ASSERT_TRUE(vkCreateBuffer != nullptr);
7096
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007097 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007098 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7099 info.size = 4;
7100 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
7101 }
7102
7103 VkDeviceSize const offsets[1]{};
7104
7105 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
7106 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
7107 m_errorMonitor->VerifyFound();
7108 }
7109}
7110
7111TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7112 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7113
7114 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7115 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7116 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7117 return;
7118 }
7119 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7120
7121 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7122
7123 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7124 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7125 return;
7126 }
7127 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7128
7129 {
7130 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7131 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7132 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7133
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007134 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7135 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007136 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7137
7138 if (!tf_features.transformFeedback) {
7139 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7140 return;
7141 }
7142
7143 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7144 }
7145
7146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7147
7148 auto vkCmdBeginTransformFeedbackEXT =
7149 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7150 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7151
7152 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007153 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7154 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007155 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7156
7157 // Request a firstCounterBuffer that is too large.
7158 {
7159 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7160
7161 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7162 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7163 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7164 m_errorMonitor->VerifyFound();
7165 }
7166
7167 // Request too many buffers.
7168 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7169 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7170
7171 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7172 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7173 m_errorMonitor->VerifyFound();
7174 }
7175 }
7176
7177 // Request an out-of-bounds location.
7178 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007179 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007180 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7181 info.size = 4;
7182 VkBufferObj const buffer_obj(*m_device, info);
7183
7184 VkDeviceSize const offsets[1]{1};
7185
7186 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7187 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7188 m_errorMonitor->VerifyFound();
7189 }
7190
7191 // Request specific offsets without specifying buffers.
7192 {
7193 VkDeviceSize const offsets[1]{};
7194
7195 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7196 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7197 m_errorMonitor->VerifyFound();
7198 }
7199
7200 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7201 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007202 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007203 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7204 info.size = 4;
7205 VkBufferObj const buffer_obj(*m_device, info);
7206
7207 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7208 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7209 m_errorMonitor->VerifyFound();
7210 }
7211
7212 // Begin while transform feedback is active.
7213 {
7214 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7215
7216 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7217 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7218 m_errorMonitor->VerifyFound();
7219
7220 auto vkCmdEndTransformFeedbackEXT =
7221 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7222 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7223
7224 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7225 }
7226}
7227
7228TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7229 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7230
7231 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7232 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7233 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7234 return;
7235 }
7236 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7237
7238 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7239
7240 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7241 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7242 return;
7243 }
7244 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7245
7246 {
7247 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7248 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7249 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7250
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007251 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7252 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007253 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7254
7255 if (!tf_features.transformFeedback) {
7256 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7257 return;
7258 }
7259
7260 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7261 }
7262
7263 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7264
7265 auto vkCmdEndTransformFeedbackEXT =
7266 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7267 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7268
7269 {
7270 // Activate transform feedback.
7271 auto vkCmdBeginTransformFeedbackEXT =
7272 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7273 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7274 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7275
7276 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007277 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7278 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007279 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7280
7281 // Request a firstCounterBuffer that is too large.
7282 {
7283 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7284
7285 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7286 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7287 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7288 m_errorMonitor->VerifyFound();
7289 }
7290
7291 // Request too many buffers.
7292 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7293 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7294
7295 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7296 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7297 m_errorMonitor->VerifyFound();
7298 }
7299 }
7300
7301 // Request an out-of-bounds location.
7302 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007303 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007304 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7305 info.size = 4;
7306 VkBufferObj const buffer_obj(*m_device, info);
7307
7308 VkDeviceSize const offsets[1]{1};
7309
7310 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7311 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7312 m_errorMonitor->VerifyFound();
7313 }
7314
7315 // Request specific offsets without specifying buffers.
7316 {
7317 VkDeviceSize const offsets[1]{};
7318
7319 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7320 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7321 m_errorMonitor->VerifyFound();
7322 }
7323
7324 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7325 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007326 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007327 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7328 info.size = 4;
7329 VkBufferObj const buffer_obj(*m_device, info);
7330
7331 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7332 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7333 m_errorMonitor->VerifyFound();
7334 }
7335 }
7336
7337 // End while transform feedback is inactive.
7338 {
7339 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7340
7341 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7342 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7343 m_errorMonitor->VerifyFound();
7344 }
7345}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007346
sfricke-samsung39ee2442020-07-22 21:21:15 -07007347TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7348 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007349
7350 // protect memory added in VK 1.1
7351 SetTargetApiVersion(VK_API_VERSION_1_1);
7352
7353 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7354 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7355 } else {
7356 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7357 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7358 return;
7359 }
7360 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7361
7362 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7363 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7364 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7365
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007366 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7367 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007368 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7369
7370 if (protected_memory_features.protectedMemory == VK_FALSE) {
7371 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7372 return;
7373 };
7374
7375 // Turns m_commandBuffer into a protected command buffer
7376 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7377
7378 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7379 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7380 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7381 return;
7382 }
7383
7384 VkBufferObj indirect_buffer;
7385 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7386 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7387
7388 VkBufferObj indexed_indirect_buffer;
7389 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7390 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7391
7392 VkBufferObj index_buffer;
7393 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7394
7395 CreatePipelineHelper pipe(*this);
7396 pipe.InitInfo();
7397 pipe.InitState();
7398 pipe.CreateGraphicsPipeline();
7399
sfricke-samsung39ee2442020-07-22 21:21:15 -07007400 VkQueryPool query_pool;
7401 VkQueryPoolCreateInfo query_pool_create_info{};
7402 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7403 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7404 query_pool_create_info.queryCount = 1;
7405 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7406
sfricke-samsung071af2d2020-07-02 10:37:22 -07007407 m_commandBuffer->begin();
7408 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7409
7410 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7411
7412 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7413 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7414 m_errorMonitor->VerifyFound();
7415
7416 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7417
7418 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7419 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7420 sizeof(VkDrawIndexedIndirectCommand));
7421 m_errorMonitor->VerifyFound();
7422
7423 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007424
7425 // Query should be outside renderpass
7426 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7427
7428 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7429 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7430 m_errorMonitor->VerifyFound();
7431
7432 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7433 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7434 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7435 m_errorMonitor->VerifyFound();
7436
sfricke-samsung071af2d2020-07-02 10:37:22 -07007437 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007438
7439 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007440}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007441
7442TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7443 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7444
7445 SetTargetApiVersion(VK_API_VERSION_1_1);
7446
7447 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7448 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7449 } else {
7450 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7451 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7452 return;
7453 }
7454 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7455
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007456 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7457 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7458 return;
7459 }
7460
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007461 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7462 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7463 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7464
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007465 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7466 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007467 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7468
7469 if (protected_memory_features.protectedMemory == VK_FALSE) {
7470 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7471 return;
7472 };
7473
7474 // Turns m_commandBuffer into a unprotected command buffer
7475 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7476
7477 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7478 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7479
7480 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7481 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7482 return;
7483 }
7484
7485 // Create actual protected and unprotected buffers
7486 VkBuffer buffer_protected = VK_NULL_HANDLE;
7487 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
7488 VkBufferCreateInfo buffer_create_info = {};
7489 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7490 buffer_create_info.pNext = nullptr;
7491 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007492 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7493 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7494 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007495 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7496
7497 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7498 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7499 buffer_create_info.flags = 0;
7500 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7501
7502 // Create actual protected and unprotected images
7503 VkImageObj image_protected(m_device);
7504 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007505 VkImageObj image_protected_descriptor(m_device);
7506 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007507 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007508 VkImageView image_views_descriptor[2];
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007509 VkImageCreateInfo image_create_info = {};
7510 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7511 image_create_info.pNext = nullptr;
7512 image_create_info.extent = {64, 64, 1};
7513 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
7514 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7515 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007516 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7517 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007518 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7519 image_create_info.arrayLayers = 1;
7520 image_create_info.mipLevels = 1;
7521
7522 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7523 image_protected.init_no_mem(*m_device, image_create_info);
7524 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007525 image_views[0] = image_protected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007526
locke-lunarg0de02522020-10-27 22:55:17 -06007527 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
7528 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7529 image_views_descriptor[0] = image_protected_descriptor.targetView(VK_FORMAT_R8G8B8A8_UNORM);
7530
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007531 image_create_info.flags = 0;
7532 image_unprotected.init_no_mem(*m_device, image_create_info);
7533 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007534 image_views[1] = image_unprotected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007535
locke-lunarg0de02522020-10-27 22:55:17 -06007536 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
7537 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7538 image_views_descriptor[1] = image_unprotected_descriptor.targetView(VK_FORMAT_R8G8B8A8_UNORM);
7539
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007540 // Create protected and unproteced memory
7541 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7542 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7543
7544 VkMemoryAllocateInfo alloc_info = {};
7545 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7546 alloc_info.pNext = nullptr;
7547 alloc_info.allocationSize = 0;
7548
7549 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7550 VkMemoryRequirements mem_reqs_protected;
7551 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7552 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7553 VkMemoryRequirements mem_reqs_unprotected;
7554 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7555 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7556
7557 // Get memory index for a protected and unprotected memory
7558 VkPhysicalDeviceMemoryProperties phys_mem_props;
7559 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7560 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7561 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7562 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7563 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7564 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7565 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7566 memory_type_unprotected = i;
7567 }
7568 // Check just protected bit is in type at all
7569 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7570 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7571 memory_type_protected = i;
7572 }
7573 }
7574 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7575 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7576 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7577 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7578 return;
7579 }
7580
7581 alloc_info.memoryTypeIndex = memory_type_protected;
7582 alloc_info.allocationSize = mem_reqs_protected.size;
7583 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7584
7585 alloc_info.allocationSize = mem_reqs_unprotected.size;
7586 alloc_info.memoryTypeIndex = memory_type_unprotected;
7587 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7588
7589 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7590 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7591 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7592 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
7593
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007594 // A renderpass and framebuffer that contains a protected and unprotected image view
7595 VkAttachmentDescription attachments[2] = {
7596 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7597 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7598 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7599 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7600 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7601 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7602 };
7603 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7604 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7605 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7606 VkSubpassDependency dependency = {0,
7607 0,
7608 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7609 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7610 VK_ACCESS_SHADER_WRITE_BIT,
7611 VK_ACCESS_SHADER_WRITE_BIT,
7612 VK_DEPENDENCY_BY_REGION_BIT};
7613 VkRenderPassCreateInfo render_pass_create_info = {
7614 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7615 VkRenderPass render_pass;
7616 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7617 VkFramebufferCreateInfo framebuffer_create_info = {
7618 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7619 VkFramebuffer framebuffer;
7620 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7621
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007622 // Various structs used for commands
7623 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7624 VkImageBlit blit_region = {};
7625 blit_region.srcSubresource = image_subresource;
7626 blit_region.dstSubresource = image_subresource;
7627 blit_region.srcOffsets[0] = {0, 0, 0};
7628 blit_region.srcOffsets[1] = {8, 8, 1};
7629 blit_region.dstOffsets[0] = {0, 8, 0};
7630 blit_region.dstOffsets[1] = {8, 8, 1};
7631 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7632 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7633 VkBufferCopy buffer_copy = {0, 0, 64};
7634 VkBufferImageCopy buffer_image_copy = {};
7635 buffer_image_copy.bufferRowLength = 0;
7636 buffer_image_copy.bufferImageHeight = 0;
7637 buffer_image_copy.imageSubresource = image_subresource;
7638 buffer_image_copy.imageOffset = {0, 0, 0};
7639 buffer_image_copy.imageExtent = {1, 1, 1};
7640 buffer_image_copy.bufferOffset = 0;
7641 VkImageCopy image_copy = {};
7642 image_copy.srcSubresource = image_subresource;
7643 image_copy.srcOffset = {0, 0, 0};
7644 image_copy.dstSubresource = image_subresource;
7645 image_copy.dstOffset = {0, 0, 0};
7646 image_copy.extent = {1, 1, 1};
7647 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007648 VkRect2D render_area = {{0, 0}, {8, 8}};
7649 VkRenderPassBeginInfo render_pass_begin = {
7650 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7651 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7652 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7653 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007654
locke-lunarg0de02522020-10-27 22:55:17 -06007655 const char fsSource[] =
7656 "#version 450\n"
7657 "layout(set=0, binding=0) uniform foo { int x; int y; } bar;\n"
7658 "layout(set=0, binding=1, rgba8) uniform image2D si1;\n"
7659 "layout(location=0) out vec4 x;\n"
7660 "void main(){\n"
7661 " x = vec4(bar.y);\n"
7662 " imageStore(si1, ivec2(0), vec4(0));\n"
7663 "}\n";
7664 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7665
7666 CreatePipelineHelper g_pipe(*this);
7667 g_pipe.InitInfo();
7668 g_pipe.gp_ci_.renderPass = render_pass;
7669 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7670 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7671 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
7672 std::array<VkPipelineColorBlendAttachmentState, 2> color_blend_attachments;
7673 color_blend_attachments[0] = g_pipe.cb_attachments_;
7674 color_blend_attachments[1] = g_pipe.cb_attachments_;
7675 g_pipe.cb_ci_.attachmentCount = color_blend_attachments.size();
7676 g_pipe.cb_ci_.pAttachments = color_blend_attachments.data();
7677 g_pipe.InitState();
7678 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7679
7680 VkSampler sampler;
7681 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7682 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7683 ASSERT_VK_SUCCESS(err);
7684
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007685 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007686 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007687 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7688 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7689 g_pipe.descriptor_set_->UpdateDescriptorSets();
7690
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007691 m_commandBuffer->begin();
7692
7693 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7694 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7695 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7696 m_errorMonitor->VerifyFound();
7697
7698 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7699 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7700 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7701 m_errorMonitor->VerifyFound();
7702
7703 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7704 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7705 &subresource_range);
7706 m_errorMonitor->VerifyFound();
7707
7708 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7709 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7710 m_errorMonitor->VerifyFound();
7711
7712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7713 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7714 m_errorMonitor->VerifyFound();
7715
7716 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7717 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7718 &buffer_image_copy);
7719 m_errorMonitor->VerifyFound();
7720
7721 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7722 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7723 &buffer_image_copy);
7724 m_errorMonitor->VerifyFound();
7725
7726 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7727 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7728 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7729 m_errorMonitor->VerifyFound();
7730
7731 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7732 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7733 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7734 m_errorMonitor->VerifyFound();
7735
7736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7737 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected, 1,
7738 &buffer_image_copy);
7739 m_errorMonitor->VerifyFound();
7740
7741 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7742 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected, 1,
7743 &buffer_image_copy);
7744 m_errorMonitor->VerifyFound();
7745
7746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7747 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7748 m_errorMonitor->VerifyFound();
7749
7750 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7751 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7752 m_errorMonitor->VerifyFound();
7753
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007754 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7755
7756 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7757 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7758 m_errorMonitor->VerifyFound();
7759
locke-lunarg0de02522020-10-27 22:55:17 -06007760 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7761 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7762 &g_pipe.descriptor_set_->set_, 0, nullptr);
7763 VkDeviceSize offset = 0;
7764 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7765 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
7766
7767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7769 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7770 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7771 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
7772
7773 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7774 m_errorMonitor->VerifyFound();
7775
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007776 vk::CmdEndRenderPass(m_commandBuffer->handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007777 m_commandBuffer->end();
7778
7779 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007780 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007781 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7782 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007783 g_pipe.descriptor_set_->UpdateDescriptorSets();
7784
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007785 protectedCommandBuffer.begin();
7786
7787 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7788 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7789 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7790 m_errorMonitor->VerifyFound();
7791
7792 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7793 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7794 &subresource_range);
7795 m_errorMonitor->VerifyFound();
7796
7797 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7798 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7799 m_errorMonitor->VerifyFound();
7800
7801 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7802 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7803 1, &buffer_image_copy);
7804 m_errorMonitor->VerifyFound();
7805
7806 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7807 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7808 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7809 m_errorMonitor->VerifyFound();
7810
7811 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7812 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7813 1, &buffer_image_copy);
7814 m_errorMonitor->VerifyFound();
7815
7816 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7817 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7818 m_errorMonitor->VerifyFound();
7819
7820 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7821 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7822 m_errorMonitor->VerifyFound();
7823
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007824 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7825
7826 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7827 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7828 m_errorMonitor->VerifyFound();
7829
locke-lunarg0de02522020-10-27 22:55:17 -06007830 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7831 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7832 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7833 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7834 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
7835
7836 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7837 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7838 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7839 m_errorMonitor->VerifyFound();
7840
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007841 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007842 protectedCommandBuffer.end();
7843
sfricke-samsung96cd9932020-08-23 20:57:11 -07007844 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7845 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7846
7847 VkProtectedSubmitInfo protected_submit_info = {};
7848 protected_submit_info.sType = VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO;
7849 protected_submit_info.pNext = nullptr;
7850
7851 VkSubmitInfo submit_info = {};
7852 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7853 submit_info.pNext = &protected_submit_info;
7854 submit_info.commandBufferCount = 2;
7855 submit_info.pCommandBuffers = comman_buffers;
7856
7857 protected_submit_info.protectedSubmit = VK_TRUE;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007858 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007859 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7860 m_errorMonitor->VerifyFound();
7861
7862 protected_submit_info.protectedSubmit = VK_FALSE;
7863 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7864 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7865 m_errorMonitor->VerifyFound();
7866
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007867 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7868 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7869 vk::FreeMemory(device(), memory_protected, nullptr);
7870 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007871 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7872 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007873}
locke-lunarg6b0de702020-08-07 17:42:13 -06007874
7875TEST_F(VkLayerTest, InvailStorageAtomicOperation) {
7876 TEST_DESCRIPTION(
7877 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7878 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7879
7880 ASSERT_NO_FATAL_FAILURE(Init());
7881
7882 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7883 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7884 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7885 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7886
7887 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7888 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7889 return;
7890 }
7891
7892 VkFormat buffer_view_format =
7893 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
7894 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7895 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
7896 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7897 return;
7898 }
7899 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7900
7901 VkPhysicalDeviceFeatures device_features = {};
7902 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
7903 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
7904 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
7905 return;
7906 }
7907
7908 VkImageObj image(m_device);
7909 image.Init(image_ci);
7910 VkImageView image_view = image.targetView(image_format);
7911
7912 VkSampler sampler = VK_NULL_HANDLE;
7913 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
7914 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
7915
7916 VkBufferObj buffer;
7917 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
7918
7919 VkBufferViewCreateInfo bvci = {};
7920 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7921 bvci.buffer = buffer.handle();
7922 bvci.format = buffer_view_format;
7923 bvci.range = VK_WHOLE_SIZE;
7924 VkBufferView buffer_view;
7925 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
7926
7927 char const *fsSource =
7928 "#version 450\n"
locke-lunarg76e8dee2020-08-21 13:20:02 -06007929 "layout(set=0, binding=3, rgba8) uniform image2D si0;\n "
7930 "layout(set=0, binding=2, rgba8) uniform image2D si1[2];\n "
7931 "layout(set = 0, binding = 1, r8) uniform imageBuffer stb2;\n"
7932 "layout(set = 0, binding = 0, r8) uniform imageBuffer stb3[2];\n"
locke-lunarg6b0de702020-08-07 17:42:13 -06007933 "void main() {\n"
7934 " imageAtomicExchange(si0, ivec2(0), 1);\n"
7935 " imageAtomicExchange(si1[0], ivec2(0), 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007936 " imageAtomicExchange(si1[1], ivec2(0), 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007937 " imageAtomicExchange(stb2, 0, 1);\n"
7938 " imageAtomicExchange(stb3[0], 0, 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007939 " imageAtomicExchange(stb3[1], 0, 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007940 "}\n";
7941
7942 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7943 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7944
7945 CreatePipelineHelper g_pipe(*this);
7946 g_pipe.InitInfo();
7947 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06007948 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7949 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7950 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7951 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06007952 g_pipe.InitState();
7953 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7954
locke-lunarg76e8dee2020-08-21 13:20:02 -06007955 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007956 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007957 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007958 VK_IMAGE_LAYOUT_GENERAL, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007959 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
7960 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06007961 g_pipe.descriptor_set_->UpdateDescriptorSets();
7962
7963 m_commandBuffer->begin();
7964 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7965 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7966 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7967 &g_pipe.descriptor_set_->set_, 0, nullptr);
7968
7969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7971 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7973 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7974 m_errorMonitor->VerifyFound();
7975
7976 m_commandBuffer->EndRenderPass();
7977 m_commandBuffer->end();
7978}
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
8060 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-CoreValidation-Shader-PushConstantOutOfRange");
8061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-CoreValidation-Shader-PushConstantOutOfRange");
8062 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
8075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8076 const float dummy_values[128] = {};
8077 vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8078 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8079 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8080 m_errorMonitor->VerifyFound();
8081
8082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8083 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8084 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8085 m_errorMonitor->VerifyFound();
8086
8087 m_errorMonitor->ExpectSuccess();
8088 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8089 68, dummy_values);
8090 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8091 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06008092}
8093
8094TEST_F(VkLayerTest, VerifyVertextBinding) {
8095 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8096
8097 ASSERT_NO_FATAL_FAILURE(Init());
8098 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8099
8100 VkBufferObj vtx_buf;
8101 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8102 vtx_buf.init(*m_device, info);
8103
8104 CreatePipelineHelper pipe(*this);
8105 pipe.InitInfo();
8106 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8107 VkVertexInputBindingDescription vtx_binding_des[3] = {
8108 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8109
8110 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8111 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8112 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8113 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8114 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8115 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8116 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8117 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8118 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8119 pipe.InitState();
8120 pipe.CreateGraphicsPipeline();
8121
8122 m_commandBuffer->begin();
8123 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8124 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8125 VkDeviceSize offset = 0;
8126 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8127
8128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8133 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8134 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008135
8136 m_commandBuffer->EndRenderPass();
8137 m_commandBuffer->end();
8138}
locke-lunargd7a08e92020-10-21 00:24:00 -06008139
8140TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8141 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8142 ASSERT_NO_FATAL_FAILURE(Init());
8143 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8144
8145 CreatePipelineHelper pipe(*this);
8146 pipe.InitInfo();
8147
8148 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8149
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008150 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008151 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8152 dyn_state_ci.pDynamicStates = dyn_states.data();
8153 pipe.dyn_state_ci_ = dyn_state_ci;
8154 pipe.InitState();
8155 pipe.CreateGraphicsPipeline();
8156
8157 m_commandBuffer->begin();
8158 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8159 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8160
8161 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8162 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8163 VkRect2D scissor = {{0, 0}, {16, 16}};
8164 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8165 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8166
8167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8168 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8169 m_errorMonitor->VerifyFound();
8170
8171 m_commandBuffer->EndRenderPass();
8172 m_commandBuffer->end();
8173}
locke-lunarg0de02522020-10-27 22:55:17 -06008174
8175TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8176 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
8177 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8178 if (version < VK_API_VERSION_1_1) {
8179 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8180 return;
8181 }
8182 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8183
8184 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FILTER_CUBIC_EXTENSION_NAME)) {
8185 m_device_extension_names.push_back(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8186 } else {
8187 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8188 return;
8189 }
8190
8191 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8192 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8193
8194 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8195 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008196
8197 VkFormatProperties format_props;
8198 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8199 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
8200 printf("%s SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.\n", kSkipPrefix);
8201 return;
8202 }
8203
locke-lunarg0de02522020-10-27 22:55:17 -06008204 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8205 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8206
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008207 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008208 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008209 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008210 image_format_info.type = image_ci.imageType;
8211 image_format_info.format = image_ci.format;
8212 image_format_info.tiling = image_ci.tiling;
8213 image_format_info.usage = image_ci.usage;
8214 image_format_info.flags = image_ci.flags;
8215
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008216 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8217 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008218
8219 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8220
8221 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
8222 printf("%s Image and ImageView supports filter cubic ; skipped.\n", kSkipPrefix);
8223 return;
8224 }
8225
8226 VkImageObj image(m_device);
8227 image.Init(image_ci);
8228 VkImageView imageView = image.targetView(format, imageViewType);
8229
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008230 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008231 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8232 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8233 VkSampler sampler;
8234 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8235
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008236 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008237 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8238 sampler_ci.pNext = &reduction_mode_ci;
8239 VkSampler sampler_rediction;
8240 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler_rediction);
8241
8242 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8243
8244 CreatePipelineHelper g_pipe(*this);
8245 g_pipe.InitInfo();
8246 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8247 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8248 g_pipe.InitState();
8249 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8250
8251 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_rediction);
8252 g_pipe.descriptor_set_->UpdateDescriptorSets();
8253
8254 m_commandBuffer->begin();
8255 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8256 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8257 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8258 &g_pipe.descriptor_set_->set_, 0, nullptr);
8259
8260 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8261 m_commandBuffer->Draw(1, 0, 0, 0);
8262 m_errorMonitor->VerifyFound();
8263
8264 m_commandBuffer->EndRenderPass();
8265 m_commandBuffer->end();
8266 m_commandBuffer->reset();
8267
8268 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8269 g_pipe.descriptor_set_->UpdateDescriptorSets();
8270
8271 m_commandBuffer->begin();
8272 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8273 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8274 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8275 &g_pipe.descriptor_set_->set_, 0, nullptr);
8276
8277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8278 m_commandBuffer->Draw(1, 0, 0, 0);
8279 m_errorMonitor->VerifyFound();
8280
8281 m_commandBuffer->EndRenderPass();
8282 m_commandBuffer->end();
8283}
8284
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008285TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008286 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 -07008287 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8288
8289 if (DeviceExtensionSupported(gpu(), nullptr, VK_IMG_FILTER_CUBIC_EXTENSION_NAME)) {
8290 m_device_extension_names.push_back(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8291 } else {
8292 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8293 return;
8294 }
8295
8296 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8297 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8298
8299 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8300 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
8301 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8302 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8303
8304 VkImageObj image(m_device);
8305 image.Init(image_ci);
8306 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8307 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8308
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008309 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008310 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8311 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8312 VkSampler sampler;
8313 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8314
8315 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8316
8317 CreatePipelineHelper g_pipe(*this);
8318 g_pipe.InitInfo();
8319 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8320 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8321 g_pipe.InitState();
8322 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8323
8324 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8325 g_pipe.descriptor_set_->UpdateDescriptorSets();
8326
8327 m_commandBuffer->begin();
8328 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8329 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8330 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8331 &g_pipe.descriptor_set_->set_, 0, nullptr);
8332
8333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8334 m_commandBuffer->Draw(1, 0, 0, 0);
8335 m_errorMonitor->VerifyFound();
8336
8337 m_commandBuffer->EndRenderPass();
8338 m_commandBuffer->end();
8339}
8340
locke-lunarg0de02522020-10-27 22:55:17 -06008341TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8342 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
8343 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8344 if (version < VK_API_VERSION_1_1) {
8345 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8346 return;
8347 }
8348 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8349 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8350 } else {
8351 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8352 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8353 return;
8354 }
8355 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8356
8357 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
8358 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8359 } else {
8360 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8361 return;
8362 }
8363
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008364 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008365 multiview_features.multiview = VK_TRUE;
8366 VkPhysicalDeviceFeatures2 pd_features2 = {};
8367 pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8368 pd_features2.pNext = &multiview_features;
8369
8370 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8371 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8372
8373 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8374 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8375 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008376 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8377 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008378 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8379 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8380 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8381 return;
8382 }
8383 CreatePipelineHelper pipe(*this);
8384 pipe.InitInfo();
8385 pipe.InitState();
8386 pipe.CreateGraphicsPipeline();
8387
8388 m_commandBuffer->begin();
8389 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8390 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8391
8392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8393 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8394 m_errorMonitor->VerifyFound();
8395
8396 m_commandBuffer->EndRenderPass();
8397 m_commandBuffer->end();
8398}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008399
8400TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8401 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8402
8403 // Enable KHR_fragment_shading_rate and all of its required extensions
8404 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8405 if (fsr_extensions) {
8406 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8407 }
8408 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8409
8410 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8411 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8412 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8413 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8414 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8415 if (fsr_extensions) {
8416 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8417 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8418 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8419 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8420 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8421 } else {
8422 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8423 return;
8424 }
8425
8426 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = {};
8427 fsr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
8428 fsr_features.pipelineFragmentShadingRate = true;
8429
8430 VkPhysicalDeviceFeatures2 device_features = {};
8431 device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8432 device_features.pNext = &fsr_features;
8433
8434 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8435
8436 // Find address of extension call and make the call
8437 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8438 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8439 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8440
8441 VkExtent2D fragmentSize = {1, 1};
8442 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8443 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8444
8445 m_commandBuffer->begin();
8446 fragmentSize.width = 0;
8447 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8448 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8449 m_errorMonitor->VerifyFound();
8450 fragmentSize.width = 1;
8451
8452 fragmentSize.height = 0;
8453 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8454 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8455 m_errorMonitor->VerifyFound();
8456 fragmentSize.height = 1;
8457
8458 fragmentSize.width = 3;
8459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8460 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8461 m_errorMonitor->VerifyFound();
8462 fragmentSize.width = 1;
8463
8464 fragmentSize.height = 3;
8465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8466 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8467 m_errorMonitor->VerifyFound();
8468 fragmentSize.height = 1;
8469
8470 fragmentSize.width = 8;
8471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8472 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8473 m_errorMonitor->VerifyFound();
8474 fragmentSize.width = 1;
8475
8476 fragmentSize.height = 8;
8477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8478 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8479 m_errorMonitor->VerifyFound();
8480 fragmentSize.height = 1;
8481 m_commandBuffer->end();
8482}
8483
8484TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8485 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8486
8487 // Enable KHR_fragment_shading_rate and all of its required extensions
8488 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8489 if (fsr_extensions) {
8490 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8491 }
8492 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8493
8494 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8495 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8496 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8497 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8498 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8499 if (fsr_extensions) {
8500 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8501 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8502 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8503 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8504 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8505 } else {
8506 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8507 return;
8508 }
8509
8510 ASSERT_NO_FATAL_FAILURE(InitState());
8511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8512
8513 // Find address of extension call and make the call
8514 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8515 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8516 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8517
8518 VkExtent2D fragmentSize = {1, 1};
8519 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8520 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8521
8522 m_commandBuffer->begin();
8523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8524 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8525 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8526 m_errorMonitor->VerifyFound();
8527 m_commandBuffer->end();
8528}
8529
8530TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8531 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8532
8533 // Enable KHR_fragment_shading_rate and all of its required extensions
8534 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8535 if (fsr_extensions) {
8536 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8537 }
8538 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8539
8540 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8541 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8542 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8543 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8544 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8545 if (fsr_extensions) {
8546 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8547 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8548 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8549 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8550 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8551 } else {
8552 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8553 return;
8554 }
8555
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008556 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8557 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008558
8559 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8560 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8561 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8562
8563 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8564 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8565
8566 // Find address of extension call and make the call
8567 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8568 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8569 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8570
8571 VkExtent2D fragmentSize = {1, 1};
8572 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8573 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8574
8575 m_commandBuffer->begin();
8576
8577 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8578 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8579 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8580 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8581 m_errorMonitor->VerifyFound();
8582 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8583
8584 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8585 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8586 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8587 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8588 m_errorMonitor->VerifyFound();
8589 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8590
8591 m_commandBuffer->end();
8592}
8593
8594TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8595 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8596
8597 // Enable KHR_fragment_shading_rate and all of its required extensions
8598 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8599 if (fsr_extensions) {
8600 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8601 }
8602 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8603
8604 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8605 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8606 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8607 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8608 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8609 if (fsr_extensions) {
8610 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8611 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8612 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8613 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8614 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8615 } else {
8616 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8617 return;
8618 }
8619
8620 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8621 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8622 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008623 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8624 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008625 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8626
8627 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8628 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8629 return;
8630 }
8631
8632 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8633
8634 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8635 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8636
8637 // Find address of extension call and make the call
8638 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8639 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8640 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8641
8642 VkExtent2D fragmentSize = {1, 1};
8643 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8644 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8645
8646 m_commandBuffer->begin();
8647 fragmentSize.width = 2;
8648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8649 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8650 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8651 m_errorMonitor->VerifyFound();
8652 fragmentSize.width = 1;
8653
8654 fragmentSize.height = 2;
8655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8656 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8657 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8658 m_errorMonitor->VerifyFound();
8659 fragmentSize.height = 1;
8660}
8661
8662TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8663 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8664
8665 // Enable KHR_fragment_shading_rate and all of its required extensions
8666 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8667 if (fsr_extensions) {
8668 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8669 }
8670 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8671
8672 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8673 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8674 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8675 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8676 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8677 if (fsr_extensions) {
8678 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8679 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8680 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8681 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8682 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8683 } else {
8684 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8685 return;
8686 }
8687
8688 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8689 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8690 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8691 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008692 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8693 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008694 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8695
8696 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8697 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8698 return;
8699 }
8700
8701 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8702 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8703 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008704 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8705 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008706 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8707
8708 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8709 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8710 return;
8711 }
8712
8713 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8714 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8715
8716 // Find address of extension call and make the call
8717 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8718 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8719 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8720
8721 VkExtent2D fragmentSize = {1, 1};
8722 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8723 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8724
8725 m_commandBuffer->begin();
8726 if (fsr_features.primitiveFragmentShadingRate) {
8727 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8728 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8729 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8730 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8731 m_errorMonitor->VerifyFound();
8732 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8733 }
8734
8735 if (fsr_features.attachmentFragmentShadingRate) {
8736 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8737 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8738 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8739 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8740 m_errorMonitor->VerifyFound();
8741 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8742 }
8743 m_commandBuffer->end();
8744}
8745
8746TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8747 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8748
8749 // Enable KHR_fragment_shading_rate and all of its required extensions
8750 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8751 if (fsr_extensions) {
8752 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8753 }
8754 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8755
8756 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8757 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8758 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8759 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8760 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8761 if (fsr_extensions) {
8762 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8763 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8764 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8765 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8766 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8767 } else {
8768 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8769 return;
8770 }
8771
8772 bool eds_extension = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8773 if (eds_extension) {
8774 m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8775 } else {
8776 printf("%s requires VK_EXT_extended_dynamic_state.\n", kSkipPrefix);
8777 return;
8778 }
8779
8780 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8781 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8782 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8783 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008784 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8785 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008786 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8787
8788 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
8789 printf("%s requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.\n", kSkipPrefix);
8790 return;
8791 }
8792
8793 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8794 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8795 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008796 VkPhysicalDeviceExtendedDynamicStateFeaturesEXT eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008797 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008798 LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8799 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008800 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8801
8802 if (!fsr_features.primitiveFragmentShadingRate) {
8803 printf("%s requires primitiveFragmentShadingRate to be supported.\n", kSkipPrefix);
8804 return;
8805 }
8806
8807 if (!features2.features.multiViewport) {
8808 printf("%s requires multiViewport to be supported.\n", kSkipPrefix);
8809 return;
8810 }
8811
8812 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8813 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8814
8815 char const *vsSource =
8816 "#version 450\n"
8817 "#extension GL_EXT_fragment_shading_rate : enable\n"
8818 "void main() {\n"
8819 " gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;\n"
8820 "}\n";
8821
Tobias Hector04f2ab22020-12-01 10:59:33 +00008822 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8823
8824 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008825 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8826 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008827 pipe.AddShader(&fs);
8828 pipe.AddDefaultColorAttachment();
8829 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008830 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008831 {
8832 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8833 pipe.AddShader(&vs);
8834 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8835 ASSERT_VK_SUCCESS(err);
8836 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00008837 m_commandBuffer->begin();
8838 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8839
8840 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8841
8842 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8843 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
8844 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
8845 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
8846
8847 // error produced here.
8848 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
8849
8850 m_errorMonitor->VerifyFound();
8851
8852 m_commandBuffer->EndRenderPass();
8853 m_commandBuffer->end();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008854}