blob: e97fe2e962d286c4397aa56f5425d65cde2fd75f [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 = {{
sfricke-samsung51303fb2021-05-09 19:09:13 -0700531 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "VUID-VkPushConstantRange-size-00296"},
532 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1}, "VUID-VkPushConstantRange-size-00297"},
533 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1}, "VUID-VkPushConstantRange-size-00297"},
534 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0}, "VUID-VkPushConstantRange-size-00296"},
535 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4}, "VUID-VkPushConstantRange-offset-00295"},
536 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big}, "VUID-VkPushConstantRange-size-00298"},
537 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big}, "VUID-VkPushConstantRange-offset-00294"},
538 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4}, "VUID-VkPushConstantRange-offset-00294"},
539 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020}, "VUID-VkPushConstantRange-offset-00294"},
540 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0}, "VUID-VkPushConstantRange-size-00298"},
unknown088160a2019-05-23 17:43:13 -0600541 }};
542
543 // Check for invalid offset and size
544 for (const auto &iter : range_tests) {
545 pc_range = iter.range;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700546 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600547 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600548 m_errorMonitor->VerifyFound();
549 }
550
551 // Check for invalid stage flag
552 pc_range.offset = 0;
553 pc_range.size = 16;
554 pc_range.stageFlags = 0;
sfricke-samsung51303fb2021-05-09 19:09:13 -0700555 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkPushConstantRange-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600556 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600557 m_errorMonitor->VerifyFound();
558
559 // Check for duplicate stage flags in a list of push constant ranges.
560 // A shader can only have one push constant block and that block is mapped
561 // to the push constant range that has that shader's stage flag set.
562 // The shader's stage flag can only appear once in all the ranges, so the
563 // implementation can find the one and only range to map it to.
564 const uint32_t ranges_per_test = 5;
565 struct DuplicateStageFlagsTestCase {
566 VkPushConstantRange const ranges[ranges_per_test];
567 std::vector<char const *> const msg;
568 };
569 // Overlapping ranges are OK, but a stage flag can appear only once.
570 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
571 {
572 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
573 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
574 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
575 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
576 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
577 {
578 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
579 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
580 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
581 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
582 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
583 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
584 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
585 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
586 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
587 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
588 }},
589 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
590 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
591 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
592 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
593 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
594 {
595 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
596 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
597 }},
598 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
599 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
600 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
601 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
602 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
603 {
604 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
605 }},
606 },
607 };
608
609 for (const auto &iter : duplicate_stageFlags_tests) {
610 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
611 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700612 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg.begin(), iter.msg.end());
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600613 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600614 m_errorMonitor->VerifyFound();
615 }
616
617 //
618 // CmdPushConstants tests
619 //
620
621 // Setup a pipeline layout with ranges: [0,32) [16,80)
622 const std::vector<VkPushConstantRange> pc_range2 = {{VK_SHADER_STAGE_VERTEX_BIT, 16, 64},
623 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 32}};
624 const VkPipelineLayoutObj pipeline_layout_obj(m_device, {}, pc_range2);
625
626 const uint8_t dummy_values[100] = {};
627
628 m_commandBuffer->begin();
629 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
630
631 // Check for invalid stage flag
632 // Note that VU 00996 isn't reached due to parameter validation
sfricke-samsung51303fb2021-05-09 19:09:13 -0700633 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-stageFlags-requiredbitmask");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600634 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), 0, 0, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600635 m_errorMonitor->VerifyFound();
636
637 // Positive tests for the overlapping ranges
638 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600639 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16,
640 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600641 m_errorMonitor->VerifyNotFound();
642 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600643 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 32, 48, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600644 m_errorMonitor->VerifyNotFound();
645 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600646 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
647 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600648 m_errorMonitor->VerifyNotFound();
649
650 // Wrong cmd stages for extant range
651 // No range for all cmd stages -- "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
Mark Lobodzinski20310782020-02-28 14:25:17 -0700652 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
unknown088160a2019-05-23 17:43:13 -0600653 // Missing cmd stages for found overlapping range -- "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
Mark Lobodzinski20310782020-02-28 14:25:17 -0700654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600655 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16,
656 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600657 m_errorMonitor->VerifyFound();
658
659 // Wrong no extant range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600661 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 80, 4,
662 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600663 m_errorMonitor->VerifyFound();
664
665 // Wrong overlapping extent
Mark Lobodzinski20310782020-02-28 14:25:17 -0700666 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600667 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
668 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 20, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600669 m_errorMonitor->VerifyFound();
670
671 // Wrong stage flags for valid overlapping range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700672 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600673 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600674 m_errorMonitor->VerifyFound();
675
676 m_commandBuffer->EndRenderPass();
677 m_commandBuffer->end();
678}
679
680TEST_F(VkLayerTest, NoBeginCommandBuffer) {
sfricke-samsung946027b2021-04-20 22:44:36 -0700681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkEndCommandBuffer-commandBuffer-00059");
unknown088160a2019-05-23 17:43:13 -0600682
683 ASSERT_NO_FATAL_FAILURE(Init());
684 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
685 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600686 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600687
688 m_errorMonitor->VerifyFound();
689}
690
691TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
692 ASSERT_NO_FATAL_FAILURE(Init());
693
694 VkCommandBufferObj cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
695
696 // Force the failure by not setting the Renderpass and Framebuffer fields
697 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
698 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
699
700 VkCommandBufferBeginInfo cmd_buf_info = {};
701 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
702 cmd_buf_info.pNext = NULL;
703 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
704 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
705
Mark Lobodzinski20310782020-02-28 14:25:17 -0700706 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferBeginInfo-flags-00053");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600707 vk::BeginCommandBuffer(cb.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600708 m_errorMonitor->VerifyFound();
709}
710
711TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
712 ASSERT_NO_FATAL_FAILURE(Init());
713
Mark Lobodzinski20310782020-02-28 14:25:17 -0700714 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600715
716 // A pool we can reset in.
717 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
718 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
719
720 secondary.begin();
721 secondary.end();
722
723 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600724 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600725
726 // rerecording of secondary
727 secondary.reset(); // explicit reset here.
728 secondary.begin();
729 secondary.end();
730
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600731 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600732 m_errorMonitor->VerifyFound();
733}
734
735TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
736 ASSERT_NO_FATAL_FAILURE(Init());
737
Mark Lobodzinski20310782020-02-28 14:25:17 -0700738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600739
740 // A pool we can reset in.
741 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
742 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
743
744 secondary.begin();
745 secondary.end();
746
747 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600748 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600749
750 // rerecording of secondary
751 secondary.begin(); // implicit reset in begin
752 secondary.end();
753
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600754 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600755 m_errorMonitor->VerifyFound();
756}
757
758TEST_F(VkLayerTest, CascadedInvalidation) {
759 ASSERT_NO_FATAL_FAILURE(Init());
760
761 VkEventCreateInfo eci = {VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, nullptr, 0};
762 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600763 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600764
765 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
766 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600767 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600768 secondary.end();
769
770 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600771 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600772 m_commandBuffer->end();
773
774 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600775 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600776
Mark Lobodzinski20310782020-02-28 14:25:17 -0700777 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600778 m_commandBuffer->QueueCommandBuffer(false);
779 m_errorMonitor->VerifyFound();
780}
781
782TEST_F(VkLayerTest, CommandBufferResetErrors) {
783 // Cause error due to Begin while recording CB
784 // Then cause 2 errors for attempting to reset CB w/o having
785 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
786 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700787 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600788
789 ASSERT_NO_FATAL_FAILURE(Init());
790
791 // Calls AllocateCommandBuffers
792 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
793
794 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
795 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
796 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
797 VkCommandBufferBeginInfo cmd_buf_info = {};
798 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
799 cmd_buf_info.pNext = NULL;
800 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
801 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
802
803 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600804 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600805 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600806 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600807 m_errorMonitor->VerifyFound();
808
Mark Lobodzinski20310782020-02-28 14:25:17 -0700809 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600810 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
811 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600812 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600813 m_errorMonitor->VerifyFound();
814
Mark Lobodzinski20310782020-02-28 14:25:17 -0700815 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600816 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600817 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600818 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600819 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600820 m_errorMonitor->VerifyFound();
821}
822
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700823TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
824 ASSERT_NO_FATAL_FAILURE(Init());
825
826 // Calls AllocateCommandBuffers
827 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
828
829 VkCommandBufferBeginInfo cmd_buf_info = {};
830 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
831 cmd_buf_info.pNext = NULL;
832 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
833
834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
835 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
836 m_errorMonitor->VerifyFound();
837}
838
unknown088160a2019-05-23 17:43:13 -0600839TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
840 // Call CmdClearAttachmentss outside of an active RenderPass
841
Mark Lobodzinski20310782020-02-28 14:25:17 -0700842 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600843 "vkCmdClearAttachments(): This call must be issued inside an active render pass");
844
845 ASSERT_NO_FATAL_FAILURE(Init());
846 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
847
848 // Start no RenderPass
849 m_commandBuffer->begin();
850
851 VkClearAttachment color_attachment;
852 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
853 color_attachment.clearValue.color.float32[0] = 0;
854 color_attachment.clearValue.color.float32[1] = 0;
855 color_attachment.clearValue.color.float32[2] = 0;
856 color_attachment.clearValue.color.float32[3] = 0;
857 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600858 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600859 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600860
861 m_errorMonitor->VerifyFound();
862}
863
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600864TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
865 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
866
Mark Lobodzinski20310782020-02-28 14:25:17 -0700867 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600868
869 ASSERT_NO_FATAL_FAILURE(Init());
870 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
871
872 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600873 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600874
875 VkClearAttachment color_attachment;
876 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
877 color_attachment.clearValue.color.float32[0] = 0;
878 color_attachment.clearValue.color.float32[1] = 0;
879 color_attachment.clearValue.color.float32[2] = 0;
880 color_attachment.clearValue.color.float32[3] = 0;
881 color_attachment.colorAttachment = 0;
882 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600883 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600884
885 m_errorMonitor->VerifyFound();
886}
887
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700888TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
889 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
890
891 ASSERT_NO_FATAL_FAILURE(Init());
892 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
893
894 m_commandBuffer->begin();
895 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
896
897 VkClearAttachment color_attachment;
898 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
899 color_attachment.clearValue.color.float32[0] = 0;
900 color_attachment.clearValue.color.float32[1] = 0;
901 color_attachment.clearValue.color.float32[2] = 0;
902 color_attachment.clearValue.color.float32[3] = 0;
903 color_attachment.colorAttachment = 0;
904 VkClearRect clear_rect = {};
905 clear_rect.rect.offset = {0, 0};
906 clear_rect.baseArrayLayer = 0;
907 clear_rect.layerCount = 1;
908
909 clear_rect.rect.extent = {0, 1};
910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
911 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
912 m_errorMonitor->VerifyFound();
913
914 clear_rect.rect.extent = {1, 0};
915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
916 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
917 m_errorMonitor->VerifyFound();
918}
919
sfricke-samsung6141db32020-10-26 03:31:38 -0700920TEST_F(VkLayerTest, ClearAttachmentsInvalidAspectMasks) {
921 TEST_DESCRIPTION("Check VkClearAttachment invalid aspect masks.");
922
923 ASSERT_NO_FATAL_FAILURE(Init());
924 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
925
926 m_commandBuffer->begin();
927 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
928
929 VkClearAttachment attachment;
930 attachment.clearValue.color.float32[0] = 0;
931 attachment.clearValue.color.float32[1] = 0;
932 attachment.clearValue.color.float32[2] = 0;
933 attachment.clearValue.color.float32[3] = 0;
934 attachment.colorAttachment = 0;
935 VkClearRect clear_rect = {};
936 clear_rect.rect.offset = {0, 0};
937 clear_rect.rect.extent = {1, 1};
938 clear_rect.baseArrayLayer = 0;
939 clear_rect.layerCount = 1;
940
941 attachment.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
943 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
944 m_errorMonitor->VerifyFound();
945
946 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT;
947 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
948 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
949 m_errorMonitor->VerifyFound();
950
951 attachment.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
952 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
953 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
954 m_errorMonitor->VerifyFound();
955
956 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
957 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
958 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
959 m_errorMonitor->VerifyFound();
960}
961
sfricke-samsung91f4a542020-10-21 00:29:17 -0700962TEST_F(VkLayerTest, ClearAttachmentsImplicitCheck) {
963 TEST_DESCRIPTION("Check VkClearAttachment implicit VUs.");
964
965 ASSERT_NO_FATAL_FAILURE(Init());
966 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
967
968 m_commandBuffer->begin();
969 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
970
971 VkClearAttachment color_attachment;
972 color_attachment.clearValue.color.float32[0] = 0;
973 color_attachment.clearValue.color.float32[1] = 0;
974 color_attachment.clearValue.color.float32[2] = 0;
975 color_attachment.clearValue.color.float32[3] = 0;
976 color_attachment.colorAttachment = 0;
977 VkClearRect clear_rect = {};
978 clear_rect.rect.offset = {0, 0};
979 clear_rect.rect.extent = {1, 1};
980 clear_rect.baseArrayLayer = 0;
981 clear_rect.layerCount = 1;
982
983 color_attachment.aspectMask = 0;
984 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-requiredbitmask");
985 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
986 m_errorMonitor->VerifyFound();
987
988 color_attachment.aspectMask = 0xffffffff;
989 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-parameter");
990 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
991 m_errorMonitor->VerifyFound();
992}
993
sfricke-samsung87b09512020-10-26 03:35:42 -0700994TEST_F(VkLayerTest, ClearColorAttachmentsDepthStencil) {
995 TEST_DESCRIPTION("Call CmdClearAttachments with invalid depth/stencil aspect masks.");
996
997 ASSERT_NO_FATAL_FAILURE(Init());
998 // Creates a color attachment
999 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1000
1001 m_commandBuffer->begin();
1002 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
1003
1004 VkClearAttachment attachment;
1005 attachment.clearValue.color.float32[0] = 0;
1006 attachment.clearValue.color.float32[1] = 0;
1007 attachment.clearValue.color.float32[2] = 0;
1008 attachment.clearValue.color.float32[3] = 0;
1009 attachment.colorAttachment = 0;
1010 VkClearRect clear_rect = {};
1011 clear_rect.rect.offset = {0, 0};
1012 clear_rect.rect.extent = {1, 1};
1013 clear_rect.baseArrayLayer = 0;
1014 clear_rect.layerCount = 1;
1015
1016 m_errorMonitor->ExpectSuccess();
1017 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1018 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1019 m_errorMonitor->VerifyNotFound();
1020
1021 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02502");
1022 attachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
1023 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1024 m_errorMonitor->VerifyFound();
1025
1026 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02503");
1027 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
1028 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
1029 m_errorMonitor->VerifyFound();
1030}
1031
unknown088160a2019-05-23 17:43:13 -06001032TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
1033 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
1034
1035 ASSERT_NO_FATAL_FAILURE(Init());
1036 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1037
1038 // An empty primary command buffer
1039 VkCommandBufferObj cb(m_device, m_commandPool);
1040 cb.begin();
1041 cb.end();
1042
1043 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001044 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06001045 VkCommandBuffer handle = cb.handle();
1046
Mark Lobodzinski20310782020-02-28 14:25:17 -07001047 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001048 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -06001049 m_errorMonitor->VerifyFound();
1050
1051 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
1052
1053 m_commandBuffer->EndRenderPass();
1054 m_commandBuffer->end();
1055}
1056
Petr Kraus8e53cf02020-01-03 05:30:04 +01001057TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
1058 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
1059
1060 ASSERT_NO_FATAL_FAILURE(Init());
1061
1062 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1063 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1064 secondary_cb.begin();
1065 secondary_cb.end();
1066
1067 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +01001069 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
1070 m_errorMonitor->VerifyFound();
1071}
1072
unknown088160a2019-05-23 17:43:13 -06001073TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
1074 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
1075
1076 ASSERT_NO_FATAL_FAILURE(Init());
1077 ASSERT_NO_FATAL_FAILURE(InitViewport());
1078 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1079
1080 const VkPipelineLayoutObj pipeline_layout(m_device);
1081
1082 struct VboEntry {
1083 uint16_t input0[2];
1084 uint32_t input1;
1085 float input2[4];
1086 };
1087
1088 const unsigned vbo_entry_count = 3;
1089 const VboEntry vbo_data[vbo_entry_count] = {};
1090
1091 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
1092 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1093
1094 VkVertexInputBindingDescription input_binding;
1095 input_binding.binding = 0;
1096 input_binding.stride = sizeof(VboEntry);
1097 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1098
1099 VkVertexInputAttributeDescription input_attribs[3];
1100
1101 input_attribs[0].binding = 0;
1102 // Location switch between attrib[0] and attrib[1] is intentional
1103 input_attribs[0].location = 1;
1104 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
1105 input_attribs[0].offset = offsetof(VboEntry, input1);
1106
1107 input_attribs[1].binding = 0;
1108 input_attribs[1].location = 0;
1109 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
1110 input_attribs[1].offset = offsetof(VboEntry, input0);
1111
1112 input_attribs[2].binding = 0;
1113 input_attribs[2].location = 2;
1114 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1115 input_attribs[2].offset = offsetof(VboEntry, input2);
1116
1117 char const *vsSource =
1118 "#version 450\n"
1119 "\n"
1120 "layout(location = 0) in vec2 input0;"
1121 "layout(location = 1) in vec4 input1;"
1122 "layout(location = 2) in vec4 input2;"
1123 "\n"
1124 "void main(){\n"
1125 " gl_Position = input1 + input2;\n"
1126 " gl_Position.xy += input0;\n"
1127 "}\n";
unknown088160a2019-05-23 17:43:13 -06001128
1129 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001130 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001131
1132 VkPipelineObj pipe1(m_device);
1133 pipe1.AddDefaultColorAttachment();
1134 pipe1.AddShader(&vs);
1135 pipe1.AddShader(&fs);
1136 pipe1.AddVertexInputBindings(&input_binding, 1);
1137 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
1138 pipe1.SetViewport(m_viewports);
1139 pipe1.SetScissor(m_scissors);
1140 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1141
1142 input_binding.stride = 6;
1143
1144 VkPipelineObj pipe2(m_device);
1145 pipe2.AddDefaultColorAttachment();
1146 pipe2.AddShader(&vs);
1147 pipe2.AddShader(&fs);
1148 pipe2.AddVertexInputBindings(&input_binding, 1);
1149 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
1150 pipe2.SetViewport(m_viewports);
1151 pipe2.SetScissor(m_scissors);
1152 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1153
1154 m_commandBuffer->begin();
1155 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1156
1157 // Test with invalid buffer offset
1158 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001159 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
1160 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001161 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
1162 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 1");
1163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001164 m_commandBuffer->Draw(1, 0, 0, 0);
1165 m_errorMonitor->VerifyFound();
1166
1167 // Test with invalid buffer stride
1168 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001169 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
1170 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001171 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
unknown088160a2019-05-23 17:43:13 -06001172 // Attribute[1] is aligned properly even with a wrong stride
Mark Lobodzinski20310782020-02-28 14:25:17 -07001173 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001174 m_commandBuffer->Draw(1, 0, 0, 0);
1175 m_errorMonitor->VerifyFound();
1176
1177 m_commandBuffer->EndRenderPass();
1178 m_commandBuffer->end();
1179}
1180
1181TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
1182 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -06001183 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -06001184
1185 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1186
1187 secondary.begin();
1188 secondary.end();
1189
1190 VkCommandBufferBeginInfo cbbi = {
1191 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1192 nullptr,
1193 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1194 nullptr,
1195 };
1196
1197 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001198 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001199 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001200 m_errorMonitor->VerifyFound();
1201 m_commandBuffer->end();
1202}
1203
1204TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1205 ASSERT_NO_FATAL_FAILURE(Init());
1206
John Zulauff1640d12019-08-13 15:39:58 -06001207 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001208
1209 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1210
1211 VkCommandBufferInheritanceInfo inh = {
1212 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1213 nullptr,
1214 };
1215 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1216
1217 secondary.begin(&cbbi);
1218 secondary.end();
1219
1220 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001221 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001222 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001223 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001224 m_errorMonitor->VerifyFound();
1225 m_commandBuffer->end();
1226}
1227
1228TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1229 ASSERT_NO_FATAL_FAILURE(Init());
1230
1231 // variation on previous test executing the same CB twice in the same
1232 // CmdExecuteCommands call
1233
John Zulauff1640d12019-08-13 15:39:58 -06001234 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001235
1236 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1237
1238 VkCommandBufferInheritanceInfo inh = {
1239 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1240 nullptr,
1241 };
1242 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1243
1244 secondary.begin(&cbbi);
1245 secondary.end();
1246
1247 m_commandBuffer->begin();
1248 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001249 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001250 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001251 m_errorMonitor->VerifyFound();
1252 m_commandBuffer->end();
1253}
1254
1255TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1256 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1257 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1258 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1259 ASSERT_NO_FATAL_FAILURE(Init());
1260
1261 VkCommandBuffer cmd_bufs[2];
1262 VkCommandBufferAllocateInfo alloc_info;
1263 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1264 alloc_info.pNext = NULL;
1265 alloc_info.commandBufferCount = 2;
1266 alloc_info.commandPool = m_commandPool->handle();
1267 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001268 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001269
1270 VkCommandBufferBeginInfo cb_binfo;
1271 cb_binfo.pNext = NULL;
1272 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1273 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1274 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001275 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001276 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001277 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1278 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001279 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1280
1281 VkSubmitInfo submit_info = {};
1282 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1283 submit_info.commandBufferCount = 2;
1284 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001285 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001286 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001287 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001288 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001289
1290 // Set one time use and now look for one time submit
1291 duplicates[0] = duplicates[1] = cmd_bufs[1];
1292 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001293 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1294 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1295 vk::EndCommandBuffer(cmd_bufs[1]);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001296 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001297 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001298 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001299 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001300}
1301
1302TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1303 TEST_DESCRIPTION(
1304 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1305
Mark Lobodzinski20310782020-02-28 14:25:17 -07001306 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001307
1308 ASSERT_NO_FATAL_FAILURE(Init());
1309 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1310
unknown088160a2019-05-23 17:43:13 -06001311 char const *fsSource =
1312 "#version 450\n"
1313 "\n"
1314 "layout(set=0, binding=0) uniform sampler3D s;\n"
1315 "layout(location=0) out vec4 color;\n"
1316 "void main() {\n"
1317 " color = texture(s, vec3(0));\n"
1318 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001319 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001320 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1321
1322 VkPipelineObj pipe(m_device);
1323 pipe.AddShader(&vs);
1324 pipe.AddShader(&fs);
1325 pipe.AddDefaultColorAttachment();
1326
1327 VkTextureObj texture(m_device, nullptr);
1328 VkSamplerObj sampler(m_device);
1329
1330 VkDescriptorSetObj descriptorSet(m_device);
1331 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1332 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1333
1334 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1335 ASSERT_VK_SUCCESS(err);
1336
1337 m_commandBuffer->begin();
1338 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1339
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001340 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001341 m_commandBuffer->BindDescriptorSet(descriptorSet);
1342
1343 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001344 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001345 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001346 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001347
1348 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001349 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001350
1351 m_errorMonitor->VerifyFound();
1352
1353 m_commandBuffer->EndRenderPass();
1354 m_commandBuffer->end();
1355}
1356
1357TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1358 TEST_DESCRIPTION(
1359 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1360 "vice versa.");
1361
Mark Lobodzinski20310782020-02-28 14:25:17 -07001362 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001363
1364 ASSERT_NO_FATAL_FAILURE(Init());
1365 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1366
unknown088160a2019-05-23 17:43:13 -06001367 char const *fsSource =
1368 "#version 450\n"
1369 "\n"
1370 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
1371 "layout(location=0) out vec4 color;\n"
1372 "void main() {\n"
1373 " color = texelFetch(s, ivec2(0), 0);\n"
1374 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001375 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001376 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1377
1378 VkPipelineObj pipe(m_device);
1379 pipe.AddShader(&vs);
1380 pipe.AddShader(&fs);
1381 pipe.AddDefaultColorAttachment();
1382
1383 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1384 VkSamplerObj sampler(m_device);
1385
1386 VkDescriptorSetObj descriptorSet(m_device);
1387 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1388 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1389
1390 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1391 ASSERT_VK_SUCCESS(err);
1392
1393 m_commandBuffer->begin();
1394 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1395
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001396 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001397 m_commandBuffer->BindDescriptorSet(descriptorSet);
1398
1399 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001400 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001401 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001402 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001403
1404 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001405 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001406
1407 m_errorMonitor->VerifyFound();
1408
1409 m_commandBuffer->EndRenderPass();
1410 m_commandBuffer->end();
1411}
1412
1413TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1414 TEST_DESCRIPTION(
1415 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1416
Mark Lobodzinski20310782020-02-28 14:25:17 -07001417 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001418
1419 ASSERT_NO_FATAL_FAILURE(Init());
1420 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1421
unknown088160a2019-05-23 17:43:13 -06001422 char const *fsSource =
1423 "#version 450\n"
1424 "\n"
1425 "layout(set=0, binding=0) uniform isampler2D s;\n"
1426 "layout(location=0) out vec4 color;\n"
1427 "void main() {\n"
1428 " color = texelFetch(s, ivec2(0), 0);\n"
1429 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001430 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001431 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1432
1433 VkPipelineObj pipe(m_device);
1434 pipe.AddShader(&vs);
1435 pipe.AddShader(&fs);
1436 pipe.AddDefaultColorAttachment();
1437
1438 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1439 VkSamplerObj sampler(m_device);
1440
1441 VkDescriptorSetObj descriptorSet(m_device);
1442 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1443 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1444
1445 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1446 ASSERT_VK_SUCCESS(err);
1447
1448 m_commandBuffer->begin();
1449 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1450
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001451 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001452 m_commandBuffer->BindDescriptorSet(descriptorSet);
1453
1454 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001455 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001456 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001457 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001458
1459 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001460 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001461
1462 m_errorMonitor->VerifyFound();
1463
1464 m_commandBuffer->EndRenderPass();
1465 m_commandBuffer->end();
1466}
1467
unknown088160a2019-05-23 17:43:13 -06001468TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1469 TEST_DESCRIPTION(
1470 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001471 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1472 bool maintenance1 = false;
1473 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
1474 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1475 maintenance1 = true;
1476 }
1477 ASSERT_NO_FATAL_FAILURE(InitState());
1478
1479 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1480 VkFormatProperties format_props;
1481 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1482 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1483 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1484 return;
1485 }
unknown088160a2019-05-23 17:43:13 -06001486
1487 // Create two images to copy between
1488 VkImageObj src_image_obj(m_device);
1489 VkImageObj dst_image_obj(m_device);
1490
1491 VkImageCreateInfo image_create_info = {};
1492 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1493 image_create_info.pNext = NULL;
1494 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001495 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001496 image_create_info.extent.width = 32;
1497 image_create_info.extent.height = 32;
1498 image_create_info.extent.depth = 1;
1499 image_create_info.mipLevels = 1;
1500 image_create_info.arrayLayers = 4;
1501 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1502 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1503 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1504 image_create_info.flags = 0;
1505
1506 src_image_obj.init(&image_create_info);
1507 ASSERT_TRUE(src_image_obj.initialized());
1508
1509 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1510 dst_image_obj.init(&image_create_info);
1511 ASSERT_TRUE(dst_image_obj.initialized());
1512
1513 m_commandBuffer->begin();
1514 VkImageCopy copyRegion;
1515 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1516 copyRegion.srcSubresource.mipLevel = 0;
1517 copyRegion.srcSubresource.baseArrayLayer = 0;
1518 copyRegion.srcSubresource.layerCount = 1;
1519 copyRegion.srcOffset.x = 0;
1520 copyRegion.srcOffset.y = 0;
1521 copyRegion.srcOffset.z = 0;
1522 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1523 copyRegion.dstSubresource.mipLevel = 0;
1524 copyRegion.dstSubresource.baseArrayLayer = 0;
1525 // Introduce failure by forcing the dst layerCount to differ from src
1526 copyRegion.dstSubresource.layerCount = 3;
1527 copyRegion.dstOffset.x = 0;
1528 copyRegion.dstOffset.y = 0;
1529 copyRegion.dstOffset.z = 0;
1530 copyRegion.extent.width = 1;
1531 copyRegion.extent.height = 1;
1532 copyRegion.extent.depth = 1;
1533
sfricke-samsung30b094c2020-05-30 11:42:11 -07001534 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1535 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001536 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1537 &copyRegion);
1538 m_errorMonitor->VerifyFound();
1539}
1540
1541TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1542 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1543
Jeff Leger465acf52020-10-12 18:07:16 -04001544 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1545
1546 bool copy_commands2 = false;
1547 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1548 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1549 copy_commands2 = true;
1550 }
1551 ASSERT_NO_FATAL_FAILURE(InitState());
1552
1553 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
Jeff Leger465acf52020-10-12 18:07:16 -04001554 if (copy_commands2) {
1555 vkCmdCopyBufferToImage2Function =
1556 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
Jeff Leger465acf52020-10-12 18:07:16 -04001557 }
unknown088160a2019-05-23 17:43:13 -06001558
1559 VkPhysicalDeviceFeatures device_features = {};
1560 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1561 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1562 if (device_features.textureCompressionBC) {
1563 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1564 } else if (device_features.textureCompressionETC2) {
1565 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1566 } else if (device_features.textureCompressionASTC_LDR) {
1567 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1568 } else {
1569 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1570 return;
1571 }
1572
1573 VkImageCreateInfo ci;
1574 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1575 ci.pNext = NULL;
1576 ci.flags = 0;
1577 ci.imageType = VK_IMAGE_TYPE_2D;
1578 ci.format = compressed_format;
1579 ci.extent = {32, 32, 1};
1580 ci.mipLevels = 6;
1581 ci.arrayLayers = 1;
1582 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1583 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1584 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1585 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1586 ci.queueFamilyIndexCount = 0;
1587 ci.pQueueFamilyIndices = NULL;
1588 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1589
1590 VkImageObj image(m_device);
1591 image.init(&ci);
1592 ASSERT_TRUE(image.initialized());
1593
1594 VkImageObj odd_image(m_device);
1595 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1596 odd_image.init(&ci);
1597 ASSERT_TRUE(odd_image.initialized());
1598
1599 // Allocate buffers
1600 VkMemoryPropertyFlags reqs = 0;
1601 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1602 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1603 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1604 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1605 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1606
1607 VkBufferImageCopy region = {};
1608 region.bufferRowLength = 0;
1609 region.bufferImageHeight = 0;
1610 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1611 region.imageSubresource.layerCount = 1;
1612 region.imageOffset = {0, 0, 0};
1613 region.bufferOffset = 0;
1614
1615 // start recording
1616 m_commandBuffer->begin();
1617
locke-lunargdf00db02020-03-04 19:00:57 -07001618 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001619 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001620 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1621 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001622 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001623 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1624 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001625 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001626 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1627 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1628
unknown088160a2019-05-23 17:43:13 -06001629 // Mip level copies that work - 5 levels
1630 m_errorMonitor->ExpectSuccess();
1631
1632 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1633 region.imageExtent = {32, 32, 1};
1634 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001635 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001636
1637 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1638 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001639 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001640
1641 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1642 region.imageExtent = {8, 8, 1};
1643 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001644 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001645
1646 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1647 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001648 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001649
1650 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1651 region.imageExtent = {4, 4, 1};
1652 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001653 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001654
1655 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1656 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001657 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001658
1659 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1660 region.imageExtent = {2, 2, 1};
1661 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001662
1663 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1664 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001665 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001666
1667 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1668 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001669 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001670
1671 region.imageExtent = {1, 1, 1};
1672 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001673
1674 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1675 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001676 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001677
1678 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1679 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001680 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001681 m_errorMonitor->VerifyNotFound();
1682
1683 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001684 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001685 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001686 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001688 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001689 m_errorMonitor->VerifyFound();
1690
1691 // Copy width < compressed block size, but not the full mip width
1692 region.imageExtent = {1, 2, 1};
1693 region.imageSubresource.mipLevel = 4;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001694 // width not a multiple of compressed block width
1695 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001696 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001697 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001698 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001699 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001700
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001701 m_errorMonitor->SetDesiredFailureMsg(
1702 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00207"); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001703 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001704 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001705 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001706 m_errorMonitor->VerifyFound();
1707
1708 // Copy height < compressed block size but not the full mip height
1709 region.imageExtent = {2, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001710 m_errorMonitor->SetDesiredFailureMsg(
1711 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001713 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001714 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001715 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001716
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001717 m_errorMonitor->SetDesiredFailureMsg(
1718 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001719 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001720 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001721 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001722 m_errorMonitor->VerifyFound();
1723
1724 // Offsets must be multiple of compressed block size
1725 region.imageOffset = {1, 1, 0};
1726 region.imageExtent = {1, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001727 // imageOffset not a multiple of block size
1728 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageOffset-00205");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001729 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001730 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001731 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001732 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001733
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001734 m_errorMonitor->SetDesiredFailureMsg(
1735 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00205"); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001737 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001738 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001739 m_errorMonitor->VerifyFound();
1740
Jeff Leger465acf52020-10-12 18:07:16 -04001741 // Equivalent test using KHR_copy_commands2
1742 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1743 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1744 NULL,
1745 region.bufferOffset,
1746 region.bufferRowLength,
1747 region.bufferImageHeight,
1748 region.imageSubresource,
1749 region.imageOffset,
1750 region.imageExtent};
1751 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1752 NULL,
1753 buffer_16.handle(),
1754 image.handle(),
1755 VK_IMAGE_LAYOUT_GENERAL,
1756 1,
1757 &region2};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001758 m_errorMonitor->SetDesiredFailureMsg(
1759 kErrorBit, "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-00205"); // imageOffset not a multiple of block size
Jeff Leger465acf52020-10-12 18:07:16 -04001760 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1761 "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-01793"); // image transfer granularity
1762 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1763 m_errorMonitor->VerifyFound();
1764 }
1765
unknown088160a2019-05-23 17:43:13 -06001766 // Offset + extent width = mip width - should succeed
1767 region.imageOffset = {4, 4, 0};
1768 region.imageExtent = {3, 4, 1};
1769 region.imageSubresource.mipLevel = 2;
1770 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001771
1772 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1773 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001774 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1775 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001776
1777 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1778 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001779 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1780 &region);
unknown088160a2019-05-23 17:43:13 -06001781 m_errorMonitor->VerifyNotFound();
1782
unknown088160a2019-05-23 17:43:13 -06001783 // Offset + extent width < mip width and not a multiple of block width - should fail
1784 region.imageExtent = {3, 3, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001785 m_errorMonitor->SetDesiredFailureMsg(
1786 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001787 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001788 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001789 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1790 &region);
unknown088160a2019-05-23 17:43:13 -06001791 m_errorMonitor->VerifyFound();
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001792 m_errorMonitor->SetDesiredFailureMsg(
1793 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001794 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001795 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001796 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1797 &region);
unknown088160a2019-05-23 17:43:13 -06001798 m_errorMonitor->VerifyFound();
1799}
1800
1801TEST_F(VkLayerTest, ImageBufferCopyTests) {
1802 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001803
1804 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1805 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1806 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1807 if (mp_extensions) {
1808 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1809 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001810 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
sfricke-samsung6d97e562020-01-07 22:01:00 -08001811 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1812 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1813 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1814 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1815 if (mp_extensions) {
1816 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1817 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1818 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1819 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1820 }
1821 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001822
1823 // Bail if any dimension of transfer granularity is 0.
1824 auto index = m_device->graphics_queue_node_index_;
1825 auto queue_family_properties = m_device->phy().queue_properties();
1826 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1827 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1828 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1829 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1830 return;
1831 }
1832
sfricke-samsung6d97e562020-01-07 22:01:00 -08001833 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1834 // and invalidates the entire command buffer. This prevents from having to reset the commmand buffer every scope rgba
Mark Lobodzinski20310782020-02-28 14:25:17 -07001835 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1836 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001837 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001838 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1839 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1840 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1841 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1842 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001843 // compression
1844 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1845 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1846 // multi-planar
1847 VkImageObj image_multi_planar(m_device); // 128^2 texels in plane_0 and 64^2 texels in plane_1
unknown088160a2019-05-23 17:43:13 -06001848
sfricke-samsung6d97e562020-01-07 22:01:00 -08001849 // Verify R8G8B8A8_UINT format is supported for transfer
1850 bool missing_rgba_support = false;
1851 VkFormatProperties props = {0, 0, 0};
1852 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1853 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1854 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1855 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1856
1857 if (!missing_rgba_support) {
1858 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1859 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1860 VK_IMAGE_TILING_OPTIMAL, 0);
1861 ASSERT_TRUE(image_64k.initialized());
1862
1863 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1864 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1865 VK_IMAGE_TILING_OPTIMAL, 0);
1866 ASSERT_TRUE(image_16k.initialized());
1867 }
unknown088160a2019-05-23 17:43:13 -06001868
1869 // Verify all needed Depth/Stencil formats are supported
1870 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001871 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001872 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1873 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1874 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001875 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001876 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1877 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1878 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001879 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001880 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1881 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1882 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001883 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001884 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1885 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1886 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1887
1888 if (!missing_ds_support) {
1889 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1890 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1891 ASSERT_TRUE(image_16k_depth.initialized());
1892
1893 ds_image_4D_1S.Init(
1894 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1895 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1896 VK_IMAGE_TILING_OPTIMAL, 0);
1897 ASSERT_TRUE(ds_image_4D_1S.initialized());
1898
1899 ds_image_3D_1S.Init(
1900 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1901 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1902 VK_IMAGE_TILING_OPTIMAL, 0);
1903 ASSERT_TRUE(ds_image_3D_1S.initialized());
1904
1905 ds_image_2D.Init(
1906 256, 256, 1, VK_FORMAT_D16_UNORM,
1907 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1908 VK_IMAGE_TILING_OPTIMAL, 0);
1909 ASSERT_TRUE(ds_image_2D.initialized());
1910
1911 ds_image_1S.Init(
1912 256, 256, 1, VK_FORMAT_S8_UINT,
1913 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1914 VK_IMAGE_TILING_OPTIMAL, 0);
1915 ASSERT_TRUE(ds_image_1S.initialized());
1916 }
1917
1918 // Allocate buffers
1919 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1920 VkMemoryPropertyFlags reqs = 0;
1921 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1922 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1923 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1924 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1925
1926 VkBufferImageCopy region = {};
1927 region.bufferRowLength = 0;
1928 region.bufferImageHeight = 0;
1929 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1930 region.imageSubresource.layerCount = 1;
1931 region.imageOffset = {0, 0, 0};
1932 region.imageExtent = {64, 64, 1};
1933 region.bufferOffset = 0;
1934
locke-lunargdf00db02020-03-04 19:00:57 -07001935 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001936 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001937 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1938 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001939 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001940 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1941 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001942 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001943 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1944 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1945
sfricke-samsung6d97e562020-01-07 22:01:00 -08001946 if (missing_rgba_support) {
1947 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001948
sfricke-samsung6d97e562020-01-07 22:01:00 -08001949 // start recording for future tests
1950 m_commandBuffer->begin();
1951 } else {
1952 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001953 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001954 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1955 &region);
unknown088160a2019-05-23 17:43:13 -06001956 m_errorMonitor->VerifyFound();
1957
Mark Lobodzinski20310782020-02-28 14:25:17 -07001958 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001959 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1960 &region);
1961 m_errorMonitor->VerifyFound();
1962
1963 // start recording
1964 m_commandBuffer->begin();
1965
1966 // successful copies
1967 m_errorMonitor->ExpectSuccess();
1968 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1969 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001970
1971 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1972 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001973 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1974 &region);
1975 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001976
1977 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1978 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001979 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1980 &region);
1981 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001982
1983 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1984 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001985 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1986 &region);
1987 region.imageOffset.x = 0;
1988 region.imageExtent.height = 64;
1989 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001990
1991 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1992 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001993 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1994 &region);
1995 m_errorMonitor->VerifyNotFound();
1996
1997 // image/buffer too small (extent too large) on copy to image
1998 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001999 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002000 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
2001 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2002 &region);
2003 m_errorMonitor->VerifyFound();
2004
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002005 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002007 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
2008 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2009 &region);
2010 m_errorMonitor->VerifyFound();
2011
2012 // image/buffer too small (offset) on copy to image
2013 region.imageExtent = {64, 64, 1};
2014 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07002015 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002016 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
2017 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2018 &region);
2019 m_errorMonitor->VerifyFound();
2020
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002021 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2022 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002023 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002024 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
2025 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2026 &region);
2027 m_errorMonitor->VerifyFound();
2028
2029 // image/buffer too small on copy to buffer
2030 region.imageExtent = {64, 64, 1};
2031 region.imageOffset = {0, 0, 0};
2032 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002033 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002034 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
2035 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2036 &region);
2037 m_errorMonitor->VerifyFound();
2038
2039 region.imageExtent = {64, 65, 1};
2040 region.bufferOffset = 0;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002041 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002042 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002043 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // image too small
2044 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
2045 &region);
2046 m_errorMonitor->VerifyFound();
2047
2048 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07002049 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002050 region.imageExtent = {64, 64, 1};
2051 region.bufferRowLength = 68;
2052 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2053 &region);
2054 m_errorMonitor->VerifyFound();
2055
2056 // An extent with zero area should produce a warning, but no error
Mark Lobodzinski20310782020-02-28 14:25:17 -07002057 m_errorMonitor->SetDesiredFailureMsg(kWarningBit | kErrorBit, "} has zero area");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002058 region.imageExtent.width = 0;
2059 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2060 &region);
2061 m_errorMonitor->VerifyFound();
2062
2063 // aspect bits
2064 region.imageExtent = {64, 64, 1};
2065 region.bufferRowLength = 0;
2066 region.bufferImageHeight = 0;
2067 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07002068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002069 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
2070 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
2071 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2072 buffer_16k.handle(), 1, &region);
2073 m_errorMonitor->VerifyFound();
2074
Mark Lobodzinski20310782020-02-28 14:25:17 -07002075 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002076 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002077 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2078 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2079 buffer_16k.handle(), 1, &region);
2080 m_errorMonitor->VerifyFound();
2081 }
2082
Mark Lobodzinski20310782020-02-28 14:25:17 -07002083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002084 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002085 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2086 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2087 &region);
2088 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002089 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002090
2091 // Out-of-range mip levels should fail
2092 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002093 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002094 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00197");
2095 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00198");
2096 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002097 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002098 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002099 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // unavoidable "region exceeds image bounds" for non-existent mip
2100 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2101 &region);
2102 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002103 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002104 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2105 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
2106 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002107 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002108 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002109 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // unavoidable "region exceeds image bounds" for non-existent mip
2110 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2111 &region);
2112 m_errorMonitor->VerifyFound();
2113 region.imageSubresource.mipLevel = 0;
2114
2115 // Out-of-range array layers should fail
2116 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2117 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002118 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002119 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2120 &region);
2121 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002122 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002123 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2124 &region);
2125 m_errorMonitor->VerifyFound();
2126 region.imageSubresource.baseArrayLayer = 0;
2127
2128 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002129 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002130 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2131 buffer_16k.handle(), 1, &region);
2132 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002134 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2135 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002136 m_errorMonitor->VerifyFound();
2137 }
2138
unknown088160a2019-05-23 17:43:13 -06002139 // Test Depth/Stencil copies
2140 if (missing_ds_support) {
2141 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2142 } else {
2143 VkBufferImageCopy ds_region = {};
2144 ds_region.bufferOffset = 0;
2145 ds_region.bufferRowLength = 0;
2146 ds_region.bufferImageHeight = 0;
2147 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2148 ds_region.imageSubresource.mipLevel = 0;
2149 ds_region.imageSubresource.baseArrayLayer = 0;
2150 ds_region.imageSubresource.layerCount = 1;
2151 ds_region.imageOffset = {0, 0, 0};
2152 ds_region.imageExtent = {256, 256, 1};
2153
2154 // Depth copies that should succeed
2155 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002156 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2157 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002158 m_errorMonitor->VerifyNotFound();
2159
2160 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002161 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2162 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002163 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2164 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002165 m_errorMonitor->VerifyNotFound();
2166
2167 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002168 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2169 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002170 m_errorMonitor->VerifyNotFound();
2171
2172 // Depth copies that should fail
2173 ds_region.bufferOffset = 4;
2174 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002175 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002176 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002177 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2178 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002179 m_errorMonitor->VerifyFound();
2180
2181 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002182 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002183 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002184 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002185 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002186 m_errorMonitor->VerifyFound();
2187
2188 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002189 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002190 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002191 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2192 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002193 m_errorMonitor->VerifyFound();
2194
sfricke-samsung5a019492021-01-25 10:32:08 -08002195 ds_region.bufferOffset = 5;
2196 ds_region.imageExtent = {64, 64, 1}; // need smaller so offset works
2197 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImage-04053");
2198 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2199 buffer_128k.handle(), 1, &ds_region);
2200 m_errorMonitor->VerifyFound();
2201 ds_region.imageExtent = {256, 256, 1};
2202
unknown088160a2019-05-23 17:43:13 -06002203 // Stencil copies that should succeed
2204 ds_region.bufferOffset = 0;
2205 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2206 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002207 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2208 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002209 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2210 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002211 m_errorMonitor->VerifyNotFound();
2212
2213 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002214 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2215 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002216 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2217 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002218 m_errorMonitor->VerifyNotFound();
2219
2220 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002221 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2222 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002223 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2224 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002225 m_errorMonitor->VerifyNotFound();
2226
2227 // Stencil copies that should fail
2228 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002229 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002230 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002231 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2232 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002233 m_errorMonitor->VerifyFound();
2234
2235 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002236 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002237 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2238 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002239 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2240 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002241 m_errorMonitor->VerifyFound();
2242
2243 ds_region.bufferRowLength = 0;
2244 ds_region.bufferOffset = 4;
2245 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002246 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002247 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002248 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2249 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002250 m_errorMonitor->VerifyFound();
2251 }
2252
2253 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002254 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002255 VkPhysicalDeviceFeatures device_features = {};
2256 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2257 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2258 device_features.textureCompressionASTC_LDR)) {
2259 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2260 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002261 // Verify transfer support for each compression format used blow
2262 bool missing_bc_support = false;
2263 bool missing_etc_support = false;
2264 bool missing_astc_support = false;
2265 bool missing_compression_support = false;
2266
2267 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2268 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2269 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2270 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2271
2272 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2273 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2274 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2275 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2276
2277 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2278 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2279 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2280 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2281
2282 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002283 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2284 0);
2285 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2286 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002287 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002288 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2289 VK_IMAGE_TILING_OPTIMAL, 0);
2290 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2291 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002292 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002293 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2294 VK_IMAGE_TILING_OPTIMAL, 0);
2295 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2296 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002297 } else {
2298 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002299 }
unknown088160a2019-05-23 17:43:13 -06002300
sfricke-samsung6d97e562020-01-07 22:01:00 -08002301 if (missing_compression_support) {
2302 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2303 } else {
2304 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002305 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002306 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002307 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2308 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002309 m_errorMonitor->ExpectSuccess();
2310 region.imageExtent = {128, 128, 1};
2311 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2312 buffer_16k.handle(), 1, &region);
2313 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002314
sfricke-samsung6d97e562020-01-07 22:01:00 -08002315 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002316 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002317 region.bufferOffset = 16;
2318 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2319 buffer_16k.handle(), 1, &region);
2320 m_errorMonitor->VerifyFound();
2321 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002322
sfricke-samsung6d97e562020-01-07 22:01:00 -08002323 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002324 m_errorMonitor->SetDesiredFailureMsg(
2325 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002326 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002327 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2328 region.imageExtent.width = 66;
2329 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2330 buffer_16k.handle(), 1, &region);
2331 m_errorMonitor->VerifyFound();
2332 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002333
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002334 m_errorMonitor->SetDesiredFailureMsg(
2335 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002336 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002337 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2338 region.imageExtent.height = 2;
2339 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2340 buffer_16k.handle(), 1, &region);
2341 m_errorMonitor->VerifyFound();
2342 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002343
sfricke-samsung6d97e562020-01-07 22:01:00 -08002344 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002345
sfricke-samsung6d97e562020-01-07 22:01:00 -08002346 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2347 m_errorMonitor->ExpectSuccess();
2348 region.imageExtent.width = 66;
2349 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002350 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2351 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002352 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2353 buffer_16k.handle(), 1, &region);
2354 region.imageExtent.width = 16;
2355 region.imageOffset.x = 0;
2356 region.imageExtent.height = 2;
2357 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002358 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2359 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002360 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2361 buffer_16k.handle(), 1, &region);
2362 m_errorMonitor->VerifyNotFound();
2363 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002364
sfricke-samsung6d97e562020-01-07 22:01:00 -08002365 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002366 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002367 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002368 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002369 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002370 region.imageExtent = {64, 64, 1};
2371 region.bufferOffset = 24;
2372 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2373 buffer_16k.handle(), 1, &region);
2374 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002375
sfricke-samsung6d97e562020-01-07 22:01:00 -08002376 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002377 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002378 region.bufferOffset = 0;
2379 region.bufferRowLength = 130;
2380 region.bufferImageHeight = 0;
2381 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2382 buffer_64k.handle(), 1, &region);
2383 m_errorMonitor->VerifyFound();
2384
2385 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002386 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002387 region.bufferRowLength = 0;
2388 region.bufferImageHeight = 130;
2389 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2390 buffer_64k.handle(), 1, &region);
2391 m_errorMonitor->VerifyFound();
2392 }
2393 }
2394
2395 // Test multi-planar formats, if supported
2396 if (!mp_extensions) {
2397 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2398 } else {
2399 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2400 // being required with samplerYcbcrConversion feature
2401 bool missing_mp_support = false;
2402 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2403 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2404 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2405 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2406
2407 if (missing_mp_support) {
2408 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2409 } else {
2410 VkBufferImageCopy mp_region = {};
2411 mp_region.bufferOffset = 0;
2412 mp_region.bufferRowLength = 0;
2413 mp_region.bufferImageHeight = 0;
2414 mp_region.imageSubresource.mipLevel = 0;
2415 mp_region.imageSubresource.baseArrayLayer = 0;
2416 mp_region.imageSubresource.layerCount = 1;
2417 mp_region.imageOffset = {0, 0, 0};
2418 mp_region.imageExtent = {128, 128, 1};
2419
2420 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2421 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2422 VK_IMAGE_TILING_OPTIMAL, 0);
2423 ASSERT_TRUE(image_multi_planar.initialized());
2424
2425 // Copies into a mutli-planar image aspect properly
2426 m_errorMonitor->ExpectSuccess();
2427 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002428 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2429 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002430 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2431 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2432 m_errorMonitor->VerifyNotFound();
2433
2434 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002435 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002436 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2437 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2438 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2439 m_errorMonitor->VerifyFound();
2440
2441 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002442 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002443 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2444 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2445 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2446 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002447
2448 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002449 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002450 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2451 mp_region.bufferOffset = 5;
2452 mp_region.imageExtent = {8, 8, 1};
2453 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2454 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2455 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002456 }
unknown088160a2019-05-23 17:43:13 -06002457 }
2458}
2459
2460TEST_F(VkLayerTest, MiscImageLayerTests) {
2461 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2462
2463 ASSERT_NO_FATAL_FAILURE(Init());
2464
2465 // TODO: Ideally we should check if a format is supported, before using it.
2466 VkImageObj image(m_device);
2467 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2468 ASSERT_TRUE(image.initialized());
2469 VkBufferObj buffer;
2470 VkMemoryPropertyFlags reqs = 0;
2471 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2472 VkBufferImageCopy region = {};
2473 region.bufferRowLength = 128;
2474 region.bufferImageHeight = 128;
2475 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2476 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2477 region.imageSubresource.layerCount = 1;
2478 region.imageExtent.height = 4;
2479 region.imageExtent.width = 4;
2480 region.imageExtent.depth = 1;
2481
2482 VkImageObj image2(m_device);
2483 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2484 ASSERT_TRUE(image2.initialized());
2485 VkBufferObj buffer2;
2486 VkMemoryPropertyFlags reqs2 = 0;
2487 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002488 m_commandBuffer->begin();
2489
2490 // Image must have offset.z of 0 and extent.depth of 1
2491 // Introduce failure by setting imageExtent.depth to 0
2492 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002493 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002494 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2495 &region);
unknown088160a2019-05-23 17:43:13 -06002496 m_errorMonitor->VerifyFound();
2497
2498 region.imageExtent.depth = 1;
2499
2500 // Image must have offset.z of 0 and extent.depth of 1
2501 // Introduce failure by setting imageOffset.z to 4
2502 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2503 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002504 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2505 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002506 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00172");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002507 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2508 &region);
unknown088160a2019-05-23 17:43:13 -06002509 m_errorMonitor->VerifyFound();
2510
2511 region.imageOffset.z = 0;
2512 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2513 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2514 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002515 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002516 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2517 &region);
unknown088160a2019-05-23 17:43:13 -06002518 m_errorMonitor->VerifyFound();
2519
unknown088160a2019-05-23 17:43:13 -06002520 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2521 region.bufferOffset = 0;
2522 region.imageExtent.height = 128;
2523 region.imageExtent.width = 128;
2524 // Introduce failure by setting bufferRowLength > 0 but less than width
2525 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002526 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002527 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2528 &region);
unknown088160a2019-05-23 17:43:13 -06002529 m_errorMonitor->VerifyFound();
2530
2531 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2532 region.bufferRowLength = 128;
2533 // Introduce failure by setting bufferRowHeight > 0 but less than height
2534 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002535 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002536 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2537 &region);
unknown088160a2019-05-23 17:43:13 -06002538 m_errorMonitor->VerifyFound();
2539
2540 region.bufferImageHeight = 128;
2541 VkImageObj intImage1(m_device);
2542 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2543 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2544 VkImageObj intImage2(m_device);
2545 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2546 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2547 VkImageBlit blitRegion = {};
2548 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2549 blitRegion.srcSubresource.baseArrayLayer = 0;
2550 blitRegion.srcSubresource.layerCount = 1;
2551 blitRegion.srcSubresource.mipLevel = 0;
2552 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2553 blitRegion.dstSubresource.baseArrayLayer = 0;
2554 blitRegion.dstSubresource.layerCount = 1;
2555 blitRegion.dstSubresource.mipLevel = 0;
2556 blitRegion.srcOffsets[0] = {128, 0, 0};
2557 blitRegion.srcOffsets[1] = {128, 128, 1};
2558 blitRegion.dstOffsets[0] = {0, 128, 0};
2559 blitRegion.dstOffsets[1] = {128, 128, 1};
2560
2561 // Look for NULL-blit warning
Mark Lobodzinski20310782020-02-28 14:25:17 -07002562 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].srcOffsets specify a zero-volume area.");
2563 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002564 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2565 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002566 m_errorMonitor->VerifyFound();
2567}
2568
2569TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2570 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002571 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2572
2573 bool copy_commands2 = false;
2574 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2575 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2576 copy_commands2 = true;
2577 }
2578 ASSERT_NO_FATAL_FAILURE(InitState());
2579
2580 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2581 if (copy_commands2) {
2582 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2583 }
unknown088160a2019-05-23 17:43:13 -06002584
sfricke-samsung30b094c2020-05-30 11:42:11 -07002585 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2586 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
2587 printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
2588 return;
2589 }
2590
unknown088160a2019-05-23 17:43:13 -06002591 VkImageCreateInfo ci;
2592 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2593 ci.pNext = NULL;
2594 ci.flags = 0;
2595 ci.imageType = VK_IMAGE_TYPE_1D;
2596 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2597 ci.extent = {32, 1, 1};
2598 ci.mipLevels = 1;
2599 ci.arrayLayers = 1;
2600 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2601 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2602 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2603 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2604 ci.queueFamilyIndexCount = 0;
2605 ci.pQueueFamilyIndices = NULL;
2606 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2607
2608 // Create 1D image
2609 VkImageObj image_1D(m_device);
2610 image_1D.init(&ci);
2611 ASSERT_TRUE(image_1D.initialized());
2612
2613 // 2D image
2614 ci.imageType = VK_IMAGE_TYPE_2D;
2615 ci.extent = {32, 32, 1};
2616 VkImageObj image_2D(m_device);
2617 image_2D.init(&ci);
2618 ASSERT_TRUE(image_2D.initialized());
2619
2620 // 3D image
2621 ci.imageType = VK_IMAGE_TYPE_3D;
2622 ci.extent = {32, 32, 8};
2623 VkImageObj image_3D(m_device);
2624 image_3D.init(&ci);
2625 ASSERT_TRUE(image_3D.initialized());
2626
2627 // 2D image array
2628 ci.imageType = VK_IMAGE_TYPE_2D;
2629 ci.extent = {32, 32, 1};
2630 ci.arrayLayers = 8;
2631 VkImageObj image_2D_array(m_device);
2632 image_2D_array.init(&ci);
2633 ASSERT_TRUE(image_2D_array.initialized());
2634
2635 m_commandBuffer->begin();
2636
2637 VkImageCopy copy_region;
2638 copy_region.extent = {32, 1, 1};
2639 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2640 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2641 copy_region.srcSubresource.mipLevel = 0;
2642 copy_region.dstSubresource.mipLevel = 0;
2643 copy_region.srcSubresource.baseArrayLayer = 0;
2644 copy_region.dstSubresource.baseArrayLayer = 0;
2645 copy_region.srcSubresource.layerCount = 1;
2646 copy_region.dstSubresource.layerCount = 1;
2647 copy_region.srcOffset = {0, 0, 0};
2648 copy_region.dstOffset = {0, 0, 0};
2649
2650 // Sanity check
2651 m_errorMonitor->ExpectSuccess();
2652 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2653 &copy_region);
2654 m_errorMonitor->VerifyNotFound();
2655
Jeff Leger465acf52020-10-12 18:07:16 -04002656 // Equivalent sanity check using KHR_copy_commands2
2657 if (copy_commands2 && vkCmdCopyImage2Function) {
2658 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2659 NULL,
2660 copy_region.srcSubresource,
2661 copy_region.srcOffset,
2662 copy_region.dstSubresource,
2663 copy_region.dstOffset,
2664 copy_region.extent};
2665 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2666 NULL,
2667 image_1D.image(),
2668 VK_IMAGE_LAYOUT_GENERAL,
2669 image_2D.image(),
2670 VK_IMAGE_LAYOUT_GENERAL,
2671 1,
2672 &region2};
2673 m_errorMonitor->ExpectSuccess();
2674 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2675 m_errorMonitor->VerifyNotFound();
2676 }
2677
unknown088160a2019-05-23 17:43:13 -06002678 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2679 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002682 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2683 &copy_region);
2684 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002685
2686 // Equivalent test using KHR_copy_commands2
2687 if (copy_commands2 && vkCmdCopyImage2Function) {
2688 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2689 NULL,
2690 copy_region.srcSubresource,
2691 copy_region.srcOffset,
2692 copy_region.dstSubresource,
2693 copy_region.dstOffset,
2694 copy_region.extent};
2695 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2696 NULL,
2697 image_1D.image(),
2698 VK_IMAGE_LAYOUT_GENERAL,
2699 image_2D.image(),
2700 VK_IMAGE_LAYOUT_GENERAL,
2701 1,
2702 &region2};
2703 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2704 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2705 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2706 m_errorMonitor->VerifyFound();
2707 }
2708
unknown088160a2019-05-23 17:43:13 -06002709 copy_region.srcOffset.y = 0;
2710 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002711 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002713 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2714 &copy_region);
2715 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002716
2717 // Equivalent test using KHR_copy_commands2
2718 if (copy_commands2 && vkCmdCopyImage2Function) {
2719 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2720 NULL,
2721 copy_region.srcSubresource,
2722 copy_region.srcOffset,
2723 copy_region.dstSubresource,
2724 copy_region.dstOffset,
2725 copy_region.extent};
2726 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2727 NULL,
2728 image_2D.image(),
2729 VK_IMAGE_LAYOUT_GENERAL,
2730 image_1D.image(),
2731 VK_IMAGE_LAYOUT_GENERAL,
2732 1,
2733 &region2};
2734 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2736 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2737 m_errorMonitor->VerifyFound();
2738 }
2739
unknown088160a2019-05-23 17:43:13 -06002740 copy_region.dstOffset.y = 0;
2741
2742 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2743 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002744 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002746 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2747 &copy_region);
2748 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002749
2750 // Equivalent test using KHR_copy_commands2
2751 if (copy_commands2 && vkCmdCopyImage2Function) {
2752 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2753 NULL,
2754 copy_region.srcSubresource,
2755 copy_region.srcOffset,
2756 copy_region.dstSubresource,
2757 copy_region.dstOffset,
2758 copy_region.extent};
2759 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2760 NULL,
2761 image_1D.image(),
2762 VK_IMAGE_LAYOUT_GENERAL,
2763 image_2D.image(),
2764 VK_IMAGE_LAYOUT_GENERAL,
2765 1,
2766 &region2};
2767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2769 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2770 m_errorMonitor->VerifyFound();
2771 }
2772
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002773 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2774 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002775 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2776 &copy_region);
2777 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002778
2779 // Equivalent test using KHR_copy_commands2
2780 if (copy_commands2 && vkCmdCopyImage2Function) {
2781 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2782 NULL,
2783 copy_region.srcSubresource,
2784 copy_region.srcOffset,
2785 copy_region.dstSubresource,
2786 copy_region.dstOffset,
2787 copy_region.extent};
2788 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2789 NULL,
2790 image_2D.image(),
2791 VK_IMAGE_LAYOUT_GENERAL,
2792 image_1D.image(),
2793 VK_IMAGE_LAYOUT_GENERAL,
2794 1,
2795 &region2};
2796 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2797 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2798 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2799 m_errorMonitor->VerifyFound();
2800 }
2801
unknown088160a2019-05-23 17:43:13 -06002802 copy_region.extent.height = 1;
2803
2804 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2805 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002806 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2807 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002808 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2809 &copy_region);
2810 m_errorMonitor->VerifyFound();
2811 copy_region.srcOffset.z = 0;
2812 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002813 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2814 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002815 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2816 &copy_region);
2817 m_errorMonitor->VerifyFound();
2818 copy_region.dstOffset.z = 0;
2819
2820 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2821 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002822 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002823 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002824 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002825 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002826 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002827 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002828 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002829 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2830 &copy_region);
2831 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002832 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002834 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002835 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002836 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002837 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002838 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002839 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2840 &copy_region);
2841 m_errorMonitor->VerifyFound();
2842 copy_region.extent.depth = 1;
2843
2844 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2845 copy_region.extent = {16, 16, 1};
2846 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002847 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002848 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002849 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002850 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2851 &copy_region);
2852 m_errorMonitor->VerifyFound();
2853 copy_region.srcOffset.z = 0;
2854 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002855 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002856 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002857 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002858 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2859 &copy_region);
2860 m_errorMonitor->VerifyFound();
2861 copy_region.dstOffset.z = 0;
2862
2863 // 3D texture accessing an array layer other than 0. VU 09c0011a
2864 copy_region.extent = {4, 4, 1};
2865 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002866 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002867 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002868 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2869 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2870 &copy_region);
2871 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002872 copy_region.srcSubresource.baseArrayLayer = 0;
2873
unknown088160a2019-05-23 17:43:13 -06002874 m_commandBuffer->end();
2875}
2876
2877TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2878 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002879 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06002880 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
2881 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2882 } else {
2883 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2884 return;
2885 }
2886 ASSERT_NO_FATAL_FAILURE(InitState());
2887
2888 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2889 VkFormatProperties format_props;
2890 // TODO: Remove this check if or when devsim handles extensions.
2891 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2892 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002893 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002894 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2895 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2896 return;
2897 }
2898
2899 VkImageCreateInfo ci;
2900 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2901 ci.pNext = NULL;
2902 ci.flags = 0;
2903 ci.imageType = VK_IMAGE_TYPE_1D;
2904 ci.format = image_format;
2905 ci.extent = {32, 1, 1};
2906 ci.mipLevels = 1;
2907 ci.arrayLayers = 1;
2908 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2909 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2910 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2911 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2912 ci.queueFamilyIndexCount = 0;
2913 ci.pQueueFamilyIndices = NULL;
2914 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2915
2916 // Create 1D image
2917 VkImageObj image_1D(m_device);
2918 image_1D.init(&ci);
2919 ASSERT_TRUE(image_1D.initialized());
2920
2921 // 2D image
2922 ci.imageType = VK_IMAGE_TYPE_2D;
2923 ci.extent = {32, 32, 1};
2924 VkImageObj image_2D(m_device);
2925 image_2D.init(&ci);
2926 ASSERT_TRUE(image_2D.initialized());
2927
2928 // 3D image
2929 ci.imageType = VK_IMAGE_TYPE_3D;
2930 ci.extent = {32, 32, 8};
2931 VkImageObj image_3D(m_device);
2932 image_3D.init(&ci);
2933 ASSERT_TRUE(image_3D.initialized());
2934
2935 // 2D image array
2936 ci.imageType = VK_IMAGE_TYPE_2D;
2937 ci.extent = {32, 32, 1};
2938 ci.arrayLayers = 8;
2939 VkImageObj image_2D_array(m_device);
2940 image_2D_array.init(&ci);
2941 ASSERT_TRUE(image_2D_array.initialized());
2942
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002943 // second 2D image array
2944 ci.imageType = VK_IMAGE_TYPE_2D;
2945 ci.extent = {32, 32, 1};
2946 ci.arrayLayers = 8;
2947 VkImageObj image_2D_array_2(m_device);
2948 image_2D_array_2.init(&ci);
2949 ASSERT_TRUE(image_2D_array_2.initialized());
2950
unknown088160a2019-05-23 17:43:13 -06002951 m_commandBuffer->begin();
2952
2953 VkImageCopy copy_region;
2954 copy_region.extent = {32, 1, 1};
2955 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2956 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2957 copy_region.srcSubresource.mipLevel = 0;
2958 copy_region.dstSubresource.mipLevel = 0;
2959 copy_region.srcSubresource.baseArrayLayer = 0;
2960 copy_region.dstSubresource.baseArrayLayer = 0;
2961 copy_region.srcSubresource.layerCount = 1;
2962 copy_region.dstSubresource.layerCount = 1;
2963 copy_region.srcOffset = {0, 0, 0};
2964 copy_region.dstOffset = {0, 0, 0};
2965
2966 // Copy from layer not present
2967 copy_region.srcSubresource.baseArrayLayer = 4;
2968 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002969 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002970 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2971 &copy_region);
2972 m_errorMonitor->VerifyFound();
2973 copy_region.srcSubresource.baseArrayLayer = 0;
2974 copy_region.srcSubresource.layerCount = 1;
2975
2976 // Copy to layer not present
2977 copy_region.dstSubresource.baseArrayLayer = 1;
2978 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002979 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002980 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2981 &copy_region);
2982 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002983 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002984 copy_region.dstSubresource.layerCount = 1;
2985
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002986 // both 2D and extent.depth not 1
2987 // Need two 2D array images to prevent other errors
2988 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002989 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002990 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2991 1, &copy_region);
2992 m_errorMonitor->VerifyFound();
2993 copy_region.extent = {32, 1, 1};
2994
2995 // 2D src / 3D dst and depth not equal to src layerCount
2996 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002997 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002998 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002999 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3000 &copy_region);
3001 m_errorMonitor->VerifyFound();
3002 copy_region.extent = {32, 1, 1};
3003
3004 // 3D src / 2D dst and depth not equal to dst layerCount
3005 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003006 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003007 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08003008 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3009 &copy_region);
3010 m_errorMonitor->VerifyFound();
3011 copy_region.extent = {32, 1, 1};
3012
unknown088160a2019-05-23 17:43:13 -06003013 m_commandBuffer->end();
3014}
3015
3016TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
3017 // Image copy tests on compressed images with block alignment errors
3018 SetTargetApiVersion(VK_API_VERSION_1_1);
3019 ASSERT_NO_FATAL_FAILURE(Init());
3020
3021 // Select a compressed format and verify support
3022 VkPhysicalDeviceFeatures device_features = {};
3023 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
3024 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
3025 if (device_features.textureCompressionBC) {
3026 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
3027 } else if (device_features.textureCompressionETC2) {
3028 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
3029 } else if (device_features.textureCompressionASTC_LDR) {
3030 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
3031 }
3032
3033 VkImageCreateInfo ci;
3034 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3035 ci.pNext = NULL;
3036 ci.flags = 0;
3037 ci.imageType = VK_IMAGE_TYPE_2D;
3038 ci.format = compressed_format;
3039 ci.extent = {64, 64, 1};
3040 ci.mipLevels = 1;
3041 ci.arrayLayers = 1;
3042 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3043 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3044 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3045 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3046 ci.queueFamilyIndexCount = 0;
3047 ci.pQueueFamilyIndices = NULL;
3048 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3049
3050 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003051 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
3052 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06003053 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
3054 return;
3055 }
3056
3057 // Create images
3058 VkImageObj image_1(m_device);
3059 image_1.init(&ci);
3060 ASSERT_TRUE(image_1.initialized());
3061
3062 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
3063 VkImageObj image_2(m_device);
3064 image_2.init(&ci);
3065 ASSERT_TRUE(image_2.initialized());
3066
3067 m_commandBuffer->begin();
3068
3069 VkImageCopy copy_region;
3070 copy_region.extent = {48, 48, 1};
3071 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3072 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3073 copy_region.srcSubresource.mipLevel = 0;
3074 copy_region.dstSubresource.mipLevel = 0;
3075 copy_region.srcSubresource.baseArrayLayer = 0;
3076 copy_region.dstSubresource.baseArrayLayer = 0;
3077 copy_region.srcSubresource.layerCount = 1;
3078 copy_region.dstSubresource.layerCount = 1;
3079 copy_region.srcOffset = {0, 0, 0};
3080 copy_region.dstOffset = {0, 0, 0};
3081
3082 // Sanity check
3083 m_errorMonitor->ExpectSuccess();
3084 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3085 m_errorMonitor->VerifyNotFound();
3086
3087 std::string vuid;
3088 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3089 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3090
3091 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3092 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003093 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003094 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003095 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3096 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003097 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3098 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3099 m_errorMonitor->VerifyFound();
3100 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003101 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3102 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003103 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3104 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3105 m_errorMonitor->VerifyFound();
3106 copy_region.srcOffset = {0, 0, 0};
3107
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003108 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003109 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003110 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3111 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003112 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3113 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3114 m_errorMonitor->VerifyFound();
3115 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003116 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3117 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003118 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3119 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3120 m_errorMonitor->VerifyFound();
3121 copy_region.dstOffset = {0, 0, 0};
3122
3123 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003124 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003125 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003126 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3127 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003128 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3129 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3130 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003131 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003132 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003133 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3134 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003135 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3136 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3137 m_errorMonitor->VerifyFound();
3138
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003139 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003140 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003141 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3142 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003143 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3144 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3145 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003146 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003147 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003148 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3149 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003150 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3151 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3152 m_errorMonitor->VerifyFound();
3153
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003154 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3155 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003156 // There are currently no supported compressed formats with a block depth other than 1,
3157 // so impossible to create a 'not a multiple' condition for depth.
3158 m_commandBuffer->end();
3159}
3160
3161TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3162 // Image copy tests on single-plane _422 formats with block alignment errors
3163
3164 // Enable KHR multiplane req'd extensions
3165 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3166 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3167 if (mp_extensions) {
3168 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3169 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003170 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003171 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3172 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3173 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3174 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3175 if (mp_extensions) {
3176 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3177 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3178 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3179 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3180 } else {
3181 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3182 return;
3183 }
3184 ASSERT_NO_FATAL_FAILURE(InitState());
3185
3186 // Select a _422 format and verify support
3187 VkImageCreateInfo ci = {};
3188 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3189 ci.pNext = NULL;
3190 ci.flags = 0;
3191 ci.imageType = VK_IMAGE_TYPE_2D;
3192 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3193 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3194 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3195 ci.mipLevels = 1;
3196 ci.arrayLayers = 1;
3197 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3198 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3199 ci.queueFamilyIndexCount = 0;
3200 ci.pQueueFamilyIndices = NULL;
3201 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3202
3203 // Verify formats
3204 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3205 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3206 if (!supported) {
3207 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3208 return; // Assume there's low ROI on searching for different mp formats
3209 }
3210
3211 // Create images
3212 ci.extent = {64, 64, 1};
3213 VkImageObj image_422(m_device);
3214 image_422.init(&ci);
3215 ASSERT_TRUE(image_422.initialized());
3216
3217 ci.extent = {64, 64, 1};
3218 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3219 VkImageObj image_ucmp(m_device);
3220 image_ucmp.init(&ci);
3221 ASSERT_TRUE(image_ucmp.initialized());
3222
3223 m_commandBuffer->begin();
3224
3225 VkImageCopy copy_region;
3226 copy_region.extent = {48, 48, 1};
3227 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3228 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3229 copy_region.srcSubresource.mipLevel = 0;
3230 copy_region.dstSubresource.mipLevel = 0;
3231 copy_region.srcSubresource.baseArrayLayer = 0;
3232 copy_region.dstSubresource.baseArrayLayer = 0;
3233 copy_region.srcSubresource.layerCount = 1;
3234 copy_region.dstSubresource.layerCount = 1;
3235 copy_region.srcOffset = {0, 0, 0};
3236 copy_region.dstOffset = {0, 0, 0};
3237
3238 // Src offsets must be multiples of compressed block sizes
3239 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003240 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003241 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003242 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3243 &copy_region);
3244 m_errorMonitor->VerifyFound();
3245 copy_region.srcOffset = {0, 0, 0};
3246
3247 // Dst offsets must be multiples of compressed block sizes
3248 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003249 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003250 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003251 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003252 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3253 &copy_region);
3254 m_errorMonitor->VerifyFound();
3255 copy_region.dstOffset = {0, 0, 0};
3256
3257 // Copy extent must be multiples of compressed block sizes if not full width/height
3258 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003259 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003260 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003261 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3262 &copy_region);
3263 m_errorMonitor->VerifyFound();
3264
unknown357e1782019-09-25 17:57:40 -06003265 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003266 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3267 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003268 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003269 copy_region.dstOffset = {0, 0, 0};
3270
3271 m_commandBuffer->end();
3272}
3273
3274TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3275 // Image copy tests on multiplane images with aspect errors
3276
3277 // Enable KHR multiplane req'd extensions
3278 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3279 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3280 if (mp_extensions) {
3281 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3282 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003283 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003284 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3285 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3286 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3287 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3288 if (mp_extensions) {
3289 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3290 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3291 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3292 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3293 } else {
3294 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3295 return;
3296 }
3297 ASSERT_NO_FATAL_FAILURE(InitState());
3298
3299 // Select multi-plane formats and verify support
3300 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3301 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3302
3303 VkImageCreateInfo ci = {};
3304 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3305 ci.pNext = NULL;
3306 ci.flags = 0;
3307 ci.imageType = VK_IMAGE_TYPE_2D;
3308 ci.format = mp2_format;
3309 ci.extent = {256, 256, 1};
3310 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3311 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3312 ci.mipLevels = 1;
3313 ci.arrayLayers = 1;
3314 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3315 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3316 ci.queueFamilyIndexCount = 0;
3317 ci.pQueueFamilyIndices = NULL;
3318 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3319
3320 // Verify formats
3321 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3322 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3323 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3324 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3325 ci.format = mp3_format;
3326 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3327 if (!supported) {
3328 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3329 kSkipPrefix);
3330 return; // Assume there's low ROI on searching for different mp formats
3331 }
3332
3333 // Create images
3334 VkImageObj mp3_image(m_device);
3335 mp3_image.init(&ci);
3336 ASSERT_TRUE(mp3_image.initialized());
3337
3338 ci.format = mp2_format;
3339 VkImageObj mp2_image(m_device);
3340 mp2_image.init(&ci);
3341 ASSERT_TRUE(mp2_image.initialized());
3342
3343 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3344 VkImageObj sp_image(m_device);
3345 sp_image.init(&ci);
3346 ASSERT_TRUE(sp_image.initialized());
3347
3348 m_commandBuffer->begin();
3349
3350 VkImageCopy copy_region;
3351 copy_region.extent = {128, 128, 1};
3352 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3353 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3354 copy_region.srcSubresource.mipLevel = 0;
3355 copy_region.dstSubresource.mipLevel = 0;
3356 copy_region.srcSubresource.baseArrayLayer = 0;
3357 copy_region.dstSubresource.baseArrayLayer = 0;
3358 copy_region.srcSubresource.layerCount = 1;
3359 copy_region.dstSubresource.layerCount = 1;
3360 copy_region.srcOffset = {0, 0, 0};
3361 copy_region.dstOffset = {0, 0, 0};
3362
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003363 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003364 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3365 &copy_region);
3366 m_errorMonitor->VerifyFound();
3367
unknown088160a2019-05-23 17:43:13 -06003368 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3369 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003370 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003371 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3372 &copy_region);
3373 m_errorMonitor->VerifyFound();
3374
3375 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3376 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003377 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003378 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3379 &copy_region);
3380 m_errorMonitor->VerifyFound();
3381
3382 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003383 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003384 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3385 &copy_region);
3386 m_errorMonitor->VerifyFound();
3387
3388 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003389 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003390 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003391 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3392 &copy_region);
3393 m_errorMonitor->VerifyFound();
3394
3395 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3396 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003397 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003398 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003399 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3400 &copy_region);
3401 m_errorMonitor->VerifyFound();
3402
3403 m_commandBuffer->end();
3404}
3405
3406TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3407 // Image copy with source region specified greater than src image size
3408 ASSERT_NO_FATAL_FAILURE(Init());
3409
3410 // Create images with full mip chain
3411 VkImageCreateInfo ci;
3412 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3413 ci.pNext = NULL;
3414 ci.flags = 0;
3415 ci.imageType = VK_IMAGE_TYPE_3D;
3416 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3417 ci.extent = {32, 32, 8};
3418 ci.mipLevels = 6;
3419 ci.arrayLayers = 1;
3420 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3421 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3422 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3423 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3424 ci.queueFamilyIndexCount = 0;
3425 ci.pQueueFamilyIndices = NULL;
3426 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3427
3428 VkImageObj src_image(m_device);
3429 src_image.init(&ci);
3430 ASSERT_TRUE(src_image.initialized());
3431
3432 // Dest image with one more mip level
3433 ci.extent = {64, 64, 16};
3434 ci.mipLevels = 7;
3435 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3436 VkImageObj dst_image(m_device);
3437 dst_image.init(&ci);
3438 ASSERT_TRUE(dst_image.initialized());
3439
3440 m_commandBuffer->begin();
3441
3442 VkImageCopy copy_region;
3443 copy_region.extent = {32, 32, 8};
3444 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3445 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3446 copy_region.srcSubresource.mipLevel = 0;
3447 copy_region.dstSubresource.mipLevel = 0;
3448 copy_region.srcSubresource.baseArrayLayer = 0;
3449 copy_region.dstSubresource.baseArrayLayer = 0;
3450 copy_region.srcSubresource.layerCount = 1;
3451 copy_region.dstSubresource.layerCount = 1;
3452 copy_region.srcOffset = {0, 0, 0};
3453 copy_region.dstOffset = {0, 0, 0};
3454
3455 m_errorMonitor->ExpectSuccess();
3456 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3457 &copy_region);
3458 m_errorMonitor->VerifyNotFound();
3459
3460 // Source exceeded in x-dim, VU 01202
3461 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003462 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003463 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3464 &copy_region);
3465 m_errorMonitor->VerifyFound();
3466
3467 // Source exceeded in y-dim, VU 01203
3468 copy_region.srcOffset.x = 0;
3469 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003470 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003471 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3472 &copy_region);
3473 m_errorMonitor->VerifyFound();
3474
3475 // Source exceeded in z-dim, VU 01204
3476 copy_region.extent = {4, 4, 4};
3477 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003478 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003479 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3480 &copy_region);
3481 m_errorMonitor->VerifyFound();
3482
3483 m_commandBuffer->end();
3484}
3485
3486TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3487 // Image copy with dest region specified greater than dest image size
3488 ASSERT_NO_FATAL_FAILURE(Init());
3489
3490 // Create images with full mip chain
3491 VkImageCreateInfo ci;
3492 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3493 ci.pNext = NULL;
3494 ci.flags = 0;
3495 ci.imageType = VK_IMAGE_TYPE_3D;
3496 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3497 ci.extent = {32, 32, 8};
3498 ci.mipLevels = 6;
3499 ci.arrayLayers = 1;
3500 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3501 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3502 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3503 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3504 ci.queueFamilyIndexCount = 0;
3505 ci.pQueueFamilyIndices = NULL;
3506 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3507
3508 VkImageObj dst_image(m_device);
3509 dst_image.init(&ci);
3510 ASSERT_TRUE(dst_image.initialized());
3511
3512 // Src image with one more mip level
3513 ci.extent = {64, 64, 16};
3514 ci.mipLevels = 7;
3515 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3516 VkImageObj src_image(m_device);
3517 src_image.init(&ci);
3518 ASSERT_TRUE(src_image.initialized());
3519
3520 m_commandBuffer->begin();
3521
3522 VkImageCopy copy_region;
3523 copy_region.extent = {32, 32, 8};
3524 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3525 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3526 copy_region.srcSubresource.mipLevel = 0;
3527 copy_region.dstSubresource.mipLevel = 0;
3528 copy_region.srcSubresource.baseArrayLayer = 0;
3529 copy_region.dstSubresource.baseArrayLayer = 0;
3530 copy_region.srcSubresource.layerCount = 1;
3531 copy_region.dstSubresource.layerCount = 1;
3532 copy_region.srcOffset = {0, 0, 0};
3533 copy_region.dstOffset = {0, 0, 0};
3534
3535 m_errorMonitor->ExpectSuccess();
3536 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3537 &copy_region);
3538 m_errorMonitor->VerifyNotFound();
3539
3540 // Dest exceeded in x-dim, VU 01205
3541 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003542 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003543 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3544 &copy_region);
3545 m_errorMonitor->VerifyFound();
3546
3547 // Dest exceeded in y-dim, VU 01206
3548 copy_region.dstOffset.x = 0;
3549 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003550 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003551 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3552 &copy_region);
3553 m_errorMonitor->VerifyFound();
3554
3555 // Dest exceeded in z-dim, VU 01207
3556 copy_region.extent = {4, 4, 4};
3557 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003558 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003559 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3560 &copy_region);
3561 m_errorMonitor->VerifyFound();
3562
3563 m_commandBuffer->end();
3564}
3565
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003566TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3567 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3568
3569 // Enable KHR multiplane req'd extensions
3570 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3571 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3572 if (mp_extensions == true) {
3573 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3574 }
3575 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3576 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3577 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3578 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3579 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3580 if (mp_extensions == true) {
3581 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3582 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3583 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3584 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3585 } else {
3586 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3587 return;
3588 }
3589 ASSERT_NO_FATAL_FAILURE(InitState());
3590
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003591 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3592 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003593 VkFormatProperties props = {0, 0, 0};
3594 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003595 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003596 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3597 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3598 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3599
3600 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003601 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003602 return;
3603 }
3604
3605 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3606 VkImageObj src_image(m_device);
3607 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003608 src_image.Init(128, 128, 1, VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003609 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003610 dst_image.Init(128, 128, 1, VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003611 ASSERT_TRUE(dst_image.initialized());
3612
3613 VkImageCopy copy_region = {};
3614 copy_region.extent = {64, 64, 1}; // Size of plane 1
3615 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3616 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3617 copy_region.srcSubresource.mipLevel = 0;
3618 copy_region.dstSubresource.mipLevel = 0;
3619 copy_region.srcSubresource.baseArrayLayer = 0;
3620 copy_region.dstSubresource.baseArrayLayer = 0;
3621 copy_region.srcSubresource.layerCount = 1;
3622 copy_region.dstSubresource.layerCount = 1;
3623 copy_region.srcOffset = {0, 0, 0};
3624 copy_region.dstOffset = {0, 0, 0};
3625 VkImageCopy original_region = copy_region;
3626
3627 m_commandBuffer->begin();
3628
3629 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3630 m_errorMonitor->ExpectSuccess();
3631 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3632 &copy_region);
3633 m_errorMonitor->VerifyNotFound();
3634
3635 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3636 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3637 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3638 m_errorMonitor->ExpectSuccess();
3639 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3640 &copy_region);
3641 m_errorMonitor->VerifyNotFound();
3642
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003643 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003644 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3645 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3646
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003647 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3648 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3649 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3650 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003651 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3652 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003653 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3654 &copy_region);
3655 m_errorMonitor->VerifyNotFound();
3656
3657 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3658 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3659 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3660 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003661 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3662 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003663 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3664 &copy_region);
3665 m_errorMonitor->VerifyNotFound();
3666
3667 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3668 copy_region.extent = {128, 64, 1};
3669 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3670 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3671 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003672 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3673 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003674 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3675 &copy_region);
3676 m_errorMonitor->VerifyNotFound();
3677
3678 // 128x64 copy from plane 0 -> Plane 1
3679 copy_region.extent = {128, 64, 1};
3680 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3681 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003682 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003683 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3684 &copy_region);
3685 m_errorMonitor->VerifyFound();
3686
3687 // 128x64 copy from plane 1 -> Plane 0
3688 copy_region.extent = {128, 64, 1};
3689 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3690 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003691 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003692 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3693 &copy_region);
3694 m_errorMonitor->VerifyFound();
3695
3696 // src exceeded in y-dim from offset
3697 copy_region = original_region;
3698 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003699 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003700 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3701 &copy_region);
3702 m_errorMonitor->VerifyFound();
3703
3704 // dst exceeded in y-dim from offset
3705 copy_region = original_region;
3706 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003707 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003708 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3709 &copy_region);
3710 m_errorMonitor->VerifyFound();
3711
3712 m_commandBuffer->end();
3713}
3714
unknown088160a2019-05-23 17:43:13 -06003715TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003716 if (!EnableDeviceProfileLayer()) {
3717 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3718 return;
3719 }
unknown088160a2019-05-23 17:43:13 -06003720
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003721 // Enable KHR multiplane req'd extensions
3722 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3723 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3724 if (mp_extensions == true) {
3725 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3726 }
3727 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3728 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3729 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3730 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3731 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3732 if (mp_extensions == true) {
3733 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3734 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3735 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3736 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3737 }
3738 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003739
sfricke-samsung51067b22020-04-30 21:41:17 -07003740 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3741 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003742
sfricke-samsung51067b22020-04-30 21:41:17 -07003743 // Load required functions
3744 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3745 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3746 return;
3747 }
3748
3749 // Set transfer for all potential used formats
3750 VkFormatProperties format_props;
3751 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3752 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3753 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3754
3755 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3756 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3757 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003758
3759 VkImageCreateInfo image_create_info = {};
3760 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3761 image_create_info.pNext = NULL;
3762 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003763 image_create_info.extent.width = 32;
3764 image_create_info.extent.height = 32;
3765 image_create_info.extent.depth = 1;
3766 image_create_info.mipLevels = 1;
3767 image_create_info.arrayLayers = 1;
3768 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003769 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3770 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003771 image_create_info.flags = 0;
3772
sfricke-samsung51067b22020-04-30 21:41:17 -07003773 image_create_info.format = VK_FORMAT_R8_UNORM;
3774 VkImageObj image_8b_unorm(m_device);
3775 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003776
sfricke-samsung51067b22020-04-30 21:41:17 -07003777 image_create_info.format = VK_FORMAT_R8_UINT;
3778 VkImageObj image_8b_uint(m_device);
3779 image_8b_uint.init(&image_create_info);
3780
3781 // First try to test two single plane mismatch
3782 {
3783 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3784 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3785 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3786
3787 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3788 VkImageObj image_32b_unorm(m_device);
3789 image_32b_unorm.init(&image_create_info);
3790
3791 m_commandBuffer->begin();
3792 VkImageCopy copyRegion;
3793 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3794 copyRegion.srcSubresource.mipLevel = 0;
3795 copyRegion.srcSubresource.baseArrayLayer = 0;
3796 copyRegion.srcSubresource.layerCount = 1;
3797 copyRegion.srcOffset.x = 0;
3798 copyRegion.srcOffset.y = 0;
3799 copyRegion.srcOffset.z = 0;
3800 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3801 copyRegion.dstSubresource.mipLevel = 0;
3802 copyRegion.dstSubresource.baseArrayLayer = 0;
3803 copyRegion.dstSubresource.layerCount = 1;
3804 copyRegion.dstOffset.x = 0;
3805 copyRegion.dstOffset.y = 0;
3806 copyRegion.dstOffset.z = 0;
3807 copyRegion.extent.width = 1;
3808 copyRegion.extent.height = 1;
3809 copyRegion.extent.depth = 1;
3810
3811 // Sanity check between two 8bit formats
3812 m_errorMonitor->ExpectSuccess();
3813 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3814 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3815 m_errorMonitor->VerifyNotFound();
3816
3817 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3819 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3820 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3821 m_errorMonitor->VerifyFound();
3822
3823 // Swap src and dst
3824 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3825 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3826 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3827 m_errorMonitor->VerifyFound();
3828
3829 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003830 }
3831
sfricke-samsung51067b22020-04-30 21:41:17 -07003832 // DstImage is a mismatched plane of a multi-planar format
3833 if (mp_extensions == false) {
3834 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3835 } else {
3836 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3837 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3838 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003839
sfricke-samsung51067b22020-04-30 21:41:17 -07003840 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3841 VkImageObj image_8b_16b_420_unorm(m_device);
3842 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003843
sfricke-samsung51067b22020-04-30 21:41:17 -07003844 m_commandBuffer->begin();
3845 VkImageCopy copyRegion;
3846 copyRegion.srcSubresource.mipLevel = 0;
3847 copyRegion.srcSubresource.baseArrayLayer = 0;
3848 copyRegion.srcSubresource.layerCount = 1;
3849 copyRegion.srcOffset.x = 0;
3850 copyRegion.srcOffset.y = 0;
3851 copyRegion.srcOffset.z = 0;
3852 copyRegion.dstSubresource.mipLevel = 0;
3853 copyRegion.dstSubresource.baseArrayLayer = 0;
3854 copyRegion.dstSubresource.layerCount = 1;
3855 copyRegion.dstOffset.x = 0;
3856 copyRegion.dstOffset.y = 0;
3857 copyRegion.dstOffset.z = 0;
3858 copyRegion.extent.width = 1;
3859 copyRegion.extent.height = 1;
3860 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003861
sfricke-samsung51067b22020-04-30 21:41:17 -07003862 // First test single-plane -> multi-plan
3863 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3864 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003865
sfricke-samsung51067b22020-04-30 21:41:17 -07003866 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3867 m_errorMonitor->ExpectSuccess();
3868 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3869 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3870 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003871
locke-lunargdf00db02020-03-04 19:00:57 -07003872 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3873 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3874
sfricke-samsung51067b22020-04-30 21:41:17 -07003875 // Make sure no false postiives if Compatible format
3876 m_errorMonitor->ExpectSuccess();
3877 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3878 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3879 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003880
sfricke-samsung51067b22020-04-30 21:41:17 -07003881 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3882 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3883 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3884 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3885 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3886 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003887
sfricke-samsung51067b22020-04-30 21:41:17 -07003888 // Same tests but swap src and dst
3889 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3890 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003891
locke-lunargdf00db02020-03-04 19:00:57 -07003892 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3893 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3894 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3895 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3896
sfricke-samsung51067b22020-04-30 21:41:17 -07003897 m_errorMonitor->ExpectSuccess();
3898 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3899 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3900 m_errorMonitor->VerifyNotFound();
3901
locke-lunargdf00db02020-03-04 19:00:57 -07003902 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3903 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3904
sfricke-samsung51067b22020-04-30 21:41:17 -07003905 m_errorMonitor->ExpectSuccess();
3906 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3907 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3908 m_errorMonitor->VerifyNotFound();
3909
3910 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3911 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3912 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3913 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3914 m_errorMonitor->VerifyFound();
3915
3916 m_commandBuffer->end();
3917 }
unknown088160a2019-05-23 17:43:13 -06003918}
3919
3920TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3921 ASSERT_NO_FATAL_FAILURE(Init());
3922 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3923 if (!depth_format) {
3924 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3925 return;
3926 }
3927
3928 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003929 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003930 if (properties.optimalTilingFeatures == 0) {
3931 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3932 return;
3933 }
3934
3935 VkImageObj srcImage(m_device);
3936 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3937 ASSERT_TRUE(srcImage.initialized());
3938 VkImageObj dstImage(m_device);
3939 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3940 ASSERT_TRUE(dstImage.initialized());
3941
3942 // Create two images of different types and try to copy between them
3943
3944 m_commandBuffer->begin();
3945 VkImageCopy copyRegion;
3946 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3947 copyRegion.srcSubresource.mipLevel = 0;
3948 copyRegion.srcSubresource.baseArrayLayer = 0;
3949 copyRegion.srcSubresource.layerCount = 1;
3950 copyRegion.srcOffset.x = 0;
3951 copyRegion.srcOffset.y = 0;
3952 copyRegion.srcOffset.z = 0;
3953 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3954 copyRegion.dstSubresource.mipLevel = 0;
3955 copyRegion.dstSubresource.baseArrayLayer = 0;
3956 copyRegion.dstSubresource.layerCount = 1;
3957 copyRegion.dstOffset.x = 0;
3958 copyRegion.dstOffset.y = 0;
3959 copyRegion.dstOffset.z = 0;
3960 copyRegion.extent.width = 1;
3961 copyRegion.extent.height = 1;
3962 copyRegion.extent.depth = 1;
3963
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003964 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003965 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3966 &copyRegion);
3967 m_commandBuffer->end();
3968
3969 m_errorMonitor->VerifyFound();
3970}
3971
3972TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3973 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3974
3975 ASSERT_NO_FATAL_FAILURE(Init());
3976
3977 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003978 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3979 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3980 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003981
3982 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3983 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
3984 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
3985 return;
3986 }
3987
3988 VkImageCreateInfo ci;
3989 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3990 ci.pNext = NULL;
3991 ci.flags = 0;
3992 ci.imageType = VK_IMAGE_TYPE_2D;
3993 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3994 ci.extent = {128, 128, 1};
3995 ci.mipLevels = 1;
3996 ci.arrayLayers = 1;
3997 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3998 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3999 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4000 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4001 ci.queueFamilyIndexCount = 0;
4002 ci.pQueueFamilyIndices = NULL;
4003 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4004
4005 VkImageObj image1(m_device);
4006 image1.init(&ci);
4007 ASSERT_TRUE(image1.initialized());
4008
4009 ci.samples = VK_SAMPLE_COUNT_2_BIT;
4010 VkImageObj image2(m_device);
4011 image2.init(&ci);
4012 ASSERT_TRUE(image2.initialized());
4013
4014 ci.samples = VK_SAMPLE_COUNT_4_BIT;
4015 VkImageObj image4(m_device);
4016 image4.init(&ci);
4017 ASSERT_TRUE(image4.initialized());
4018
4019 m_commandBuffer->begin();
4020
4021 VkImageCopy copyRegion;
4022 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4023 copyRegion.srcSubresource.mipLevel = 0;
4024 copyRegion.srcSubresource.baseArrayLayer = 0;
4025 copyRegion.srcSubresource.layerCount = 1;
4026 copyRegion.srcOffset = {0, 0, 0};
4027 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4028 copyRegion.dstSubresource.mipLevel = 0;
4029 copyRegion.dstSubresource.baseArrayLayer = 0;
4030 copyRegion.dstSubresource.layerCount = 1;
4031 copyRegion.dstOffset = {0, 0, 0};
4032 copyRegion.extent = {128, 128, 1};
4033
4034 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07004035 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004036 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4037 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004038 m_errorMonitor->VerifyFound();
4039
Mark Lobodzinski20310782020-02-28 14:25:17 -07004040 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004041 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
4042 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004043 m_errorMonitor->VerifyFound();
4044
4045 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07004046 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004047 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
4048 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004049 m_errorMonitor->VerifyFound();
4050
Mark Lobodzinski20310782020-02-28 14:25:17 -07004051 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004052 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
4053 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004054 m_errorMonitor->VerifyFound();
4055
4056 m_commandBuffer->end();
4057}
4058
4059TEST_F(VkLayerTest, CopyImageAspectMismatch) {
4060 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004061
4062 if (!EnableDeviceProfileLayer()) {
4063 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
4064 return;
4065 }
4066
4067 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
4068 if (mp_extensions) {
4069 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
4070 }
4071
4072 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4073 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4074 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4075 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4076 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4077 if (mp_extensions) {
4078 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
4079 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
4080 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
4081 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
4082 }
4083 ASSERT_NO_FATAL_FAILURE(InitState());
4084
4085 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
4086 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4087
4088 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4089 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4090 return;
4091 }
4092
unknown088160a2019-05-23 17:43:13 -06004093 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4094 if (!ds_format) {
4095 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4096 return;
4097 }
4098
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004099 // Add Transfer support for all used formats
4100 VkFormatProperties formatProps;
4101 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
4102 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4103 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4104 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
4105 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4106 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4107 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4108 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4109 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4110
unknown088160a2019-05-23 17:43:13 -06004111 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4112 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4113 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4114 VK_IMAGE_TILING_OPTIMAL, 0);
4115 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4116 VK_IMAGE_TILING_OPTIMAL, 0);
4117 ASSERT_TRUE(color_image.initialized());
4118 ASSERT_TRUE(depth_image.initialized());
4119 ASSERT_TRUE(ds_image.initialized());
4120
4121 VkImageCopy copyRegion;
4122 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4123 copyRegion.srcSubresource.mipLevel = 0;
4124 copyRegion.srcSubresource.baseArrayLayer = 0;
4125 copyRegion.srcSubresource.layerCount = 1;
4126 copyRegion.srcOffset = {0, 0, 0};
4127 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4128 copyRegion.dstSubresource.mipLevel = 0;
4129 copyRegion.dstSubresource.baseArrayLayer = 0;
4130 copyRegion.dstSubresource.layerCount = 1;
4131 copyRegion.dstOffset = {64, 0, 0};
4132 copyRegion.extent = {64, 128, 1};
4133
4134 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004135 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004136 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004137 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4138 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004139 m_errorMonitor->VerifyFound();
4140
4141 m_commandBuffer->begin();
4142
4143 // Src and dest aspect masks don't match
4144 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004145 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004146 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004147 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4148 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004149 m_errorMonitor->VerifyFound();
4150 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4151
4152 // Illegal combinations of aspect bits
4153 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4154 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004155 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004156 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004157 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004158 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004159 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4160 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004161 m_errorMonitor->VerifyFound();
4162 // same test for dstSubresource
4163 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4164 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004165 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004166 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004167 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004168 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004169 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4170 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004171 m_errorMonitor->VerifyFound();
4172
4173 // Metadata aspect is illegal
4174 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4175 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004176 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004177 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004178 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004179 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4180 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004181 m_errorMonitor->VerifyFound();
4182 // same test for dstSubresource
4183 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4184 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004185 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004186 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004187 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004188 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4189 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004190 m_errorMonitor->VerifyFound();
4191
sfricke-samsung6141db32020-10-26 03:31:38 -07004192 // Aspect Memory Plane mask is illegal
4193 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4194 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4195 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4196 // These aspect/format mismatches are redundant but unavoidable here
4197 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4198 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4199 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4200 m_errorMonitor->VerifyFound();
4201
unknown088160a2019-05-23 17:43:13 -06004202 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4203 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004204 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004205
4206 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004207 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004208 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004209 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004210 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4211 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004212 m_errorMonitor->VerifyFound();
4213
4214 // Aspect mask doesn't match dest image format
4215 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4216 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004217 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004218 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004219 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004220 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4221 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004222 m_errorMonitor->VerifyFound();
4223
4224 m_commandBuffer->end();
4225}
4226
4227TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004228 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004229
4230 ASSERT_NO_FATAL_FAILURE(Init());
4231
4232 // Create two images of sample count 1 and try to Resolve between them
4233
4234 VkImageCreateInfo image_create_info = {};
4235 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4236 image_create_info.pNext = NULL;
4237 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4238 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4239 image_create_info.extent.width = 32;
4240 image_create_info.extent.height = 1;
4241 image_create_info.extent.depth = 1;
4242 image_create_info.mipLevels = 1;
4243 image_create_info.arrayLayers = 1;
4244 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4245 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4246 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4247 image_create_info.flags = 0;
4248
4249 VkImageObj srcImage(m_device);
4250 srcImage.init(&image_create_info);
4251 ASSERT_TRUE(srcImage.initialized());
4252
4253 VkImageObj dstImage(m_device);
4254 dstImage.init(&image_create_info);
4255 ASSERT_TRUE(dstImage.initialized());
4256
4257 m_commandBuffer->begin();
4258 VkImageResolve resolveRegion;
4259 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4260 resolveRegion.srcSubresource.mipLevel = 0;
4261 resolveRegion.srcSubresource.baseArrayLayer = 0;
4262 resolveRegion.srcSubresource.layerCount = 1;
4263 resolveRegion.srcOffset.x = 0;
4264 resolveRegion.srcOffset.y = 0;
4265 resolveRegion.srcOffset.z = 0;
4266 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4267 resolveRegion.dstSubresource.mipLevel = 0;
4268 resolveRegion.dstSubresource.baseArrayLayer = 0;
4269 resolveRegion.dstSubresource.layerCount = 1;
4270 resolveRegion.dstOffset.x = 0;
4271 resolveRegion.dstOffset.y = 0;
4272 resolveRegion.dstOffset.z = 0;
4273 resolveRegion.extent.width = 1;
4274 resolveRegion.extent.height = 1;
4275 resolveRegion.extent.depth = 1;
4276 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4277 &resolveRegion);
4278 m_commandBuffer->end();
4279
4280 m_errorMonitor->VerifyFound();
4281}
4282
4283TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004284 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004285
4286 ASSERT_NO_FATAL_FAILURE(Init());
4287
4288 // Create two images of sample count 4 and try to Resolve between them
4289
4290 VkImageCreateInfo image_create_info = {};
4291 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4292 image_create_info.pNext = NULL;
4293 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4294 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4295 image_create_info.extent.width = 32;
4296 image_create_info.extent.height = 1;
4297 image_create_info.extent.depth = 1;
4298 image_create_info.mipLevels = 1;
4299 image_create_info.arrayLayers = 1;
4300 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4301 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4302 // Note: Some implementations expect color attachment usage for any
4303 // multisample surface
4304 image_create_info.usage =
4305 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4306 image_create_info.flags = 0;
4307
4308 VkImageObj srcImage(m_device);
4309 srcImage.init(&image_create_info);
4310 ASSERT_TRUE(srcImage.initialized());
4311
4312 VkImageObj dstImage(m_device);
4313 dstImage.init(&image_create_info);
4314 ASSERT_TRUE(dstImage.initialized());
4315
4316 m_commandBuffer->begin();
4317 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4318 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4319 // VK_IMAGE_LAYOUT_GENERAL = 1,
4320 VkImageResolve resolveRegion;
4321 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4322 resolveRegion.srcSubresource.mipLevel = 0;
4323 resolveRegion.srcSubresource.baseArrayLayer = 0;
4324 resolveRegion.srcSubresource.layerCount = 1;
4325 resolveRegion.srcOffset.x = 0;
4326 resolveRegion.srcOffset.y = 0;
4327 resolveRegion.srcOffset.z = 0;
4328 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4329 resolveRegion.dstSubresource.mipLevel = 0;
4330 resolveRegion.dstSubresource.baseArrayLayer = 0;
4331 resolveRegion.dstSubresource.layerCount = 1;
4332 resolveRegion.dstOffset.x = 0;
4333 resolveRegion.dstOffset.y = 0;
4334 resolveRegion.dstOffset.z = 0;
4335 resolveRegion.extent.width = 1;
4336 resolveRegion.extent.height = 1;
4337 resolveRegion.extent.depth = 1;
4338 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4339 &resolveRegion);
4340 m_commandBuffer->end();
4341
4342 m_errorMonitor->VerifyFound();
4343}
4344
4345TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004346 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004347
4348 ASSERT_NO_FATAL_FAILURE(Init());
4349
4350 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004351 VkImageObj srcImage(m_device);
4352 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004353
4354 VkImageCreateInfo image_create_info = {};
4355 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4356 image_create_info.pNext = NULL;
4357 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4358 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4359 image_create_info.extent.width = 32;
4360 image_create_info.extent.height = 1;
4361 image_create_info.extent.depth = 1;
4362 image_create_info.mipLevels = 1;
4363 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004364 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004365 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4366 // Note: Some implementations expect color attachment usage for any
4367 // multisample surface
4368 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4369 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004370 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004371
4372 // Set format to something other than source image
4373 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4374 // Note: Some implementations expect color attachment usage for any
4375 // multisample surface
4376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4377 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004378 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004379
4380 m_commandBuffer->begin();
4381 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4382 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4383 // VK_IMAGE_LAYOUT_GENERAL = 1,
4384 VkImageResolve resolveRegion;
4385 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4386 resolveRegion.srcSubresource.mipLevel = 0;
4387 resolveRegion.srcSubresource.baseArrayLayer = 0;
4388 resolveRegion.srcSubresource.layerCount = 1;
4389 resolveRegion.srcOffset.x = 0;
4390 resolveRegion.srcOffset.y = 0;
4391 resolveRegion.srcOffset.z = 0;
4392 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4393 resolveRegion.dstSubresource.mipLevel = 0;
4394 resolveRegion.dstSubresource.baseArrayLayer = 0;
4395 resolveRegion.dstSubresource.layerCount = 1;
4396 resolveRegion.dstOffset.x = 0;
4397 resolveRegion.dstOffset.y = 0;
4398 resolveRegion.dstOffset.z = 0;
4399 resolveRegion.extent.width = 1;
4400 resolveRegion.extent.height = 1;
4401 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004402 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4403 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004404 m_commandBuffer->end();
4405
4406 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004407}
4408
4409TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004410 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004411
4412 ASSERT_NO_FATAL_FAILURE(Init());
4413
4414 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004415 VkImageObj srcImage(m_device);
4416 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004417
4418 VkImageCreateInfo image_create_info = {};
4419 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4420 image_create_info.pNext = NULL;
4421 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4422 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4423 image_create_info.extent.width = 32;
4424 image_create_info.extent.height = 1;
4425 image_create_info.extent.depth = 1;
4426 image_create_info.mipLevels = 1;
4427 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004428 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004429 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4430 // Note: Some implementations expect color attachment usage for any
4431 // multisample surface
4432 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4433 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004434 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004435
4436 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4437 // Note: Some implementations expect color attachment usage for any
4438 // multisample surface
4439 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4440 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004441 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004442
4443 m_commandBuffer->begin();
4444 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4445 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4446 // VK_IMAGE_LAYOUT_GENERAL = 1,
4447 VkImageResolve resolveRegion;
4448 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4449 resolveRegion.srcSubresource.mipLevel = 0;
4450 resolveRegion.srcSubresource.baseArrayLayer = 0;
4451 resolveRegion.srcSubresource.layerCount = 1;
4452 resolveRegion.srcOffset.x = 0;
4453 resolveRegion.srcOffset.y = 0;
4454 resolveRegion.srcOffset.z = 0;
4455 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4456 resolveRegion.dstSubresource.mipLevel = 0;
4457 resolveRegion.dstSubresource.baseArrayLayer = 0;
4458 resolveRegion.dstSubresource.layerCount = 1;
4459 resolveRegion.dstOffset.x = 0;
4460 resolveRegion.dstOffset.y = 0;
4461 resolveRegion.dstOffset.z = 0;
4462 resolveRegion.extent.width = 1;
4463 resolveRegion.extent.height = 1;
4464 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004465 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4466 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004467 m_commandBuffer->end();
4468
4469 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004470}
4471
4472TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4473 ASSERT_NO_FATAL_FAILURE(Init());
4474
4475 // Create two images of different types and try to copy between them
4476 VkImageObj srcImage(m_device);
4477 VkImageObj dstImage(m_device);
4478
4479 VkImageCreateInfo image_create_info = {};
4480 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4481 image_create_info.pNext = NULL;
4482 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4483 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4484 image_create_info.extent.width = 32;
4485 image_create_info.extent.height = 32;
4486 image_create_info.extent.depth = 1;
4487 image_create_info.mipLevels = 1;
4488 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004489 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004490 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4491 image_create_info.usage =
4492 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4493 // Note: Some implementations expect color attachment usage for any
4494 // multisample surface
4495 image_create_info.flags = 0;
4496 srcImage.init(&image_create_info);
4497 ASSERT_TRUE(srcImage.initialized());
4498
4499 // Note: Some implementations expect color attachment usage for any
4500 // multisample surface
4501 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4502 dstImage.init(&image_create_info);
4503 ASSERT_TRUE(dstImage.initialized());
4504
4505 m_commandBuffer->begin();
4506 // source image must have valid contents before resolve
4507 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4508 VkImageSubresourceRange subresource = {};
4509 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4510 subresource.layerCount = 1;
4511 subresource.levelCount = 1;
4512 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4513 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4514 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4515 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4516
4517 VkImageResolve resolveRegion;
4518 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4519 resolveRegion.srcSubresource.mipLevel = 0;
4520 resolveRegion.srcSubresource.baseArrayLayer = 0;
4521 resolveRegion.srcSubresource.layerCount = 1;
4522 resolveRegion.srcOffset.x = 0;
4523 resolveRegion.srcOffset.y = 0;
4524 resolveRegion.srcOffset.z = 0;
4525 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4526 resolveRegion.dstSubresource.mipLevel = 0;
4527 resolveRegion.dstSubresource.baseArrayLayer = 0;
4528 resolveRegion.dstSubresource.layerCount = 1;
4529 resolveRegion.dstOffset.x = 0;
4530 resolveRegion.dstOffset.y = 0;
4531 resolveRegion.dstOffset.z = 0;
4532 resolveRegion.extent.width = 1;
4533 resolveRegion.extent.height = 1;
4534 resolveRegion.extent.depth = 1;
4535 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004536 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004537 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4538 1, &resolveRegion);
4539 m_errorMonitor->VerifyFound();
4540 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004541 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004542 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4543 1, &resolveRegion);
4544 m_errorMonitor->VerifyFound();
4545 m_commandBuffer->end();
4546}
4547
4548TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004549 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4550
4551 bool copy_commands2 = false;
4552 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4553 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4554 copy_commands2 = true;
4555 }
4556 ASSERT_NO_FATAL_FAILURE(InitState());
4557
4558 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4559 if (copy_commands2) {
4560 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4561 }
unknown088160a2019-05-23 17:43:13 -06004562
4563 // Create two images of different types and try to copy between them
4564 VkImageObj srcImage(m_device);
4565 VkImageObj dstImage(m_device);
4566
4567 VkImageCreateInfo image_create_info = {};
4568 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4569 image_create_info.pNext = NULL;
4570 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4571 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4572 image_create_info.extent.width = 32;
4573 image_create_info.extent.height = 32;
4574 image_create_info.extent.depth = 1;
4575 image_create_info.mipLevels = 1;
4576 image_create_info.arrayLayers = 1;
sfricke-samsungf46582f2021-03-31 02:02:37 -07004577 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
unknown088160a2019-05-23 17:43:13 -06004578 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4579 image_create_info.usage =
4580 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4581 // Note: Some implementations expect color attachment usage for any
4582 // multisample surface
4583 image_create_info.flags = 0;
4584 srcImage.init(&image_create_info);
4585 ASSERT_TRUE(srcImage.initialized());
4586
4587 // Note: Some implementations expect color attachment usage for any
4588 // multisample surface
4589 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4590 dstImage.init(&image_create_info);
4591 ASSERT_TRUE(dstImage.initialized());
4592
4593 m_commandBuffer->begin();
4594 // source image must have valid contents before resolve
4595 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4596 VkImageSubresourceRange subresource = {};
4597 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4598 subresource.layerCount = 1;
4599 subresource.levelCount = 1;
4600 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4601 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4602 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4603 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4604
4605 VkImageResolve resolveRegion;
4606 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4607 resolveRegion.srcSubresource.mipLevel = 0;
4608 resolveRegion.srcSubresource.baseArrayLayer = 0;
4609 resolveRegion.srcSubresource.layerCount = 1;
4610 resolveRegion.srcOffset.x = 0;
4611 resolveRegion.srcOffset.y = 0;
4612 resolveRegion.srcOffset.z = 0;
4613 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4614 resolveRegion.dstSubresource.mipLevel = 0;
4615 resolveRegion.dstSubresource.baseArrayLayer = 0;
4616 resolveRegion.dstSubresource.layerCount = 1;
4617 resolveRegion.dstOffset.x = 0;
4618 resolveRegion.dstOffset.y = 0;
4619 resolveRegion.dstOffset.z = 0;
4620 resolveRegion.extent.width = 1;
4621 resolveRegion.extent.height = 1;
4622 resolveRegion.extent.depth = 1;
4623 // invalid source mip level
4624 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004626 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4627 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4628 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004629
4630 // Equivalent test using KHR_copy_commands2
4631 if (copy_commands2 && vkCmdResolveImage2Function) {
4632 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4633 NULL,
4634 resolveRegion.srcSubresource,
4635 resolveRegion.srcOffset,
4636 resolveRegion.dstSubresource,
4637 resolveRegion.dstOffset,
4638 resolveRegion.extent};
4639 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4640 NULL,
4641 srcImage.image(),
4642 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4643 dstImage.image(),
4644 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4645 1,
4646 &resolveRegion2};
4647 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01709");
4648 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4649 m_errorMonitor->VerifyFound();
4650 }
4651
unknown088160a2019-05-23 17:43:13 -06004652 resolveRegion.srcSubresource.mipLevel = 0;
4653 // invalid dest mip level
4654 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004655 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004656 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4657 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4658 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004659
4660 // Equivalent test using KHR_copy_commands2
4661 if (copy_commands2 && vkCmdResolveImage2Function) {
4662 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4663 NULL,
4664 resolveRegion.srcSubresource,
4665 resolveRegion.srcOffset,
4666 resolveRegion.dstSubresource,
4667 resolveRegion.dstOffset,
4668 resolveRegion.extent};
4669 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4670 NULL,
4671 srcImage.image(),
4672 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4673 dstImage.image(),
4674 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4675 1,
4676 &resolveRegion2};
4677 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01710");
4678 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4679 m_errorMonitor->VerifyFound();
4680 }
4681
unknown088160a2019-05-23 17:43:13 -06004682 resolveRegion.dstSubresource.mipLevel = 0;
4683 // invalid source array layer range
4684 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004685 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004686 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4687 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4688 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004689
4690 // Equivalent test using KHR_copy_commands2
4691 if (copy_commands2 && vkCmdResolveImage2Function) {
4692 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4693 NULL,
4694 resolveRegion.srcSubresource,
4695 resolveRegion.srcOffset,
4696 resolveRegion.dstSubresource,
4697 resolveRegion.dstOffset,
4698 resolveRegion.extent};
4699 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4700 NULL,
4701 srcImage.image(),
4702 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4703 dstImage.image(),
4704 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4705 1,
4706 &resolveRegion2};
4707 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01711");
4708 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4709 m_errorMonitor->VerifyFound();
4710 }
4711
unknown088160a2019-05-23 17:43:13 -06004712 resolveRegion.srcSubresource.baseArrayLayer = 0;
4713 // invalid dest array layer range
4714 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004715 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004716 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4717 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4718 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004719
4720 // Equivalent test using KHR_copy_commands2
4721 if (copy_commands2 && vkCmdResolveImage2Function) {
4722 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4723 NULL,
4724 resolveRegion.srcSubresource,
4725 resolveRegion.srcOffset,
4726 resolveRegion.dstSubresource,
4727 resolveRegion.dstOffset,
4728 resolveRegion.extent};
4729 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4730 NULL,
4731 srcImage.image(),
4732 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4733 dstImage.image(),
4734 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4735 1,
4736 &resolveRegion2};
4737 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01712");
4738 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4739 m_errorMonitor->VerifyFound();
4740 }
4741
unknown088160a2019-05-23 17:43:13 -06004742 resolveRegion.dstSubresource.baseArrayLayer = 0;
4743
4744 m_commandBuffer->end();
4745}
4746
sfricke-samsungf78d0592020-06-11 21:34:44 -07004747TEST_F(VkLayerTest, ResolveImageImageType) {
4748 ASSERT_NO_FATAL_FAILURE(Init());
4749 // Create images of different types and try to resolve between them
4750 VkImageObj srcImage2D(m_device);
4751 VkImageObj dstImage1D(m_device);
4752 VkImageObj dstImage3D(m_device);
4753
4754 VkImageCreateInfo image_create_info = {};
4755 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4756 image_create_info.pNext = NULL;
4757 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4758 image_create_info.extent.width = 32;
4759 image_create_info.extent.height = 1;
4760 image_create_info.extent.depth = 1;
4761 image_create_info.mipLevels = 1;
4762 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
sfricke-samsungf46582f2021-03-31 02:02:37 -07004763 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT; // guarantee support from sampledImageColorSampleCounts
sfricke-samsungf78d0592020-06-11 21:34:44 -07004764 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4765 image_create_info.usage =
4766 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4767 // Note: Some implementations expect color attachment usage for any
4768 // multisample surface
4769 image_create_info.flags = 0;
4770
4771 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4772 srcImage2D.init(&image_create_info);
4773 ASSERT_TRUE(srcImage2D.initialized());
4774
4775 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4776 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4777 dstImage1D.init(&image_create_info);
4778 ASSERT_TRUE(dstImage1D.initialized());
4779
4780 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4781 image_create_info.extent.height = 16;
4782 image_create_info.extent.depth = 16;
4783 image_create_info.arrayLayers = 1;
4784 dstImage3D.init(&image_create_info);
4785 ASSERT_TRUE(dstImage3D.initialized());
4786
4787 m_commandBuffer->begin();
4788
4789 VkImageResolve resolveRegion;
4790 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4791 resolveRegion.srcSubresource.mipLevel = 0;
4792 resolveRegion.srcSubresource.baseArrayLayer = 0;
4793 resolveRegion.srcSubresource.layerCount = 1;
4794 resolveRegion.srcOffset.x = 0;
4795 resolveRegion.srcOffset.y = 0;
4796 resolveRegion.srcOffset.z = 0;
4797 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4798 resolveRegion.dstSubresource.mipLevel = 0;
4799 resolveRegion.dstSubresource.baseArrayLayer = 0;
4800 resolveRegion.dstSubresource.layerCount = 1;
4801 resolveRegion.dstOffset.x = 0;
4802 resolveRegion.dstOffset.y = 0;
4803 resolveRegion.dstOffset.z = 0;
4804 resolveRegion.extent.width = 1;
4805 resolveRegion.extent.height = 1;
4806 resolveRegion.extent.depth = 1;
4807
4808 // non-zero value baseArrayLayer
4809 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004810 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004811 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4812 &resolveRegion);
4813 m_errorMonitor->VerifyFound();
4814 resolveRegion.srcSubresource.baseArrayLayer = 0;
4815
4816 // Set height with 1D dstImage
4817 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004819 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004820 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4821 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004822 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4823 &resolveRegion);
4824 m_errorMonitor->VerifyFound();
4825 resolveRegion.extent.height = 1;
4826
4827 // Set depth with 1D dstImage and 2D srcImage
4828 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004829 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4830 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004831 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4832 &resolveRegion);
4833 m_errorMonitor->VerifyFound();
4834 resolveRegion.extent.depth = 1;
4835
4836 m_commandBuffer->end();
4837}
4838
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004839TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4840 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4841 ASSERT_NO_FATAL_FAILURE(Init());
4842
4843 VkImageObj srcImage2D(m_device);
4844 VkImageObj dstImage2D(m_device);
4845
4846 VkImageCreateInfo image_create_info = {};
4847 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4848 image_create_info.pNext = NULL;
4849 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4850 image_create_info.extent.width = 32;
4851 image_create_info.extent.height = 32;
4852 image_create_info.extent.depth = 1;
4853 image_create_info.mipLevels = 6; // full chain from 32x32 to 1x1
4854 image_create_info.arrayLayers = 1;
4855 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4856 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4857 image_create_info.usage =
4858 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4859 // Note: Some implementations expect color attachment usage for any
4860 // multisample surface
4861 image_create_info.flags = 0;
4862
4863 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4864 srcImage2D.init(&image_create_info);
4865 ASSERT_TRUE(srcImage2D.initialized());
4866
4867 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4868 dstImage2D.init(&image_create_info);
4869 ASSERT_TRUE(dstImage2D.initialized());
4870
4871 m_commandBuffer->begin();
4872
4873 VkImageResolve resolveRegion = {};
4874 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4875 resolveRegion.srcSubresource.mipLevel = 0;
4876 resolveRegion.srcSubresource.baseArrayLayer = 0;
4877 resolveRegion.srcSubresource.layerCount = 1;
4878 resolveRegion.srcOffset.x = 0;
4879 resolveRegion.srcOffset.y = 0;
4880 resolveRegion.srcOffset.z = 0;
4881 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4882 resolveRegion.dstSubresource.mipLevel = 0;
4883 resolveRegion.dstSubresource.baseArrayLayer = 0;
4884 resolveRegion.dstSubresource.layerCount = 1;
4885 resolveRegion.dstOffset.x = 0;
4886 resolveRegion.dstOffset.y = 0;
4887 resolveRegion.dstOffset.z = 0;
4888 resolveRegion.extent.width = 32;
4889 resolveRegion.extent.height = 32;
4890 resolveRegion.extent.depth = 1;
4891
4892 m_errorMonitor->ExpectSuccess();
4893 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4894 &resolveRegion);
4895 m_errorMonitor->VerifyNotFound();
4896
4897 // srcImage exceeded in x-dim
4898 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004899 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004900 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4901 &resolveRegion);
4902 m_errorMonitor->VerifyFound();
4903 resolveRegion.srcOffset.x = 0;
4904
4905 // dstImage exceeded in x-dim
4906 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004907 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004908 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4909 &resolveRegion);
4910 m_errorMonitor->VerifyFound();
4911 resolveRegion.dstOffset.x = 0;
4912
4913 // both image exceeded in y-dim because mipLevel 3 is a 4x4 size image
4914 resolveRegion.extent = {4, 8, 1};
4915 resolveRegion.srcSubresource.mipLevel = 3;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004916 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004917 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4918 &resolveRegion);
4919 m_errorMonitor->VerifyFound();
4920 resolveRegion.srcSubresource.mipLevel = 0;
4921
4922 resolveRegion.dstSubresource.mipLevel = 3;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004923 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004924 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4925 &resolveRegion);
4926 m_errorMonitor->VerifyFound();
4927 resolveRegion.dstSubresource.mipLevel = 0;
4928
4929 // srcImage exceeded in z-dim
4930 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004931 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4932 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004933 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4934 &resolveRegion);
4935 m_errorMonitor->VerifyFound();
4936 resolveRegion.srcOffset.z = 0;
4937
4938 // dstImage exceeded in z-dim
4939 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004940 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4941 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004942 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4943 &resolveRegion);
4944 m_errorMonitor->VerifyFound();
4945 resolveRegion.dstOffset.z = 0;
4946
4947 m_commandBuffer->end();
4948}
4949
unknown088160a2019-05-23 17:43:13 -06004950TEST_F(VkLayerTest, ClearImageErrors) {
4951 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4952
4953 ASSERT_NO_FATAL_FAILURE(Init());
4954 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4955
4956 m_commandBuffer->begin();
4957
4958 // Color image
4959 VkClearColorValue clear_color;
4960 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4961 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4962 const int32_t img_width = 32;
4963 const int32_t img_height = 32;
4964 VkImageCreateInfo image_create_info = {};
4965 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4966 image_create_info.pNext = NULL;
4967 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4968 image_create_info.format = color_format;
4969 image_create_info.extent.width = img_width;
4970 image_create_info.extent.height = img_height;
4971 image_create_info.extent.depth = 1;
4972 image_create_info.mipLevels = 1;
4973 image_create_info.arrayLayers = 1;
4974 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4975 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4976
4977 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4978 vk_testing::Image color_image_no_transfer;
4979 color_image_no_transfer.init(*m_device, image_create_info);
4980
4981 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4982 vk_testing::Image color_image;
4983 color_image.init(*m_device, image_create_info);
4984
4985 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4986
4987 // Depth/Stencil image
4988 VkClearDepthStencilValue clear_value = {0};
4989 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4990 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4991 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4992 ds_image_create_info.extent.width = 64;
4993 ds_image_create_info.extent.height = 64;
4994 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4995 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4996
4997 vk_testing::Image ds_image;
4998 ds_image.init(*m_device, ds_image_create_info);
4999
5000 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
5001
sfricke-samsungcd924d92020-05-20 23:51:17 -07005002 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06005003
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005004 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06005005
5006 m_errorMonitor->VerifyFound();
5007
sfricke-samsungcd924d92020-05-20 23:51:17 -07005008 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06005009
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005010 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
5011 &color_range);
unknown088160a2019-05-23 17:43:13 -06005012
5013 m_errorMonitor->VerifyFound();
5014
5015 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07005016 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07005017 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06005018
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005019 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5020 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06005021
5022 m_errorMonitor->VerifyFound();
5023}
5024
5025TEST_F(VkLayerTest, CommandQueueFlags) {
5026 TEST_DESCRIPTION(
5027 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
5028
5029 ASSERT_NO_FATAL_FAILURE(Init());
5030
5031 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5032 if (queueFamilyIndex == UINT32_MAX) {
5033 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5034 return;
5035 } else {
5036 // Create command pool on a non-graphics queue
5037 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5038
5039 // Setup command buffer on pool
5040 VkCommandBufferObj command_buffer(m_device, &command_pool);
5041 command_buffer.begin();
5042
5043 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07005044 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005045 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5046 command_buffer.SetViewport(0, 1, &viewport);
5047 m_errorMonitor->VerifyFound();
5048 }
5049}
5050
sfricke-samsung674ba102020-08-18 22:38:49 -07005051TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
5052 TEST_DESCRIPTION(
5053 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
5054 "buffer");
5055
5056 ASSERT_NO_FATAL_FAILURE(Init());
5057
5058 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
5059 if (queueFamilyIndex == UINT32_MAX) {
5060 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
5061 return;
5062 } else {
5063 // Create Depth image
5064 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
5065 if (ds_format == VK_FORMAT_UNDEFINED) {
5066 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
5067 return;
5068 }
5069
5070 VkImageObj ds_image(m_device);
5071 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
5072 VK_IMAGE_TILING_OPTIMAL, 0);
5073 ASSERT_TRUE(ds_image.initialized());
5074
5075 // Allocate buffers
5076 VkBufferObj buffer;
5077 VkMemoryPropertyFlags reqs = 0;
5078 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5079
5080 VkBufferImageCopy region = {};
5081 region.bufferRowLength = 0;
5082 region.bufferImageHeight = 0;
5083 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
5084 region.imageSubresource.layerCount = 1;
5085 region.imageOffset = {0, 0, 0};
5086 region.imageExtent = {64, 64, 1};
5087 region.bufferOffset = 0;
5088
5089 // Create command pool on a non-graphics queue
5090 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5091
5092 // Setup command buffer on pool
5093 VkCommandBufferObj command_buffer(m_device, &command_pool);
5094 command_buffer.begin();
5095
sfricke-samsungea4fd142020-10-17 23:51:59 -07005096 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005097 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5098 1, &region);
5099 m_errorMonitor->VerifyFound();
5100 }
5101}
5102
sfricke-samsung5a019492021-01-25 10:32:08 -08005103TEST_F(VkLayerTest, ImageCopyTransferQueueFlags) {
5104 TEST_DESCRIPTION(
5105 "Allocate a command buffer on a queue that does not support graphics/compute and try to issue an invalid image copy to "
5106 "buffer");
5107
5108 ASSERT_NO_FATAL_FAILURE(Init());
5109
5110 // Should be left with a tranfser queue
5111 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT | VK_QUEUE_COMPUTE_BIT);
5112 if (queueFamilyIndex == UINT32_MAX) {
5113 printf("%s Non-graphics/compute queue family not found; skipped.\n", kSkipPrefix);
5114 return;
5115 }
5116
5117 VkImageObj image(m_device);
5118 image.Init(32, 32, 1, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT,
5119 VK_IMAGE_TILING_OPTIMAL, 0);
5120 ASSERT_TRUE(image.initialized());
5121
5122 // Allocate buffers
5123 VkBufferObj buffer;
5124 VkMemoryPropertyFlags reqs = 0;
5125 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
5126
5127 VkBufferImageCopy region = {};
5128 region.bufferRowLength = 0;
5129 region.bufferImageHeight = 0;
5130 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5131 region.imageSubresource.layerCount = 1;
5132 region.imageOffset = {0, 0, 0};
5133 region.imageExtent = {16, 16, 1};
5134 region.bufferOffset = 5;
5135
5136 // Create command pool on a non-graphics queue
5137 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5138
5139 // Setup command buffer on pool
5140 VkCommandBufferObj command_buffer(m_device, &command_pool);
5141 command_buffer.begin();
5142
5143 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
5144 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04052");
5145 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5146 &region);
5147 m_errorMonitor->VerifyFound();
5148}
5149
sfricke-samsungcb467672020-11-25 00:09:28 -08005150TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5151 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5152
5153 ASSERT_NO_FATAL_FAILURE(Init());
5154
5155 if (m_device->queue_props.size() < 2) {
5156 printf("%s Need 2 different queues for testing skipping.\n", kSkipPrefix);
5157 return;
5158 }
5159
5160 // First two queue families
5161 uint32_t queue_index_A = 0;
5162 uint32_t queue_index_B = 1;
5163
5164 VkCommandPoolCreateInfo pool_create_info = {};
5165 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5166 pool_create_info.pNext = nullptr;
5167 pool_create_info.flags = 0;
5168
5169 VkCommandPool command_pool_A;
5170 pool_create_info.queueFamilyIndex = queue_index_A;
5171 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_A);
5172
5173 VkCommandPool command_pool_B;
5174 pool_create_info.queueFamilyIndex = queue_index_B;
5175 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_B);
5176
5177 VkCommandBuffer command_buffer[2]; // [0] primary and [1] secondary
5178 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5179 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5180 command_buffer_allocate_info.commandBufferCount = 1;
5181 command_buffer_allocate_info.commandPool = command_pool_A;
5182 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5183 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[0]);
5184
5185 command_buffer_allocate_info.commandPool = command_pool_B;
5186 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5187 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[1]);
5188
5189 VkCommandBufferBeginInfo begin_info = {};
5190 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5191
5192 // secondary
5193 vk::BeginCommandBuffer(command_buffer[1], &begin_info);
5194 vk::EndCommandBuffer(command_buffer[1]);
5195
5196 // Try using different pool's command buffer as secondary
5197 vk::BeginCommandBuffer(command_buffer[0], &begin_info);
5198 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
5199 vk::CmdExecuteCommands(command_buffer[0], 1, &command_buffer[1]);
5200 m_errorMonitor->VerifyFound();
5201 vk::EndCommandBuffer(command_buffer[0]);
5202
5203 vk::DestroyCommandPool(m_device->device(), command_pool_A, NULL);
5204 vk::DestroyCommandPool(m_device->device(), command_pool_B, NULL);
5205}
5206
unknown088160a2019-05-23 17:43:13 -06005207TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5208 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5209 ASSERT_NO_FATAL_FAILURE(Init());
5210 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5211 // never record secondary
5212
Mark Lobodzinski20310782020-02-28 14:25:17 -07005213 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005214 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005215 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005216 m_errorMonitor->VerifyFound();
5217 m_commandBuffer->end();
5218}
5219
5220TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5221 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5222
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005223 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005224 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5225
5226 VkImageCreateInfo image_create_info = {};
5227 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5228 image_create_info.pNext = NULL;
5229 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5230 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5231 image_create_info.extent.width = 32;
5232 image_create_info.extent.height = 1;
5233 image_create_info.extent.depth = 1;
5234 image_create_info.mipLevels = 1;
5235 image_create_info.arrayLayers = 1;
5236 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5237 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5238 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5239 image_create_info.flags = 0;
5240
5241 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5242 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5243
5244 VkImageObj image(m_device);
5245 image.init(&image_create_info);
5246 ASSERT_TRUE(image.initialized());
5247 VkImageMemoryBarrier image_barrier =
5248 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5249
5250 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5251 image_barrier.oldLayout = old_layout;
5252 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005253 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5254 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005255 };
5256
5257 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5258 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5259 secondary.begin();
5260 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5261 secondary.end();
5262
Mark Lobodzinski20310782020-02-28 14:25:17 -07005263 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005264 m_commandBuffer->begin();
5265 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005266 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005267 m_errorMonitor->VerifyFound();
5268
unknown088160a2019-05-23 17:43:13 -06005269 m_commandBuffer->reset();
5270 secondary.reset();
5271
5272 // Validate that UNDEFINED doesn't false positive on us
5273 secondary.begin();
5274 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5275 secondary.end();
5276 m_commandBuffer->begin();
5277 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5278 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005279 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005280 m_errorMonitor->VerifyNotFound();
5281 m_commandBuffer->end();
5282}
5283
5284TEST_F(VkLayerTest, SetDynViewportParamTests) {
5285 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5286
5287 SetTargetApiVersion(VK_API_VERSION_1_1);
5288 VkPhysicalDeviceFeatures features{};
5289 ASSERT_NO_FATAL_FAILURE(Init(&features));
5290
5291 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5292 const VkViewport viewports[] = {vp, vp};
5293
5294 m_commandBuffer->begin();
5295
5296 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005297 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005298 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005299 m_errorMonitor->VerifyFound();
5300
Mark Lobodzinski20310782020-02-28 14:25:17 -07005301 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005302 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005303 m_errorMonitor->VerifyFound();
5304
Mark Lobodzinski20310782020-02-28 14:25:17 -07005305 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005306 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005307 m_errorMonitor->VerifyFound();
5308
Mark Lobodzinski20310782020-02-28 14:25:17 -07005309 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5310 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005311 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005312 m_errorMonitor->VerifyFound();
5313
Mark Lobodzinski20310782020-02-28 14:25:17 -07005314 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005315 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005316 m_errorMonitor->VerifyFound();
5317
5318 // core viewport tests
5319 using std::vector;
5320 struct TestCase {
5321 VkViewport vp;
5322 std::string veid;
5323 };
5324
5325 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5326 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5327 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5328
5329 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5330 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5331 const auto one_before_min_bounds = NearestSmaller(min_bound);
5332 const auto one_past_max_bounds = NearestGreater(max_bound);
5333
5334 const auto below_zero = NearestSmaller(0.0f);
5335 const auto past_one = NearestGreater(1.0f);
5336
5337 vector<TestCase> test_cases = {
5338 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5339 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5340 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5341 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5342 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5343 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5344 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5345 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5346 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5347 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5348 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5349 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5350 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5351 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5352 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5353 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5354 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5355 };
5356
5357 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5358 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5359 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5360 } else {
5361 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5362 }
5363
5364 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005365 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005366 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005367 m_errorMonitor->VerifyFound();
5368 }
5369}
5370
5371TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5372 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5373
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005374 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005375
5376 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
5377 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
5378 } else {
5379 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5380 return;
5381 }
5382 ASSERT_NO_FATAL_FAILURE(InitState());
5383
5384 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5385}
5386
5387TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5388 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5389
5390 ASSERT_NO_FATAL_FAILURE(Init());
5391
5392 if (!m_device->phy().features().multiViewport) {
5393 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5394 return;
5395 }
5396
unknown088160a2019-05-23 17:43:13 -06005397 m_commandBuffer->begin();
5398
Mark Lobodzinski20310782020-02-28 14:25:17 -07005399 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005400 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005401 m_errorMonitor->VerifyFound();
5402
Petr Kraus14e49492019-09-09 20:13:29 +02005403 const auto max_viewports = m_device->props.limits.maxViewports;
5404
Mark Lobodzinski20310782020-02-28 14:25:17 -07005405 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005406 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005407 m_errorMonitor->VerifyFound();
5408
Petr Kraus14e49492019-09-09 20:13:29 +02005409 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5410 if (max_viewports >= too_big_max_viewports) {
5411 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5412 kSkipPrefix);
5413 } else {
5414 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5415 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5416
Mark Lobodzinski20310782020-02-28 14:25:17 -07005417 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005418 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005419 m_errorMonitor->VerifyFound();
5420
Mark Lobodzinski20310782020-02-28 14:25:17 -07005421 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005422 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005423 m_errorMonitor->VerifyFound();
5424
Mark Lobodzinski20310782020-02-28 14:25:17 -07005425 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005426 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005427 m_errorMonitor->VerifyFound();
5428
Mark Lobodzinski20310782020-02-28 14:25:17 -07005429 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005430 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005431 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005432 }
unknown088160a2019-05-23 17:43:13 -06005433}
5434
5435TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5436 TEST_DESCRIPTION(
5437 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5438
5439 ASSERT_NO_FATAL_FAILURE(Init());
5440 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5441
5442 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5443 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5444
5445 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5446 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5447 nullptr, // pNext
5448 m_renderPass,
5449 0, // subpass
5450 m_framebuffer,
5451 };
5452 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5453 nullptr, // pNext
5454 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5455
5456 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5457 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5458 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5459 sec_cmdbuff_inside_rp.end();
5460
5461 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5462 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5463 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5464 sec_cmdbuff_outside_rp.end();
5465
5466 m_commandBuffer->begin();
5467
Mark Lobodzinski20310782020-02-28 14:25:17 -07005468 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005469 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005470 m_errorMonitor->VerifyFound();
5471
5472 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5473 nullptr, // pNext
5474 m_renderPass,
5475 m_framebuffer,
5476 {{0, 0}, {32, 32}},
5477 static_cast<uint32_t>(m_renderPassClearValues.size()),
5478 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005479 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005480
Mark Lobodzinski20310782020-02-28 14:25:17 -07005481 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005482 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005483 m_errorMonitor->VerifyFound();
5484}
5485
5486TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5487 TEST_DESCRIPTION(
5488 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5489 ASSERT_NO_FATAL_FAILURE(Init());
5490 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5491
5492 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
5493 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5494 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5495 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5496 command_buffer_allocate_info.commandBufferCount = 1;
5497
5498 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005499 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
unknown088160a2019-05-23 17:43:13 -06005500 VkCommandBufferBeginInfo command_buffer_begin_info = {};
5501 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
5502 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5503 command_buffer_inheritance_info.renderPass = m_renderPass;
5504 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5505
5506 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5507 command_buffer_begin_info.flags =
5508 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5509 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5510
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005511 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005512 VkClearAttachment color_attachment;
5513 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5514 color_attachment.clearValue.color.float32[0] = 0;
5515 color_attachment.clearValue.color.float32[1] = 0;
5516 color_attachment.clearValue.color.float32[2] = 0;
5517 color_attachment.clearValue.color.float32[3] = 0;
5518 color_attachment.colorAttachment = 0;
5519 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005520 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005521 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5522 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005523 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005524 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005525
Mark Lobodzinski20310782020-02-28 14:25:17 -07005526 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005527 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005528 m_errorMonitor->VerifyFound();
5529
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005530 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005531 m_commandBuffer->end();
5532}
5533
5534TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5535 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
5536 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5537 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5538 } else {
5539 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5540 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5541 return;
5542 }
5543
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005544 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005545 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5546 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5547 } else {
5548 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5549 return;
5550 }
5551 ASSERT_NO_FATAL_FAILURE(InitState());
5552
5553 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5554 if (push_descriptor_prop.maxPushDescriptors < 1) {
5555 // Some implementations report an invalid maxPushDescriptors of 0
5556 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5557 return;
5558 }
5559
5560 // Create ordinary and push descriptor set layout
5561 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5562 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5563 ASSERT_TRUE(ds_layout.initialized());
5564 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5565 ASSERT_TRUE(push_ds_layout.initialized());
5566
5567 // Now use the descriptor set layouts to create a pipeline layout
5568 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5569 ASSERT_TRUE(pipeline_layout.initialized());
5570
5571 // Create a descriptor to push
5572 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5573 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5574 ASSERT_TRUE(buffer_obj.initialized());
5575
5576 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5577 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5578 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5579
5580 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5581 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5582
5583 // Find address of extension call and make the call
5584 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005585 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005586 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5587
5588 // Section 1: Queue family matching/capabilities.
5589 // Create command pool on a non-graphics queue
5590 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5591 const uint32_t transfer_only_qfi =
5592 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5593 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005594 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005595 } else {
5596 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5597
5598 VkCommandPoolObj command_pool(m_device, err_qfi);
5599 ASSERT_TRUE(command_pool.initialized());
5600 VkCommandBufferObj command_buffer(m_device, &command_pool);
5601 ASSERT_TRUE(command_buffer.initialized());
5602 command_buffer.begin();
5603
Mark Lobodzinski20310782020-02-28 14:25:17 -07005604 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5605 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005606 if (err_qfi == transfer_only_qfi) {
5607 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005608 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005609 }
5610 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5611 &descriptor_write);
5612 m_errorMonitor->VerifyFound();
5613 command_buffer.end();
5614
5615 // If we succeed in testing only one condition above, we need to test the other below.
5616 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5617 // Need to test the neither compute/gfx supported case separately.
5618 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5619 ASSERT_TRUE(tran_command_pool.initialized());
5620 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5621 ASSERT_TRUE(tran_command_buffer.initialized());
5622 tran_command_buffer.begin();
5623
5624 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5626 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5627 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005628 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5629 &descriptor_write);
5630 m_errorMonitor->VerifyFound();
5631 tran_command_buffer.end();
5632 }
5633 }
5634
5635 // Push to the non-push binding
5636 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005637 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005638 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5639 &descriptor_write);
5640 m_errorMonitor->VerifyFound();
5641
5642 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005643 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005644 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5645 &descriptor_write);
5646 m_errorMonitor->VerifyFound();
5647 m_commandBuffer->end();
5648
5649 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5650 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005651 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005652 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR()");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005653 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005654 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5655 &descriptor_write);
5656 m_errorMonitor->VerifyFound();
5657}
5658
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005659TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5660 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5661 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5662 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5663 } else {
5664 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5665 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5666 return;
5667 }
5668
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005669 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005670 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5671 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5672 } else {
5673 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5674 return;
5675 }
5676 ASSERT_NO_FATAL_FAILURE(InitState());
5677
5678 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5679 if (push_descriptor_prop.maxPushDescriptors < 1) {
5680 // Some implementations report an invalid maxPushDescriptors of 0.
5681 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5682 return;
5683 }
5684
5685 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5686 if (min_alignment == 0) {
5687 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5688 return;
5689 }
5690
5691 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5692 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5693 ASSERT_TRUE(push_ds_layout.initialized());
5694
5695 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5696 ASSERT_TRUE(pipeline_layout.initialized());
5697
5698 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5699 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5700 ASSERT_TRUE(buffer_obj.initialized());
5701
5702 // Use an invalid alignment.
5703 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5704 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5705 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5706
5707 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5708 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5709 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5710
5711 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005712 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005713 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5714 &descriptor_write);
5715 m_errorMonitor->VerifyFound();
5716
5717 m_commandBuffer->end();
5718}
5719
unknown088160a2019-05-23 17:43:13 -06005720TEST_F(VkLayerTest, SetDynScissorParamTests) {
5721 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5722
5723 VkPhysicalDeviceFeatures features{};
5724 ASSERT_NO_FATAL_FAILURE(Init(&features));
5725
5726 const VkRect2D scissor = {{0, 0}, {16, 16}};
5727 const VkRect2D scissors[] = {scissor, scissor};
5728
5729 m_commandBuffer->begin();
5730
5731 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005732 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005733 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005734 m_errorMonitor->VerifyFound();
5735
Mark Lobodzinski20310782020-02-28 14:25:17 -07005736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005737 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005738 m_errorMonitor->VerifyFound();
5739
Mark Lobodzinski20310782020-02-28 14:25:17 -07005740 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005741 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005742 m_errorMonitor->VerifyFound();
5743
Mark Lobodzinski20310782020-02-28 14:25:17 -07005744 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005746 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005747 m_errorMonitor->VerifyFound();
5748
Mark Lobodzinski20310782020-02-28 14:25:17 -07005749 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005750 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005751 m_errorMonitor->VerifyFound();
5752
5753 struct TestCase {
5754 VkRect2D scissor;
5755 std::string vuid;
5756 };
5757
5758 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5759 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5760 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5761 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5762 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5763 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5764 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5765 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5766
5767 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005769 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005770 m_errorMonitor->VerifyFound();
5771 }
5772
5773 m_commandBuffer->end();
5774}
5775
5776TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5777 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5778
5779 ASSERT_NO_FATAL_FAILURE(Init());
5780
5781 if (!m_device->phy().features().multiViewport) {
5782 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5783 return;
5784 }
5785
unknown088160a2019-05-23 17:43:13 -06005786 m_commandBuffer->begin();
5787
Mark Lobodzinski20310782020-02-28 14:25:17 -07005788 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005789 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005790 m_errorMonitor->VerifyFound();
5791
Petr Kraus14e49492019-09-09 20:13:29 +02005792 const auto max_scissors = m_device->props.limits.maxViewports;
5793
Mark Lobodzinski20310782020-02-28 14:25:17 -07005794 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005795 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005796 m_errorMonitor->VerifyFound();
5797
Petr Kraus14e49492019-09-09 20:13:29 +02005798 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5799 if (max_scissors >= too_big_max_scissors) {
5800 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5801 kSkipPrefix);
5802 } else {
5803 const VkRect2D scissor = {{0, 0}, {16, 16}};
5804 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5805
Mark Lobodzinski20310782020-02-28 14:25:17 -07005806 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005807 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005808 m_errorMonitor->VerifyFound();
5809
Mark Lobodzinski20310782020-02-28 14:25:17 -07005810 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005811 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005812 m_errorMonitor->VerifyFound();
5813
Mark Lobodzinski20310782020-02-28 14:25:17 -07005814 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005815 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005816 m_errorMonitor->VerifyFound();
5817
Mark Lobodzinski20310782020-02-28 14:25:17 -07005818 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005819 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005820 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005821 }
unknown088160a2019-05-23 17:43:13 -06005822}
5823
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005824TEST_F(VkLayerTest, IndirectDrawTests) {
5825 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06005826
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005827 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5828 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5829 } else {
5830 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5831 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5832 return;
5833 }
5834 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5835
5836 if (IsPlatform(kMockICD) || DeviceSimulation()) {
5837 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
5838 return;
5839 }
5840
5841 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
5842 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
5843 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
5844
5845 // Create a device and ensure multiDrawIndirect is disabled
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005846 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
5847 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005848 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
5849 features2.features.multiDrawIndirect = VK_FALSE;
5850
5851 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
unknown088160a2019-05-23 17:43:13 -06005852 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5853
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005854 CreatePipelineHelper pipe(*this);
5855 pipe.InitInfo();
5856 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5857 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5858 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5859 dyn_state_ci.dynamicStateCount = size(dyn_states);
5860 dyn_state_ci.pDynamicStates = dyn_states;
5861 pipe.dyn_state_ci_ = dyn_state_ci;
5862 pipe.InitState();
5863 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005864
5865 m_commandBuffer->begin();
5866 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5867
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005868 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5869 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5870 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005871
5872 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005873 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005874 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005875 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005876
5877 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5878 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5879 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005880 VkBufferObj draw_buffer;
5881 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005882
5883 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07005884 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005885 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005886 m_errorMonitor->VerifyFound();
5887
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005888 // VUID-vkCmdDrawIndirect-drawCount-02718
5889 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-02718");
5890 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
5891 m_errorMonitor->VerifyFound();
5892
5893 // VUID-vkCmdDrawIndexedIndirect-drawCount-02718
5894 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-02718");
5895 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
5896 m_errorMonitor->VerifyFound();
5897
unknown088160a2019-05-23 17:43:13 -06005898 m_commandBuffer->EndRenderPass();
5899 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06005900}
5901
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005902TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
5903 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
5904
5905 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5906 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5907 } else {
5908 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5909 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5910 return;
5911 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005912 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005913
5914 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
5915 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5916 } else {
5917 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07005918 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005919 }
5920
5921 ASSERT_NO_FATAL_FAILURE(InitState());
5922 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5923
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005924 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
5925 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005926 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
5927
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005928 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
5929 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
5930
5931 m_commandBuffer->begin();
5932 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5933 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5934 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5935 buffer_create_info.size = 1024;
5936 VkBufferObj counter_buffer;
5937 counter_buffer.init(*m_device, buffer_create_info);
5938
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005939 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07005940 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005941 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005942 m_errorMonitor->VerifyFound();
5943
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005944 // some mock ICD json files are missing a valid stride value
5945 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
5946 // non-4 multiple stride
sfricke-samsung6886c4b2021-01-16 08:37:35 -08005947 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-counterBufferOffset-04568");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005948 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
5949 m_errorMonitor->VerifyFound();
5950 }
5951
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005952 m_commandBuffer->EndRenderPass();
5953 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07005954
5955 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
5956 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
5957 return;
5958 }
5959
5960 std::vector<const char *> device_extension_names;
5961 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5962 VkDeviceObj test_device(0, gpu(), device_extension_names);
5963 VkCommandPoolObj commandPool(&test_device, 0);
5964 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
5965 VkBufferObj counter_buffer2;
5966 counter_buffer2.init(test_device, buffer_create_info);
5967 VkPipelineLayoutObj pipelineLayout(&test_device);
5968 VkRenderPass renderpass;
5969 VkRenderPassCreateInfo rp_info = {};
5970 VkSubpassDescription subpass = {};
5971 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5972 rp_info.pSubpasses = &subpass;
5973 rp_info.subpassCount = 1;
5974 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
5975 VkPipelineObj pipeline(&test_device);
5976 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
5977 pipeline.AddShader(&vs);
5978 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
5979 m_renderPassBeginInfo.renderPass = renderpass;
5980 VkFramebuffer fb;
5981 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
5982 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
5983 m_renderPassBeginInfo.framebuffer = fb;
5984 m_renderPassBeginInfo.renderPass = renderpass;
5985 commandBuffer.begin();
5986 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5987 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
5988 VkRect2D scissor = {{0, 0}, {16, 16}};
5989 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
5990 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
5991 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
5992 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08005993 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07005994 }
5995 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
5996 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
5997 m_errorMonitor->VerifyFound();
5998 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
5999 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07006000}
6001
unknown088160a2019-05-23 17:43:13 -06006002TEST_F(VkLayerTest, DrawIndirectCountKHR) {
6003 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
6004
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006005 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006006 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6007 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6008 } else {
6009 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6010 return;
6011 }
6012 ASSERT_NO_FATAL_FAILURE(InitState());
6013 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6014
6015 VkMemoryRequirements memory_requirements;
6016 VkMemoryAllocateInfo memory_allocate_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
6017
6018 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006019 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006020
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006021 CreatePipelineHelper pipe(*this);
6022 pipe.InitInfo();
6023 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6024 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6025 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6026 dyn_state_ci.dynamicStateCount = size(dyn_states);
6027 dyn_state_ci.pDynamicStates = dyn_states;
6028 pipe.dyn_state_ci_ = dyn_state_ci;
6029 pipe.InitState();
6030 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006031
6032 m_commandBuffer->begin();
6033 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6034
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006035 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6036 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6037 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006038
6039 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006040 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006041 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006042 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006043
6044 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6045 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
6046 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6047 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006048 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06006049
6050 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6051 count_buffer_create_info.size = sizeof(uint32_t);
6052 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006053 VkBufferObj count_buffer;
6054 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006055
Mike Schuchardt65847d92019-12-20 13:50:47 -08006056 // VUID-vkCmdDrawIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006057 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006058 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
6059 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006060 m_errorMonitor->VerifyFound();
6061
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006062 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06006063 memory_allocate_info.allocationSize = memory_requirements.size;
6064 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
6065 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006066 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
6067 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006068
6069 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006070 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006071
Mike Schuchardt65847d92019-12-20 13:50:47 -08006072 // VUID-vkCmdDrawIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006073 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06006074 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
6075 m_errorMonitor->VerifyFound();
6076
Mike Schuchardt65847d92019-12-20 13:50:47 -08006077 // VUID-vkCmdDrawIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006078 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006079 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
6080 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006081 m_errorMonitor->VerifyFound();
6082
Mike Schuchardt65847d92019-12-20 13:50:47 -08006083 // VUID-vkCmdDrawIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006084 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006085 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
6086 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06006087 m_errorMonitor->VerifyFound();
6088
Mike Schuchardt65847d92019-12-20 13:50:47 -08006089 // VUID-vkCmdDrawIndirectCount-stride-03110
Mark Lobodzinski20310782020-02-28 14:25:17 -07006090 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006091 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006092 m_errorMonitor->VerifyFound();
6093
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006094 // 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 -06006095 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006096 // VUID-vkCmdDrawIndirectCount-renderPass-02684
6097 // VUID-vkCmdDrawIndirectCount-subpass-02685
6098 // VUID-vkCmdDrawIndirectCount-commandBuffer-02701
unknown088160a2019-05-23 17:43:13 -06006099
6100 m_commandBuffer->EndRenderPass();
6101 m_commandBuffer->end();
6102
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006103 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
6104 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006105
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006106 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06006107}
6108
6109TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
6110 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
6111
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006112 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006113 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
6114 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
6115 } else {
6116 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
6117 return;
6118 }
6119 ASSERT_NO_FATAL_FAILURE(InitState());
6120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6121
unknown088160a2019-05-23 17:43:13 -06006122 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006123 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06006124
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006125 CreatePipelineHelper pipe(*this);
6126 pipe.InitInfo();
6127 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
6128 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
6129 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
6130 dyn_state_ci.dynamicStateCount = size(dyn_states);
6131 dyn_state_ci.pDynamicStates = dyn_states;
6132 pipe.dyn_state_ci_ = dyn_state_ci;
6133 pipe.InitState();
6134 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006135
6136 m_commandBuffer->begin();
6137 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6138
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006139 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6140 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6141 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006142
6143 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006144 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006145 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006146 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006147
6148 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6149 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6150 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006151 VkBufferObj draw_buffer;
6152 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006153
6154 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6155 count_buffer_create_info.size = sizeof(uint32_t);
6156 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006157 VkBufferObj count_buffer;
6158 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006159
6160 VkBufferCreateInfo index_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6161 index_buffer_create_info.size = sizeof(uint32_t);
6162 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006163 VkBufferObj index_buffer;
6164 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006165
Mike Schuchardt65847d92019-12-20 13:50:47 -08006166 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial - only tests whether the index buffer is bound)
Mark Lobodzinski20310782020-02-28 14:25:17 -07006167 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006168 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006169 sizeof(VkDrawIndexedIndirectCommand));
6170 m_errorMonitor->VerifyFound();
6171
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006172 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006173
6174 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006175 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006176
Mike Schuchardt65847d92019-12-20 13:50:47 -08006177 // VUID-vkCmdDrawIndexedIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006178 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006179 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006180 sizeof(VkDrawIndexedIndirectCommand));
6181 m_errorMonitor->VerifyFound();
6182
6183 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006184 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006185
Mike Schuchardt65847d92019-12-20 13:50:47 -08006186 // VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006187 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006188 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06006189 sizeof(VkDrawIndexedIndirectCommand));
6190 m_errorMonitor->VerifyFound();
6191
Mike Schuchardt65847d92019-12-20 13:50:47 -08006192 // VUID-vkCmdDrawIndexedIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006193 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006194 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006195 sizeof(VkDrawIndexedIndirectCommand));
6196 m_errorMonitor->VerifyFound();
6197
Mike Schuchardt65847d92019-12-20 13:50:47 -08006198 // VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006199 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006200 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006201 sizeof(VkDrawIndexedIndirectCommand));
6202 m_errorMonitor->VerifyFound();
6203
Mike Schuchardt65847d92019-12-20 13:50:47 -08006204 // VUID-vkCmdDrawIndexedIndirectCount-stride-03142
Mark Lobodzinski20310782020-02-28 14:25:17 -07006205 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006206 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006207 m_errorMonitor->VerifyFound();
6208
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006209 // 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 -06006210 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006211 // VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684
6212 // VUID-vkCmdDrawIndexedIndirectCount-subpass-02685
6213 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial)
unknown088160a2019-05-23 17:43:13 -06006214
6215 m_commandBuffer->EndRenderPass();
6216 m_commandBuffer->end();
6217
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006218 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
6219 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006220}
6221
sfricke-samsung860d3b22020-05-04 21:08:29 -07006222TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6223 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6224
6225 SetTargetApiVersion(VK_API_VERSION_1_2);
6226 ASSERT_NO_FATAL_FAILURE(Init());
6227 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6228 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
6229 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
6230 return;
6231 }
6232
6233 VkBufferObj indirect_buffer;
6234 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6235 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6236
6237 VkBufferObj indexed_indirect_buffer;
6238 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6239 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6240
6241 VkBufferObj count_buffer;
6242 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6243
6244 VkBufferObj index_buffer;
6245 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6246
6247 CreatePipelineHelper pipe(*this);
6248 pipe.InitInfo();
6249 pipe.InitState();
6250 pipe.CreateGraphicsPipeline();
6251
6252 // Make calls to valid commands but without the drawIndirectCount feature set
6253 m_commandBuffer->begin();
6254 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6255
6256 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6257
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006258 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006259 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6260 sizeof(VkDrawIndirectCommand));
6261 m_errorMonitor->VerifyFound();
6262
6263 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6264
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006265 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006266 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6267 sizeof(VkDrawIndexedIndirectCommand));
6268 m_errorMonitor->VerifyFound();
6269
6270 m_commandBuffer->EndRenderPass();
6271 m_commandBuffer->end();
6272}
6273
unknown088160a2019-05-23 17:43:13 -06006274TEST_F(VkLayerTest, ExclusiveScissorNV) {
6275 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6276
6277 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6278 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6279 } else {
6280 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6281 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6282 return;
6283 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006284 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006285 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6286 for (auto device_extension : required_device_extensions) {
6287 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6288 m_device_extension_names.push_back(device_extension);
6289 } else {
6290 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6291 return;
6292 }
6293 }
6294
6295 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006296 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006297 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6298
6299 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006300 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6301 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006302 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6303
6304 features2.features.multiViewport = VK_FALSE;
6305
6306 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6307 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6308
6309 if (m_device->phy().properties().limits.maxViewports) {
6310 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6311 return;
6312 }
6313
6314 // Based on PSOViewportStateTests
6315 {
6316 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6317 VkViewport viewports[] = {viewport, viewport};
6318 VkRect2D scissor = {{0, 0}, {64, 64}};
6319 VkRect2D scissors[100] = {scissor, scissor};
6320
6321 using std::vector;
6322 struct TestCase {
6323 uint32_t viewport_count;
6324 VkViewport *viewports;
6325 uint32_t scissor_count;
6326 VkRect2D *scissors;
6327 uint32_t exclusive_scissor_count;
6328 VkRect2D *exclusive_scissors;
6329
6330 vector<std::string> vuids;
6331 };
6332
6333 vector<TestCase> test_cases = {
6334 {1,
6335 viewports,
6336 1,
6337 scissors,
6338 2,
6339 scissors,
6340 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6341 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6342 {1,
6343 viewports,
6344 1,
6345 scissors,
6346 100,
6347 scissors,
6348 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6349 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6350 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006351 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006352 };
6353
6354 for (const auto &test_case : test_cases) {
6355 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc = {
6356 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV};
6357
6358 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6359 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6360 helper.vp_state_ci_.pViewports = test_case.viewports;
6361 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6362 helper.vp_state_ci_.pScissors = test_case.scissors;
6363 helper.vp_state_ci_.pNext = &exc;
6364
6365 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6366 exc.pExclusiveScissors = test_case.exclusive_scissors;
6367 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006368 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006369 }
6370 }
6371
6372 // Based on SetDynScissorParamTests
6373 {
6374 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006375 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006376
6377 const VkRect2D scissor = {{0, 0}, {16, 16}};
6378 const VkRect2D scissors[] = {scissor, scissor};
6379
6380 m_commandBuffer->begin();
6381
Mark Lobodzinski20310782020-02-28 14:25:17 -07006382 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006383 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6384 m_errorMonitor->VerifyFound();
6385
Mark Lobodzinski20310782020-02-28 14:25:17 -07006386 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006387 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6388 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6389 m_errorMonitor->VerifyFound();
6390
Mark Lobodzinski20310782020-02-28 14:25:17 -07006391 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006392 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6393 m_errorMonitor->VerifyFound();
6394
Mark Lobodzinski20310782020-02-28 14:25:17 -07006395 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006396 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006397 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006398 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6399 m_errorMonitor->VerifyFound();
6400
Mark Lobodzinski20310782020-02-28 14:25:17 -07006401 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6402 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006403 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6404 m_errorMonitor->VerifyFound();
6405
Mark Lobodzinski20310782020-02-28 14:25:17 -07006406 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006407 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6408 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6409 m_errorMonitor->VerifyFound();
6410
6411 struct TestCase {
6412 VkRect2D scissor;
6413 std::string vuid;
6414 };
6415
6416 std::vector<TestCase> test_cases = {
6417 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6418 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6419 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6420 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6421 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6422 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6423 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6424 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6425
6426 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006427 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006428 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6429 m_errorMonitor->VerifyFound();
6430 }
6431
6432 m_commandBuffer->end();
6433 }
6434}
6435
6436TEST_F(VkLayerTest, MeshShaderNV) {
6437 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6438
6439 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6440 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6441 } else {
6442 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6443 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6444 return;
6445 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006446 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006447 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
6448 for (auto device_extension : required_device_extensions) {
6449 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6450 m_device_extension_names.push_back(device_extension);
6451 } else {
6452 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6453 return;
6454 }
6455 }
6456
Tony-LunarG048f5012020-04-29 16:55:11 -06006457 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006458 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6459 return;
6460 }
6461
6462 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006463 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006464 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6465
6466 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006467 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6468 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006469 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6470 features2.features.multiDrawIndirect = VK_FALSE;
6471
6472 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6473 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6474
6475 static const char vertShaderText[] =
6476 "#version 450\n"
6477 "vec2 vertices[3];\n"
6478 "void main() {\n"
6479 " vertices[0] = vec2(-1.0, -1.0);\n"
6480 " vertices[1] = vec2( 1.0, -1.0);\n"
6481 " vertices[2] = vec2( 0.0, 1.0);\n"
6482 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
6483 " gl_PointSize = 1.0f;\n"
6484 "}\n";
6485
6486 static const char meshShaderText[] =
6487 "#version 450\n"
6488 "#extension GL_NV_mesh_shader : require\n"
6489 "layout(local_size_x = 1) in;\n"
6490 "layout(max_vertices = 3) out;\n"
6491 "layout(max_primitives = 1) out;\n"
6492 "layout(triangles) out;\n"
6493 "void main() {\n"
6494 " gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);\n"
6495 " gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);\n"
6496 " gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);\n"
6497 " gl_PrimitiveIndicesNV[0] = 0;\n"
6498 " gl_PrimitiveIndicesNV[1] = 1;\n"
6499 " gl_PrimitiveIndicesNV[2] = 2;\n"
6500 " gl_PrimitiveCountNV = 1;\n"
6501 "}\n";
6502
6503 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6504 VkShaderObj ms(m_device, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV, this);
6505 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6506
6507 // Test pipeline creation
6508 {
6509 // can't mix mesh with vertex
6510 const auto break_vp = [&](CreatePipelineHelper &helper) {
6511 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6512 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006513 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006514 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6515
6516 // vertex or mesh must be present
6517 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006518 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006519 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6520
6521 // vertexinput and inputassembly must be valid when vertex stage is present
6522 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6523 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6524 helper.gp_ci_.pVertexInputState = nullptr;
6525 helper.gp_ci_.pInputAssemblyState = nullptr;
6526 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006527 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006528 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6529 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6530 }
6531
6532 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006533 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006534
6535 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6536 buffer_create_info.size = sizeof(uint32_t);
6537 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6538 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006539 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006540 ASSERT_VK_SUCCESS(result);
6541
6542 m_commandBuffer->begin();
6543
Mark Lobodzinski20310782020-02-28 14:25:17 -07006544 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6545 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006546 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6547 m_errorMonitor->VerifyFound();
6548
6549 m_commandBuffer->end();
6550
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006551 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006552}
6553
6554TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6555 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
6556 ASSERT_NO_FATAL_FAILURE(Init());
6557 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6558
6559 VkEvent event;
6560 VkEventCreateInfo event_create_info{};
6561 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006562 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006563
6564 m_commandBuffer->begin();
6565
Shannon McPherson93970b12020-06-12 14:34:35 -06006566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006567 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006568 m_errorMonitor->VerifyFound();
6569
Shannon McPherson93970b12020-06-12 14:34:35 -06006570 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006571 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006572 m_errorMonitor->VerifyFound();
6573
Shannon McPherson93970b12020-06-12 14:34:35 -06006574 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006575 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006576 m_errorMonitor->VerifyFound();
6577
Shannon McPherson93970b12020-06-12 14:34:35 -06006578 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006579 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006580 m_errorMonitor->VerifyFound();
6581
Shannon McPherson93970b12020-06-12 14:34:35 -06006582 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6583 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006584 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6585 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006586 m_errorMonitor->VerifyFound();
6587
Shannon McPherson93970b12020-06-12 14:34:35 -06006588 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6589 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006590 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6591 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006592 m_errorMonitor->VerifyFound();
6593
Shannon McPherson93970b12020-06-12 14:34:35 -06006594 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6595 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006596 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6597 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006598 m_errorMonitor->VerifyFound();
6599
Shannon McPherson93970b12020-06-12 14:34:35 -06006600 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6601 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006602 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6603 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006604 m_errorMonitor->VerifyFound();
6605
6606 m_commandBuffer->end();
6607
6608 VkSemaphoreCreateInfo semaphore_create_info = {};
6609 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6610 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006611 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006612
6613 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
6614 VkSubmitInfo submit_info = {};
6615
6616 // Signal the semaphore so the next test can wait on it.
6617 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6618 submit_info.signalSemaphoreCount = 1;
6619 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006620 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006621 m_errorMonitor->VerifyNotFound();
6622
6623 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6624 submit_info.signalSemaphoreCount = 0;
6625 submit_info.pSignalSemaphores = nullptr;
6626 submit_info.waitSemaphoreCount = 1;
6627 submit_info.pWaitSemaphores = &semaphore;
6628 submit_info.pWaitDstStageMask = &stage_flags;
6629
Mark Lobodzinski20310782020-02-28 14:25:17 -07006630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02089");
6631 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02090");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006632 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006633 m_errorMonitor->VerifyFound();
6634
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006635 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006636
6637 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6638 VkPipelineShaderStageCreateInfo meshStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6639 meshStage = vs.GetStageCreateInfo();
6640 meshStage.stage = VK_SHADER_STAGE_MESH_BIT_NV;
6641 VkPipelineShaderStageCreateInfo taskStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6642 taskStage = vs.GetStageCreateInfo();
6643 taskStage.stage = VK_SHADER_STAGE_TASK_BIT_NV;
6644
6645 // mesh and task shaders not supported
6646 const auto break_vp = [&](CreatePipelineHelper &helper) {
6647 helper.shader_stages_ = {meshStage, taskStage, vs.GetStageCreateInfo()};
6648 };
6649 CreatePipelineHelper::OneshotTest(
Mark Lobodzinski20310782020-02-28 14:25:17 -07006650 *this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006651 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "VUID-VkPipelineShaderStageCreateInfo-pName-00707",
6652 "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6653 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
6654
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006655 vk::DestroyEvent(m_device->device(), event, nullptr);
6656 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006657}
Chris Mayerc93536f2019-09-19 16:34:49 +02006658
6659TEST_F(VkLayerTest, ViewportWScalingNV) {
6660 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6661
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006662 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006663
6664 VkPhysicalDeviceFeatures device_features = {};
6665 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6666
6667 if (!device_features.multiViewport) {
6668 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6669 return;
6670 }
6671
6672 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6673 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6674 } else {
6675 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6676 return;
6677 }
6678
6679 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6680 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6681
6682 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006683 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006684
6685 const char vs_src[] = R"(
6686 #version 450
6687 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6688 vec2( 1.0f, 1.0f),
6689 vec2(-1.0f, -1.0f),
6690 vec2( 1.0f, -1.0f) };
6691 out gl_PerVertex {
6692 vec4 gl_Position;
6693 };
6694
6695 void main() {
6696 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
6697 })";
6698
6699 const char fs_src[] = R"(
6700 #version 450
6701 layout(location = 0) out vec4 outColor;
6702
6703 void main() {
6704 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
6705 })";
6706
6707 const std::vector<VkViewport> vp = {
6708 {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}};
6709 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6710 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6711
6712 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6713
6714 VkPipelineViewportWScalingStateCreateInfoNV vpsi = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV};
6715 vpsi.viewportWScalingEnable = VK_TRUE;
6716 vpsi.viewportCount = vp_count;
6717 vpsi.pViewportWScalings = scale.data();
6718
6719 VkPipelineViewportStateCreateInfo vpci = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO};
6720 vpci.viewportCount = vp_count;
6721 vpci.pViewports = vp.data();
6722 vpci.scissorCount = vp_count;
6723 vpci.pScissors = sc.data();
6724 vpci.pNext = &vpsi;
6725
6726 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6727
6728 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006729 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006730
6731 // Create pipeline with w-scaling enabled but without a valid scaling array
6732 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006733 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006734 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6735
6736 vpsi.pViewportWScalings = scale.data();
6737
6738 // Create pipeline with w-scaling enabled but without matching viewport counts
6739 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006740 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006741 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6742
6743 const VkPipelineLayoutObj pl(m_device);
6744
6745 VkShaderObj vs(m_device, vs_src, VK_SHADER_STAGE_VERTEX_BIT, this);
6746 VkShaderObj fs(m_device, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6747
6748 VkPipelineObj pipe(m_device);
6749 pipe.AddDefaultColorAttachment();
6750 pipe.AddShader(&vs);
6751 pipe.AddShader(&fs);
6752 pipe.SetViewport(vp);
6753 pipe.SetScissor(sc);
6754 pipe.CreateVKPipeline(pl.handle(), renderPass());
6755
6756 VkPipelineObj pipeDynWScale(m_device);
6757 pipeDynWScale.AddDefaultColorAttachment();
6758 pipeDynWScale.AddShader(&vs);
6759 pipeDynWScale.AddShader(&fs);
6760 pipeDynWScale.SetViewport(vp);
6761 pipeDynWScale.SetScissor(sc);
6762 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6763 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6764
6765 m_commandBuffer->begin();
6766
6767 // Bind pipeline without dynamic w scaling enabled
6768 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006769 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006770 m_errorMonitor->VerifyNotFound();
6771
Chris Mayerc93536f2019-09-19 16:34:49 +02006772 // Bind pipeline that has dynamic w-scaling enabled
6773 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006774 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006775 m_errorMonitor->VerifyNotFound();
6776
6777 const auto max_vps = m_device->props.limits.maxViewports;
6778
Mark Lobodzinski20310782020-02-28 14:25:17 -07006779 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006780 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6781 m_errorMonitor->VerifyFound();
6782
6783 m_errorMonitor->ExpectSuccess();
6784 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6785 m_errorMonitor->VerifyNotFound();
6786
6787 m_commandBuffer->end();
6788}
sfricke-samsung914e8002020-01-07 22:26:18 -08006789
6790TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6791 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6792
6793 // Enable Sampler YCbCr Conversion req'd extensions
6794 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6795 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6796 if (mp_extensions) {
6797 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6798 }
6799 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006800 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sfricke-samsung914e8002020-01-07 22:26:18 -08006801 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6802 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6803 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6804 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6805 if (mp_extensions) {
6806 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6807 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6808 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6809 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6810 } else {
6811 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6812 return;
6813 }
6814
6815 // Explictly not enable Ycbcr Conversion Features
6816 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {};
6817 ycbcr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
6818 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6819 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6820
6821 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6822 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6823 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6824 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6825 return;
6826 }
6827
6828 // Create Ycbcr conversion
6829 VkSamplerYcbcrConversion conversions;
6830 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6831 NULL,
6832 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6833 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6834 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6835 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6836 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6837 VK_CHROMA_LOCATION_COSITED_EVEN,
6838 VK_CHROMA_LOCATION_COSITED_EVEN,
6839 VK_FILTER_NEAREST,
6840 false};
6841
Mark Lobodzinski20310782020-02-28 14:25:17 -07006842 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006843 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6844 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006845}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006846
6847TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6848 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6849
6850 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6851 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6852 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6853 return;
6854 }
6855 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6856
6857 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6858
6859 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6860 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6861 return;
6862 }
6863 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6864
6865 {
6866 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6867 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6868 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6869
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006870 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6871 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006872 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6873
6874 if (!tf_features.transformFeedback) {
6875 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6876 return;
6877 }
6878 }
6879
6880 ASSERT_NO_FATAL_FAILURE(InitState());
6881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6882
6883 {
6884 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
6885 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6886 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6887
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006888 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006889 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6890 info.size = 4;
6891 VkBufferObj buffer;
6892 buffer.init(*m_device, info);
6893 VkDeviceSize offsets[1]{};
6894
6895 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
6896 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
6897 m_errorMonitor->VerifyFound();
6898 }
6899
6900 {
6901 auto vkCmdBeginTransformFeedbackEXT =
6902 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6903 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6904
6905 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
6906 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6907 m_errorMonitor->VerifyFound();
6908 }
6909
6910 {
6911 auto vkCmdEndTransformFeedbackEXT =
6912 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6913 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6914
6915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
6916 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
6917 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6918 m_errorMonitor->VerifyFound();
6919 }
6920}
6921
6922TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
6923 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
6924
6925 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6926 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6927 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6928 return;
6929 }
6930 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6931
6932 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6933
6934 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6935 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6936 return;
6937 }
6938 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6939
6940 {
6941 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6942 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6943 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6944
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006945 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6946 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006947 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6948
6949 if (!tf_features.transformFeedback) {
6950 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6951 return;
6952 }
6953
6954 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6955 }
6956
6957 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6958
6959 auto vkCmdBindTransformFeedbackBuffersEXT =
6960 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6961 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6962
6963 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006964 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6965 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006966 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6967
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006968 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006969 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6970 info.size = 8;
6971 VkBufferObj const buffer_obj(*m_device, info);
6972
6973 // Request a firstBinding that is too large.
6974 {
6975 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
6976 VkDeviceSize const offsets[1]{};
6977
6978 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
6979 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6980 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
6981 nullptr);
6982 m_errorMonitor->VerifyFound();
6983 }
6984
6985 // Request too many bindings.
6986 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
6987 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
6988 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
6989
6990 std::vector<VkDeviceSize> offsets(bindingCount);
6991
6992 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6993 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
6994 nullptr);
6995 m_errorMonitor->VerifyFound();
6996 }
6997
6998 // Request a size that is larger than the maximum size.
6999 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
7000 VkDeviceSize const offsets[1]{};
7001 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
7002
7003 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
7004 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7005 m_errorMonitor->VerifyFound();
7006 }
7007 }
7008
7009 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007010 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007011 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7012 info.size = 8;
7013 VkBufferObj const buffer_obj(*m_device, info);
7014
7015 // Request an offset that is too large.
7016 {
7017 VkDeviceSize const offsets[1]{info.size + 4};
7018
7019 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
7020 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7021 m_errorMonitor->VerifyFound();
7022 }
7023
7024 // Request an offset that is not a multiple of 4.
7025 {
7026 VkDeviceSize const offsets[1]{1};
7027
7028 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
7029 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7030 m_errorMonitor->VerifyFound();
7031 }
7032
7033 // Request a size that is larger than the buffer's size.
7034 {
7035 VkDeviceSize const offsets[1]{};
7036 VkDeviceSize const sizes[1]{info.size + 1};
7037
7038 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007039 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7040 m_errorMonitor->VerifyFound();
7041 }
7042
7043 // Request an offset and size whose sum is larger than the buffer's size.
7044 {
7045 VkDeviceSize const offsets[1]{4};
7046 VkDeviceSize const sizes[1]{info.size - 3};
7047
7048 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
7049 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
7050 m_errorMonitor->VerifyFound();
7051 }
7052
7053 // Bind while transform feedback is active.
7054 {
7055 auto vkCmdBeginTransformFeedbackEXT =
7056 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7057 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7058 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7059
7060 VkDeviceSize const offsets[1]{};
7061
7062 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
7063 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7064 m_errorMonitor->VerifyFound();
7065
7066 auto vkCmdEndTransformFeedbackEXT =
7067 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7068 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7069 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7070 }
7071 }
7072
7073 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
7074 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007075 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007076 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7077 info.size = 4;
7078 VkBufferObj const buffer_obj(*m_device, info);
7079
7080 VkDeviceSize const offsets[1]{};
7081
7082 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
7083 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
7084 m_errorMonitor->VerifyFound();
7085 }
7086
7087 // Don't bind memory.
7088 {
7089 VkBuffer buffer{};
7090 {
7091 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
7092 ASSERT_TRUE(vkCreateBuffer != nullptr);
7093
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007094 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007095 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
7096 info.size = 4;
7097 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
7098 }
7099
7100 VkDeviceSize const offsets[1]{};
7101
7102 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
7103 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
7104 m_errorMonitor->VerifyFound();
7105 }
7106}
7107
7108TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
7109 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
7110
7111 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7112 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7113 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7114 return;
7115 }
7116 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7117
7118 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7119
7120 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7121 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7122 return;
7123 }
7124 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7125
7126 {
7127 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7128 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7129 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7130
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007131 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7132 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007133 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7134
7135 if (!tf_features.transformFeedback) {
7136 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7137 return;
7138 }
7139
7140 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7141 }
7142
7143 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7144
7145 auto vkCmdBeginTransformFeedbackEXT =
7146 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7147 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7148
7149 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007150 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7151 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007152 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7153
7154 // Request a firstCounterBuffer that is too large.
7155 {
7156 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7157
7158 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7159 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7160 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7161 m_errorMonitor->VerifyFound();
7162 }
7163
7164 // Request too many buffers.
7165 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7166 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7167
7168 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7169 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7170 m_errorMonitor->VerifyFound();
7171 }
7172 }
7173
7174 // Request an out-of-bounds location.
7175 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007176 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007177 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7178 info.size = 4;
7179 VkBufferObj const buffer_obj(*m_device, info);
7180
7181 VkDeviceSize const offsets[1]{1};
7182
7183 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7184 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7185 m_errorMonitor->VerifyFound();
7186 }
7187
7188 // Request specific offsets without specifying buffers.
7189 {
7190 VkDeviceSize const offsets[1]{};
7191
7192 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7193 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7194 m_errorMonitor->VerifyFound();
7195 }
7196
7197 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7198 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007199 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007200 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7201 info.size = 4;
7202 VkBufferObj const buffer_obj(*m_device, info);
7203
7204 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7205 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7206 m_errorMonitor->VerifyFound();
7207 }
7208
7209 // Begin while transform feedback is active.
7210 {
7211 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7212
7213 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7214 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7215 m_errorMonitor->VerifyFound();
7216
7217 auto vkCmdEndTransformFeedbackEXT =
7218 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7219 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7220
7221 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7222 }
7223}
7224
7225TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7226 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7227
7228 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7229 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7230 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7231 return;
7232 }
7233 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7234
7235 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7236
7237 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7238 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7239 return;
7240 }
7241 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7242
7243 {
7244 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7245 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7246 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7247
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007248 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7249 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007250 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7251
7252 if (!tf_features.transformFeedback) {
7253 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7254 return;
7255 }
7256
7257 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7258 }
7259
7260 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7261
7262 auto vkCmdEndTransformFeedbackEXT =
7263 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7264 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7265
7266 {
7267 // Activate transform feedback.
7268 auto vkCmdBeginTransformFeedbackEXT =
7269 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7270 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7271 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7272
7273 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007274 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7275 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007276 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7277
7278 // Request a firstCounterBuffer that is too large.
7279 {
7280 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7281
7282 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7283 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7284 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7285 m_errorMonitor->VerifyFound();
7286 }
7287
7288 // Request too many buffers.
7289 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7290 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7291
7292 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7293 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7294 m_errorMonitor->VerifyFound();
7295 }
7296 }
7297
7298 // Request an out-of-bounds location.
7299 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007300 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007301 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7302 info.size = 4;
7303 VkBufferObj const buffer_obj(*m_device, info);
7304
7305 VkDeviceSize const offsets[1]{1};
7306
7307 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7308 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7309 m_errorMonitor->VerifyFound();
7310 }
7311
7312 // Request specific offsets without specifying buffers.
7313 {
7314 VkDeviceSize const offsets[1]{};
7315
7316 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7317 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7318 m_errorMonitor->VerifyFound();
7319 }
7320
7321 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7322 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007323 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007324 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7325 info.size = 4;
7326 VkBufferObj const buffer_obj(*m_device, info);
7327
7328 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7329 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7330 m_errorMonitor->VerifyFound();
7331 }
7332 }
7333
7334 // End while transform feedback is inactive.
7335 {
7336 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7337
7338 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7339 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7340 m_errorMonitor->VerifyFound();
7341 }
7342}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007343
sfricke-samsung39ee2442020-07-22 21:21:15 -07007344TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7345 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007346
7347 // protect memory added in VK 1.1
7348 SetTargetApiVersion(VK_API_VERSION_1_1);
7349
7350 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7351 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7352 } else {
7353 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7354 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7355 return;
7356 }
7357 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7358
7359 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7360 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7361 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7362
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007363 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7364 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007365 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7366
7367 if (protected_memory_features.protectedMemory == VK_FALSE) {
7368 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7369 return;
7370 };
7371
7372 // Turns m_commandBuffer into a protected command buffer
7373 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7374
7375 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7376 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7377 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7378 return;
7379 }
7380
7381 VkBufferObj indirect_buffer;
7382 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7383 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7384
7385 VkBufferObj indexed_indirect_buffer;
7386 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7387 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7388
7389 VkBufferObj index_buffer;
7390 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7391
7392 CreatePipelineHelper pipe(*this);
7393 pipe.InitInfo();
7394 pipe.InitState();
7395 pipe.CreateGraphicsPipeline();
7396
sfricke-samsung39ee2442020-07-22 21:21:15 -07007397 VkQueryPool query_pool;
7398 VkQueryPoolCreateInfo query_pool_create_info{};
7399 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7400 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7401 query_pool_create_info.queryCount = 1;
7402 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7403
sfricke-samsung071af2d2020-07-02 10:37:22 -07007404 m_commandBuffer->begin();
7405 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7406
7407 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7408
7409 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7410 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7411 m_errorMonitor->VerifyFound();
7412
7413 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7414
7415 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7416 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7417 sizeof(VkDrawIndexedIndirectCommand));
7418 m_errorMonitor->VerifyFound();
7419
7420 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007421
7422 // Query should be outside renderpass
7423 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7424
7425 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7426 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7427 m_errorMonitor->VerifyFound();
7428
7429 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7430 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7431 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7432 m_errorMonitor->VerifyFound();
7433
sfricke-samsung071af2d2020-07-02 10:37:22 -07007434 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007435
7436 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007437}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007438
7439TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7440 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7441
7442 SetTargetApiVersion(VK_API_VERSION_1_1);
7443
7444 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7445 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7446 } else {
7447 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7448 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7449 return;
7450 }
7451 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7452
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007453 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7454 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7455 return;
7456 }
7457
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007458 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7459 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7460 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7461
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007462 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7463 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007464 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7465
7466 if (protected_memory_features.protectedMemory == VK_FALSE) {
7467 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7468 return;
7469 };
7470
7471 // Turns m_commandBuffer into a unprotected command buffer
7472 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7473
7474 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7475 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7476
7477 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7478 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7479 return;
7480 }
7481
7482 // Create actual protected and unprotected buffers
7483 VkBuffer buffer_protected = VK_NULL_HANDLE;
7484 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
7485 VkBufferCreateInfo buffer_create_info = {};
7486 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7487 buffer_create_info.pNext = nullptr;
7488 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007489 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7490 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7491 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007492 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7493
7494 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7495 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7496 buffer_create_info.flags = 0;
7497 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7498
7499 // Create actual protected and unprotected images
7500 VkImageObj image_protected(m_device);
7501 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007502 VkImageObj image_protected_descriptor(m_device);
7503 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007504 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007505 VkImageView image_views_descriptor[2];
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007506 VkImageCreateInfo image_create_info = {};
7507 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7508 image_create_info.pNext = nullptr;
7509 image_create_info.extent = {64, 64, 1};
7510 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
7511 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7512 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007513 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7514 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007515 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7516 image_create_info.arrayLayers = 1;
7517 image_create_info.mipLevels = 1;
7518
7519 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7520 image_protected.init_no_mem(*m_device, image_create_info);
7521 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007522 image_views[0] = image_protected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007523
locke-lunarg0de02522020-10-27 22:55:17 -06007524 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
7525 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7526 image_views_descriptor[0] = image_protected_descriptor.targetView(VK_FORMAT_R8G8B8A8_UNORM);
7527
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007528 image_create_info.flags = 0;
7529 image_unprotected.init_no_mem(*m_device, image_create_info);
7530 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007531 image_views[1] = image_unprotected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007532
locke-lunarg0de02522020-10-27 22:55:17 -06007533 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
7534 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7535 image_views_descriptor[1] = image_unprotected_descriptor.targetView(VK_FORMAT_R8G8B8A8_UNORM);
7536
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007537 // Create protected and unproteced memory
7538 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7539 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7540
7541 VkMemoryAllocateInfo alloc_info = {};
7542 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7543 alloc_info.pNext = nullptr;
7544 alloc_info.allocationSize = 0;
7545
7546 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7547 VkMemoryRequirements mem_reqs_protected;
7548 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7549 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7550 VkMemoryRequirements mem_reqs_unprotected;
7551 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7552 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7553
7554 // Get memory index for a protected and unprotected memory
7555 VkPhysicalDeviceMemoryProperties phys_mem_props;
7556 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7557 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7558 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7559 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7560 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7561 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7562 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7563 memory_type_unprotected = i;
7564 }
7565 // Check just protected bit is in type at all
7566 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7567 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7568 memory_type_protected = i;
7569 }
7570 }
7571 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7572 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7573 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7574 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7575 return;
7576 }
7577
7578 alloc_info.memoryTypeIndex = memory_type_protected;
7579 alloc_info.allocationSize = mem_reqs_protected.size;
7580 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7581
7582 alloc_info.allocationSize = mem_reqs_unprotected.size;
7583 alloc_info.memoryTypeIndex = memory_type_unprotected;
7584 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7585
7586 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7587 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7588 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7589 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
7590
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007591 // A renderpass and framebuffer that contains a protected and unprotected image view
7592 VkAttachmentDescription attachments[2] = {
7593 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7594 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7595 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
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 };
7600 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7601 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7602 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7603 VkSubpassDependency dependency = {0,
7604 0,
7605 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7606 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7607 VK_ACCESS_SHADER_WRITE_BIT,
7608 VK_ACCESS_SHADER_WRITE_BIT,
7609 VK_DEPENDENCY_BY_REGION_BIT};
7610 VkRenderPassCreateInfo render_pass_create_info = {
7611 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7612 VkRenderPass render_pass;
7613 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7614 VkFramebufferCreateInfo framebuffer_create_info = {
7615 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7616 VkFramebuffer framebuffer;
7617 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7618
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007619 // Various structs used for commands
7620 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7621 VkImageBlit blit_region = {};
7622 blit_region.srcSubresource = image_subresource;
7623 blit_region.dstSubresource = image_subresource;
7624 blit_region.srcOffsets[0] = {0, 0, 0};
7625 blit_region.srcOffsets[1] = {8, 8, 1};
7626 blit_region.dstOffsets[0] = {0, 8, 0};
7627 blit_region.dstOffsets[1] = {8, 8, 1};
7628 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7629 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7630 VkBufferCopy buffer_copy = {0, 0, 64};
7631 VkBufferImageCopy buffer_image_copy = {};
7632 buffer_image_copy.bufferRowLength = 0;
7633 buffer_image_copy.bufferImageHeight = 0;
7634 buffer_image_copy.imageSubresource = image_subresource;
7635 buffer_image_copy.imageOffset = {0, 0, 0};
7636 buffer_image_copy.imageExtent = {1, 1, 1};
7637 buffer_image_copy.bufferOffset = 0;
7638 VkImageCopy image_copy = {};
7639 image_copy.srcSubresource = image_subresource;
7640 image_copy.srcOffset = {0, 0, 0};
7641 image_copy.dstSubresource = image_subresource;
7642 image_copy.dstOffset = {0, 0, 0};
7643 image_copy.extent = {1, 1, 1};
7644 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007645 VkRect2D render_area = {{0, 0}, {8, 8}};
7646 VkRenderPassBeginInfo render_pass_begin = {
7647 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7648 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7649 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7650 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007651
locke-lunarg0de02522020-10-27 22:55:17 -06007652 const char fsSource[] =
7653 "#version 450\n"
7654 "layout(set=0, binding=0) uniform foo { int x; int y; } bar;\n"
7655 "layout(set=0, binding=1, rgba8) uniform image2D si1;\n"
7656 "layout(location=0) out vec4 x;\n"
7657 "void main(){\n"
7658 " x = vec4(bar.y);\n"
7659 " imageStore(si1, ivec2(0), vec4(0));\n"
7660 "}\n";
7661 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7662
7663 CreatePipelineHelper g_pipe(*this);
7664 g_pipe.InitInfo();
7665 g_pipe.gp_ci_.renderPass = render_pass;
7666 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7667 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7668 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
7669 std::array<VkPipelineColorBlendAttachmentState, 2> color_blend_attachments;
7670 color_blend_attachments[0] = g_pipe.cb_attachments_;
7671 color_blend_attachments[1] = g_pipe.cb_attachments_;
7672 g_pipe.cb_ci_.attachmentCount = color_blend_attachments.size();
7673 g_pipe.cb_ci_.pAttachments = color_blend_attachments.data();
7674 g_pipe.InitState();
7675 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7676
7677 VkSampler sampler;
7678 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7679 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7680 ASSERT_VK_SUCCESS(err);
7681
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007682 // Use protected resources in unprotected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007683 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 0, 1024);
locke-lunarg0de02522020-10-27 22:55:17 -06007684 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7685 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7686 g_pipe.descriptor_set_->UpdateDescriptorSets();
7687
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007688 m_commandBuffer->begin();
7689
7690 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7691 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7692 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7693 m_errorMonitor->VerifyFound();
7694
7695 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7696 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7697 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7698 m_errorMonitor->VerifyFound();
7699
7700 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7701 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7702 &subresource_range);
7703 m_errorMonitor->VerifyFound();
7704
7705 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7706 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7707 m_errorMonitor->VerifyFound();
7708
7709 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7710 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7711 m_errorMonitor->VerifyFound();
7712
7713 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7714 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7715 &buffer_image_copy);
7716 m_errorMonitor->VerifyFound();
7717
7718 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7719 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7720 &buffer_image_copy);
7721 m_errorMonitor->VerifyFound();
7722
7723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7724 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7725 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7726 m_errorMonitor->VerifyFound();
7727
7728 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7729 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7730 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7731 m_errorMonitor->VerifyFound();
7732
7733 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7734 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected, 1,
7735 &buffer_image_copy);
7736 m_errorMonitor->VerifyFound();
7737
7738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7739 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected, 1,
7740 &buffer_image_copy);
7741 m_errorMonitor->VerifyFound();
7742
7743 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7744 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7745 m_errorMonitor->VerifyFound();
7746
7747 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7748 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7749 m_errorMonitor->VerifyFound();
7750
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007751 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7752
7753 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7754 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7755 m_errorMonitor->VerifyFound();
7756
locke-lunarg0de02522020-10-27 22:55:17 -06007757 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7758 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7759 &g_pipe.descriptor_set_->set_, 0, nullptr);
7760 VkDeviceSize offset = 0;
7761 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7762 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
7763
7764 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7765 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7766 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7767 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
7769
7770 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7771 m_errorMonitor->VerifyFound();
7772
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007773 vk::CmdEndRenderPass(m_commandBuffer->handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007774 m_commandBuffer->end();
7775
7776 // Use unprotected resources in protected command buffer
sfricke-samsung36428462021-02-10 01:23:34 -08007777 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 0, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007778 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7779 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007780 g_pipe.descriptor_set_->UpdateDescriptorSets();
7781
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007782 protectedCommandBuffer.begin();
7783
7784 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7785 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7786 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7787 m_errorMonitor->VerifyFound();
7788
7789 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7790 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7791 &subresource_range);
7792 m_errorMonitor->VerifyFound();
7793
7794 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7795 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7796 m_errorMonitor->VerifyFound();
7797
7798 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7799 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7800 1, &buffer_image_copy);
7801 m_errorMonitor->VerifyFound();
7802
7803 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7804 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7805 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7806 m_errorMonitor->VerifyFound();
7807
7808 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7809 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7810 1, &buffer_image_copy);
7811 m_errorMonitor->VerifyFound();
7812
7813 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7814 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7815 m_errorMonitor->VerifyFound();
7816
7817 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7818 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7819 m_errorMonitor->VerifyFound();
7820
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007821 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7822
7823 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7824 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7825 m_errorMonitor->VerifyFound();
7826
locke-lunarg0de02522020-10-27 22:55:17 -06007827 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7828 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7829 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7830 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7831 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
7832
7833 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7834 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7835 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7836 m_errorMonitor->VerifyFound();
7837
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007838 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007839 protectedCommandBuffer.end();
7840
sfricke-samsung96cd9932020-08-23 20:57:11 -07007841 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7842 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7843
7844 VkProtectedSubmitInfo protected_submit_info = {};
7845 protected_submit_info.sType = VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO;
7846 protected_submit_info.pNext = nullptr;
7847
7848 VkSubmitInfo submit_info = {};
7849 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7850 submit_info.pNext = &protected_submit_info;
7851 submit_info.commandBufferCount = 2;
7852 submit_info.pCommandBuffers = comman_buffers;
7853
7854 protected_submit_info.protectedSubmit = VK_TRUE;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007855 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007856 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7857 m_errorMonitor->VerifyFound();
7858
7859 protected_submit_info.protectedSubmit = VK_FALSE;
7860 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7861 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7862 m_errorMonitor->VerifyFound();
7863
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007864 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7865 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7866 vk::FreeMemory(device(), memory_protected, nullptr);
7867 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007868 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7869 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007870}
locke-lunarg6b0de702020-08-07 17:42:13 -06007871
7872TEST_F(VkLayerTest, InvailStorageAtomicOperation) {
7873 TEST_DESCRIPTION(
7874 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7875 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7876
7877 ASSERT_NO_FATAL_FAILURE(Init());
7878
7879 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7880 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7881 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7882 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7883
7884 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7885 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7886 return;
7887 }
7888
7889 VkFormat buffer_view_format =
7890 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
7891 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7892 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
7893 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7894 return;
7895 }
7896 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7897
7898 VkPhysicalDeviceFeatures device_features = {};
7899 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
7900 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
7901 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
7902 return;
7903 }
7904
7905 VkImageObj image(m_device);
7906 image.Init(image_ci);
7907 VkImageView image_view = image.targetView(image_format);
7908
7909 VkSampler sampler = VK_NULL_HANDLE;
7910 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
7911 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
7912
7913 VkBufferObj buffer;
7914 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
7915
7916 VkBufferViewCreateInfo bvci = {};
7917 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7918 bvci.buffer = buffer.handle();
7919 bvci.format = buffer_view_format;
7920 bvci.range = VK_WHOLE_SIZE;
7921 VkBufferView buffer_view;
7922 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
7923
7924 char const *fsSource =
7925 "#version 450\n"
locke-lunarg76e8dee2020-08-21 13:20:02 -06007926 "layout(set=0, binding=3, rgba8) uniform image2D si0;\n "
7927 "layout(set=0, binding=2, rgba8) uniform image2D si1[2];\n "
7928 "layout(set = 0, binding = 1, r8) uniform imageBuffer stb2;\n"
7929 "layout(set = 0, binding = 0, r8) uniform imageBuffer stb3[2];\n"
locke-lunarg6b0de702020-08-07 17:42:13 -06007930 "void main() {\n"
7931 " imageAtomicExchange(si0, ivec2(0), 1);\n"
7932 " imageAtomicExchange(si1[0], ivec2(0), 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007933 " imageAtomicExchange(si1[1], ivec2(0), 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007934 " imageAtomicExchange(stb2, 0, 1);\n"
7935 " imageAtomicExchange(stb3[0], 0, 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007936 " imageAtomicExchange(stb3[1], 0, 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007937 "}\n";
7938
7939 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7940 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7941
7942 CreatePipelineHelper g_pipe(*this);
7943 g_pipe.InitInfo();
7944 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06007945 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7946 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7947 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7948 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06007949 g_pipe.InitState();
7950 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7951
locke-lunarg76e8dee2020-08-21 13:20:02 -06007952 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007953 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007954 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
sfricke-samsung392ba9f2021-03-05 02:23:21 -08007955 VK_IMAGE_LAYOUT_GENERAL, 0, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007956 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
sfricke-samsung392ba9f2021-03-05 02:23:21 -08007957 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 0, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06007958 g_pipe.descriptor_set_->UpdateDescriptorSets();
7959
7960 m_commandBuffer->begin();
7961 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7962 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7963 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7964 &g_pipe.descriptor_set_->set_, 0, nullptr);
7965
7966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7970 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7971 m_errorMonitor->VerifyFound();
7972
7973 m_commandBuffer->EndRenderPass();
7974 m_commandBuffer->end();
7975}
locke-lunargae1bbab2020-09-10 11:55:56 -06007976
7977TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
7978 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
7979
7980 ASSERT_NO_FATAL_FAILURE(Init());
7981 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7982
7983 // push constant range: 0-99
7984 char const *const vsSource =
7985 "#version 450\n"
7986 "\n"
7987 "layout(push_constant, std430) uniform foo {\n"
7988 " bool b;\n"
7989 " float f2[3];\n"
7990 " vec3 v;\n"
7991 " vec4 v2[2];\n"
7992 " mat3 m;\n"
7993 "} constants;\n"
7994 "void func1( float f ){\n"
7995 // use the whole v2[1]. byte: 48-63.
7996 " vec2 v2 = constants.v2[1].yz;\n"
7997 "}\n"
7998 "void main(){\n"
7999 // use only v2[0].z. byte: 40-43.
8000 " func1( constants.v2[0].z);\n"
8001 // index of m is variable. The all m is used. byte: 64-99.
8002 " for(int i=1;i<2;++i) {\n"
8003 " vec3 v3 = constants.m[i]; \n"
8004 " }\n"
8005 "}\n";
8006
8007 // push constant range: 0 - 95
8008 char const *const fsSource =
8009 "#version 450\n"
8010 "\n"
8011 "struct foo1{\n"
8012 " int i[4];"
8013 "}f;\n"
8014 "layout(push_constant, std430) uniform foo {\n"
8015 " float x[2][2][2];\n"
8016 " foo1 s;\n"
8017 " foo1 ss[3];\n"
8018 "} constants;\n"
8019 "void main(){\n"
8020 // use s. byte: 32-47.
8021 " f = constants.s;\n"
8022 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
8023 " for(int i=1;i<2;++i) {\n"
8024 " int ii = constants.ss[i].i[3]; \n"
8025 " }\n"
8026 "}\n";
8027
8028 VkShaderObj const vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8029 VkShaderObj const fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8030
8031 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
8032 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
8033
8034 VkPipelineLayoutCreateInfo pipeline_layout_info{
8035 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &push_constant_range};
8036
8037 VkPipelineLayout pipeline_layout;
8038 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
8039
8040 CreatePipelineHelper g_pipe(*this);
8041 g_pipe.InitInfo();
8042 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8043 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
8044 g_pipe.InitState();
8045 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8046
8047 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
8048 VkPipelineLayout pipeline_layout_small;
8049 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
8050
8051 CreatePipelineHelper g_pipe_small_range(*this);
8052 g_pipe_small_range.InitInfo();
8053 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
8054 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
8055 g_pipe_small_range.InitState();
8056
sfricke-samsung7699b912021-04-12 23:01:51 -07008057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
8058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-VkGraphicsPipelineCreateInfo-layout-00756");
locke-lunargae1bbab2020-09-10 11:55:56 -06008059 g_pipe_small_range.CreateGraphicsPipeline();
8060 m_errorMonitor->VerifyFound();
8061
8062 m_commandBuffer->begin();
8063 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8064
8065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8066 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8067 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8068 &g_pipe.descriptor_set_->set_, 0, nullptr);
8069 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8070 m_errorMonitor->VerifyFound();
8071
locke-lunargae1bbab2020-09-10 11:55:56 -06008072 const float dummy_values[128] = {};
locke-lunargae1bbab2020-09-10 11:55:56 -06008073
Nathaniel Cesarioee42bab2021-04-14 20:02:16 -06008074 // NOTE: these are commented out due to ambiguity around VUID 02698 and push constant lifetimes
8075 // See https://gitlab.khronos.org/vulkan/vulkan/-/issues/2602 and
8076 // https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/2689
8077 // for more details.
8078 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8079 // vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
8080 // VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
8081 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8082 // m_errorMonitor->VerifyFound();
8083
8084 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
8085 // vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
8086 // vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8087 // m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008088
8089 m_errorMonitor->ExpectSuccess();
8090 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
8091 68, dummy_values);
8092 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8093 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06008094}
8095
8096TEST_F(VkLayerTest, VerifyVertextBinding) {
8097 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
8098
8099 ASSERT_NO_FATAL_FAILURE(Init());
8100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8101
8102 VkBufferObj vtx_buf;
8103 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
8104 vtx_buf.init(*m_device, info);
8105
8106 CreatePipelineHelper pipe(*this);
8107 pipe.InitInfo();
8108 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
8109 VkVertexInputBindingDescription vtx_binding_des[3] = {
8110 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
8111
8112 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
8113 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
8114 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8115 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
8116 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
8117 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
8118 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
8119 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
8120 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
8121 pipe.InitState();
8122 pipe.CreateGraphicsPipeline();
8123
8124 m_commandBuffer->begin();
8125 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8126 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8127 VkDeviceSize offset = 0;
8128 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
8129
8130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
8131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
8132 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8133 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
8135 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8136 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06008137
8138 m_commandBuffer->EndRenderPass();
8139 m_commandBuffer->end();
8140}
locke-lunargd7a08e92020-10-21 00:24:00 -06008141
8142TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8143 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8144 ASSERT_NO_FATAL_FAILURE(Init());
8145 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8146
8147 CreatePipelineHelper pipe(*this);
8148 pipe.InitInfo();
8149
8150 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8151
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008152 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008153 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8154 dyn_state_ci.pDynamicStates = dyn_states.data();
8155 pipe.dyn_state_ci_ = dyn_state_ci;
8156 pipe.InitState();
8157 pipe.CreateGraphicsPipeline();
8158
8159 m_commandBuffer->begin();
8160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8161 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8162
8163 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8164 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8165 VkRect2D scissor = {{0, 0}, {16, 16}};
8166 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8167 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8168
8169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8170 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8171 m_errorMonitor->VerifyFound();
8172
8173 m_commandBuffer->EndRenderPass();
8174 m_commandBuffer->end();
8175}
locke-lunarg0de02522020-10-27 22:55:17 -06008176
8177TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8178 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
8179 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8180 if (version < VK_API_VERSION_1_1) {
8181 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8182 return;
8183 }
8184 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8185
8186 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FILTER_CUBIC_EXTENSION_NAME)) {
8187 m_device_extension_names.push_back(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8188 } else {
8189 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8190 return;
8191 }
8192
8193 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8194 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8195
8196 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8197 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008198
8199 VkFormatProperties format_props;
8200 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8201 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
8202 printf("%s SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.\n", kSkipPrefix);
8203 return;
8204 }
8205
locke-lunarg0de02522020-10-27 22:55:17 -06008206 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8207 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8208
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008209 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008210 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008211 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008212 image_format_info.type = image_ci.imageType;
8213 image_format_info.format = image_ci.format;
8214 image_format_info.tiling = image_ci.tiling;
8215 image_format_info.usage = image_ci.usage;
8216 image_format_info.flags = image_ci.flags;
8217
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008218 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8219 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008220
8221 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8222
8223 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
8224 printf("%s Image and ImageView supports filter cubic ; skipped.\n", kSkipPrefix);
8225 return;
8226 }
8227
8228 VkImageObj image(m_device);
8229 image.Init(image_ci);
8230 VkImageView imageView = image.targetView(format, imageViewType);
8231
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008232 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008233 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8234 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8235 VkSampler sampler;
8236 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8237
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008238 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008239 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8240 sampler_ci.pNext = &reduction_mode_ci;
8241 VkSampler sampler_rediction;
8242 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler_rediction);
8243
8244 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8245
8246 CreatePipelineHelper g_pipe(*this);
8247 g_pipe.InitInfo();
8248 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8249 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8250 g_pipe.InitState();
8251 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8252
8253 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_rediction);
8254 g_pipe.descriptor_set_->UpdateDescriptorSets();
8255
8256 m_commandBuffer->begin();
8257 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8258 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8259 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8260 &g_pipe.descriptor_set_->set_, 0, nullptr);
8261
8262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8263 m_commandBuffer->Draw(1, 0, 0, 0);
8264 m_errorMonitor->VerifyFound();
8265
8266 m_commandBuffer->EndRenderPass();
8267 m_commandBuffer->end();
8268 m_commandBuffer->reset();
8269
8270 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8271 g_pipe.descriptor_set_->UpdateDescriptorSets();
8272
8273 m_commandBuffer->begin();
8274 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8275 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8276 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8277 &g_pipe.descriptor_set_->set_, 0, nullptr);
8278
8279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8280 m_commandBuffer->Draw(1, 0, 0, 0);
8281 m_errorMonitor->VerifyFound();
8282
8283 m_commandBuffer->EndRenderPass();
8284 m_commandBuffer->end();
8285}
8286
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008287TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008288 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 -07008289 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8290
8291 if (DeviceExtensionSupported(gpu(), nullptr, VK_IMG_FILTER_CUBIC_EXTENSION_NAME)) {
8292 m_device_extension_names.push_back(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8293 } else {
8294 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8295 return;
8296 }
8297
8298 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8299 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8300
8301 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8302 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
8303 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8304 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8305
8306 VkImageObj image(m_device);
8307 image.Init(image_ci);
8308 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8309 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8310
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008311 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008312 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8313 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8314 VkSampler sampler;
8315 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8316
8317 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8318
8319 CreatePipelineHelper g_pipe(*this);
8320 g_pipe.InitInfo();
8321 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8322 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8323 g_pipe.InitState();
8324 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8325
8326 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8327 g_pipe.descriptor_set_->UpdateDescriptorSets();
8328
8329 m_commandBuffer->begin();
8330 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8331 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8332 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8333 &g_pipe.descriptor_set_->set_, 0, nullptr);
8334
8335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8336 m_commandBuffer->Draw(1, 0, 0, 0);
8337 m_errorMonitor->VerifyFound();
8338
8339 m_commandBuffer->EndRenderPass();
8340 m_commandBuffer->end();
8341}
8342
locke-lunarg0de02522020-10-27 22:55:17 -06008343TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8344 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
8345 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8346 if (version < VK_API_VERSION_1_1) {
8347 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8348 return;
8349 }
8350 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8351 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8352 } else {
8353 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8354 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8355 return;
8356 }
8357 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8358
8359 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
8360 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8361 } else {
8362 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8363 return;
8364 }
8365
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008366 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008367 multiview_features.multiview = VK_TRUE;
8368 VkPhysicalDeviceFeatures2 pd_features2 = {};
8369 pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8370 pd_features2.pNext = &multiview_features;
8371
8372 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8373 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8374
8375 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8376 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8377 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008378 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8379 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008380 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8381 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8382 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8383 return;
8384 }
8385 CreatePipelineHelper pipe(*this);
8386 pipe.InitInfo();
8387 pipe.InitState();
8388 pipe.CreateGraphicsPipeline();
8389
8390 m_commandBuffer->begin();
8391 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8392 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8393
8394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8395 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8396 m_errorMonitor->VerifyFound();
8397
8398 m_commandBuffer->EndRenderPass();
8399 m_commandBuffer->end();
8400}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008401
8402TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8403 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8404
8405 // Enable KHR_fragment_shading_rate and all of its required extensions
8406 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8407 if (fsr_extensions) {
8408 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8409 }
8410 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8411
8412 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8413 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8414 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8415 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8416 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8417 if (fsr_extensions) {
8418 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8419 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8420 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8421 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8422 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8423 } else {
8424 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8425 return;
8426 }
8427
8428 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = {};
8429 fsr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
8430 fsr_features.pipelineFragmentShadingRate = true;
8431
8432 VkPhysicalDeviceFeatures2 device_features = {};
8433 device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8434 device_features.pNext = &fsr_features;
8435
8436 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8437
8438 // Find address of extension call and make the call
8439 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8440 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8441 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8442
8443 VkExtent2D fragmentSize = {1, 1};
8444 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8445 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8446
8447 m_commandBuffer->begin();
8448 fragmentSize.width = 0;
8449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8450 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8451 m_errorMonitor->VerifyFound();
8452 fragmentSize.width = 1;
8453
8454 fragmentSize.height = 0;
8455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8456 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8457 m_errorMonitor->VerifyFound();
8458 fragmentSize.height = 1;
8459
8460 fragmentSize.width = 3;
8461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8462 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8463 m_errorMonitor->VerifyFound();
8464 fragmentSize.width = 1;
8465
8466 fragmentSize.height = 3;
8467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8468 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8469 m_errorMonitor->VerifyFound();
8470 fragmentSize.height = 1;
8471
8472 fragmentSize.width = 8;
8473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8474 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8475 m_errorMonitor->VerifyFound();
8476 fragmentSize.width = 1;
8477
8478 fragmentSize.height = 8;
8479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8480 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8481 m_errorMonitor->VerifyFound();
8482 fragmentSize.height = 1;
8483 m_commandBuffer->end();
8484}
8485
8486TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8487 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8488
8489 // Enable KHR_fragment_shading_rate and all of its required extensions
8490 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8491 if (fsr_extensions) {
8492 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8493 }
8494 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8495
8496 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8497 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8498 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8499 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8500 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8501 if (fsr_extensions) {
8502 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8503 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8504 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8505 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8506 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8507 } else {
8508 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8509 return;
8510 }
8511
8512 ASSERT_NO_FATAL_FAILURE(InitState());
8513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8514
8515 // Find address of extension call and make the call
8516 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8517 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8518 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8519
8520 VkExtent2D fragmentSize = {1, 1};
8521 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8522 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8523
8524 m_commandBuffer->begin();
8525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8526 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8527 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8528 m_errorMonitor->VerifyFound();
8529 m_commandBuffer->end();
8530}
8531
8532TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8533 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8534
8535 // Enable KHR_fragment_shading_rate and all of its required extensions
8536 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8537 if (fsr_extensions) {
8538 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8539 }
8540 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8541
8542 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8543 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8544 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8545 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8546 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8547 if (fsr_extensions) {
8548 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8549 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8550 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8551 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8552 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8553 } else {
8554 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8555 return;
8556 }
8557
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008558 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8559 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008560
8561 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8562 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8563 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8564
8565 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8566 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8567
8568 // Find address of extension call and make the call
8569 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8570 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8571 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8572
8573 VkExtent2D fragmentSize = {1, 1};
8574 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8575 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8576
8577 m_commandBuffer->begin();
8578
8579 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8580 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8581 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8582 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8583 m_errorMonitor->VerifyFound();
8584 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8585
8586 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8588 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8589 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8590 m_errorMonitor->VerifyFound();
8591 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8592
8593 m_commandBuffer->end();
8594}
8595
8596TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8597 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8598
8599 // Enable KHR_fragment_shading_rate and all of its required extensions
8600 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8601 if (fsr_extensions) {
8602 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8603 }
8604 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8605
8606 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8607 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8608 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8609 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8610 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8611 if (fsr_extensions) {
8612 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8613 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8614 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8615 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8616 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8617 } else {
8618 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8619 return;
8620 }
8621
8622 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8623 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8624 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008625 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8626 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008627 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8628
8629 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8630 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8631 return;
8632 }
8633
8634 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8635
8636 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8637 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8638
8639 // Find address of extension call and make the call
8640 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8641 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8642 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8643
8644 VkExtent2D fragmentSize = {1, 1};
8645 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8646 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8647
8648 m_commandBuffer->begin();
8649 fragmentSize.width = 2;
8650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8651 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8652 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8653 m_errorMonitor->VerifyFound();
8654 fragmentSize.width = 1;
8655
8656 fragmentSize.height = 2;
8657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8658 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8659 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8660 m_errorMonitor->VerifyFound();
8661 fragmentSize.height = 1;
8662}
8663
8664TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8665 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8666
8667 // Enable KHR_fragment_shading_rate and all of its required extensions
8668 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8669 if (fsr_extensions) {
8670 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8671 }
8672 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8673
8674 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8675 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8676 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8677 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8678 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8679 if (fsr_extensions) {
8680 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8681 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8682 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8683 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8684 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8685 } else {
8686 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8687 return;
8688 }
8689
8690 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8691 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8692 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8693 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008694 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8695 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008696 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8697
8698 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8699 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8700 return;
8701 }
8702
8703 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8704 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8705 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008706 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8707 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008708 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8709
8710 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8711 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8712 return;
8713 }
8714
8715 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8716 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8717
8718 // Find address of extension call and make the call
8719 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8720 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8721 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8722
8723 VkExtent2D fragmentSize = {1, 1};
8724 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8725 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8726
8727 m_commandBuffer->begin();
8728 if (fsr_features.primitiveFragmentShadingRate) {
8729 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8731 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8732 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8733 m_errorMonitor->VerifyFound();
8734 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8735 }
8736
8737 if (fsr_features.attachmentFragmentShadingRate) {
8738 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8740 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8741 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8742 m_errorMonitor->VerifyFound();
8743 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8744 }
8745 m_commandBuffer->end();
8746}
8747
8748TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8749 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8750
8751 // Enable KHR_fragment_shading_rate and all of its required extensions
8752 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8753 if (fsr_extensions) {
8754 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8755 }
8756 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8757
8758 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8759 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8760 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8761 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8762 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8763 if (fsr_extensions) {
8764 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8765 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8766 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8767 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8768 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8769 } else {
8770 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8771 return;
8772 }
8773
8774 bool eds_extension = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8775 if (eds_extension) {
8776 m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8777 } else {
8778 printf("%s requires VK_EXT_extended_dynamic_state.\n", kSkipPrefix);
8779 return;
8780 }
8781
8782 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8783 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8784 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8785 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008786 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8787 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008788 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8789
8790 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
8791 printf("%s requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.\n", kSkipPrefix);
8792 return;
8793 }
8794
8795 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8796 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8797 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008798 VkPhysicalDeviceExtendedDynamicStateFeaturesEXT eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008799 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008800 LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8801 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008802 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8803
8804 if (!fsr_features.primitiveFragmentShadingRate) {
8805 printf("%s requires primitiveFragmentShadingRate to be supported.\n", kSkipPrefix);
8806 return;
8807 }
8808
8809 if (!features2.features.multiViewport) {
8810 printf("%s requires multiViewport to be supported.\n", kSkipPrefix);
8811 return;
8812 }
8813
8814 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8815 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8816
8817 char const *vsSource =
8818 "#version 450\n"
8819 "#extension GL_EXT_fragment_shading_rate : enable\n"
8820 "void main() {\n"
8821 " gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;\n"
8822 "}\n";
8823
Tobias Hector04f2ab22020-12-01 10:59:33 +00008824 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8825
8826 VkPipelineObj pipe(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008827 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8828 pipe.SetScissor(scissors);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008829 pipe.AddShader(&fs);
8830 pipe.AddDefaultColorAttachment();
8831 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008832 const VkPipelineLayoutObj pl(m_device);
Tony-LunarG6ee10062021-02-03 13:56:52 -07008833 {
8834 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8835 pipe.AddShader(&vs);
8836 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8837 ASSERT_VK_SUCCESS(err);
8838 }
Tobias Hector04f2ab22020-12-01 10:59:33 +00008839 m_commandBuffer->begin();
8840 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8841
8842 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8843
8844 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8845 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
8846 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
8847 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
8848
8849 // error produced here.
8850 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
8851
8852 m_errorMonitor->VerifyFound();
8853
8854 m_commandBuffer->EndRenderPass();
8855 m_commandBuffer->end();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008856}