blob: 82960d5ecc076a5d96bd6e61d1955cc9a80e88aa [file] [log] [blame]
unknown088160a2019-05-23 17:43:13 -06001/*
sfricke-samsung6d97e562020-01-07 22:01:00 -08002 * Copyright (c) 2015-2020 The Khronos Group Inc.
3 * Copyright (c) 2015-2020 Valve Corporation
4 * Copyright (c) 2015-2020 LunarG, Inc.
5 * Copyright (c) 2015-2020 Google, Inc.
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
unknown088160a2019-05-23 17:43:13 -0600388TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700389 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600390 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted");
391
392 ASSERT_NO_FATAL_FAILURE(Init());
393 ASSERT_NO_FATAL_FAILURE(InitViewport());
394 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
395
396 // We luck out b/c by default the framework creates CB w/ the
397 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
398 m_commandBuffer->begin();
399 m_commandBuffer->ClearAllBuffers(m_renderTargets, m_clear_color, nullptr, m_depth_clear_color, m_stencil_clear_color);
400 m_commandBuffer->end();
401
402 // Bypass framework since it does the waits automatically
403 VkResult err = VK_SUCCESS;
404 VkSubmitInfo submit_info;
405 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
406 submit_info.pNext = NULL;
407 submit_info.waitSemaphoreCount = 0;
408 submit_info.pWaitSemaphores = NULL;
409 submit_info.pWaitDstStageMask = NULL;
410 submit_info.commandBufferCount = 1;
411 submit_info.pCommandBuffers = &m_commandBuffer->handle();
412 submit_info.signalSemaphoreCount = 0;
413 submit_info.pSignalSemaphores = NULL;
414
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600415 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -0600416 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600417 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600418
419 // Cause validation error by re-submitting cmd buffer that should only be
420 // submitted once
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600421 err = vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
422 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -0600423
424 m_errorMonitor->VerifyFound();
425}
426
427TEST_F(VkLayerTest, InvalidPushConstants) {
428 ASSERT_NO_FATAL_FAILURE(Init());
429 ASSERT_NO_FATAL_FAILURE(InitViewport());
430 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
431
432 VkPipelineLayout pipeline_layout;
433 VkPushConstantRange pc_range = {};
434 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
435 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
436 pipeline_layout_ci.pushConstantRangeCount = 1;
437 pipeline_layout_ci.pPushConstantRanges = &pc_range;
438
439 //
440 // Check for invalid push constant ranges in pipeline layouts.
441 //
442 struct PipelineLayoutTestCase {
443 VkPushConstantRange const range;
444 char const *msg;
445 };
446
447 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
448 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
449 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0}, "vkCreatePipelineLayout() call has push constants index 0 with size 0."},
450 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1}, "vkCreatePipelineLayout() call has push constants index 0 with size 1."},
451 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1}, "vkCreatePipelineLayout() call has push constants index 0 with size 1."},
452 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0}, "vkCreatePipelineLayout() call has push constants index 0 with size 0."},
453 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4}, "vkCreatePipelineLayout() call has push constants index 0 with offset 1. Offset must"},
454 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big}, "vkCreatePipelineLayout() call has push constants index 0 with offset "},
455 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big}, "vkCreatePipelineLayout() call has push constants index 0 with offset "},
456 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4}, "vkCreatePipelineLayout() call has push constants index 0 with offset "},
457 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
458 "vkCreatePipelineLayout() call has push constants index 0 with offset "},
459 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
460 "vkCreatePipelineLayout() call has push constants index 0 with offset "},
461 }};
462
463 // Check for invalid offset and size
464 for (const auto &iter : range_tests) {
465 pc_range = iter.range;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700466 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600467 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600468 m_errorMonitor->VerifyFound();
469 }
470
471 // Check for invalid stage flag
472 pc_range.offset = 0;
473 pc_range.size = 16;
474 pc_range.stageFlags = 0;
475 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -0700476 kErrorBit, "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600477 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600478 m_errorMonitor->VerifyFound();
479
480 // Check for duplicate stage flags in a list of push constant ranges.
481 // A shader can only have one push constant block and that block is mapped
482 // to the push constant range that has that shader's stage flag set.
483 // The shader's stage flag can only appear once in all the ranges, so the
484 // implementation can find the one and only range to map it to.
485 const uint32_t ranges_per_test = 5;
486 struct DuplicateStageFlagsTestCase {
487 VkPushConstantRange const ranges[ranges_per_test];
488 std::vector<char const *> const msg;
489 };
490 // Overlapping ranges are OK, but a stage flag can appear only once.
491 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
492 {
493 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
494 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
495 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
496 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
497 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
498 {
499 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
500 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
501 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
502 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
503 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
504 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
505 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
506 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
507 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
508 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
509 }},
510 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
511 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
512 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
513 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
514 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
515 {
516 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
517 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
518 }},
519 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
520 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
521 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
522 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
523 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
524 {
525 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
526 }},
527 },
528 };
529
530 for (const auto &iter : duplicate_stageFlags_tests) {
531 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
532 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Mark Lobodzinski20310782020-02-28 14:25:17 -0700533 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, iter.msg.begin(), iter.msg.end());
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600534 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
unknown088160a2019-05-23 17:43:13 -0600535 m_errorMonitor->VerifyFound();
536 }
537
538 //
539 // CmdPushConstants tests
540 //
541
542 // Setup a pipeline layout with ranges: [0,32) [16,80)
543 const std::vector<VkPushConstantRange> pc_range2 = {{VK_SHADER_STAGE_VERTEX_BIT, 16, 64},
544 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 32}};
545 const VkPipelineLayoutObj pipeline_layout_obj(m_device, {}, pc_range2);
546
547 const uint8_t dummy_values[100] = {};
548
549 m_commandBuffer->begin();
550 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
551
552 // Check for invalid stage flag
553 // Note that VU 00996 isn't reached due to parameter validation
Mark Lobodzinski20310782020-02-28 14:25:17 -0700554 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600555 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), 0, 0, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600556 m_errorMonitor->VerifyFound();
557
558 // Positive tests for the overlapping ranges
559 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600560 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16,
561 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600562 m_errorMonitor->VerifyNotFound();
563 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600564 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 32, 48, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600565 m_errorMonitor->VerifyNotFound();
566 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600567 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
568 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600569 m_errorMonitor->VerifyNotFound();
570
571 // Wrong cmd stages for extant range
572 // No range for all cmd stages -- "VUID-vkCmdPushConstants-offset-01795" VUID-vkCmdPushConstants-offset-01795
Mark Lobodzinski20310782020-02-28 14:25:17 -0700573 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
unknown088160a2019-05-23 17:43:13 -0600574 // Missing cmd stages for found overlapping range -- "VUID-vkCmdPushConstants-offset-01796" VUID-vkCmdPushConstants-offset-01796
Mark Lobodzinski20310782020-02-28 14:25:17 -0700575 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600576 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16,
577 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600578 m_errorMonitor->VerifyFound();
579
580 // Wrong no extant range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700581 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600582 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_FRAGMENT_BIT, 80, 4,
583 dummy_values);
unknown088160a2019-05-23 17:43:13 -0600584 m_errorMonitor->VerifyFound();
585
586 // Wrong overlapping extent
Mark Lobodzinski20310782020-02-28 14:25:17 -0700587 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01795");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600588 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(),
589 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 20, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600590 m_errorMonitor->VerifyFound();
591
592 // Wrong stage flags for valid overlapping range
Mark Lobodzinski20310782020-02-28 14:25:17 -0700593 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushConstants-offset-01796");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600594 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_obj.handle(), VK_SHADER_STAGE_VERTEX_BIT, 16, 16, dummy_values);
unknown088160a2019-05-23 17:43:13 -0600595 m_errorMonitor->VerifyFound();
596
597 m_commandBuffer->EndRenderPass();
598 m_commandBuffer->end();
599}
600
601TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinski20310782020-02-28 14:25:17 -0700602 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "You must call vkBeginCommandBuffer() before this call to ");
unknown088160a2019-05-23 17:43:13 -0600603
604 ASSERT_NO_FATAL_FAILURE(Init());
605 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
606 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600607 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600608
609 m_errorMonitor->VerifyFound();
610}
611
612TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
613 ASSERT_NO_FATAL_FAILURE(Init());
614
615 VkCommandBufferObj cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
616
617 // Force the failure by not setting the Renderpass and Framebuffer fields
618 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
619 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
620
621 VkCommandBufferBeginInfo cmd_buf_info = {};
622 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
623 cmd_buf_info.pNext = NULL;
624 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
625 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
626
Mark Lobodzinski20310782020-02-28 14:25:17 -0700627 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCommandBufferBeginInfo-flags-00053");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600628 vk::BeginCommandBuffer(cb.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600629 m_errorMonitor->VerifyFound();
630}
631
632TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedExplicitReset) {
633 ASSERT_NO_FATAL_FAILURE(Init());
634
Mark Lobodzinski20310782020-02-28 14:25:17 -0700635 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600636
637 // A pool we can reset in.
638 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
639 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
640
641 secondary.begin();
642 secondary.end();
643
644 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600645 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600646
647 // rerecording of secondary
648 secondary.reset(); // explicit reset here.
649 secondary.begin();
650 secondary.end();
651
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600652 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600653 m_errorMonitor->VerifyFound();
654}
655
656TEST_F(VkLayerTest, SecondaryCommandBufferRerecordedNoReset) {
657 ASSERT_NO_FATAL_FAILURE(Init());
658
Mark Lobodzinski20310782020-02-28 14:25:17 -0700659 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "was destroyed or rerecorded");
unknown088160a2019-05-23 17:43:13 -0600660
661 // A pool we can reset in.
662 VkCommandPoolObj pool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
663 VkCommandBufferObj secondary(m_device, &pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
664
665 secondary.begin();
666 secondary.end();
667
668 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600669 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600670
671 // rerecording of secondary
672 secondary.begin(); // implicit reset in begin
673 secondary.end();
674
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600675 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600676 m_errorMonitor->VerifyFound();
677}
678
679TEST_F(VkLayerTest, CascadedInvalidation) {
680 ASSERT_NO_FATAL_FAILURE(Init());
681
682 VkEventCreateInfo eci = {VK_STRUCTURE_TYPE_EVENT_CREATE_INFO, nullptr, 0};
683 VkEvent event;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600684 vk::CreateEvent(m_device->device(), &eci, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -0600685
686 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
687 secondary.begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600688 vk::CmdSetEvent(secondary.handle(), event, VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT);
unknown088160a2019-05-23 17:43:13 -0600689 secondary.end();
690
691 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600692 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -0600693 m_commandBuffer->end();
694
695 // destroying the event should invalidate both primary and secondary CB
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600696 vk::DestroyEvent(m_device->device(), event, nullptr);
unknown088160a2019-05-23 17:43:13 -0600697
Mark Lobodzinski20310782020-02-28 14:25:17 -0700698 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBuffer-VkEvent");
unknown088160a2019-05-23 17:43:13 -0600699 m_commandBuffer->QueueCommandBuffer(false);
700 m_errorMonitor->VerifyFound();
701}
702
703TEST_F(VkLayerTest, CommandBufferResetErrors) {
704 // Cause error due to Begin while recording CB
705 // Then cause 2 errors for attempting to reset CB w/o having
706 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
707 // which CBs were allocated. Note that this bit is off by default.
Mark Lobodzinski20310782020-02-28 14:25:17 -0700708 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00049");
unknown088160a2019-05-23 17:43:13 -0600709
710 ASSERT_NO_FATAL_FAILURE(Init());
711
712 // Calls AllocateCommandBuffers
713 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
714
715 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
716 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
717 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
718 VkCommandBufferBeginInfo cmd_buf_info = {};
719 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
720 cmd_buf_info.pNext = NULL;
721 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
722 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
723
724 // Begin CB to transition to recording state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600725 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600726 // Can't re-begin. This should trigger error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600727 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600728 m_errorMonitor->VerifyFound();
729
Mark Lobodzinski20310782020-02-28 14:25:17 -0700730 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkResetCommandBuffer-commandBuffer-00046");
unknown088160a2019-05-23 17:43:13 -0600731 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
732 // Reset attempt will trigger error due to incorrect CommandPool state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600733 vk::ResetCommandBuffer(commandBuffer.handle(), flags);
unknown088160a2019-05-23 17:43:13 -0600734 m_errorMonitor->VerifyFound();
735
Mark Lobodzinski20310782020-02-28 14:25:17 -0700736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-00050");
unknown088160a2019-05-23 17:43:13 -0600737 // Transition CB to RECORDED state
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600738 vk::EndCommandBuffer(commandBuffer.handle());
unknown088160a2019-05-23 17:43:13 -0600739 // Now attempting to Begin will implicitly reset, which triggers error
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600740 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
unknown088160a2019-05-23 17:43:13 -0600741 m_errorMonitor->VerifyFound();
742}
743
sfricke-samsungae9f00a2020-05-28 20:48:49 -0700744TEST_F(VkLayerTest, CommandBufferPrimaryFlags) {
745 ASSERT_NO_FATAL_FAILURE(Init());
746
747 // Calls AllocateCommandBuffers
748 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
749
750 VkCommandBufferBeginInfo cmd_buf_info = {};
751 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
752 cmd_buf_info.pNext = NULL;
753 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
754
755 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkBeginCommandBuffer-commandBuffer-02840");
756 vk::BeginCommandBuffer(commandBuffer.handle(), &cmd_buf_info);
757 m_errorMonitor->VerifyFound();
758}
759
unknown088160a2019-05-23 17:43:13 -0600760TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
761 // Call CmdClearAttachmentss outside of an active RenderPass
762
Mark Lobodzinski20310782020-02-28 14:25:17 -0700763 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -0600764 "vkCmdClearAttachments(): This call must be issued inside an active render pass");
765
766 ASSERT_NO_FATAL_FAILURE(Init());
767 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
768
769 // Start no RenderPass
770 m_commandBuffer->begin();
771
772 VkClearAttachment color_attachment;
773 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
774 color_attachment.clearValue.color.float32[0] = 0;
775 color_attachment.clearValue.color.float32[1] = 0;
776 color_attachment.clearValue.color.float32[2] = 0;
777 color_attachment.clearValue.color.float32[3] = 0;
778 color_attachment.colorAttachment = 0;
Mark Lobodzinskid5447512019-06-28 09:56:36 -0600779 VkClearRect clear_rect = {{{0, 0}, {32, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600780 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
unknown088160a2019-05-23 17:43:13 -0600781
782 m_errorMonitor->VerifyFound();
783}
784
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600785TEST_F(VkLayerTest, ClearColorAttachmentsZeroLayercount) {
786 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a layerCount of zero.");
787
Mark Lobodzinski20310782020-02-28 14:25:17 -0700788 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-layerCount-01934");
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600789
790 ASSERT_NO_FATAL_FAILURE(Init());
791 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
792
793 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600794 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600795
796 VkClearAttachment color_attachment;
797 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
798 color_attachment.clearValue.color.float32[0] = 0;
799 color_attachment.clearValue.color.float32[1] = 0;
800 color_attachment.clearValue.color.float32[2] = 0;
801 color_attachment.clearValue.color.float32[3] = 0;
802 color_attachment.colorAttachment = 0;
803 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600804 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinski7d7da062019-06-27 16:01:39 -0600805
806 m_errorMonitor->VerifyFound();
807}
808
sfricke-samsungf0f3d8b2020-04-25 02:20:47 -0700809TEST_F(VkLayerTest, ClearColorAttachmentsZeroExtent) {
810 TEST_DESCRIPTION("Call CmdClearAttachments with a pRect having a rect2D extent of zero.");
811
812 ASSERT_NO_FATAL_FAILURE(Init());
813 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
814
815 m_commandBuffer->begin();
816 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
817
818 VkClearAttachment color_attachment;
819 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
820 color_attachment.clearValue.color.float32[0] = 0;
821 color_attachment.clearValue.color.float32[1] = 0;
822 color_attachment.clearValue.color.float32[2] = 0;
823 color_attachment.clearValue.color.float32[3] = 0;
824 color_attachment.colorAttachment = 0;
825 VkClearRect clear_rect = {};
826 clear_rect.rect.offset = {0, 0};
827 clear_rect.baseArrayLayer = 0;
828 clear_rect.layerCount = 1;
829
830 clear_rect.rect.extent = {0, 1};
831 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02682");
832 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
833 m_errorMonitor->VerifyFound();
834
835 clear_rect.rect.extent = {1, 0};
836 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-rect-02683");
837 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
838 m_errorMonitor->VerifyFound();
839}
840
sfricke-samsung6141db32020-10-26 03:31:38 -0700841TEST_F(VkLayerTest, ClearAttachmentsInvalidAspectMasks) {
842 TEST_DESCRIPTION("Check VkClearAttachment invalid aspect masks.");
843
844 ASSERT_NO_FATAL_FAILURE(Init());
845 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
846
847 m_commandBuffer->begin();
848 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
849
850 VkClearAttachment attachment;
851 attachment.clearValue.color.float32[0] = 0;
852 attachment.clearValue.color.float32[1] = 0;
853 attachment.clearValue.color.float32[2] = 0;
854 attachment.clearValue.color.float32[3] = 0;
855 attachment.colorAttachment = 0;
856 VkClearRect clear_rect = {};
857 clear_rect.rect.offset = {0, 0};
858 clear_rect.rect.extent = {1, 1};
859 clear_rect.baseArrayLayer = 0;
860 clear_rect.layerCount = 1;
861
862 attachment.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
863 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
864 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
865 m_errorMonitor->VerifyFound();
866
867 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT;
868 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-00020");
869 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
870 m_errorMonitor->VerifyFound();
871
872 attachment.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
873 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
874 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
875 m_errorMonitor->VerifyFound();
876
877 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
878 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-02246");
879 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
880 m_errorMonitor->VerifyFound();
881}
882
sfricke-samsung91f4a542020-10-21 00:29:17 -0700883TEST_F(VkLayerTest, ClearAttachmentsImplicitCheck) {
884 TEST_DESCRIPTION("Check VkClearAttachment implicit VUs.");
885
886 ASSERT_NO_FATAL_FAILURE(Init());
887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
888
889 m_commandBuffer->begin();
890 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
891
892 VkClearAttachment color_attachment;
893 color_attachment.clearValue.color.float32[0] = 0;
894 color_attachment.clearValue.color.float32[1] = 0;
895 color_attachment.clearValue.color.float32[2] = 0;
896 color_attachment.clearValue.color.float32[3] = 0;
897 color_attachment.colorAttachment = 0;
898 VkClearRect clear_rect = {};
899 clear_rect.rect.offset = {0, 0};
900 clear_rect.rect.extent = {1, 1};
901 clear_rect.baseArrayLayer = 0;
902 clear_rect.layerCount = 1;
903
904 color_attachment.aspectMask = 0;
905 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-requiredbitmask");
906 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
907 m_errorMonitor->VerifyFound();
908
909 color_attachment.aspectMask = 0xffffffff;
910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkClearAttachment-aspectMask-parameter");
911 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &color_attachment, 1, &clear_rect);
912 m_errorMonitor->VerifyFound();
913}
914
sfricke-samsung87b09512020-10-26 03:35:42 -0700915TEST_F(VkLayerTest, ClearColorAttachmentsDepthStencil) {
916 TEST_DESCRIPTION("Call CmdClearAttachments with invalid depth/stencil aspect masks.");
917
918 ASSERT_NO_FATAL_FAILURE(Init());
919 // Creates a color attachment
920 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
921
922 m_commandBuffer->begin();
923 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_INLINE);
924
925 VkClearAttachment attachment;
926 attachment.clearValue.color.float32[0] = 0;
927 attachment.clearValue.color.float32[1] = 0;
928 attachment.clearValue.color.float32[2] = 0;
929 attachment.clearValue.color.float32[3] = 0;
930 attachment.colorAttachment = 0;
931 VkClearRect clear_rect = {};
932 clear_rect.rect.offset = {0, 0};
933 clear_rect.rect.extent = {1, 1};
934 clear_rect.baseArrayLayer = 0;
935 clear_rect.layerCount = 1;
936
937 m_errorMonitor->ExpectSuccess();
938 attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
939 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
940 m_errorMonitor->VerifyNotFound();
941
942 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02502");
943 attachment.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
944 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
945 m_errorMonitor->VerifyFound();
946
947 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-aspectMask-02503");
948 attachment.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
949 vk::CmdClearAttachments(m_commandBuffer->handle(), 1, &attachment, 1, &clear_rect);
950 m_errorMonitor->VerifyFound();
951}
952
unknown088160a2019-05-23 17:43:13 -0600953TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
954 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a primary command buffer (should only be secondary)");
955
956 ASSERT_NO_FATAL_FAILURE(Init());
957 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
958
959 // An empty primary command buffer
960 VkCommandBufferObj cb(m_device, m_commandPool);
961 cb.begin();
962 cb.end();
963
964 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600965 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -0600966 VkCommandBuffer handle = cb.handle();
967
Mark Lobodzinski20310782020-02-28 14:25:17 -0700968 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00088");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -0600969 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
unknown088160a2019-05-23 17:43:13 -0600970 m_errorMonitor->VerifyFound();
971
972 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be in the pending state");
973
974 m_commandBuffer->EndRenderPass();
975 m_commandBuffer->end();
976}
977
Petr Kraus8e53cf02020-01-03 05:30:04 +0100978TEST_F(VkLayerTest, ExecuteCommandsToSecondaryCB) {
979 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands to a Secondary command buffer");
980
981 ASSERT_NO_FATAL_FAILURE(Init());
982
983 VkCommandBufferObj main_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
984 VkCommandBufferObj secondary_cb(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
985 secondary_cb.begin();
986 secondary_cb.end();
987
988 main_cb.begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -0700989 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-bufferlevel");
Petr Kraus8e53cf02020-01-03 05:30:04 +0100990 vk::CmdExecuteCommands(main_cb.handle(), 1, &secondary_cb.handle());
991 m_errorMonitor->VerifyFound();
992}
993
unknown088160a2019-05-23 17:43:13 -0600994TEST_F(VkLayerTest, InvalidVertexAttributeAlignment) {
995 TEST_DESCRIPTION("Check for proper aligment of attribAddress which depends on a bound pipeline and on a bound vertex buffer");
996
997 ASSERT_NO_FATAL_FAILURE(Init());
998 ASSERT_NO_FATAL_FAILURE(InitViewport());
999 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1000
1001 const VkPipelineLayoutObj pipeline_layout(m_device);
1002
1003 struct VboEntry {
1004 uint16_t input0[2];
1005 uint32_t input1;
1006 float input2[4];
1007 };
1008
1009 const unsigned vbo_entry_count = 3;
1010 const VboEntry vbo_data[vbo_entry_count] = {};
1011
1012 VkConstantBufferObj vbo(m_device, static_cast<int>(sizeof(VboEntry) * vbo_entry_count),
1013 reinterpret_cast<const void *>(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
1014
1015 VkVertexInputBindingDescription input_binding;
1016 input_binding.binding = 0;
1017 input_binding.stride = sizeof(VboEntry);
1018 input_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
1019
1020 VkVertexInputAttributeDescription input_attribs[3];
1021
1022 input_attribs[0].binding = 0;
1023 // Location switch between attrib[0] and attrib[1] is intentional
1024 input_attribs[0].location = 1;
1025 input_attribs[0].format = VK_FORMAT_A8B8G8R8_UNORM_PACK32;
1026 input_attribs[0].offset = offsetof(VboEntry, input1);
1027
1028 input_attribs[1].binding = 0;
1029 input_attribs[1].location = 0;
1030 input_attribs[1].format = VK_FORMAT_R16G16_UNORM;
1031 input_attribs[1].offset = offsetof(VboEntry, input0);
1032
1033 input_attribs[2].binding = 0;
1034 input_attribs[2].location = 2;
1035 input_attribs[2].format = VK_FORMAT_R32G32B32A32_SFLOAT;
1036 input_attribs[2].offset = offsetof(VboEntry, input2);
1037
1038 char const *vsSource =
1039 "#version 450\n"
1040 "\n"
1041 "layout(location = 0) in vec2 input0;"
1042 "layout(location = 1) in vec4 input1;"
1043 "layout(location = 2) in vec4 input2;"
1044 "\n"
1045 "void main(){\n"
1046 " gl_Position = input1 + input2;\n"
1047 " gl_Position.xy += input0;\n"
1048 "}\n";
unknown088160a2019-05-23 17:43:13 -06001049
1050 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001051 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001052
1053 VkPipelineObj pipe1(m_device);
1054 pipe1.AddDefaultColorAttachment();
1055 pipe1.AddShader(&vs);
1056 pipe1.AddShader(&fs);
1057 pipe1.AddVertexInputBindings(&input_binding, 1);
1058 pipe1.AddVertexInputAttribs(&input_attribs[0], 3);
1059 pipe1.SetViewport(m_viewports);
1060 pipe1.SetScissor(m_scissors);
1061 pipe1.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1062
1063 input_binding.stride = 6;
1064
1065 VkPipelineObj pipe2(m_device);
1066 pipe2.AddDefaultColorAttachment();
1067 pipe2.AddShader(&vs);
1068 pipe2.AddShader(&fs);
1069 pipe2.AddVertexInputBindings(&input_binding, 1);
1070 pipe2.AddVertexInputAttribs(&input_attribs[0], 3);
1071 pipe2.SetViewport(m_viewports);
1072 pipe2.SetScissor(m_scissors);
1073 pipe2.CreateVKPipeline(pipeline_layout.handle(), renderPass());
1074
1075 m_commandBuffer->begin();
1076 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1077
1078 // Test with invalid buffer offset
1079 VkDeviceSize offset = 1;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001080 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe1.handle());
1081 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001082 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
1083 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 1");
1084 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001085 m_commandBuffer->Draw(1, 0, 0, 0);
1086 m_errorMonitor->VerifyFound();
1087
1088 // Test with invalid buffer stride
1089 offset = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001090 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe2.handle());
1091 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &vbo.handle(), &offset);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001092 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 0");
unknown088160a2019-05-23 17:43:13 -06001093 // Attribute[1] is aligned properly even with a wrong stride
Mark Lobodzinski20310782020-02-28 14:25:17 -07001094 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "Invalid attribAddress alignment for vertex attribute 2");
unknown088160a2019-05-23 17:43:13 -06001095 m_commandBuffer->Draw(1, 0, 0, 0);
1096 m_errorMonitor->VerifyFound();
1097
1098 m_commandBuffer->EndRenderPass();
1099 m_commandBuffer->end();
1100}
1101
1102TEST_F(VkLayerTest, NonSimultaneousSecondaryMarksPrimary) {
1103 ASSERT_NO_FATAL_FAILURE(Init());
locke-lunarg77b9f7c2019-06-18 00:06:03 -06001104 const char *simultaneous_use_message = "UNASSIGNED-CoreValidation-DrawState-InvalidCommandBufferSimultaneousUse";
unknown088160a2019-05-23 17:43:13 -06001105
1106 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1107
1108 secondary.begin();
1109 secondary.end();
1110
1111 VkCommandBufferBeginInfo cbbi = {
1112 VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
1113 nullptr,
1114 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT,
1115 nullptr,
1116 };
1117
1118 m_commandBuffer->begin(&cbbi);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001119 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001120 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001121 m_errorMonitor->VerifyFound();
1122 m_commandBuffer->end();
1123}
1124
1125TEST_F(VkLayerTest, SimultaneousUseSecondaryTwoExecutes) {
1126 ASSERT_NO_FATAL_FAILURE(Init());
1127
John Zulauff1640d12019-08-13 15:39:58 -06001128 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00092";
unknown088160a2019-05-23 17:43:13 -06001129
1130 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1131
1132 VkCommandBufferInheritanceInfo inh = {
1133 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1134 nullptr,
1135 };
1136 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1137
1138 secondary.begin(&cbbi);
1139 secondary.end();
1140
1141 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001142 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
Mark Lobodzinski20310782020-02-28 14:25:17 -07001143 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001144 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06001145 m_errorMonitor->VerifyFound();
1146 m_commandBuffer->end();
1147}
1148
1149TEST_F(VkLayerTest, SimultaneousUseSecondarySingleExecute) {
1150 ASSERT_NO_FATAL_FAILURE(Init());
1151
1152 // variation on previous test executing the same CB twice in the same
1153 // CmdExecuteCommands call
1154
John Zulauff1640d12019-08-13 15:39:58 -06001155 const char *simultaneous_use_message = "VUID-vkCmdExecuteCommands-pCommandBuffers-00093";
unknown088160a2019-05-23 17:43:13 -06001156
1157 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
1158
1159 VkCommandBufferInheritanceInfo inh = {
1160 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
1161 nullptr,
1162 };
1163 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, &inh};
1164
1165 secondary.begin(&cbbi);
1166 secondary.end();
1167
1168 m_commandBuffer->begin();
1169 VkCommandBuffer cbs[] = {secondary.handle(), secondary.handle()};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001170 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001171 vk::CmdExecuteCommands(m_commandBuffer->handle(), 2, cbs);
unknown088160a2019-05-23 17:43:13 -06001172 m_errorMonitor->VerifyFound();
1173 m_commandBuffer->end();
1174}
1175
1176TEST_F(VkLayerTest, SimultaneousUseOneShot) {
1177 TEST_DESCRIPTION("Submit the same command buffer twice in one submit looking for simultaneous use and one time submit errors");
1178 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
1179 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
1180 ASSERT_NO_FATAL_FAILURE(Init());
1181
1182 VkCommandBuffer cmd_bufs[2];
1183 VkCommandBufferAllocateInfo alloc_info;
1184 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
1185 alloc_info.pNext = NULL;
1186 alloc_info.commandBufferCount = 2;
1187 alloc_info.commandPool = m_commandPool->handle();
1188 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001189 vk::AllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
unknown088160a2019-05-23 17:43:13 -06001190
1191 VkCommandBufferBeginInfo cb_binfo;
1192 cb_binfo.pNext = NULL;
1193 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
1194 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
1195 cb_binfo.flags = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001196 vk::BeginCommandBuffer(cmd_bufs[0], &cb_binfo);
unknown088160a2019-05-23 17:43:13 -06001197 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001198 vk::CmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
1199 vk::EndCommandBuffer(cmd_bufs[0]);
unknown088160a2019-05-23 17:43:13 -06001200 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
1201
1202 VkSubmitInfo submit_info = {};
1203 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1204 submit_info.commandBufferCount = 2;
1205 submit_info.pCommandBuffers = duplicates;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001206 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, simultaneous_use_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001207 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001208 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001209 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001210
1211 // Set one time use and now look for one time submit
1212 duplicates[0] = duplicates[1] = cmd_bufs[1];
1213 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 -06001214 vk::BeginCommandBuffer(cmd_bufs[1], &cb_binfo);
1215 vk::CmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
1216 vk::EndCommandBuffer(cmd_bufs[1]);
Mark Lobodzinski20310782020-02-28 14:25:17 -07001217 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, one_shot_message);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001218 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06001219 m_errorMonitor->VerifyFound();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001220 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06001221}
1222
1223TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
1224 TEST_DESCRIPTION(
1225 "Test that an error is produced when an image view type does not match the dimensionality declared in the shader");
1226
Mark Lobodzinski20310782020-02-28 14:25:17 -07001227 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
unknown088160a2019-05-23 17:43:13 -06001228
1229 ASSERT_NO_FATAL_FAILURE(Init());
1230 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1231
unknown088160a2019-05-23 17:43:13 -06001232 char const *fsSource =
1233 "#version 450\n"
1234 "\n"
1235 "layout(set=0, binding=0) uniform sampler3D s;\n"
1236 "layout(location=0) out vec4 color;\n"
1237 "void main() {\n"
1238 " color = texture(s, vec3(0));\n"
1239 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001240 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001241 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1242
1243 VkPipelineObj pipe(m_device);
1244 pipe.AddShader(&vs);
1245 pipe.AddShader(&fs);
1246 pipe.AddDefaultColorAttachment();
1247
1248 VkTextureObj texture(m_device, nullptr);
1249 VkSamplerObj sampler(m_device);
1250
1251 VkDescriptorSetObj descriptorSet(m_device);
1252 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1253 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1254
1255 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1256 ASSERT_VK_SUCCESS(err);
1257
1258 m_commandBuffer->begin();
1259 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1260
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001261 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001262 m_commandBuffer->BindDescriptorSet(descriptorSet);
1263
1264 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001265 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001266 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001267 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001268
1269 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001270 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001271
1272 m_errorMonitor->VerifyFound();
1273
1274 m_commandBuffer->EndRenderPass();
1275 m_commandBuffer->end();
1276}
1277
1278TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
1279 TEST_DESCRIPTION(
1280 "Test that an error is produced when a multisampled images are consumed via singlesample images types in the shader, or "
1281 "vice versa.");
1282
Mark Lobodzinski20310782020-02-28 14:25:17 -07001283 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "requires bound image to have multiple samples");
unknown088160a2019-05-23 17:43:13 -06001284
1285 ASSERT_NO_FATAL_FAILURE(Init());
1286 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1287
unknown088160a2019-05-23 17:43:13 -06001288 char const *fsSource =
1289 "#version 450\n"
1290 "\n"
1291 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
1292 "layout(location=0) out vec4 color;\n"
1293 "void main() {\n"
1294 " color = texelFetch(s, ivec2(0), 0);\n"
1295 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001296 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001297 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1298
1299 VkPipelineObj pipe(m_device);
1300 pipe.AddShader(&vs);
1301 pipe.AddShader(&fs);
1302 pipe.AddDefaultColorAttachment();
1303
1304 VkTextureObj texture(m_device, nullptr); // THIS LINE CAUSES CRASH ON MALI
1305 VkSamplerObj sampler(m_device);
1306
1307 VkDescriptorSetObj descriptorSet(m_device);
1308 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1309 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1310
1311 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1312 ASSERT_VK_SUCCESS(err);
1313
1314 m_commandBuffer->begin();
1315 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1316
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001317 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001318 m_commandBuffer->BindDescriptorSet(descriptorSet);
1319
1320 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001321 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001322 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001323 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001324
1325 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001326 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001327
1328 m_errorMonitor->VerifyFound();
1329
1330 m_commandBuffer->EndRenderPass();
1331 m_commandBuffer->end();
1332}
1333
1334TEST_F(VkLayerTest, DrawTimeImageComponentTypeMismatchWithPipeline) {
1335 TEST_DESCRIPTION(
1336 "Test that an error is produced when the component type of an imageview disagrees with the type in the shader.");
1337
Mark Lobodzinski20310782020-02-28 14:25:17 -07001338 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "SINT component type, but bound descriptor");
unknown088160a2019-05-23 17:43:13 -06001339
1340 ASSERT_NO_FATAL_FAILURE(Init());
1341 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1342
unknown088160a2019-05-23 17:43:13 -06001343 char const *fsSource =
1344 "#version 450\n"
1345 "\n"
1346 "layout(set=0, binding=0) uniform isampler2D s;\n"
1347 "layout(location=0) out vec4 color;\n"
1348 "void main() {\n"
1349 " color = texelFetch(s, ivec2(0), 0);\n"
1350 "}\n";
locke-lunarg8e2c91b2019-06-11 17:53:26 -06001351 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
unknown088160a2019-05-23 17:43:13 -06001352 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
1353
1354 VkPipelineObj pipe(m_device);
1355 pipe.AddShader(&vs);
1356 pipe.AddShader(&fs);
1357 pipe.AddDefaultColorAttachment();
1358
1359 VkTextureObj texture(m_device, nullptr); // UNORM texture by default, incompatible with isampler2D
1360 VkSamplerObj sampler(m_device);
1361
1362 VkDescriptorSetObj descriptorSet(m_device);
1363 descriptorSet.AppendSamplerTexture(&sampler, &texture);
1364 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
1365
1366 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
1367 ASSERT_VK_SUCCESS(err);
1368
1369 m_commandBuffer->begin();
1370 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
1371
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001372 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
unknown088160a2019-05-23 17:43:13 -06001373 m_commandBuffer->BindDescriptorSet(descriptorSet);
1374
1375 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001376 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06001377 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001378 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06001379
1380 // error produced here.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001381 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
unknown088160a2019-05-23 17:43:13 -06001382
1383 m_errorMonitor->VerifyFound();
1384
1385 m_commandBuffer->EndRenderPass();
1386 m_commandBuffer->end();
1387}
1388
unknown088160a2019-05-23 17:43:13 -06001389TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
1390 TEST_DESCRIPTION(
1391 "Try to copy between images with the source subresource having a different layerCount than the destination subresource");
sfricke-samsung30b094c2020-05-30 11:42:11 -07001392 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1393 bool maintenance1 = false;
1394 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
1395 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1396 maintenance1 = true;
1397 }
1398 ASSERT_NO_FATAL_FAILURE(InitState());
1399
1400 VkFormat image_format = VK_FORMAT_B8G8R8A8_UNORM;
1401 VkFormatProperties format_props;
1402 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
1403 if ((format_props.optimalTilingFeatures & (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT)) == 0) {
1404 printf("%s Transfer for format is not supported.\n", kSkipPrefix);
1405 return;
1406 }
unknown088160a2019-05-23 17:43:13 -06001407
1408 // Create two images to copy between
1409 VkImageObj src_image_obj(m_device);
1410 VkImageObj dst_image_obj(m_device);
1411
1412 VkImageCreateInfo image_create_info = {};
1413 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1414 image_create_info.pNext = NULL;
1415 image_create_info.imageType = VK_IMAGE_TYPE_2D;
sfricke-samsung30b094c2020-05-30 11:42:11 -07001416 image_create_info.format = image_format;
unknown088160a2019-05-23 17:43:13 -06001417 image_create_info.extent.width = 32;
1418 image_create_info.extent.height = 32;
1419 image_create_info.extent.depth = 1;
1420 image_create_info.mipLevels = 1;
1421 image_create_info.arrayLayers = 4;
1422 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1423 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1424 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1425 image_create_info.flags = 0;
1426
1427 src_image_obj.init(&image_create_info);
1428 ASSERT_TRUE(src_image_obj.initialized());
1429
1430 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1431 dst_image_obj.init(&image_create_info);
1432 ASSERT_TRUE(dst_image_obj.initialized());
1433
1434 m_commandBuffer->begin();
1435 VkImageCopy copyRegion;
1436 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1437 copyRegion.srcSubresource.mipLevel = 0;
1438 copyRegion.srcSubresource.baseArrayLayer = 0;
1439 copyRegion.srcSubresource.layerCount = 1;
1440 copyRegion.srcOffset.x = 0;
1441 copyRegion.srcOffset.y = 0;
1442 copyRegion.srcOffset.z = 0;
1443 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1444 copyRegion.dstSubresource.mipLevel = 0;
1445 copyRegion.dstSubresource.baseArrayLayer = 0;
1446 // Introduce failure by forcing the dst layerCount to differ from src
1447 copyRegion.dstSubresource.layerCount = 3;
1448 copyRegion.dstOffset.x = 0;
1449 copyRegion.dstOffset.y = 0;
1450 copyRegion.dstOffset.z = 0;
1451 copyRegion.extent.width = 1;
1452 copyRegion.extent.height = 1;
1453 copyRegion.extent.depth = 1;
1454
sfricke-samsung30b094c2020-05-30 11:42:11 -07001455 const char *vuid = (maintenance1 == true) ? "VUID-VkImageCopy-extent-00140" : "VUID-VkImageCopy-layerCount-00138";
1456 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
unknown088160a2019-05-23 17:43:13 -06001457 m_commandBuffer->CopyImage(src_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image_obj.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
1458 &copyRegion);
1459 m_errorMonitor->VerifyFound();
1460}
1461
1462TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
1463 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
1464
Jeff Leger465acf52020-10-12 18:07:16 -04001465 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
1466
1467 bool copy_commands2 = false;
1468 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
1469 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
1470 copy_commands2 = true;
1471 }
1472 ASSERT_NO_FATAL_FAILURE(InitState());
1473
1474 PFN_vkCmdCopyBufferToImage2KHR vkCmdCopyBufferToImage2Function = nullptr;
Jeff Leger465acf52020-10-12 18:07:16 -04001475 if (copy_commands2) {
1476 vkCmdCopyBufferToImage2Function =
1477 (PFN_vkCmdCopyBufferToImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyBufferToImage2KHR");
Jeff Leger465acf52020-10-12 18:07:16 -04001478 }
unknown088160a2019-05-23 17:43:13 -06001479
1480 VkPhysicalDeviceFeatures device_features = {};
1481 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
1482 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
1483 if (device_features.textureCompressionBC) {
1484 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
1485 } else if (device_features.textureCompressionETC2) {
1486 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
1487 } else if (device_features.textureCompressionASTC_LDR) {
1488 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
1489 } else {
1490 printf("%s No compressed formats supported - CompressedImageMipCopyTests skipped.\n", kSkipPrefix);
1491 return;
1492 }
1493
1494 VkImageCreateInfo ci;
1495 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1496 ci.pNext = NULL;
1497 ci.flags = 0;
1498 ci.imageType = VK_IMAGE_TYPE_2D;
1499 ci.format = compressed_format;
1500 ci.extent = {32, 32, 1};
1501 ci.mipLevels = 6;
1502 ci.arrayLayers = 1;
1503 ci.samples = VK_SAMPLE_COUNT_1_BIT;
1504 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1505 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
1506 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1507 ci.queueFamilyIndexCount = 0;
1508 ci.pQueueFamilyIndices = NULL;
1509 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1510
1511 VkImageObj image(m_device);
1512 image.init(&ci);
1513 ASSERT_TRUE(image.initialized());
1514
1515 VkImageObj odd_image(m_device);
1516 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
1517 odd_image.init(&ci);
1518 ASSERT_TRUE(odd_image.initialized());
1519
1520 // Allocate buffers
1521 VkMemoryPropertyFlags reqs = 0;
1522 VkBufferObj buffer_1024, buffer_64, buffer_16, buffer_8;
1523 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
1524 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
1525 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
1526 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
1527
1528 VkBufferImageCopy region = {};
1529 region.bufferRowLength = 0;
1530 region.bufferImageHeight = 0;
1531 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1532 region.imageSubresource.layerCount = 1;
1533 region.imageOffset = {0, 0, 0};
1534 region.bufferOffset = 0;
1535
1536 // start recording
1537 m_commandBuffer->begin();
1538
locke-lunargdf00db02020-03-04 19:00:57 -07001539 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001540 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001541 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1542 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001543 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001544 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1545 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001546 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001547 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1548 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1549
unknown088160a2019-05-23 17:43:13 -06001550 // Mip level copies that work - 5 levels
1551 m_errorMonitor->ExpectSuccess();
1552
1553 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
1554 region.imageExtent = {32, 32, 1};
1555 region.imageSubresource.mipLevel = 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001556 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001557
1558 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1559 &mem_barriers[2], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001560 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001561
1562 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
1563 region.imageExtent = {8, 8, 1};
1564 region.imageSubresource.mipLevel = 2;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001565 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001566
1567 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1568 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001569 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001570
1571 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
1572 region.imageExtent = {4, 4, 1};
1573 region.imageSubresource.mipLevel = 3;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001574 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001575
1576 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1577 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001578 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001579
1580 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
1581 region.imageExtent = {2, 2, 1};
1582 region.imageSubresource.mipLevel = 4;
locke-lunargdf00db02020-03-04 19:00:57 -07001583
1584 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1585 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001586 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001587
1588 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1589 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001590 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001591
1592 region.imageExtent = {1, 1, 1};
1593 region.imageSubresource.mipLevel = 5;
locke-lunargdf00db02020-03-04 19:00:57 -07001594
1595 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1596 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001597 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001598
1599 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1600 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001601 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001602 m_errorMonitor->VerifyNotFound();
1603
1604 // Buffer must accommodate a full compressed block, regardless of texel count
Mark Lobodzinski20310782020-02-28 14:25:17 -07001605 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001606 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001607 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07001608 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00171");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001609 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001610 m_errorMonitor->VerifyFound();
1611
1612 // Copy width < compressed block size, but not the full mip width
1613 region.imageExtent = {1, 2, 1};
1614 region.imageSubresource.mipLevel = 4;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001615 // width not a multiple of compressed block width
1616 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001617 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001618 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001619 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001620 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001621
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001622 m_errorMonitor->SetDesiredFailureMsg(
1623 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00207"); // width not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001624 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001625 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001626 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001627 m_errorMonitor->VerifyFound();
1628
1629 // Copy height < compressed block size but not the full mip height
1630 region.imageExtent = {2, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001631 m_errorMonitor->SetDesiredFailureMsg(
1632 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001633 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001634 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001635 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001636 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001637
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001638 m_errorMonitor->SetDesiredFailureMsg(
1639 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // height not a multiple of compressed block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001640 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001641 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001642 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001643 m_errorMonitor->VerifyFound();
1644
1645 // Offsets must be multiple of compressed block size
1646 region.imageOffset = {1, 1, 0};
1647 region.imageExtent = {1, 1, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001648 // imageOffset not a multiple of block size
1649 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageOffset-00205");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001650 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001651 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001652 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1, &region);
unknown088160a2019-05-23 17:43:13 -06001653 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04001654
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001655 m_errorMonitor->SetDesiredFailureMsg(
1656 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00205"); // imageOffset not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07001657 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001658 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001659 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06001660 m_errorMonitor->VerifyFound();
1661
Jeff Leger465acf52020-10-12 18:07:16 -04001662 // Equivalent test using KHR_copy_commands2
1663 if (copy_commands2 && vkCmdCopyBufferToImage2Function) {
1664 const VkBufferImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2_KHR,
1665 NULL,
1666 region.bufferOffset,
1667 region.bufferRowLength,
1668 region.bufferImageHeight,
1669 region.imageSubresource,
1670 region.imageOffset,
1671 region.imageExtent};
1672 const VkCopyBufferToImageInfo2KHR copy_buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2_KHR,
1673 NULL,
1674 buffer_16.handle(),
1675 image.handle(),
1676 VK_IMAGE_LAYOUT_GENERAL,
1677 1,
1678 &region2};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001679 m_errorMonitor->SetDesiredFailureMsg(
1680 kErrorBit, "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-00205"); // imageOffset not a multiple of block size
Jeff Leger465acf52020-10-12 18:07:16 -04001681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
1682 "VUID-VkCopyBufferToImageInfo2KHR-imageOffset-01793"); // image transfer granularity
1683 vkCmdCopyBufferToImage2Function(m_commandBuffer->handle(), &copy_buffer_to_image_info2);
1684 m_errorMonitor->VerifyFound();
1685 }
1686
unknown088160a2019-05-23 17:43:13 -06001687 // Offset + extent width = mip width - should succeed
1688 region.imageOffset = {4, 4, 0};
1689 region.imageExtent = {3, 4, 1};
1690 region.imageSubresource.mipLevel = 2;
1691 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07001692
1693 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1694 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001695 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1696 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001697
1698 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1699 &mem_barriers[1], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001700 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1701 &region);
unknown088160a2019-05-23 17:43:13 -06001702 m_errorMonitor->VerifyNotFound();
1703
unknown088160a2019-05-23 17:43:13 -06001704 // Offset + extent width < mip width and not a multiple of block width - should fail
1705 region.imageExtent = {3, 3, 1};
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001706 m_errorMonitor->SetDesiredFailureMsg(
1707 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001708 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001709 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001710 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
1711 &region);
unknown088160a2019-05-23 17:43:13 -06001712 m_errorMonitor->VerifyFound();
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001713 m_errorMonitor->SetDesiredFailureMsg(
1714 kErrorBit, "VUID-vkCmdCopyBufferToImage-imageExtent-00208"); // offset+extent not a multiple of block width
Mark Lobodzinski20310782020-02-28 14:25:17 -07001715 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06001716 "VUID-vkCmdCopyBufferToImage-imageOffset-01793"); // image transfer granularity
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001717 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1718 &region);
unknown088160a2019-05-23 17:43:13 -06001719 m_errorMonitor->VerifyFound();
1720}
1721
1722TEST_F(VkLayerTest, ImageBufferCopyTests) {
1723 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001724
1725 // Enable KHR multiplane req'd extensions for multi-planar copy tests
1726 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
1727 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
1728 if (mp_extensions) {
1729 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
1730 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07001731 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor, nullptr));
sfricke-samsung6d97e562020-01-07 22:01:00 -08001732 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1733 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1734 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1735 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1736 if (mp_extensions) {
1737 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
1738 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
1739 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
1740 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
1741 }
1742 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06001743
1744 // Bail if any dimension of transfer granularity is 0.
1745 auto index = m_device->graphics_queue_node_index_;
1746 auto queue_family_properties = m_device->phy().queue_properties();
1747 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
1748 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
1749 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
1750 printf("%s Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n", kSkipPrefix);
1751 return;
1752 }
1753
sfricke-samsung6d97e562020-01-07 22:01:00 -08001754 // All VkImageObj must be defined here as if defined inside below scopes will cause image memory to be deleted when out of scope
1755 // 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 -07001756 VkImageObj image_64k(m_device); // 128^2 texels, 64k
1757 VkImageObj image_16k(m_device); // 64^2 texels, 16k
sfricke-samsung6d97e562020-01-07 22:01:00 -08001758 // depth stencil
unknown088160a2019-05-23 17:43:13 -06001759 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
1760 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
1761 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
1762 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
1763 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
sfricke-samsung6d97e562020-01-07 22:01:00 -08001764 // compression
1765 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
1766 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
1767 // multi-planar
1768 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 -06001769
sfricke-samsung6d97e562020-01-07 22:01:00 -08001770 // Verify R8G8B8A8_UINT format is supported for transfer
1771 bool missing_rgba_support = false;
1772 VkFormatProperties props = {0, 0, 0};
1773 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_R8G8B8A8_UINT, &props);
1774 missing_rgba_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1775 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1776 missing_rgba_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1777
1778 if (!missing_rgba_support) {
1779 image_64k.Init(128, 128, 1, VK_FORMAT_R8G8B8A8_UINT,
1780 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1781 VK_IMAGE_TILING_OPTIMAL, 0);
1782 ASSERT_TRUE(image_64k.initialized());
1783
1784 image_16k.Init(64, 64, 1, VK_FORMAT_R8G8B8A8_UINT,
1785 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
1786 VK_IMAGE_TILING_OPTIMAL, 0);
1787 ASSERT_TRUE(image_16k.initialized());
1788 }
unknown088160a2019-05-23 17:43:13 -06001789
1790 // Verify all needed Depth/Stencil formats are supported
1791 bool missing_ds_support = false;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001792 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001793 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1794 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1795 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001796 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001797 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1798 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1799 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001800 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
unknown088160a2019-05-23 17:43:13 -06001801 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1802 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1803 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06001804 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
unknown088160a2019-05-23 17:43:13 -06001805 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
1806 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
1807 missing_ds_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
1808
1809 if (!missing_ds_support) {
1810 image_16k_depth.Init(64, 64, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1811 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
1812 ASSERT_TRUE(image_16k_depth.initialized());
1813
1814 ds_image_4D_1S.Init(
1815 256, 256, 1, VK_FORMAT_D32_SFLOAT_S8_UINT,
1816 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1817 VK_IMAGE_TILING_OPTIMAL, 0);
1818 ASSERT_TRUE(ds_image_4D_1S.initialized());
1819
1820 ds_image_3D_1S.Init(
1821 256, 256, 1, VK_FORMAT_D24_UNORM_S8_UINT,
1822 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1823 VK_IMAGE_TILING_OPTIMAL, 0);
1824 ASSERT_TRUE(ds_image_3D_1S.initialized());
1825
1826 ds_image_2D.Init(
1827 256, 256, 1, VK_FORMAT_D16_UNORM,
1828 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1829 VK_IMAGE_TILING_OPTIMAL, 0);
1830 ASSERT_TRUE(ds_image_2D.initialized());
1831
1832 ds_image_1S.Init(
1833 256, 256, 1, VK_FORMAT_S8_UINT,
1834 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
1835 VK_IMAGE_TILING_OPTIMAL, 0);
1836 ASSERT_TRUE(ds_image_1S.initialized());
1837 }
1838
1839 // Allocate buffers
1840 VkBufferObj buffer_256k, buffer_128k, buffer_64k, buffer_16k;
1841 VkMemoryPropertyFlags reqs = 0;
1842 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
1843 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
1844 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
1845 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
1846
1847 VkBufferImageCopy region = {};
1848 region.bufferRowLength = 0;
1849 region.bufferImageHeight = 0;
1850 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1851 region.imageSubresource.layerCount = 1;
1852 region.imageOffset = {0, 0, 0};
1853 region.imageExtent = {64, 64, 1};
1854 region.bufferOffset = 0;
1855
locke-lunargdf00db02020-03-04 19:00:57 -07001856 VkMemoryBarrier mem_barriers[3];
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001857 mem_barriers[0] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001858 mem_barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1859 mem_barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001860 mem_barriers[1] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001861 mem_barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1862 mem_barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07001863 mem_barriers[2] = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07001864 mem_barriers[2].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
1865 mem_barriers[2].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
1866
sfricke-samsung6d97e562020-01-07 22:01:00 -08001867 if (missing_rgba_support) {
1868 printf("%s R8G8B8A8_UINT transfer unsupported - skipping RGBA tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06001869
sfricke-samsung6d97e562020-01-07 22:01:00 -08001870 // start recording for future tests
1871 m_commandBuffer->begin();
1872 } else {
1873 // attempt copies before putting command buffer in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07001874 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001875 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1876 &region);
unknown088160a2019-05-23 17:43:13 -06001877 m_errorMonitor->VerifyFound();
1878
Mark Lobodzinski20310782020-02-28 14:25:17 -07001879 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-recording");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001880 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1881 &region);
1882 m_errorMonitor->VerifyFound();
1883
1884 // start recording
1885 m_commandBuffer->begin();
1886
1887 // successful copies
1888 m_errorMonitor->ExpectSuccess();
1889 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1890 &region);
locke-lunargdf00db02020-03-04 19:00:57 -07001891
1892 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1893 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001894 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1895 &region);
1896 region.imageOffset.x = 16; // 16k copy, offset requires larger image
locke-lunargdf00db02020-03-04 19:00:57 -07001897
1898 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1899 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001900 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1901 &region);
1902 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
locke-lunargdf00db02020-03-04 19:00:57 -07001903
1904 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
1905 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001906 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1907 &region);
1908 region.imageOffset.x = 0;
1909 region.imageExtent.height = 64;
1910 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
locke-lunargdf00db02020-03-04 19:00:57 -07001911
1912 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 2,
1913 &mem_barriers[1], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08001914 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1915 &region);
1916 m_errorMonitor->VerifyNotFound();
1917
1918 // image/buffer too small (extent too large) on copy to image
1919 region.imageExtent = {65, 64, 1};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001920 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001921 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1922 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1923 &region);
1924 m_errorMonitor->VerifyFound();
1925
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001926 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001927 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001928 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
1929 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1930 &region);
1931 m_errorMonitor->VerifyFound();
1932
1933 // image/buffer too small (offset) on copy to image
1934 region.imageExtent = {64, 64, 1};
1935 region.imageOffset = {0, 4, 0};
Mark Lobodzinski20310782020-02-28 14:25:17 -07001936 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001937 "VUID-vkCmdCopyBufferToImage-pRegions-00171"); // buffer too small
1938 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1939 &region);
1940 m_errorMonitor->VerifyFound();
1941
Shannon McPherson2c793ba2020-08-28 12:13:24 -06001942 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
1943 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001945 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // image too small
1946 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
1947 &region);
1948 m_errorMonitor->VerifyFound();
1949
1950 // image/buffer too small on copy to buffer
1951 region.imageExtent = {64, 64, 1};
1952 region.imageOffset = {0, 0, 0};
1953 region.bufferOffset = 4;
Mark Lobodzinski20310782020-02-28 14:25:17 -07001954 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001955 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // buffer too small
1956 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1957 &region);
1958 m_errorMonitor->VerifyFound();
1959
1960 region.imageExtent = {64, 65, 1};
1961 region.bufferOffset = 0;
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001962 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00198");
Mark Lobodzinski20310782020-02-28 14:25:17 -07001963 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001964 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // image too small
1965 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
1966 &region);
1967 m_errorMonitor->VerifyFound();
1968
1969 // buffer size OK but rowlength causes loose packing
Mark Lobodzinski20310782020-02-28 14:25:17 -07001970 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001971 region.imageExtent = {64, 64, 1};
1972 region.bufferRowLength = 68;
1973 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1974 &region);
1975 m_errorMonitor->VerifyFound();
1976
1977 // An extent with zero area should produce a warning, but no error
Mark Lobodzinski20310782020-02-28 14:25:17 -07001978 m_errorMonitor->SetDesiredFailureMsg(kWarningBit | kErrorBit, "} has zero area");
sfricke-samsung6d97e562020-01-07 22:01:00 -08001979 region.imageExtent.width = 0;
1980 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
1981 &region);
1982 m_errorMonitor->VerifyFound();
1983
1984 // aspect bits
1985 region.imageExtent = {64, 64, 1};
1986 region.bufferRowLength = 0;
1987 region.bufferImageHeight = 0;
1988 if (!missing_ds_support) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07001989 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08001990 "VUID-VkBufferImageCopy-aspectMask-00212"); // more than 1 aspect bit set
1991 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
1992 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
1993 buffer_16k.handle(), 1, &region);
1994 m_errorMonitor->VerifyFound();
1995
Mark Lobodzinski20310782020-02-28 14:25:17 -07001996 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07001997 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // different mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08001998 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
1999 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
2000 buffer_16k.handle(), 1, &region);
2001 m_errorMonitor->VerifyFound();
2002 }
2003
Mark Lobodzinski20310782020-02-28 14:25:17 -07002004 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002005 "VUID-vkCmdCopyImageToBuffer-aspectMask-00211"); // mis-matched aspect
sfricke-samsung6d97e562020-01-07 22:01:00 -08002006 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2007 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2008 &region);
2009 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002010 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002011
2012 // Out-of-range mip levels should fail
2013 region.imageSubresource.mipLevel = image_16k.create_info().mipLevels + 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002014 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01703");
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002015 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00197");
2016 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00198");
2017 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyImageToBuffer-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002018 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002019 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002020 "VUID-vkCmdCopyImageToBuffer-pRegions-00182"); // unavoidable "region exceeds image bounds" for non-existent mip
2021 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2022 &region);
2023 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002024 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01701");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002025 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00197");
2026 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00198");
2027 m_errorMonitor->SetUnexpectedError("VUID-vkCmdCopyBufferToImage-imageOffset-00200");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002028 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002029 kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002030 "VUID-vkCmdCopyBufferToImage-pRegions-00172"); // unavoidable "region exceeds image bounds" for non-existent mip
2031 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2032 &region);
2033 m_errorMonitor->VerifyFound();
2034 region.imageSubresource.mipLevel = 0;
2035
2036 // Out-of-range array layers should fail
2037 region.imageSubresource.baseArrayLayer = image_16k.create_info().arrayLayers;
2038 region.imageSubresource.layerCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002039 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageSubresource-01704");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002040 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
2041 &region);
2042 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002043 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageSubresource-01702");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002044 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
2045 &region);
2046 m_errorMonitor->VerifyFound();
2047 region.imageSubresource.baseArrayLayer = 0;
2048
2049 // Layout mismatch should fail
Mark Lobodzinski20310782020-02-28 14:25:17 -07002050 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-srcImageLayout-00189");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002051 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2052 buffer_16k.handle(), 1, &region);
2053 m_errorMonitor->VerifyFound();
Mark Lobodzinski20310782020-02-28 14:25:17 -07002054 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-dstImageLayout-00180");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002055 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_16k.handle(),
2056 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
unknown088160a2019-05-23 17:43:13 -06002057 m_errorMonitor->VerifyFound();
2058 }
2059
unknown088160a2019-05-23 17:43:13 -06002060 // Test Depth/Stencil copies
2061 if (missing_ds_support) {
2062 printf("%s Depth / Stencil formats unsupported - skipping D/S tests.\n", kSkipPrefix);
2063 } else {
2064 VkBufferImageCopy ds_region = {};
2065 ds_region.bufferOffset = 0;
2066 ds_region.bufferRowLength = 0;
2067 ds_region.bufferImageHeight = 0;
2068 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
2069 ds_region.imageSubresource.mipLevel = 0;
2070 ds_region.imageSubresource.baseArrayLayer = 0;
2071 ds_region.imageSubresource.layerCount = 1;
2072 ds_region.imageOffset = {0, 0, 0};
2073 ds_region.imageExtent = {256, 256, 1};
2074
2075 // Depth copies that should succeed
2076 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002077 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2078 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002079 m_errorMonitor->VerifyNotFound();
2080
2081 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002082 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2083 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002084 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2085 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002086 m_errorMonitor->VerifyNotFound();
2087
2088 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002089 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2090 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002091 m_errorMonitor->VerifyNotFound();
2092
2093 // Depth copies that should fail
2094 ds_region.bufferOffset = 4;
2095 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002096 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002097 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 4b depth per texel, pack into 256k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002098 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2099 buffer_256k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002100 m_errorMonitor->VerifyFound();
2101
2102 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002103 kErrorBit,
locke-lunarg00710512020-06-01 13:56:49 -06002104 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 3b depth per texel, pack (loose) into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002105 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
locke-lunarg00710512020-06-01 13:56:49 -06002106 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002107 m_errorMonitor->VerifyFound();
2108
2109 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002110 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002111 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 2b depth per texel, into 128k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002112 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2113 buffer_128k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002114 m_errorMonitor->VerifyFound();
2115
2116 // Stencil copies that should succeed
2117 ds_region.bufferOffset = 0;
2118 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
2119 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002120 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2121 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002122 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2123 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002124 m_errorMonitor->VerifyNotFound();
2125
2126 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002127 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2128 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002129 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2130 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002131 m_errorMonitor->VerifyNotFound();
2132
2133 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
locke-lunargdf00db02020-03-04 19:00:57 -07002134 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2135 &mem_barriers[0], 0, nullptr, 0, nullptr);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002136 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2137 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002138 m_errorMonitor->VerifyNotFound();
2139
2140 // Stencil copies that should fail
2141 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002142 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002143 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002144 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2145 buffer_16k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002146 m_errorMonitor->VerifyFound();
2147
2148 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002149 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002150 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Extract 1b stencil per texel, pack into 64k buffer
2151 ds_region.bufferRowLength = 260;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002152 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2153 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002154 m_errorMonitor->VerifyFound();
2155
2156 ds_region.bufferRowLength = 0;
2157 ds_region.bufferOffset = 4;
2158 m_errorMonitor->SetDesiredFailureMsg(
Mark Lobodzinski20310782020-02-28 14:25:17 -07002159 kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002160 "VUID-vkCmdCopyImageToBuffer-pRegions-00183"); // Copy 1b depth per texel, into 64k buffer
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002161 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
2162 buffer_64k.handle(), 1, &ds_region);
unknown088160a2019-05-23 17:43:13 -06002163 m_errorMonitor->VerifyFound();
2164 }
2165
2166 // Test compressed formats, if supported
sfricke-samsung6d97e562020-01-07 22:01:00 -08002167 // Support here requires both feature bit for compression and picked format supports transfer feature bits
unknown088160a2019-05-23 17:43:13 -06002168 VkPhysicalDeviceFeatures device_features = {};
2169 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2170 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
2171 device_features.textureCompressionASTC_LDR)) {
2172 printf("%s No compressed formats supported - block compression tests skipped.\n", kSkipPrefix);
2173 } else {
sfricke-samsung6d97e562020-01-07 22:01:00 -08002174 // Verify transfer support for each compression format used blow
2175 bool missing_bc_support = false;
2176 bool missing_etc_support = false;
2177 bool missing_astc_support = false;
2178 bool missing_compression_support = false;
2179
2180 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_BC3_SRGB_BLOCK, &props);
2181 missing_bc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2182 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2183 missing_bc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2184
2185 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, &props);
2186 missing_etc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2187 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2188 missing_etc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2189
2190 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_ASTC_4x4_UNORM_BLOCK, &props);
2191 missing_astc_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2192 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2193 missing_astc_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2194
2195 if (device_features.textureCompressionBC && (!missing_bc_support)) {
unknown088160a2019-05-23 17:43:13 -06002196 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2197 0);
2198 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
2199 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002200 } else if (device_features.textureCompressionETC2 && (!missing_etc_support)) {
unknown088160a2019-05-23 17:43:13 -06002201 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2202 VK_IMAGE_TILING_OPTIMAL, 0);
2203 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2204 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002205 } else if (device_features.textureCompressionASTC_LDR && (!missing_astc_support)) {
unknown088160a2019-05-23 17:43:13 -06002206 image_16k_4x4comp.Init(128, 128, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2207 VK_IMAGE_TILING_OPTIMAL, 0);
2208 image_NPOT_4x4comp.Init(130, 130, 1, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
2209 VK_IMAGE_TILING_OPTIMAL, 0);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002210 } else {
2211 missing_compression_support = true;
unknown088160a2019-05-23 17:43:13 -06002212 }
unknown088160a2019-05-23 17:43:13 -06002213
sfricke-samsung6d97e562020-01-07 22:01:00 -08002214 if (missing_compression_support) {
2215 printf("%s No compressed formats transfers bits are supported - block compression tests skipped.\n", kSkipPrefix);
2216 } else {
2217 ASSERT_TRUE(image_16k_4x4comp.initialized());
sfricke-samsung3a10b922020-05-13 23:23:16 -07002218 std::string vuid;
sfricke-samsung6d97e562020-01-07 22:01:00 -08002219 // Just fits
locke-lunargdf00db02020-03-04 19:00:57 -07002220 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2221 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002222 m_errorMonitor->ExpectSuccess();
2223 region.imageExtent = {128, 128, 1};
2224 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2225 buffer_16k.handle(), 1, &region);
2226 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06002227
sfricke-samsung6d97e562020-01-07 22:01:00 -08002228 // with offset, too big for buffer
Mark Lobodzinski20310782020-02-28 14:25:17 -07002229 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-pRegions-00183");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002230 region.bufferOffset = 16;
2231 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2232 buffer_16k.handle(), 1, &region);
2233 m_errorMonitor->VerifyFound();
2234 region.bufferOffset = 0;
unknown088160a2019-05-23 17:43:13 -06002235
sfricke-samsung6d97e562020-01-07 22:01:00 -08002236 // extents that are not a multiple of compressed block size
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002237 m_errorMonitor->SetDesiredFailureMsg(
2238 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00207"); // extent width not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002239 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002240 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2241 region.imageExtent.width = 66;
2242 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2243 buffer_16k.handle(), 1, &region);
2244 m_errorMonitor->VerifyFound();
2245 region.imageExtent.width = 128;
unknown088160a2019-05-23 17:43:13 -06002246
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002247 m_errorMonitor->SetDesiredFailureMsg(
2248 kErrorBit, "VUID-vkCmdCopyImageToBuffer-imageExtent-00208"); // extent height not a multiple of block size
Mark Lobodzinski20310782020-02-28 14:25:17 -07002249 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
sfricke-samsung6d97e562020-01-07 22:01:00 -08002250 "VUID-vkCmdCopyImageToBuffer-imageOffset-01794"); // image transfer granularity
2251 region.imageExtent.height = 2;
2252 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2253 buffer_16k.handle(), 1, &region);
2254 m_errorMonitor->VerifyFound();
2255 region.imageExtent.height = 128;
unknown088160a2019-05-23 17:43:13 -06002256
sfricke-samsung6d97e562020-01-07 22:01:00 -08002257 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
unknown088160a2019-05-23 17:43:13 -06002258
sfricke-samsung6d97e562020-01-07 22:01:00 -08002259 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
2260 m_errorMonitor->ExpectSuccess();
2261 region.imageExtent.width = 66;
2262 region.imageOffset.x = 64;
locke-lunargdf00db02020-03-04 19:00:57 -07002263 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2264 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002265 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2266 buffer_16k.handle(), 1, &region);
2267 region.imageExtent.width = 16;
2268 region.imageOffset.x = 0;
2269 region.imageExtent.height = 2;
2270 region.imageOffset.y = 128;
locke-lunargdf00db02020-03-04 19:00:57 -07002271 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2272 &mem_barriers[0], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002273 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2274 buffer_16k.handle(), 1, &region);
2275 m_errorMonitor->VerifyNotFound();
2276 region.imageOffset = {0, 0, 0};
unknown088160a2019-05-23 17:43:13 -06002277
sfricke-samsung6d97e562020-01-07 22:01:00 -08002278 // buffer offset must be a multiple of texel block size (16)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002279 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferOffset-00206");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002280 vuid =
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002281 mp_extensions ? "VUID-vkCmdCopyImageToBuffer-bufferOffset-01558" : "VUID-vkCmdCopyImageToBuffer-bufferOffset-00193";
sfricke-samsung125d2b42020-05-28 06:32:43 -07002282 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002283 region.imageExtent = {64, 64, 1};
2284 region.bufferOffset = 24;
2285 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2286 buffer_16k.handle(), 1, &region);
2287 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06002288
sfricke-samsung6d97e562020-01-07 22:01:00 -08002289 // rowlength not a multiple of block width (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002290 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferRowLength-00203");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002291 region.bufferOffset = 0;
2292 region.bufferRowLength = 130;
2293 region.bufferImageHeight = 0;
2294 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2295 buffer_64k.handle(), 1, &region);
2296 m_errorMonitor->VerifyFound();
2297
2298 // imageheight not a multiple of block height (4)
sfricke-samsung88ac6fe2020-10-24 10:00:13 -07002299 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-bufferImageHeight-00204");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002300 region.bufferRowLength = 0;
2301 region.bufferImageHeight = 130;
2302 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
2303 buffer_64k.handle(), 1, &region);
2304 m_errorMonitor->VerifyFound();
2305 }
2306 }
2307
2308 // Test multi-planar formats, if supported
2309 if (!mp_extensions) {
2310 printf("%s multi-planar extensions not supported; skipped.\n", kSkipPrefix);
2311 } else {
2312 // Try to use G8_B8R8_2PLANE_420_UNORM because need 2-plane format for some tests and likely supported due to copy support
2313 // being required with samplerYcbcrConversion feature
2314 bool missing_mp_support = false;
2315 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &props);
2316 missing_mp_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
2317 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
2318 missing_mp_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
2319
2320 if (missing_mp_support) {
2321 printf("%s VK_FORMAT_G8_B8R8_2PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
2322 } else {
2323 VkBufferImageCopy mp_region = {};
2324 mp_region.bufferOffset = 0;
2325 mp_region.bufferRowLength = 0;
2326 mp_region.bufferImageHeight = 0;
2327 mp_region.imageSubresource.mipLevel = 0;
2328 mp_region.imageSubresource.baseArrayLayer = 0;
2329 mp_region.imageSubresource.layerCount = 1;
2330 mp_region.imageOffset = {0, 0, 0};
2331 mp_region.imageExtent = {128, 128, 1};
2332
2333 // YUV420 means 1/2 width and height so plane_0 is 128x128 and plane_1 is 64x64 here
2334 image_multi_planar.Init(128, 128, 1, VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
2335 VK_IMAGE_TILING_OPTIMAL, 0);
2336 ASSERT_TRUE(image_multi_planar.initialized());
2337
2338 // Copies into a mutli-planar image aspect properly
2339 m_errorMonitor->ExpectSuccess();
2340 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
locke-lunargdf00db02020-03-04 19:00:57 -07002341 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
2342 &mem_barriers[2], 0, nullptr, 0, nullptr);
sfricke-samsung6d97e562020-01-07 22:01:00 -08002343 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2344 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2345 m_errorMonitor->VerifyNotFound();
2346
2347 // uses plane_2 without being 3 planar format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002348 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002349 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT;
2350 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2351 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2352 m_errorMonitor->VerifyFound();
2353
2354 // uses single-plane aspect mask
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002355 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-aspectMask-01560");
sfricke-samsung6d97e562020-01-07 22:01:00 -08002356 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2357 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2358 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2359 m_errorMonitor->VerifyFound();
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002360
2361 // buffer offset must be a multiple of texel block size for VK_FORMAT_R8G8_UNORM (2)
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002362 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-01559");
sfricke-samsungb616d3f2020-06-03 22:00:34 -07002363 mp_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
2364 mp_region.bufferOffset = 5;
2365 mp_region.imageExtent = {8, 8, 1};
2366 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_16k.handle(), image_multi_planar.handle(),
2367 VK_IMAGE_LAYOUT_GENERAL, 1, &mp_region);
2368 m_errorMonitor->VerifyFound();
sfricke-samsung6d97e562020-01-07 22:01:00 -08002369 }
unknown088160a2019-05-23 17:43:13 -06002370 }
2371}
2372
2373TEST_F(VkLayerTest, MiscImageLayerTests) {
2374 TEST_DESCRIPTION("Image-related tests that don't belong elsewhere");
2375
2376 ASSERT_NO_FATAL_FAILURE(Init());
2377
2378 // TODO: Ideally we should check if a format is supported, before using it.
2379 VkImageObj image(m_device);
2380 image.Init(128, 128, 1, VK_FORMAT_R16G16B16A16_UINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
2381 ASSERT_TRUE(image.initialized());
2382 VkBufferObj buffer;
2383 VkMemoryPropertyFlags reqs = 0;
2384 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
2385 VkBufferImageCopy region = {};
2386 region.bufferRowLength = 128;
2387 region.bufferImageHeight = 128;
2388 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2389 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
2390 region.imageSubresource.layerCount = 1;
2391 region.imageExtent.height = 4;
2392 region.imageExtent.width = 4;
2393 region.imageExtent.depth = 1;
2394
2395 VkImageObj image2(m_device);
2396 image2.Init(128, 128, 1, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
2397 ASSERT_TRUE(image2.initialized());
2398 VkBufferObj buffer2;
2399 VkMemoryPropertyFlags reqs2 = 0;
2400 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
unknown088160a2019-05-23 17:43:13 -06002401 m_commandBuffer->begin();
2402
2403 // Image must have offset.z of 0 and extent.depth of 1
2404 // Introduce failure by setting imageExtent.depth to 0
2405 region.imageExtent.depth = 0;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002406 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002407 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2408 &region);
unknown088160a2019-05-23 17:43:13 -06002409 m_errorMonitor->VerifyFound();
2410
2411 region.imageExtent.depth = 1;
2412
2413 // Image must have offset.z of 0 and extent.depth of 1
2414 // Introduce failure by setting imageOffset.z to 4
2415 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
2416 region.imageOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002417 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-srcImage-00201");
2418 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-imageOffset-00200");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002419 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-pRegions-00172");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002420 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2421 &region);
unknown088160a2019-05-23 17:43:13 -06002422 m_errorMonitor->VerifyFound();
2423
2424 region.imageOffset.z = 0;
2425 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
2426 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
2427 region.bufferOffset = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002428 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-bufferOffset-00193");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002429 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2430 &region);
unknown088160a2019-05-23 17:43:13 -06002431 m_errorMonitor->VerifyFound();
2432
unknown088160a2019-05-23 17:43:13 -06002433 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
2434 region.bufferOffset = 0;
2435 region.imageExtent.height = 128;
2436 region.imageExtent.width = 128;
2437 // Introduce failure by setting bufferRowLength > 0 but less than width
2438 region.bufferRowLength = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002439 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferRowLength-00195");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002440 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2441 &region);
unknown088160a2019-05-23 17:43:13 -06002442 m_errorMonitor->VerifyFound();
2443
2444 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
2445 region.bufferRowLength = 128;
2446 // Introduce failure by setting bufferRowHeight > 0 but less than height
2447 region.bufferImageHeight = 64;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002448 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBufferImageCopy-bufferImageHeight-00196");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002449 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer.handle(), image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
2450 &region);
unknown088160a2019-05-23 17:43:13 -06002451 m_errorMonitor->VerifyFound();
2452
2453 region.bufferImageHeight = 128;
2454 VkImageObj intImage1(m_device);
2455 intImage1.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2456 intImage1.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2457 VkImageObj intImage2(m_device);
2458 intImage2.Init(128, 128, 1, VK_FORMAT_R8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
2459 intImage2.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
2460 VkImageBlit blitRegion = {};
2461 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2462 blitRegion.srcSubresource.baseArrayLayer = 0;
2463 blitRegion.srcSubresource.layerCount = 1;
2464 blitRegion.srcSubresource.mipLevel = 0;
2465 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2466 blitRegion.dstSubresource.baseArrayLayer = 0;
2467 blitRegion.dstSubresource.layerCount = 1;
2468 blitRegion.dstSubresource.mipLevel = 0;
2469 blitRegion.srcOffsets[0] = {128, 0, 0};
2470 blitRegion.srcOffsets[1] = {128, 128, 1};
2471 blitRegion.dstOffsets[0] = {0, 128, 0};
2472 blitRegion.dstOffsets[1] = {128, 128, 1};
2473
2474 // Look for NULL-blit warning
Mark Lobodzinski20310782020-02-28 14:25:17 -07002475 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].srcOffsets specify a zero-volume area.");
2476 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "vkCmdBlitImage(): pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002477 vk::CmdBlitImage(m_commandBuffer->handle(), intImage1.handle(), intImage1.Layout(), intImage2.handle(), intImage2.Layout(), 1,
2478 &blitRegion, VK_FILTER_LINEAR);
unknown088160a2019-05-23 17:43:13 -06002479 m_errorMonitor->VerifyFound();
2480}
2481
2482TEST_F(VkLayerTest, CopyImageTypeExtentMismatch) {
2483 // Image copy tests where format type and extents don't match
Jeff Leger465acf52020-10-12 18:07:16 -04002484 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
2485
2486 bool copy_commands2 = false;
2487 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
2488 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
2489 copy_commands2 = true;
2490 }
2491 ASSERT_NO_FATAL_FAILURE(InitState());
2492
2493 PFN_vkCmdCopyImage2KHR vkCmdCopyImage2Function = nullptr;
2494 if (copy_commands2) {
2495 vkCmdCopyImage2Function = (PFN_vkCmdCopyImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdCopyImage2KHR");
2496 }
unknown088160a2019-05-23 17:43:13 -06002497
sfricke-samsung30b094c2020-05-30 11:42:11 -07002498 // Tests are designed to run without Maintenance1 which was promoted in 1.1
2499 if (DeviceValidationVersion() >= VK_API_VERSION_1_1) {
2500 printf("%s Tests for 1.0 only, test skipped.\n", kSkipPrefix);
2501 return;
2502 }
2503
unknown088160a2019-05-23 17:43:13 -06002504 VkImageCreateInfo ci;
2505 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2506 ci.pNext = NULL;
2507 ci.flags = 0;
2508 ci.imageType = VK_IMAGE_TYPE_1D;
2509 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
2510 ci.extent = {32, 1, 1};
2511 ci.mipLevels = 1;
2512 ci.arrayLayers = 1;
2513 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2514 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2515 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2516 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2517 ci.queueFamilyIndexCount = 0;
2518 ci.pQueueFamilyIndices = NULL;
2519 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2520
2521 // Create 1D image
2522 VkImageObj image_1D(m_device);
2523 image_1D.init(&ci);
2524 ASSERT_TRUE(image_1D.initialized());
2525
2526 // 2D image
2527 ci.imageType = VK_IMAGE_TYPE_2D;
2528 ci.extent = {32, 32, 1};
2529 VkImageObj image_2D(m_device);
2530 image_2D.init(&ci);
2531 ASSERT_TRUE(image_2D.initialized());
2532
2533 // 3D image
2534 ci.imageType = VK_IMAGE_TYPE_3D;
2535 ci.extent = {32, 32, 8};
2536 VkImageObj image_3D(m_device);
2537 image_3D.init(&ci);
2538 ASSERT_TRUE(image_3D.initialized());
2539
2540 // 2D image array
2541 ci.imageType = VK_IMAGE_TYPE_2D;
2542 ci.extent = {32, 32, 1};
2543 ci.arrayLayers = 8;
2544 VkImageObj image_2D_array(m_device);
2545 image_2D_array.init(&ci);
2546 ASSERT_TRUE(image_2D_array.initialized());
2547
2548 m_commandBuffer->begin();
2549
2550 VkImageCopy copy_region;
2551 copy_region.extent = {32, 1, 1};
2552 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2553 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2554 copy_region.srcSubresource.mipLevel = 0;
2555 copy_region.dstSubresource.mipLevel = 0;
2556 copy_region.srcSubresource.baseArrayLayer = 0;
2557 copy_region.dstSubresource.baseArrayLayer = 0;
2558 copy_region.srcSubresource.layerCount = 1;
2559 copy_region.dstSubresource.layerCount = 1;
2560 copy_region.srcOffset = {0, 0, 0};
2561 copy_region.dstOffset = {0, 0, 0};
2562
2563 // Sanity check
2564 m_errorMonitor->ExpectSuccess();
2565 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2566 &copy_region);
2567 m_errorMonitor->VerifyNotFound();
2568
Jeff Leger465acf52020-10-12 18:07:16 -04002569 // Equivalent sanity check using KHR_copy_commands2
2570 if (copy_commands2 && vkCmdCopyImage2Function) {
2571 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2572 NULL,
2573 copy_region.srcSubresource,
2574 copy_region.srcOffset,
2575 copy_region.dstSubresource,
2576 copy_region.dstOffset,
2577 copy_region.extent};
2578 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2579 NULL,
2580 image_1D.image(),
2581 VK_IMAGE_LAYOUT_GENERAL,
2582 image_2D.image(),
2583 VK_IMAGE_LAYOUT_GENERAL,
2584 1,
2585 &region2};
2586 m_errorMonitor->ExpectSuccess();
2587 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2588 m_errorMonitor->VerifyNotFound();
2589 }
2590
unknown088160a2019-05-23 17:43:13 -06002591 // 1D texture w/ offset.y > 0. Source = VU 09c00124, dest = 09c00130
2592 copy_region.srcOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002593 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2594 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002595 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2596 &copy_region);
2597 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002598
2599 // Equivalent test using KHR_copy_commands2
2600 if (copy_commands2 && vkCmdCopyImage2Function) {
2601 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2602 NULL,
2603 copy_region.srcSubresource,
2604 copy_region.srcOffset,
2605 copy_region.dstSubresource,
2606 copy_region.dstOffset,
2607 copy_region.extent};
2608 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2609 NULL,
2610 image_1D.image(),
2611 VK_IMAGE_LAYOUT_GENERAL,
2612 image_2D.image(),
2613 VK_IMAGE_LAYOUT_GENERAL,
2614 1,
2615 &region2};
2616 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2617 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2618 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2619 m_errorMonitor->VerifyFound();
2620 }
2621
unknown088160a2019-05-23 17:43:13 -06002622 copy_region.srcOffset.y = 0;
2623 copy_region.dstOffset.y = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002624 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2625 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002626 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2627 &copy_region);
2628 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002629
2630 // Equivalent test using KHR_copy_commands2
2631 if (copy_commands2 && vkCmdCopyImage2Function) {
2632 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2633 NULL,
2634 copy_region.srcSubresource,
2635 copy_region.srcOffset,
2636 copy_region.dstSubresource,
2637 copy_region.dstOffset,
2638 copy_region.extent};
2639 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2640 NULL,
2641 image_2D.image(),
2642 VK_IMAGE_LAYOUT_GENERAL,
2643 image_1D.image(),
2644 VK_IMAGE_LAYOUT_GENERAL,
2645 1,
2646 &region2};
2647 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2648 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2649 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2650 m_errorMonitor->VerifyFound();
2651 }
2652
unknown088160a2019-05-23 17:43:13 -06002653 copy_region.dstOffset.y = 0;
2654
2655 // 1D texture w/ extent.height > 1. Source = VU 09c00124, dest = 09c00130
2656 copy_region.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002657 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00146");
2658 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002659 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2660 &copy_region);
2661 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002662
2663 // Equivalent test using KHR_copy_commands2
2664 if (copy_commands2 && vkCmdCopyImage2Function) {
2665 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2666 NULL,
2667 copy_region.srcSubresource,
2668 copy_region.srcOffset,
2669 copy_region.dstSubresource,
2670 copy_region.dstOffset,
2671 copy_region.extent};
2672 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2673 NULL,
2674 image_1D.image(),
2675 VK_IMAGE_LAYOUT_GENERAL,
2676 image_2D.image(),
2677 VK_IMAGE_LAYOUT_GENERAL,
2678 1,
2679 &region2};
2680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcImage-00146");
2681 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-srcOffset-00145"); // also y-dim overrun
2682 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2683 m_errorMonitor->VerifyFound();
2684 }
2685
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002686 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-00152");
2687 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151"); // also y-dim overrun
unknown088160a2019-05-23 17:43:13 -06002688 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2689 &copy_region);
2690 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04002691
2692 // Equivalent test using KHR_copy_commands2
2693 if (copy_commands2 && vkCmdCopyImage2Function) {
2694 const VkImageCopy2KHR region2 = {VK_STRUCTURE_TYPE_IMAGE_COPY_2_KHR,
2695 NULL,
2696 copy_region.srcSubresource,
2697 copy_region.srcOffset,
2698 copy_region.dstSubresource,
2699 copy_region.dstOffset,
2700 copy_region.extent};
2701 const VkCopyImageInfo2KHR copy_image_info2 = {VK_STRUCTURE_TYPE_COPY_IMAGE_INFO_2_KHR,
2702 NULL,
2703 image_2D.image(),
2704 VK_IMAGE_LAYOUT_GENERAL,
2705 image_1D.image(),
2706 VK_IMAGE_LAYOUT_GENERAL,
2707 1,
2708 &region2};
2709 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstImage-00152");
2710 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkCopyImageInfo2KHR-dstOffset-00151"); // also y-dim overrun
2711 vkCmdCopyImage2Function(m_commandBuffer->handle(), &copy_image_info2);
2712 m_errorMonitor->VerifyFound();
2713 }
2714
unknown088160a2019-05-23 17:43:13 -06002715 copy_region.extent.height = 1;
2716
2717 // 1D texture w/ offset.z > 0. Source = VU 09c00df2, dest = 09c00df4
2718 copy_region.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002719 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
2720 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002721 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2722 &copy_region);
2723 m_errorMonitor->VerifyFound();
2724 copy_region.srcOffset.z = 0;
2725 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002726 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
2727 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun
unknown088160a2019-05-23 17:43:13 -06002728 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2729 &copy_region);
2730 m_errorMonitor->VerifyFound();
2731 copy_region.dstOffset.z = 0;
2732
2733 // 1D texture w/ extent.depth > 1. Source = VU 09c00df2, dest = 09c00df4
2734 copy_region.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002735 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01785");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002736 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002737 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002738 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002739 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002740 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002741 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002742 m_commandBuffer->CopyImage(image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2743 &copy_region);
2744 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002745 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01786");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002746 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002747 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002748 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002749 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
Mark Lobodzinski20310782020-02-28 14:25:17 -07002750 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002751 "VUID-vkCmdCopyImage-srcImage-01789"); // 2D needs to be 1 pre-Vulkan 1.1
unknown088160a2019-05-23 17:43:13 -06002752 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2753 &copy_region);
2754 m_errorMonitor->VerifyFound();
2755 copy_region.extent.depth = 1;
2756
2757 // 2D texture w/ offset.z > 0. Source = VU 09c00df6, dest = 09c00df8
2758 copy_region.extent = {16, 16, 1};
2759 copy_region.srcOffset.z = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002760 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01787");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002761 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002762 "VUID-vkCmdCopyImage-srcOffset-00147"); // also z-dim overrun (src)
unknown088160a2019-05-23 17:43:13 -06002763 m_commandBuffer->CopyImage(image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2764 &copy_region);
2765 m_errorMonitor->VerifyFound();
2766 copy_region.srcOffset.z = 0;
2767 copy_region.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002768 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01788");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002769 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002770 "VUID-vkCmdCopyImage-dstOffset-00153"); // also z-dim overrun (dst)
unknown088160a2019-05-23 17:43:13 -06002771 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2772 &copy_region);
2773 m_errorMonitor->VerifyFound();
2774 copy_region.dstOffset.z = 0;
2775
2776 // 3D texture accessing an array layer other than 0. VU 09c0011a
2777 copy_region.extent = {4, 4, 1};
2778 copy_region.srcSubresource.baseArrayLayer = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002779 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00139");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002780 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06002781 "VUID-vkCmdCopyImage-srcSubresource-01698"); // also 'too many layers'
2782 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2783 &copy_region);
2784 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002785 copy_region.srcSubresource.baseArrayLayer = 0;
2786
unknown088160a2019-05-23 17:43:13 -06002787 m_commandBuffer->end();
2788}
2789
2790TEST_F(VkLayerTest, CopyImageTypeExtentMismatchMaintenance1) {
2791 // Image copy tests where format type and extents don't match and the Maintenance1 extension is enabled
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07002792 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06002793 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
2794 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
2795 } else {
2796 printf("%s Maintenance1 extension cannot be enabled, test skipped.\n", kSkipPrefix);
2797 return;
2798 }
2799 ASSERT_NO_FATAL_FAILURE(InitState());
2800
2801 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM;
2802 VkFormatProperties format_props;
2803 // TODO: Remove this check if or when devsim handles extensions.
2804 // The chosen format has mandatory support the transfer src and dst format features when Maitenance1 is enabled. However, our
2805 // use of devsim and the mock ICD violate this guarantee.
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002806 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), image_format, &format_props);
unknown088160a2019-05-23 17:43:13 -06002807 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT)) {
2808 printf("%s Maintenance1 extension is not supported.\n", kSkipPrefix);
2809 return;
2810 }
2811
2812 VkImageCreateInfo ci;
2813 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2814 ci.pNext = NULL;
2815 ci.flags = 0;
2816 ci.imageType = VK_IMAGE_TYPE_1D;
2817 ci.format = image_format;
2818 ci.extent = {32, 1, 1};
2819 ci.mipLevels = 1;
2820 ci.arrayLayers = 1;
2821 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2822 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2823 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2824 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2825 ci.queueFamilyIndexCount = 0;
2826 ci.pQueueFamilyIndices = NULL;
2827 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2828
2829 // Create 1D image
2830 VkImageObj image_1D(m_device);
2831 image_1D.init(&ci);
2832 ASSERT_TRUE(image_1D.initialized());
2833
2834 // 2D image
2835 ci.imageType = VK_IMAGE_TYPE_2D;
2836 ci.extent = {32, 32, 1};
2837 VkImageObj image_2D(m_device);
2838 image_2D.init(&ci);
2839 ASSERT_TRUE(image_2D.initialized());
2840
2841 // 3D image
2842 ci.imageType = VK_IMAGE_TYPE_3D;
2843 ci.extent = {32, 32, 8};
2844 VkImageObj image_3D(m_device);
2845 image_3D.init(&ci);
2846 ASSERT_TRUE(image_3D.initialized());
2847
2848 // 2D image array
2849 ci.imageType = VK_IMAGE_TYPE_2D;
2850 ci.extent = {32, 32, 1};
2851 ci.arrayLayers = 8;
2852 VkImageObj image_2D_array(m_device);
2853 image_2D_array.init(&ci);
2854 ASSERT_TRUE(image_2D_array.initialized());
2855
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002856 // second 2D image array
2857 ci.imageType = VK_IMAGE_TYPE_2D;
2858 ci.extent = {32, 32, 1};
2859 ci.arrayLayers = 8;
2860 VkImageObj image_2D_array_2(m_device);
2861 image_2D_array_2.init(&ci);
2862 ASSERT_TRUE(image_2D_array_2.initialized());
2863
unknown088160a2019-05-23 17:43:13 -06002864 m_commandBuffer->begin();
2865
2866 VkImageCopy copy_region;
2867 copy_region.extent = {32, 1, 1};
2868 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2869 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2870 copy_region.srcSubresource.mipLevel = 0;
2871 copy_region.dstSubresource.mipLevel = 0;
2872 copy_region.srcSubresource.baseArrayLayer = 0;
2873 copy_region.dstSubresource.baseArrayLayer = 0;
2874 copy_region.srcSubresource.layerCount = 1;
2875 copy_region.dstSubresource.layerCount = 1;
2876 copy_region.srcOffset = {0, 0, 0};
2877 copy_region.dstOffset = {0, 0, 0};
2878
2879 // Copy from layer not present
2880 copy_region.srcSubresource.baseArrayLayer = 4;
2881 copy_region.srcSubresource.layerCount = 6;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002882 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcSubresource-01698");
unknown088160a2019-05-23 17:43:13 -06002883 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2884 &copy_region);
2885 m_errorMonitor->VerifyFound();
2886 copy_region.srcSubresource.baseArrayLayer = 0;
2887 copy_region.srcSubresource.layerCount = 1;
2888
2889 // Copy to layer not present
2890 copy_region.dstSubresource.baseArrayLayer = 1;
2891 copy_region.dstSubresource.layerCount = 8;
Mark Lobodzinski20310782020-02-28 14:25:17 -07002892 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstSubresource-01699");
unknown088160a2019-05-23 17:43:13 -06002893 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2894 &copy_region);
2895 m_errorMonitor->VerifyFound();
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002896 copy_region.dstSubresource.baseArrayLayer = 0;
unknown088160a2019-05-23 17:43:13 -06002897 copy_region.dstSubresource.layerCount = 1;
2898
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002899 // both 2D and extent.depth not 1
2900 // Need two 2D array images to prevent other errors
2901 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002902 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01790");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002903 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array_2.image(), VK_IMAGE_LAYOUT_GENERAL,
2904 1, &copy_region);
2905 m_errorMonitor->VerifyFound();
2906 copy_region.extent = {32, 1, 1};
2907
2908 // 2D src / 3D dst and depth not equal to src layerCount
2909 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002910 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01791");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002911 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002912 m_commandBuffer->CopyImage(image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2913 &copy_region);
2914 m_errorMonitor->VerifyFound();
2915 copy_region.extent = {32, 1, 1};
2916
2917 // 3D src / 2D dst and depth not equal to dst layerCount
2918 copy_region.extent = {4, 1, 2};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06002919 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01792");
Mark Lobodzinski20310782020-02-28 14:25:17 -07002920 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageCopy-extent-00140");
sfricke-samsung211ee9c2020-02-13 23:38:39 -08002921 m_commandBuffer->CopyImage(image_3D.image(), VK_IMAGE_LAYOUT_GENERAL, image_2D_array.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
2922 &copy_region);
2923 m_errorMonitor->VerifyFound();
2924 copy_region.extent = {32, 1, 1};
2925
unknown088160a2019-05-23 17:43:13 -06002926 m_commandBuffer->end();
2927}
2928
2929TEST_F(VkLayerTest, CopyImageCompressedBlockAlignment) {
2930 // Image copy tests on compressed images with block alignment errors
2931 SetTargetApiVersion(VK_API_VERSION_1_1);
2932 ASSERT_NO_FATAL_FAILURE(Init());
2933
2934 // Select a compressed format and verify support
2935 VkPhysicalDeviceFeatures device_features = {};
2936 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
2937 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
2938 if (device_features.textureCompressionBC) {
2939 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
2940 } else if (device_features.textureCompressionETC2) {
2941 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
2942 } else if (device_features.textureCompressionASTC_LDR) {
2943 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
2944 }
2945
2946 VkImageCreateInfo ci;
2947 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2948 ci.pNext = NULL;
2949 ci.flags = 0;
2950 ci.imageType = VK_IMAGE_TYPE_2D;
2951 ci.format = compressed_format;
2952 ci.extent = {64, 64, 1};
2953 ci.mipLevels = 1;
2954 ci.arrayLayers = 1;
2955 ci.samples = VK_SAMPLE_COUNT_1_BIT;
2956 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
2957 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
2958 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
2959 ci.queueFamilyIndexCount = 0;
2960 ci.pQueueFamilyIndices = NULL;
2961 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
2962
2963 VkImageFormatProperties img_prop = {};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06002964 if (VK_SUCCESS != vk::GetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), ci.format, ci.imageType, ci.tiling,
2965 ci.usage, ci.flags, &img_prop)) {
unknown088160a2019-05-23 17:43:13 -06002966 printf("%s No compressed formats supported - CopyImageCompressedBlockAlignment skipped.\n", kSkipPrefix);
2967 return;
2968 }
2969
2970 // Create images
2971 VkImageObj image_1(m_device);
2972 image_1.init(&ci);
2973 ASSERT_TRUE(image_1.initialized());
2974
2975 ci.extent = {62, 62, 1}; // slightly smaller and not divisible by block size
2976 VkImageObj image_2(m_device);
2977 image_2.init(&ci);
2978 ASSERT_TRUE(image_2.initialized());
2979
2980 m_commandBuffer->begin();
2981
2982 VkImageCopy copy_region;
2983 copy_region.extent = {48, 48, 1};
2984 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2985 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
2986 copy_region.srcSubresource.mipLevel = 0;
2987 copy_region.dstSubresource.mipLevel = 0;
2988 copy_region.srcSubresource.baseArrayLayer = 0;
2989 copy_region.dstSubresource.baseArrayLayer = 0;
2990 copy_region.srcSubresource.layerCount = 1;
2991 copy_region.dstSubresource.layerCount = 1;
2992 copy_region.srcOffset = {0, 0, 0};
2993 copy_region.dstOffset = {0, 0, 0};
2994
2995 // Sanity check
2996 m_errorMonitor->ExpectSuccess();
2997 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
2998 m_errorMonitor->VerifyNotFound();
2999
3000 std::string vuid;
3001 bool ycbcr = (DeviceExtensionEnabled(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME) ||
3002 (DeviceValidationVersion() >= VK_API_VERSION_1_1));
3003
3004 // Src, Dest offsets must be multiples of compressed block sizes {4, 4, 1}
3005 // Image transfer granularity gets set to compressed block size, so an ITG error is also (unavoidably) triggered.
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003006 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01727" : "VUID-vkCmdCopyImage-srcImage-01727";
unknown088160a2019-05-23 17:43:13 -06003007 copy_region.srcOffset = {2, 4, 0}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003008 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3009 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003010 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3011 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3012 m_errorMonitor->VerifyFound();
3013 copy_region.srcOffset = {12, 1, 0}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003014 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3015 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003016 "VUID-vkCmdCopyImage-srcOffset-01783"); // srcOffset image transfer granularity
3017 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3018 m_errorMonitor->VerifyFound();
3019 copy_region.srcOffset = {0, 0, 0};
3020
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003021 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01731" : "VUID-vkCmdCopyImage-dstImage-01731";
unknown088160a2019-05-23 17:43:13 -06003022 copy_region.dstOffset = {1, 0, 0}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003023 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3024 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003025 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3026 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3027 m_errorMonitor->VerifyFound();
3028 copy_region.dstOffset = {4, 1, 0}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003029 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3030 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003031 "VUID-vkCmdCopyImage-dstOffset-01784"); // dstOffset image transfer granularity
3032 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3033 m_errorMonitor->VerifyFound();
3034 copy_region.dstOffset = {0, 0, 0};
3035
3036 // Copy extent must be multiples of compressed block sizes {4, 4, 1} if not full width/height
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003037 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01728" : "VUID-vkCmdCopyImage-srcImage-01728";
unknown088160a2019-05-23 17:43:13 -06003038 copy_region.extent = {62, 60, 1}; // source width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003039 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3040 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003041 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3042 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3043 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003044 vuid = ycbcr ? "VUID-vkCmdCopyImage-srcImage-01729" : "VUID-vkCmdCopyImage-srcImage-01729";
unknown088160a2019-05-23 17:43:13 -06003045 copy_region.extent = {60, 62, 1}; // source height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003046 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3047 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003048 "VUID-vkCmdCopyImage-srcOffset-01783"); // src extent image transfer granularity
3049 m_commandBuffer->CopyImage(image_1.image(), VK_IMAGE_LAYOUT_GENERAL, image_2.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3050 m_errorMonitor->VerifyFound();
3051
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003052 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01732" : "VUID-vkCmdCopyImage-dstImage-01732";
unknown088160a2019-05-23 17:43:13 -06003053 copy_region.extent = {62, 60, 1}; // dest width
Mark Lobodzinski20310782020-02-28 14:25:17 -07003054 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3055 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003056 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3057 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3058 m_errorMonitor->VerifyFound();
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003059 vuid = ycbcr ? "VUID-vkCmdCopyImage-dstImage-01733" : "VUID-vkCmdCopyImage-dstImage-01733";
unknown088160a2019-05-23 17:43:13 -06003060 copy_region.extent = {60, 62, 1}; // dest height
Mark Lobodzinski20310782020-02-28 14:25:17 -07003061 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3062 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06003063 "VUID-vkCmdCopyImage-dstOffset-01784"); // dst extent image transfer granularity
3064 m_commandBuffer->CopyImage(image_2.image(), VK_IMAGE_LAYOUT_GENERAL, image_1.image(), VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
3065 m_errorMonitor->VerifyFound();
3066
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003067 // Note: "VUID-vkCmdCopyImage-srcImage-01730", "VUID-vkCmdCopyImage-dstImage-01734", "VUID-vkCmdCopyImage-srcImage-01730",
3068 // "VUID-vkCmdCopyImage-dstImage-01734"
unknown088160a2019-05-23 17:43:13 -06003069 // There are currently no supported compressed formats with a block depth other than 1,
3070 // so impossible to create a 'not a multiple' condition for depth.
3071 m_commandBuffer->end();
3072}
3073
3074TEST_F(VkLayerTest, CopyImageSinglePlane422Alignment) {
3075 // Image copy tests on single-plane _422 formats with block alignment errors
3076
3077 // Enable KHR multiplane req'd extensions
3078 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3079 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3080 if (mp_extensions) {
3081 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3082 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003083 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003084 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3085 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3086 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3087 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3088 if (mp_extensions) {
3089 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3090 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3091 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3092 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3093 } else {
3094 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3095 return;
3096 }
3097 ASSERT_NO_FATAL_FAILURE(InitState());
3098
3099 // Select a _422 format and verify support
3100 VkImageCreateInfo ci = {};
3101 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3102 ci.pNext = NULL;
3103 ci.flags = 0;
3104 ci.imageType = VK_IMAGE_TYPE_2D;
3105 ci.format = VK_FORMAT_G8B8G8R8_422_UNORM_KHR;
3106 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3107 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3108 ci.mipLevels = 1;
3109 ci.arrayLayers = 1;
3110 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3111 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3112 ci.queueFamilyIndexCount = 0;
3113 ci.pQueueFamilyIndices = NULL;
3114 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3115
3116 // Verify formats
3117 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3118 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3119 if (!supported) {
3120 printf("%s Single-plane _422 image format not supported. Skipping test.\n", kSkipPrefix);
3121 return; // Assume there's low ROI on searching for different mp formats
3122 }
3123
3124 // Create images
3125 ci.extent = {64, 64, 1};
3126 VkImageObj image_422(m_device);
3127 image_422.init(&ci);
3128 ASSERT_TRUE(image_422.initialized());
3129
3130 ci.extent = {64, 64, 1};
3131 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3132 VkImageObj image_ucmp(m_device);
3133 image_ucmp.init(&ci);
3134 ASSERT_TRUE(image_ucmp.initialized());
3135
3136 m_commandBuffer->begin();
3137
3138 VkImageCopy copy_region;
3139 copy_region.extent = {48, 48, 1};
3140 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3141 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3142 copy_region.srcSubresource.mipLevel = 0;
3143 copy_region.dstSubresource.mipLevel = 0;
3144 copy_region.srcSubresource.baseArrayLayer = 0;
3145 copy_region.dstSubresource.baseArrayLayer = 0;
3146 copy_region.srcSubresource.layerCount = 1;
3147 copy_region.dstSubresource.layerCount = 1;
3148 copy_region.srcOffset = {0, 0, 0};
3149 copy_region.dstOffset = {0, 0, 0};
3150
3151 // Src offsets must be multiples of compressed block sizes
3152 copy_region.srcOffset = {3, 4, 0}; // source offset x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003153 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01727");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003154 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003155 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3156 &copy_region);
3157 m_errorMonitor->VerifyFound();
3158 copy_region.srcOffset = {0, 0, 0};
3159
3160 // Dst offsets must be multiples of compressed block sizes
3161 copy_region.dstOffset = {1, 0, 0};
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003162 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01731");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-01784");
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003164 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003165 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3166 &copy_region);
3167 m_errorMonitor->VerifyFound();
3168 copy_region.dstOffset = {0, 0, 0};
3169
3170 // Copy extent must be multiples of compressed block sizes if not full width/height
3171 copy_region.extent = {31, 60, 1}; // 422 source, extent.x
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003172 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01728");
Mark Lobodzinski20310782020-02-28 14:25:17 -07003173 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-01783");
unknown088160a2019-05-23 17:43:13 -06003174 m_commandBuffer->CopyImage(image_422.image(), VK_IMAGE_LAYOUT_GENERAL, image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3175 &copy_region);
3176 m_errorMonitor->VerifyFound();
3177
unknown357e1782019-09-25 17:57:40 -06003178 // 422 dest
unknown088160a2019-05-23 17:43:13 -06003179 m_commandBuffer->CopyImage(image_ucmp.image(), VK_IMAGE_LAYOUT_GENERAL, image_422.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3180 &copy_region);
unknown357e1782019-09-25 17:57:40 -06003181 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003182 copy_region.dstOffset = {0, 0, 0};
3183
3184 m_commandBuffer->end();
3185}
3186
3187TEST_F(VkLayerTest, CopyImageMultiplaneAspectBits) {
3188 // Image copy tests on multiplane images with aspect errors
3189
3190 // Enable KHR multiplane req'd extensions
3191 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3192 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3193 if (mp_extensions) {
3194 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3195 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07003196 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06003197 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3198 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3199 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3200 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3201 if (mp_extensions) {
3202 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3203 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3204 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3205 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3206 } else {
3207 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3208 return;
3209 }
3210 ASSERT_NO_FATAL_FAILURE(InitState());
3211
3212 // Select multi-plane formats and verify support
3213 VkFormat mp3_format = VK_FORMAT_G8_B8_R8_3PLANE_422_UNORM_KHR;
3214 VkFormat mp2_format = VK_FORMAT_G8_B8R8_2PLANE_422_UNORM_KHR;
3215
3216 VkImageCreateInfo ci = {};
3217 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3218 ci.pNext = NULL;
3219 ci.flags = 0;
3220 ci.imageType = VK_IMAGE_TYPE_2D;
3221 ci.format = mp2_format;
3222 ci.extent = {256, 256, 1};
3223 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3224 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3225 ci.mipLevels = 1;
3226 ci.arrayLayers = 1;
3227 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3228 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3229 ci.queueFamilyIndexCount = 0;
3230 ci.pQueueFamilyIndices = NULL;
3231 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3232
3233 // Verify formats
3234 VkFormatFeatureFlags features = VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT;
3235 bool supported = ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3236 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3237 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3238 ci.format = mp3_format;
3239 supported = supported && ImageFormatAndFeaturesSupported(instance(), gpu(), ci, features);
3240 if (!supported) {
3241 printf("%s Multiplane image formats or optimally tiled depth-stencil buffers not supported. Skipping test.\n",
3242 kSkipPrefix);
3243 return; // Assume there's low ROI on searching for different mp formats
3244 }
3245
3246 // Create images
3247 VkImageObj mp3_image(m_device);
3248 mp3_image.init(&ci);
3249 ASSERT_TRUE(mp3_image.initialized());
3250
3251 ci.format = mp2_format;
3252 VkImageObj mp2_image(m_device);
3253 mp2_image.init(&ci);
3254 ASSERT_TRUE(mp2_image.initialized());
3255
3256 ci.format = VK_FORMAT_D24_UNORM_S8_UINT;
3257 VkImageObj sp_image(m_device);
3258 sp_image.init(&ci);
3259 ASSERT_TRUE(sp_image.initialized());
3260
3261 m_commandBuffer->begin();
3262
3263 VkImageCopy copy_region;
3264 copy_region.extent = {128, 128, 1};
3265 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3266 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
3267 copy_region.srcSubresource.mipLevel = 0;
3268 copy_region.dstSubresource.mipLevel = 0;
3269 copy_region.srcSubresource.baseArrayLayer = 0;
3270 copy_region.dstSubresource.baseArrayLayer = 0;
3271 copy_region.srcSubresource.layerCount = 1;
3272 copy_region.dstSubresource.layerCount = 1;
3273 copy_region.srcOffset = {0, 0, 0};
3274 copy_region.dstOffset = {0, 0, 0};
3275
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003276 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01552");
unknown088160a2019-05-23 17:43:13 -06003277 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3278 &copy_region);
3279 m_errorMonitor->VerifyFound();
3280
unknown088160a2019-05-23 17:43:13 -06003281 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3282 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003283 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01553");
unknown088160a2019-05-23 17:43:13 -06003284 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3285 &copy_region);
3286 m_errorMonitor->VerifyFound();
3287
3288 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT_KHR;
3289 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003290 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01554");
unknown088160a2019-05-23 17:43:13 -06003291 m_commandBuffer->CopyImage(mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3292 &copy_region);
3293 m_errorMonitor->VerifyFound();
3294
3295 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003296 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01555");
unknown088160a2019-05-23 17:43:13 -06003297 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3298 &copy_region);
3299 m_errorMonitor->VerifyFound();
3300
3301 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003302 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-01556");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003303 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003304 m_commandBuffer->CopyImage(mp2_image.image(), VK_IMAGE_LAYOUT_GENERAL, sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3305 &copy_region);
3306 m_errorMonitor->VerifyFound();
3307
3308 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3309 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_2_BIT_KHR;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003310 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstImage-01557");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003311 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549"); // since also non-compatiable
unknown088160a2019-05-23 17:43:13 -06003312 m_commandBuffer->CopyImage(sp_image.image(), VK_IMAGE_LAYOUT_GENERAL, mp3_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3313 &copy_region);
3314 m_errorMonitor->VerifyFound();
3315
3316 m_commandBuffer->end();
3317}
3318
3319TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
3320 // Image copy with source region specified greater than src image size
3321 ASSERT_NO_FATAL_FAILURE(Init());
3322
3323 // Create images with full mip chain
3324 VkImageCreateInfo ci;
3325 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3326 ci.pNext = NULL;
3327 ci.flags = 0;
3328 ci.imageType = VK_IMAGE_TYPE_3D;
3329 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3330 ci.extent = {32, 32, 8};
3331 ci.mipLevels = 6;
3332 ci.arrayLayers = 1;
3333 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3334 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3335 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3336 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3337 ci.queueFamilyIndexCount = 0;
3338 ci.pQueueFamilyIndices = NULL;
3339 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3340
3341 VkImageObj src_image(m_device);
3342 src_image.init(&ci);
3343 ASSERT_TRUE(src_image.initialized());
3344
3345 // Dest image with one more mip level
3346 ci.extent = {64, 64, 16};
3347 ci.mipLevels = 7;
3348 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3349 VkImageObj dst_image(m_device);
3350 dst_image.init(&ci);
3351 ASSERT_TRUE(dst_image.initialized());
3352
3353 m_commandBuffer->begin();
3354
3355 VkImageCopy copy_region;
3356 copy_region.extent = {32, 32, 8};
3357 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3358 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3359 copy_region.srcSubresource.mipLevel = 0;
3360 copy_region.dstSubresource.mipLevel = 0;
3361 copy_region.srcSubresource.baseArrayLayer = 0;
3362 copy_region.dstSubresource.baseArrayLayer = 0;
3363 copy_region.srcSubresource.layerCount = 1;
3364 copy_region.dstSubresource.layerCount = 1;
3365 copy_region.srcOffset = {0, 0, 0};
3366 copy_region.dstOffset = {0, 0, 0};
3367
3368 m_errorMonitor->ExpectSuccess();
3369 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3370 &copy_region);
3371 m_errorMonitor->VerifyNotFound();
3372
3373 // Source exceeded in x-dim, VU 01202
3374 copy_region.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003375 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
unknown088160a2019-05-23 17:43:13 -06003376 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3377 &copy_region);
3378 m_errorMonitor->VerifyFound();
3379
3380 // Source exceeded in y-dim, VU 01203
3381 copy_region.srcOffset.x = 0;
3382 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003383 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
unknown088160a2019-05-23 17:43:13 -06003384 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3385 &copy_region);
3386 m_errorMonitor->VerifyFound();
3387
3388 // Source exceeded in z-dim, VU 01204
3389 copy_region.extent = {4, 4, 4};
3390 copy_region.srcSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003391 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00147");
unknown088160a2019-05-23 17:43:13 -06003392 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3393 &copy_region);
3394 m_errorMonitor->VerifyFound();
3395
3396 m_commandBuffer->end();
3397}
3398
3399TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
3400 // Image copy with dest region specified greater than dest image size
3401 ASSERT_NO_FATAL_FAILURE(Init());
3402
3403 // Create images with full mip chain
3404 VkImageCreateInfo ci;
3405 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3406 ci.pNext = NULL;
3407 ci.flags = 0;
3408 ci.imageType = VK_IMAGE_TYPE_3D;
3409 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3410 ci.extent = {32, 32, 8};
3411 ci.mipLevels = 6;
3412 ci.arrayLayers = 1;
3413 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3414 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3415 ci.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3416 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3417 ci.queueFamilyIndexCount = 0;
3418 ci.pQueueFamilyIndices = NULL;
3419 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3420
3421 VkImageObj dst_image(m_device);
3422 dst_image.init(&ci);
3423 ASSERT_TRUE(dst_image.initialized());
3424
3425 // Src image with one more mip level
3426 ci.extent = {64, 64, 16};
3427 ci.mipLevels = 7;
3428 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
3429 VkImageObj src_image(m_device);
3430 src_image.init(&ci);
3431 ASSERT_TRUE(src_image.initialized());
3432
3433 m_commandBuffer->begin();
3434
3435 VkImageCopy copy_region;
3436 copy_region.extent = {32, 32, 8};
3437 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3438 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3439 copy_region.srcSubresource.mipLevel = 0;
3440 copy_region.dstSubresource.mipLevel = 0;
3441 copy_region.srcSubresource.baseArrayLayer = 0;
3442 copy_region.dstSubresource.baseArrayLayer = 0;
3443 copy_region.srcSubresource.layerCount = 1;
3444 copy_region.dstSubresource.layerCount = 1;
3445 copy_region.srcOffset = {0, 0, 0};
3446 copy_region.dstOffset = {0, 0, 0};
3447
3448 m_errorMonitor->ExpectSuccess();
3449 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3450 &copy_region);
3451 m_errorMonitor->VerifyNotFound();
3452
3453 // Dest exceeded in x-dim, VU 01205
3454 copy_region.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003455 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
unknown088160a2019-05-23 17:43:13 -06003456 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3457 &copy_region);
3458 m_errorMonitor->VerifyFound();
3459
3460 // Dest exceeded in y-dim, VU 01206
3461 copy_region.dstOffset.x = 0;
3462 copy_region.extent.height = 48;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003463 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
unknown088160a2019-05-23 17:43:13 -06003464 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3465 &copy_region);
3466 m_errorMonitor->VerifyFound();
3467
3468 // Dest exceeded in z-dim, VU 01207
3469 copy_region.extent = {4, 4, 4};
3470 copy_region.dstSubresource.mipLevel = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003471 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00153");
unknown088160a2019-05-23 17:43:13 -06003472 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3473 &copy_region);
3474 m_errorMonitor->VerifyFound();
3475
3476 m_commandBuffer->end();
3477}
3478
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003479TEST_F(VkLayerTest, CopyImageMultiPlaneSizeExceeded) {
3480 TEST_DESCRIPTION("Image Copy for multi-planar format that exceed size of plane for both src and dst");
3481
3482 // Enable KHR multiplane req'd extensions
3483 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3484 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3485 if (mp_extensions == true) {
3486 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3487 }
3488 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3489 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3490 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3491 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3492 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3493 if (mp_extensions == true) {
3494 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3495 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3496 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3497 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3498 } else {
3499 printf("%s test requires KHR multiplane extensions, not available. Skipping.\n", kSkipPrefix);
3500 return;
3501 }
3502 ASSERT_NO_FATAL_FAILURE(InitState());
3503
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003504 // Try to use VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM because need multi-plane format for some tests and likely supported due to
3505 // copy support being required with samplerYcbcrConversion feature
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003506 VkFormatProperties props = {0, 0, 0};
3507 bool missing_format_support = false;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003508 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM, &props);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003509 missing_format_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
3510 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_SRC_BIT) == 0;
3511 missing_format_support |= (props.optimalTilingFeatures & VK_FORMAT_FEATURE_TRANSFER_DST_BIT) == 0;
3512
3513 if (missing_format_support == true) {
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003514 printf("%s VK_FORMAT_G8_B8_R8_3PLANE_420_UNORM transfer not supported; skipped.\n", kSkipPrefix);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003515 return;
3516 }
3517
3518 // 128^2 texels in plane_0 and 64^2 texels in plane_1
3519 VkImageObj src_image(m_device);
3520 VkImageObj dst_image(m_device);
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003521 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 -08003522 ASSERT_TRUE(src_image.initialized());
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003523 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 -08003524 ASSERT_TRUE(dst_image.initialized());
3525
3526 VkImageCopy copy_region = {};
3527 copy_region.extent = {64, 64, 1}; // Size of plane 1
3528 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3529 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3530 copy_region.srcSubresource.mipLevel = 0;
3531 copy_region.dstSubresource.mipLevel = 0;
3532 copy_region.srcSubresource.baseArrayLayer = 0;
3533 copy_region.dstSubresource.baseArrayLayer = 0;
3534 copy_region.srcSubresource.layerCount = 1;
3535 copy_region.dstSubresource.layerCount = 1;
3536 copy_region.srcOffset = {0, 0, 0};
3537 copy_region.dstOffset = {0, 0, 0};
3538 VkImageCopy original_region = copy_region;
3539
3540 m_commandBuffer->begin();
3541
3542 // Should be able to do a 64x64 copy from plane 1 -> Plane 1
3543 m_errorMonitor->ExpectSuccess();
3544 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3545 &copy_region);
3546 m_errorMonitor->VerifyNotFound();
3547
3548 // Should be able to do a 64x64 copy from plane 0 -> Plane 0
3549 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3550 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3551 m_errorMonitor->ExpectSuccess();
3552 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3553 &copy_region);
3554 m_errorMonitor->VerifyNotFound();
3555
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07003556 VkMemoryBarrier mem_barrier = LvlInitStruct<VkMemoryBarrier>();
locke-lunargdf00db02020-03-04 19:00:57 -07003557 mem_barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3558 mem_barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
3559
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003560 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3561 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3562 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3563 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003564 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3565 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003566 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3567 &copy_region);
3568 m_errorMonitor->VerifyNotFound();
3569
3570 // Should be able to do a 64x64 copy from plane 0 -> Plane 1
3571 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3572 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3573 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003574 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3575 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003576 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3577 &copy_region);
3578 m_errorMonitor->VerifyNotFound();
3579
3580 // Should be able to do a 128x64 copy from plane 0 -> Plane 0
3581 copy_region.extent = {128, 64, 1};
3582 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3583 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3584 m_errorMonitor->ExpectSuccess();
locke-lunargdf00db02020-03-04 19:00:57 -07003585 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, 0, 1,
3586 &mem_barrier, 0, nullptr, 0, nullptr);
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003587 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3588 &copy_region);
3589 m_errorMonitor->VerifyNotFound();
3590
3591 // 128x64 copy from plane 0 -> Plane 1
3592 copy_region.extent = {128, 64, 1};
3593 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3594 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003595 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00150");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003596 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3597 &copy_region);
3598 m_errorMonitor->VerifyFound();
3599
3600 // 128x64 copy from plane 1 -> Plane 0
3601 copy_region.extent = {128, 64, 1};
3602 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3603 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003604 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00144");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003605 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3606 &copy_region);
3607 m_errorMonitor->VerifyFound();
3608
3609 // src exceeded in y-dim from offset
3610 copy_region = original_region;
3611 copy_region.srcOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003612 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcOffset-00145");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003613 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3614 &copy_region);
3615 m_errorMonitor->VerifyFound();
3616
3617 // dst exceeded in y-dim from offset
3618 copy_region = original_region;
3619 copy_region.dstOffset.y = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06003620 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-dstOffset-00151");
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003621 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
3622 &copy_region);
3623 m_errorMonitor->VerifyFound();
3624
3625 m_commandBuffer->end();
3626}
3627
unknown088160a2019-05-23 17:43:13 -06003628TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
sfricke-samsung51067b22020-04-30 21:41:17 -07003629 if (!EnableDeviceProfileLayer()) {
3630 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3631 return;
3632 }
unknown088160a2019-05-23 17:43:13 -06003633
sfricke-samsung8ceaaea2020-03-07 14:08:08 -08003634 // Enable KHR multiplane req'd extensions
3635 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME,
3636 VK_KHR_GET_MEMORY_REQUIREMENTS_2_SPEC_VERSION);
3637 if (mp_extensions == true) {
3638 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3639 }
3640 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3641 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3642 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3643 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3644 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3645 if (mp_extensions == true) {
3646 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3647 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3648 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3649 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3650 }
3651 ASSERT_NO_FATAL_FAILURE(InitState());
unknown088160a2019-05-23 17:43:13 -06003652
sfricke-samsung51067b22020-04-30 21:41:17 -07003653 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3654 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003655
sfricke-samsung51067b22020-04-30 21:41:17 -07003656 // Load required functions
3657 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
3658 printf("%s Failed to device profile layer.\n", kSkipPrefix);
3659 return;
3660 }
3661
3662 // Set transfer for all potential used formats
3663 VkFormatProperties format_props;
3664 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, &format_props);
3665 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3666 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UNORM, format_props);
3667
3668 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, &format_props);
3669 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3670 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8_UINT, format_props);
unknown088160a2019-05-23 17:43:13 -06003671
3672 VkImageCreateInfo image_create_info = {};
3673 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3674 image_create_info.pNext = NULL;
3675 image_create_info.imageType = VK_IMAGE_TYPE_2D;
unknown088160a2019-05-23 17:43:13 -06003676 image_create_info.extent.width = 32;
3677 image_create_info.extent.height = 32;
3678 image_create_info.extent.depth = 1;
3679 image_create_info.mipLevels = 1;
3680 image_create_info.arrayLayers = 1;
3681 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
sfricke-samsung51067b22020-04-30 21:41:17 -07003682 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3683 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
unknown088160a2019-05-23 17:43:13 -06003684 image_create_info.flags = 0;
3685
sfricke-samsung51067b22020-04-30 21:41:17 -07003686 image_create_info.format = VK_FORMAT_R8_UNORM;
3687 VkImageObj image_8b_unorm(m_device);
3688 image_8b_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003689
sfricke-samsung51067b22020-04-30 21:41:17 -07003690 image_create_info.format = VK_FORMAT_R8_UINT;
3691 VkImageObj image_8b_uint(m_device);
3692 image_8b_uint.init(&image_create_info);
3693
3694 // First try to test two single plane mismatch
3695 {
3696 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, &format_props);
3697 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3698 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R8G8B8A8_UNORM, format_props);
3699
3700 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
3701 VkImageObj image_32b_unorm(m_device);
3702 image_32b_unorm.init(&image_create_info);
3703
3704 m_commandBuffer->begin();
3705 VkImageCopy copyRegion;
3706 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3707 copyRegion.srcSubresource.mipLevel = 0;
3708 copyRegion.srcSubresource.baseArrayLayer = 0;
3709 copyRegion.srcSubresource.layerCount = 1;
3710 copyRegion.srcOffset.x = 0;
3711 copyRegion.srcOffset.y = 0;
3712 copyRegion.srcOffset.z = 0;
3713 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3714 copyRegion.dstSubresource.mipLevel = 0;
3715 copyRegion.dstSubresource.baseArrayLayer = 0;
3716 copyRegion.dstSubresource.layerCount = 1;
3717 copyRegion.dstOffset.x = 0;
3718 copyRegion.dstOffset.y = 0;
3719 copyRegion.dstOffset.z = 0;
3720 copyRegion.extent.width = 1;
3721 copyRegion.extent.height = 1;
3722 copyRegion.extent.depth = 1;
3723
3724 // Sanity check between two 8bit formats
3725 m_errorMonitor->ExpectSuccess();
3726 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3727 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3728 m_errorMonitor->VerifyNotFound();
3729
3730 const char *vuid = (mp_extensions) ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
3731 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3732 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_32b_unorm.handle(),
3733 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3734 m_errorMonitor->VerifyFound();
3735
3736 // Swap src and dst
3737 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
3738 m_commandBuffer->CopyImage(image_32b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3739 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3740 m_errorMonitor->VerifyFound();
3741
3742 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06003743 }
3744
sfricke-samsung51067b22020-04-30 21:41:17 -07003745 // DstImage is a mismatched plane of a multi-planar format
3746 if (mp_extensions == false) {
3747 printf("%s No multi-planar support; section of tests skipped.\n", kSkipPrefix);
3748 } else {
3749 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, &format_props);
3750 format_props.optimalTilingFeatures |= (VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
3751 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_G8_B8R8_2PLANE_420_UNORM, format_props);
unknown088160a2019-05-23 17:43:13 -06003752
sfricke-samsung51067b22020-04-30 21:41:17 -07003753 image_create_info.format = VK_FORMAT_G8_B8R8_2PLANE_420_UNORM;
3754 VkImageObj image_8b_16b_420_unorm(m_device);
3755 image_8b_16b_420_unorm.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06003756
sfricke-samsung51067b22020-04-30 21:41:17 -07003757 m_commandBuffer->begin();
3758 VkImageCopy copyRegion;
3759 copyRegion.srcSubresource.mipLevel = 0;
3760 copyRegion.srcSubresource.baseArrayLayer = 0;
3761 copyRegion.srcSubresource.layerCount = 1;
3762 copyRegion.srcOffset.x = 0;
3763 copyRegion.srcOffset.y = 0;
3764 copyRegion.srcOffset.z = 0;
3765 copyRegion.dstSubresource.mipLevel = 0;
3766 copyRegion.dstSubresource.baseArrayLayer = 0;
3767 copyRegion.dstSubresource.layerCount = 1;
3768 copyRegion.dstOffset.x = 0;
3769 copyRegion.dstOffset.y = 0;
3770 copyRegion.dstOffset.z = 0;
3771 copyRegion.extent.width = 1;
3772 copyRegion.extent.height = 1;
3773 copyRegion.extent.depth = 1;
unknown088160a2019-05-23 17:43:13 -06003774
sfricke-samsung51067b22020-04-30 21:41:17 -07003775 // First test single-plane -> multi-plan
3776 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3777 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
unknown088160a2019-05-23 17:43:13 -06003778
sfricke-samsung51067b22020-04-30 21:41:17 -07003779 // Plane 0 is VK_FORMAT_R8_UNORM so this should succeed
3780 m_errorMonitor->ExpectSuccess();
3781 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3782 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3783 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003784
locke-lunargdf00db02020-03-04 19:00:57 -07003785 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3786 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3787
sfricke-samsung51067b22020-04-30 21:41:17 -07003788 // Make sure no false postiives if Compatible format
3789 m_errorMonitor->ExpectSuccess();
3790 m_commandBuffer->CopyImage(image_8b_uint.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3791 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3792 m_errorMonitor->VerifyNotFound();
unknown088160a2019-05-23 17:43:13 -06003793
sfricke-samsung51067b22020-04-30 21:41:17 -07003794 // Plane 1 is VK_FORMAT_R8G8_UNORM so this should fail
3795 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3796 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3797 m_commandBuffer->CopyImage(image_8b_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_16b_420_unorm.handle(),
3798 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3799 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06003800
sfricke-samsung51067b22020-04-30 21:41:17 -07003801 // Same tests but swap src and dst
3802 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_0_BIT;
3803 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
sfricke-samsungdce5f692020-03-07 13:59:31 -08003804
locke-lunargdf00db02020-03-04 19:00:57 -07003805 image_8b_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_ACCESS_TRANSFER_READ_BIT,
3806 VK_ACCESS_TRANSFER_WRITE_BIT, VK_IMAGE_LAYOUT_GENERAL);
3807 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3808 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3809
sfricke-samsung51067b22020-04-30 21:41:17 -07003810 m_errorMonitor->ExpectSuccess();
3811 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_unorm.handle(),
3812 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3813 m_errorMonitor->VerifyNotFound();
3814
locke-lunargdf00db02020-03-04 19:00:57 -07003815 image_8b_16b_420_unorm.ImageMemoryBarrier(m_commandBuffer, VK_IMAGE_ASPECT_PLANE_0_BIT, VK_ACCESS_TRANSFER_WRITE_BIT,
3816 VK_ACCESS_TRANSFER_READ_BIT, VK_IMAGE_LAYOUT_GENERAL);
3817
sfricke-samsung51067b22020-04-30 21:41:17 -07003818 m_errorMonitor->ExpectSuccess();
3819 m_commandBuffer->CopyImage(image_8b_16b_420_unorm.handle(), VK_IMAGE_LAYOUT_GENERAL, image_8b_uint.handle(),
3820 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
3821 m_errorMonitor->VerifyNotFound();
3822
3823 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_PLANE_1_BIT;
3824 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-None-01549");
3825 m_commandBuffer->CopyImage(image_8b_16b_420_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();
3830 }
unknown088160a2019-05-23 17:43:13 -06003831}
3832
3833TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
3834 ASSERT_NO_FATAL_FAILURE(Init());
3835 auto depth_format = FindSupportedDepthStencilFormat(gpu());
3836 if (!depth_format) {
3837 printf("%s Couldn't depth stencil image format.\n", kSkipPrefix);
3838 return;
3839 }
3840
3841 VkFormatProperties properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003842 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT, &properties);
unknown088160a2019-05-23 17:43:13 -06003843 if (properties.optimalTilingFeatures == 0) {
3844 printf("%s Image format not supported; skipped.\n", kSkipPrefix);
3845 return;
3846 }
3847
3848 VkImageObj srcImage(m_device);
3849 srcImage.Init(32, 32, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
3850 ASSERT_TRUE(srcImage.initialized());
3851 VkImageObj dstImage(m_device);
3852 dstImage.Init(32, 32, 1, depth_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
3853 ASSERT_TRUE(dstImage.initialized());
3854
3855 // Create two images of different types and try to copy between them
3856
3857 m_commandBuffer->begin();
3858 VkImageCopy copyRegion;
3859 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3860 copyRegion.srcSubresource.mipLevel = 0;
3861 copyRegion.srcSubresource.baseArrayLayer = 0;
3862 copyRegion.srcSubresource.layerCount = 1;
3863 copyRegion.srcOffset.x = 0;
3864 copyRegion.srcOffset.y = 0;
3865 copyRegion.srcOffset.z = 0;
3866 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
3867 copyRegion.dstSubresource.mipLevel = 0;
3868 copyRegion.dstSubresource.baseArrayLayer = 0;
3869 copyRegion.dstSubresource.layerCount = 1;
3870 copyRegion.dstOffset.x = 0;
3871 copyRegion.dstOffset.y = 0;
3872 copyRegion.dstOffset.z = 0;
3873 copyRegion.extent.width = 1;
3874 copyRegion.extent.height = 1;
3875 copyRegion.extent.depth = 1;
3876
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003877 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00135");
unknown088160a2019-05-23 17:43:13 -06003878 m_commandBuffer->CopyImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
3879 &copyRegion);
3880 m_commandBuffer->end();
3881
3882 m_errorMonitor->VerifyFound();
3883}
3884
3885TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
3886 TEST_DESCRIPTION("Image copies with sample count mis-matches");
3887
3888 ASSERT_NO_FATAL_FAILURE(Init());
3889
3890 VkImageFormatProperties image_format_properties;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003891 vk::GetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
3892 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
3893 &image_format_properties);
unknown088160a2019-05-23 17:43:13 -06003894
3895 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
3896 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
3897 printf("%s Image multi-sample support not found; skipped.\n", kSkipPrefix);
3898 return;
3899 }
3900
3901 VkImageCreateInfo ci;
3902 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3903 ci.pNext = NULL;
3904 ci.flags = 0;
3905 ci.imageType = VK_IMAGE_TYPE_2D;
3906 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
3907 ci.extent = {128, 128, 1};
3908 ci.mipLevels = 1;
3909 ci.arrayLayers = 1;
3910 ci.samples = VK_SAMPLE_COUNT_1_BIT;
3911 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
3912 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3913 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
3914 ci.queueFamilyIndexCount = 0;
3915 ci.pQueueFamilyIndices = NULL;
3916 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3917
3918 VkImageObj image1(m_device);
3919 image1.init(&ci);
3920 ASSERT_TRUE(image1.initialized());
3921
3922 ci.samples = VK_SAMPLE_COUNT_2_BIT;
3923 VkImageObj image2(m_device);
3924 image2.init(&ci);
3925 ASSERT_TRUE(image2.initialized());
3926
3927 ci.samples = VK_SAMPLE_COUNT_4_BIT;
3928 VkImageObj image4(m_device);
3929 image4.init(&ci);
3930 ASSERT_TRUE(image4.initialized());
3931
3932 m_commandBuffer->begin();
3933
3934 VkImageCopy copyRegion;
3935 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3936 copyRegion.srcSubresource.mipLevel = 0;
3937 copyRegion.srcSubresource.baseArrayLayer = 0;
3938 copyRegion.srcSubresource.layerCount = 1;
3939 copyRegion.srcOffset = {0, 0, 0};
3940 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3941 copyRegion.dstSubresource.mipLevel = 0;
3942 copyRegion.dstSubresource.baseArrayLayer = 0;
3943 copyRegion.dstSubresource.layerCount = 1;
3944 copyRegion.dstOffset = {0, 0, 0};
3945 copyRegion.extent = {128, 128, 1};
3946
3947 // Copy a single sample image to/from a multi-sample image
Mark Lobodzinski20310782020-02-28 14:25:17 -07003948 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003949 vk::CmdCopyImage(m_commandBuffer->handle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
3950 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003951 m_errorMonitor->VerifyFound();
3952
Mark Lobodzinski20310782020-02-28 14:25:17 -07003953 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003954 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(), VK_IMAGE_LAYOUT_GENERAL,
3955 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003956 m_errorMonitor->VerifyFound();
3957
3958 // Copy between multi-sample images with different sample counts
Mark Lobodzinski20310782020-02-28 14:25:17 -07003959 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003960 vk::CmdCopyImage(m_commandBuffer->handle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(), VK_IMAGE_LAYOUT_GENERAL,
3961 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003962 m_errorMonitor->VerifyFound();
3963
Mark Lobodzinski20310782020-02-28 14:25:17 -07003964 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-srcImage-00136");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06003965 vk::CmdCopyImage(m_commandBuffer->handle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(), VK_IMAGE_LAYOUT_GENERAL,
3966 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06003967 m_errorMonitor->VerifyFound();
3968
3969 m_commandBuffer->end();
3970}
3971
3972TEST_F(VkLayerTest, CopyImageAspectMismatch) {
3973 TEST_DESCRIPTION("Image copies with aspect mask errors");
sfricke-samsung99dc12c2020-04-23 01:52:01 -07003974
3975 if (!EnableDeviceProfileLayer()) {
3976 printf("%s Failed to enable device profile layer.\n", kSkipPrefix);
3977 return;
3978 }
3979
3980 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
3981 if (mp_extensions) {
3982 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
3983 }
3984
3985 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
3986 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3987 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3988 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3989 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3990 if (mp_extensions) {
3991 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
3992 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
3993 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
3994 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
3995 }
3996 ASSERT_NO_FATAL_FAILURE(InitState());
3997
3998 PFN_vkSetPhysicalDeviceFormatPropertiesEXT fpvkSetPhysicalDeviceFormatPropertiesEXT = nullptr;
3999 PFN_vkGetOriginalPhysicalDeviceFormatPropertiesEXT fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT = nullptr;
4000
4001 if (!LoadDeviceProfileLayer(fpvkSetPhysicalDeviceFormatPropertiesEXT, fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT)) {
4002 printf("%s Required extensions are not avaiable.\n", kSkipPrefix);
4003 return;
4004 }
4005
unknown088160a2019-05-23 17:43:13 -06004006 auto ds_format = FindSupportedDepthStencilFormat(gpu());
4007 if (!ds_format) {
4008 printf("%s Couldn't find depth stencil format.\n", kSkipPrefix);
4009 return;
4010 }
4011
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004012 // Add Transfer support for all used formats
4013 VkFormatProperties formatProps;
4014 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, &formatProps);
4015 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4016 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4017 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_D32_SFLOAT, &formatProps);
4018 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4019 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), VK_FORMAT_R32_SFLOAT, formatProps);
4020 fpvkGetOriginalPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, &formatProps);
4021 formatProps.optimalTilingFeatures |= (VK_FORMAT_FEATURE_TRANSFER_SRC_BIT | VK_FORMAT_FEATURE_TRANSFER_DST_BIT);
4022 fpvkSetPhysicalDeviceFormatPropertiesEXT(gpu(), ds_format, formatProps);
4023
unknown088160a2019-05-23 17:43:13 -06004024 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
4025 color_image.Init(128, 128, 1, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
4026 depth_image.Init(128, 128, 1, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4027 VK_IMAGE_TILING_OPTIMAL, 0);
4028 ds_image.Init(128, 128, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
4029 VK_IMAGE_TILING_OPTIMAL, 0);
4030 ASSERT_TRUE(color_image.initialized());
4031 ASSERT_TRUE(depth_image.initialized());
4032 ASSERT_TRUE(ds_image.initialized());
4033
4034 VkImageCopy copyRegion;
4035 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4036 copyRegion.srcSubresource.mipLevel = 0;
4037 copyRegion.srcSubresource.baseArrayLayer = 0;
4038 copyRegion.srcSubresource.layerCount = 1;
4039 copyRegion.srcOffset = {0, 0, 0};
4040 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4041 copyRegion.dstSubresource.mipLevel = 0;
4042 copyRegion.dstSubresource.baseArrayLayer = 0;
4043 copyRegion.dstSubresource.layerCount = 1;
4044 copyRegion.dstOffset = {64, 0, 0};
4045 copyRegion.extent = {64, 128, 1};
4046
4047 // Submitting command before command buffer is in recording state
Mark Lobodzinski20310782020-02-28 14:25:17 -07004048 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06004049 "You must call vkBeginCommandBuffer"); // "VUID-vkCmdCopyImage-commandBuffer-recording");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004050 vk::CmdCopyImage(m_commandBuffer->handle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4051 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004052 m_errorMonitor->VerifyFound();
4053
4054 m_commandBuffer->begin();
4055
4056 // Src and dest aspect masks don't match
4057 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004058 const char *vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01551" : "VUID-VkImageCopy-aspectMask-00137";
Mark Lobodzinski20310782020-02-28 14:25:17 -07004059 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004060 vk::CmdCopyImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(),
4061 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004062 m_errorMonitor->VerifyFound();
4063 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4064
4065 // Illegal combinations of aspect bits
4066 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
4067 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004068 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004069 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004070 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004071 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004072 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4073 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004074 m_errorMonitor->VerifyFound();
4075 // same test for dstSubresource
4076 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4077 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
Mark Lobodzinski20310782020-02-28 14:25:17 -07004078 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00167");
unknown088160a2019-05-23 17:43:13 -06004079 // These aspect/format mismatches are redundant but unavoidable here
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004080 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
Mark Lobodzinski20310782020-02-28 14:25:17 -07004081 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004082 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4083 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004084 m_errorMonitor->VerifyFound();
4085
4086 // Metadata aspect is illegal
4087 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
4088 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004089 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004090 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004091 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004092 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4093 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004094 m_errorMonitor->VerifyFound();
4095 // same test for dstSubresource
4096 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4097 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004098 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-00168");
unknown088160a2019-05-23 17:43:13 -06004099 // These aspect/format mismatches are redundant but unavoidable here
Mark Lobodzinski20310782020-02-28 14:25:17 -07004100 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004101 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4102 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004103 m_errorMonitor->VerifyFound();
4104
sfricke-samsung6141db32020-10-26 03:31:38 -07004105 // Aspect Memory Plane mask is illegal
4106 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
4107 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4108 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkImageSubresourceLayers-aspectMask-02247");
4109 // These aspect/format mismatches are redundant but unavoidable here
4110 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, vuid);
4111 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(),
4112 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
4113 m_errorMonitor->VerifyFound();
4114
unknown088160a2019-05-23 17:43:13 -06004115 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4116 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004117 const char *compatible_vuid = mp_extensions ? "VUID-vkCmdCopyImage-srcImage-01548" : "VUID-vkCmdCopyImage-srcImage-00135";
unknown088160a2019-05-23 17:43:13 -06004118
4119 // Aspect mask doesn't match source image format
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004120 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00142");
unknown088160a2019-05-23 17:43:13 -06004121 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004122 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004123 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4124 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004125 m_errorMonitor->VerifyFound();
4126
4127 // Aspect mask doesn't match dest image format
4128 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4129 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004130 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-aspectMask-00143");
unknown088160a2019-05-23 17:43:13 -06004131 // Again redundant but unavoidable
sfricke-samsung99dc12c2020-04-23 01:52:01 -07004132 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, compatible_vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004133 vk::CmdCopyImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
4134 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
unknown088160a2019-05-23 17:43:13 -06004135 m_errorMonitor->VerifyFound();
4136
4137 m_commandBuffer->end();
4138}
4139
4140TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004141 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00257");
unknown088160a2019-05-23 17:43:13 -06004142
4143 ASSERT_NO_FATAL_FAILURE(Init());
4144
4145 // Create two images of sample count 1 and try to Resolve between them
4146
4147 VkImageCreateInfo image_create_info = {};
4148 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4149 image_create_info.pNext = NULL;
4150 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4151 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4152 image_create_info.extent.width = 32;
4153 image_create_info.extent.height = 1;
4154 image_create_info.extent.depth = 1;
4155 image_create_info.mipLevels = 1;
4156 image_create_info.arrayLayers = 1;
4157 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4158 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4159 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4160 image_create_info.flags = 0;
4161
4162 VkImageObj srcImage(m_device);
4163 srcImage.init(&image_create_info);
4164 ASSERT_TRUE(srcImage.initialized());
4165
4166 VkImageObj dstImage(m_device);
4167 dstImage.init(&image_create_info);
4168 ASSERT_TRUE(dstImage.initialized());
4169
4170 m_commandBuffer->begin();
4171 VkImageResolve resolveRegion;
4172 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4173 resolveRegion.srcSubresource.mipLevel = 0;
4174 resolveRegion.srcSubresource.baseArrayLayer = 0;
4175 resolveRegion.srcSubresource.layerCount = 1;
4176 resolveRegion.srcOffset.x = 0;
4177 resolveRegion.srcOffset.y = 0;
4178 resolveRegion.srcOffset.z = 0;
4179 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4180 resolveRegion.dstSubresource.mipLevel = 0;
4181 resolveRegion.dstSubresource.baseArrayLayer = 0;
4182 resolveRegion.dstSubresource.layerCount = 1;
4183 resolveRegion.dstOffset.x = 0;
4184 resolveRegion.dstOffset.y = 0;
4185 resolveRegion.dstOffset.z = 0;
4186 resolveRegion.extent.width = 1;
4187 resolveRegion.extent.height = 1;
4188 resolveRegion.extent.depth = 1;
4189 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4190 &resolveRegion);
4191 m_commandBuffer->end();
4192
4193 m_errorMonitor->VerifyFound();
4194}
4195
4196TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004197 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00259");
unknown088160a2019-05-23 17:43:13 -06004198
4199 ASSERT_NO_FATAL_FAILURE(Init());
4200
4201 // Create two images of sample count 4 and try to Resolve between them
4202
4203 VkImageCreateInfo image_create_info = {};
4204 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4205 image_create_info.pNext = NULL;
4206 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4207 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4208 image_create_info.extent.width = 32;
4209 image_create_info.extent.height = 1;
4210 image_create_info.extent.depth = 1;
4211 image_create_info.mipLevels = 1;
4212 image_create_info.arrayLayers = 1;
4213 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4214 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4215 // Note: Some implementations expect color attachment usage for any
4216 // multisample surface
4217 image_create_info.usage =
4218 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4219 image_create_info.flags = 0;
4220
4221 VkImageObj srcImage(m_device);
4222 srcImage.init(&image_create_info);
4223 ASSERT_TRUE(srcImage.initialized());
4224
4225 VkImageObj dstImage(m_device);
4226 dstImage.init(&image_create_info);
4227 ASSERT_TRUE(dstImage.initialized());
4228
4229 m_commandBuffer->begin();
4230 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4231 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4232 // VK_IMAGE_LAYOUT_GENERAL = 1,
4233 VkImageResolve resolveRegion;
4234 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4235 resolveRegion.srcSubresource.mipLevel = 0;
4236 resolveRegion.srcSubresource.baseArrayLayer = 0;
4237 resolveRegion.srcSubresource.layerCount = 1;
4238 resolveRegion.srcOffset.x = 0;
4239 resolveRegion.srcOffset.y = 0;
4240 resolveRegion.srcOffset.z = 0;
4241 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4242 resolveRegion.dstSubresource.mipLevel = 0;
4243 resolveRegion.dstSubresource.baseArrayLayer = 0;
4244 resolveRegion.dstSubresource.layerCount = 1;
4245 resolveRegion.dstOffset.x = 0;
4246 resolveRegion.dstOffset.y = 0;
4247 resolveRegion.dstOffset.z = 0;
4248 resolveRegion.extent.width = 1;
4249 resolveRegion.extent.height = 1;
4250 resolveRegion.extent.depth = 1;
4251 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4252 &resolveRegion);
4253 m_commandBuffer->end();
4254
4255 m_errorMonitor->VerifyFound();
4256}
4257
4258TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004259 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-01386");
unknown088160a2019-05-23 17:43:13 -06004260
4261 ASSERT_NO_FATAL_FAILURE(Init());
4262
4263 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004264 VkImageObj srcImage(m_device);
4265 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004266
4267 VkImageCreateInfo image_create_info = {};
4268 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4269 image_create_info.pNext = NULL;
4270 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4271 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4272 image_create_info.extent.width = 32;
4273 image_create_info.extent.height = 1;
4274 image_create_info.extent.depth = 1;
4275 image_create_info.mipLevels = 1;
4276 image_create_info.arrayLayers = 1;
4277 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4278 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4279 // Note: Some implementations expect color attachment usage for any
4280 // multisample surface
4281 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4282 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004283 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004284
4285 // Set format to something other than source image
4286 image_create_info.format = VK_FORMAT_R32_SFLOAT;
4287 // Note: Some implementations expect color attachment usage for any
4288 // multisample surface
4289 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4290 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004291 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004292
4293 m_commandBuffer->begin();
4294 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4295 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4296 // VK_IMAGE_LAYOUT_GENERAL = 1,
4297 VkImageResolve resolveRegion;
4298 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4299 resolveRegion.srcSubresource.mipLevel = 0;
4300 resolveRegion.srcSubresource.baseArrayLayer = 0;
4301 resolveRegion.srcSubresource.layerCount = 1;
4302 resolveRegion.srcOffset.x = 0;
4303 resolveRegion.srcOffset.y = 0;
4304 resolveRegion.srcOffset.z = 0;
4305 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4306 resolveRegion.dstSubresource.mipLevel = 0;
4307 resolveRegion.dstSubresource.baseArrayLayer = 0;
4308 resolveRegion.dstSubresource.layerCount = 1;
4309 resolveRegion.dstOffset.x = 0;
4310 resolveRegion.dstOffset.y = 0;
4311 resolveRegion.dstOffset.z = 0;
4312 resolveRegion.extent.width = 1;
4313 resolveRegion.extent.height = 1;
4314 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004315 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4316 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004317 m_commandBuffer->end();
4318
4319 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004320}
4321
4322TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
sfricke-samsungc26350e2020-05-30 12:31:31 -07004323 m_errorMonitor->SetDesiredFailureMsg(kWarningBit, "UNASSIGNED-CoreValidation-DrawState-MismatchedImageType");
unknown088160a2019-05-23 17:43:13 -06004324
4325 ASSERT_NO_FATAL_FAILURE(Init());
4326
4327 // Create two images of different types and try to copy between them
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004328 VkImageObj srcImage(m_device);
4329 VkImageObj dstImage(m_device);
unknown088160a2019-05-23 17:43:13 -06004330
4331 VkImageCreateInfo image_create_info = {};
4332 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4333 image_create_info.pNext = NULL;
4334 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4335 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4336 image_create_info.extent.width = 32;
4337 image_create_info.extent.height = 1;
4338 image_create_info.extent.depth = 1;
4339 image_create_info.mipLevels = 1;
4340 image_create_info.arrayLayers = 1;
4341 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4342 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4343 // Note: Some implementations expect color attachment usage for any
4344 // multisample surface
4345 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4346 image_create_info.flags = 0;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004347 srcImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004348
4349 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4350 // Note: Some implementations expect color attachment usage for any
4351 // multisample surface
4352 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4353 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004354 dstImage.init(&image_create_info);
unknown088160a2019-05-23 17:43:13 -06004355
4356 m_commandBuffer->begin();
4357 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
4358 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
4359 // VK_IMAGE_LAYOUT_GENERAL = 1,
4360 VkImageResolve resolveRegion;
4361 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4362 resolveRegion.srcSubresource.mipLevel = 0;
4363 resolveRegion.srcSubresource.baseArrayLayer = 0;
4364 resolveRegion.srcSubresource.layerCount = 1;
4365 resolveRegion.srcOffset.x = 0;
4366 resolveRegion.srcOffset.y = 0;
4367 resolveRegion.srcOffset.z = 0;
4368 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4369 resolveRegion.dstSubresource.mipLevel = 0;
4370 resolveRegion.dstSubresource.baseArrayLayer = 0;
4371 resolveRegion.dstSubresource.layerCount = 1;
4372 resolveRegion.dstOffset.x = 0;
4373 resolveRegion.dstOffset.y = 0;
4374 resolveRegion.dstOffset.z = 0;
4375 resolveRegion.extent.width = 1;
4376 resolveRegion.extent.height = 1;
4377 resolveRegion.extent.depth = 1;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06004378 m_commandBuffer->ResolveImage(srcImage.handle(), VK_IMAGE_LAYOUT_GENERAL, dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
4379 &resolveRegion);
unknown088160a2019-05-23 17:43:13 -06004380 m_commandBuffer->end();
4381
4382 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06004383}
4384
4385TEST_F(VkLayerTest, ResolveImageLayoutMismatch) {
4386 ASSERT_NO_FATAL_FAILURE(Init());
4387
4388 // Create two images of different types and try to copy between them
4389 VkImageObj srcImage(m_device);
4390 VkImageObj dstImage(m_device);
4391
4392 VkImageCreateInfo image_create_info = {};
4393 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4394 image_create_info.pNext = NULL;
4395 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4396 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4397 image_create_info.extent.width = 32;
4398 image_create_info.extent.height = 32;
4399 image_create_info.extent.depth = 1;
4400 image_create_info.mipLevels = 1;
4401 image_create_info.arrayLayers = 1;
4402 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4403 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4404 image_create_info.usage =
4405 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4406 // Note: Some implementations expect color attachment usage for any
4407 // multisample surface
4408 image_create_info.flags = 0;
4409 srcImage.init(&image_create_info);
4410 ASSERT_TRUE(srcImage.initialized());
4411
4412 // Note: Some implementations expect color attachment usage for any
4413 // multisample surface
4414 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4415 dstImage.init(&image_create_info);
4416 ASSERT_TRUE(dstImage.initialized());
4417
4418 m_commandBuffer->begin();
4419 // source image must have valid contents before resolve
4420 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4421 VkImageSubresourceRange subresource = {};
4422 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4423 subresource.layerCount = 1;
4424 subresource.levelCount = 1;
4425 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4426 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4427 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4428 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4429
4430 VkImageResolve resolveRegion;
4431 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4432 resolveRegion.srcSubresource.mipLevel = 0;
4433 resolveRegion.srcSubresource.baseArrayLayer = 0;
4434 resolveRegion.srcSubresource.layerCount = 1;
4435 resolveRegion.srcOffset.x = 0;
4436 resolveRegion.srcOffset.y = 0;
4437 resolveRegion.srcOffset.z = 0;
4438 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4439 resolveRegion.dstSubresource.mipLevel = 0;
4440 resolveRegion.dstSubresource.baseArrayLayer = 0;
4441 resolveRegion.dstSubresource.layerCount = 1;
4442 resolveRegion.dstOffset.x = 0;
4443 resolveRegion.dstOffset.y = 0;
4444 resolveRegion.dstOffset.z = 0;
4445 resolveRegion.extent.width = 1;
4446 resolveRegion.extent.height = 1;
4447 resolveRegion.extent.depth = 1;
4448 // source image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004449 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImageLayout-00260");
unknown088160a2019-05-23 17:43:13 -06004450 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4451 1, &resolveRegion);
4452 m_errorMonitor->VerifyFound();
4453 // dst image layout mismatch
Mark Lobodzinski20310782020-02-28 14:25:17 -07004454 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImageLayout-00262");
unknown088160a2019-05-23 17:43:13 -06004455 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(), VK_IMAGE_LAYOUT_GENERAL,
4456 1, &resolveRegion);
4457 m_errorMonitor->VerifyFound();
4458 m_commandBuffer->end();
4459}
4460
4461TEST_F(VkLayerTest, ResolveInvalidSubresource) {
Jeff Leger465acf52020-10-12 18:07:16 -04004462 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
4463
4464 bool copy_commands2 = false;
4465 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME)) {
4466 m_device_extension_names.push_back(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME);
4467 copy_commands2 = true;
4468 }
4469 ASSERT_NO_FATAL_FAILURE(InitState());
4470
4471 PFN_vkCmdResolveImage2KHR vkCmdResolveImage2Function = nullptr;
4472 if (copy_commands2) {
4473 vkCmdResolveImage2Function = (PFN_vkCmdResolveImage2KHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCmdResolveImage2KHR");
4474 }
unknown088160a2019-05-23 17:43:13 -06004475
4476 // Create two images of different types and try to copy between them
4477 VkImageObj srcImage(m_device);
4478 VkImageObj dstImage(m_device);
4479
4480 VkImageCreateInfo image_create_info = {};
4481 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4482 image_create_info.pNext = NULL;
4483 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4484 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
4485 image_create_info.extent.width = 32;
4486 image_create_info.extent.height = 32;
4487 image_create_info.extent.depth = 1;
4488 image_create_info.mipLevels = 1;
4489 image_create_info.arrayLayers = 1;
4490 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4491 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4492 image_create_info.usage =
4493 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4494 // Note: Some implementations expect color attachment usage for any
4495 // multisample surface
4496 image_create_info.flags = 0;
4497 srcImage.init(&image_create_info);
4498 ASSERT_TRUE(srcImage.initialized());
4499
4500 // Note: Some implementations expect color attachment usage for any
4501 // multisample surface
4502 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4503 dstImage.init(&image_create_info);
4504 ASSERT_TRUE(dstImage.initialized());
4505
4506 m_commandBuffer->begin();
4507 // source image must have valid contents before resolve
4508 VkClearColorValue clear_color = {{0, 0, 0, 0}};
4509 VkImageSubresourceRange subresource = {};
4510 subresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4511 subresource.layerCount = 1;
4512 subresource.levelCount = 1;
4513 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4514 m_commandBuffer->ClearColorImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, &clear_color, 1, &subresource);
4515 srcImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
4516 dstImage.SetLayout(m_commandBuffer, VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
4517
4518 VkImageResolve resolveRegion;
4519 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4520 resolveRegion.srcSubresource.mipLevel = 0;
4521 resolveRegion.srcSubresource.baseArrayLayer = 0;
4522 resolveRegion.srcSubresource.layerCount = 1;
4523 resolveRegion.srcOffset.x = 0;
4524 resolveRegion.srcOffset.y = 0;
4525 resolveRegion.srcOffset.z = 0;
4526 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4527 resolveRegion.dstSubresource.mipLevel = 0;
4528 resolveRegion.dstSubresource.baseArrayLayer = 0;
4529 resolveRegion.dstSubresource.layerCount = 1;
4530 resolveRegion.dstOffset.x = 0;
4531 resolveRegion.dstOffset.y = 0;
4532 resolveRegion.dstOffset.z = 0;
4533 resolveRegion.extent.width = 1;
4534 resolveRegion.extent.height = 1;
4535 resolveRegion.extent.depth = 1;
4536 // invalid source mip level
4537 resolveRegion.srcSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004538 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01709");
unknown088160a2019-05-23 17:43:13 -06004539 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4540 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4541 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004542
4543 // Equivalent test using KHR_copy_commands2
4544 if (copy_commands2 && vkCmdResolveImage2Function) {
4545 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4546 NULL,
4547 resolveRegion.srcSubresource,
4548 resolveRegion.srcOffset,
4549 resolveRegion.dstSubresource,
4550 resolveRegion.dstOffset,
4551 resolveRegion.extent};
4552 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4553 NULL,
4554 srcImage.image(),
4555 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4556 dstImage.image(),
4557 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4558 1,
4559 &resolveRegion2};
4560 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01709");
4561 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4562 m_errorMonitor->VerifyFound();
4563 }
4564
unknown088160a2019-05-23 17:43:13 -06004565 resolveRegion.srcSubresource.mipLevel = 0;
4566 // invalid dest mip level
4567 resolveRegion.dstSubresource.mipLevel = image_create_info.mipLevels;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004568 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01710");
unknown088160a2019-05-23 17:43:13 -06004569 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4570 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4571 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004572
4573 // Equivalent test using KHR_copy_commands2
4574 if (copy_commands2 && vkCmdResolveImage2Function) {
4575 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4576 NULL,
4577 resolveRegion.srcSubresource,
4578 resolveRegion.srcOffset,
4579 resolveRegion.dstSubresource,
4580 resolveRegion.dstOffset,
4581 resolveRegion.extent};
4582 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4583 NULL,
4584 srcImage.image(),
4585 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4586 dstImage.image(),
4587 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4588 1,
4589 &resolveRegion2};
4590 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01710");
4591 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4592 m_errorMonitor->VerifyFound();
4593 }
4594
unknown088160a2019-05-23 17:43:13 -06004595 resolveRegion.dstSubresource.mipLevel = 0;
4596 // invalid source array layer range
4597 resolveRegion.srcSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004598 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcSubresource-01711");
unknown088160a2019-05-23 17:43:13 -06004599 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4600 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4601 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004602
4603 // Equivalent test using KHR_copy_commands2
4604 if (copy_commands2 && vkCmdResolveImage2Function) {
4605 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4606 NULL,
4607 resolveRegion.srcSubresource,
4608 resolveRegion.srcOffset,
4609 resolveRegion.dstSubresource,
4610 resolveRegion.dstOffset,
4611 resolveRegion.extent};
4612 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4613 NULL,
4614 srcImage.image(),
4615 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4616 dstImage.image(),
4617 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4618 1,
4619 &resolveRegion2};
4620 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-srcSubresource-01711");
4621 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4622 m_errorMonitor->VerifyFound();
4623 }
4624
unknown088160a2019-05-23 17:43:13 -06004625 resolveRegion.srcSubresource.baseArrayLayer = 0;
4626 // invalid dest array layer range
4627 resolveRegion.dstSubresource.baseArrayLayer = image_create_info.arrayLayers;
Mark Lobodzinski20310782020-02-28 14:25:17 -07004628 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstSubresource-01712");
unknown088160a2019-05-23 17:43:13 -06004629 m_commandBuffer->ResolveImage(srcImage.image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, dstImage.image(),
4630 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &resolveRegion);
4631 m_errorMonitor->VerifyFound();
Jeff Leger465acf52020-10-12 18:07:16 -04004632
4633 // Equivalent test using KHR_copy_commands2
4634 if (copy_commands2 && vkCmdResolveImage2Function) {
4635 const VkImageResolve2KHR resolveRegion2 = {VK_STRUCTURE_TYPE_IMAGE_RESOLVE_2_KHR,
4636 NULL,
4637 resolveRegion.srcSubresource,
4638 resolveRegion.srcOffset,
4639 resolveRegion.dstSubresource,
4640 resolveRegion.dstOffset,
4641 resolveRegion.extent};
4642 const VkResolveImageInfo2KHR resolve_image_info2 = {VK_STRUCTURE_TYPE_RESOLVE_IMAGE_INFO_2_KHR,
4643 NULL,
4644 srcImage.image(),
4645 VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
4646 dstImage.image(),
4647 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4648 1,
4649 &resolveRegion2};
4650 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkResolveImageInfo2KHR-dstSubresource-01712");
4651 vkCmdResolveImage2Function(m_commandBuffer->handle(), &resolve_image_info2);
4652 m_errorMonitor->VerifyFound();
4653 }
4654
unknown088160a2019-05-23 17:43:13 -06004655 resolveRegion.dstSubresource.baseArrayLayer = 0;
4656
4657 m_commandBuffer->end();
4658}
4659
sfricke-samsungf78d0592020-06-11 21:34:44 -07004660TEST_F(VkLayerTest, ResolveImageImageType) {
4661 ASSERT_NO_FATAL_FAILURE(Init());
4662 // Create images of different types and try to resolve between them
4663 VkImageObj srcImage2D(m_device);
4664 VkImageObj dstImage1D(m_device);
4665 VkImageObj dstImage3D(m_device);
4666
4667 VkImageCreateInfo image_create_info = {};
4668 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4669 image_create_info.pNext = NULL;
4670 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4671 image_create_info.extent.width = 32;
4672 image_create_info.extent.height = 1;
4673 image_create_info.extent.depth = 1;
4674 image_create_info.mipLevels = 1;
4675 image_create_info.arrayLayers = 4; // more than 1 to not trip other validation
4676 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
4677 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4678 image_create_info.usage =
4679 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4680 // Note: Some implementations expect color attachment usage for any
4681 // multisample surface
4682 image_create_info.flags = 0;
4683
4684 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4685 srcImage2D.init(&image_create_info);
4686 ASSERT_TRUE(srcImage2D.initialized());
4687
4688 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4689 image_create_info.imageType = VK_IMAGE_TYPE_1D;
4690 dstImage1D.init(&image_create_info);
4691 ASSERT_TRUE(dstImage1D.initialized());
4692
4693 image_create_info.imageType = VK_IMAGE_TYPE_3D;
4694 image_create_info.extent.height = 16;
4695 image_create_info.extent.depth = 16;
4696 image_create_info.arrayLayers = 1;
4697 dstImage3D.init(&image_create_info);
4698 ASSERT_TRUE(dstImage3D.initialized());
4699
4700 m_commandBuffer->begin();
4701
4702 VkImageResolve resolveRegion;
4703 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4704 resolveRegion.srcSubresource.mipLevel = 0;
4705 resolveRegion.srcSubresource.baseArrayLayer = 0;
4706 resolveRegion.srcSubresource.layerCount = 1;
4707 resolveRegion.srcOffset.x = 0;
4708 resolveRegion.srcOffset.y = 0;
4709 resolveRegion.srcOffset.z = 0;
4710 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4711 resolveRegion.dstSubresource.mipLevel = 0;
4712 resolveRegion.dstSubresource.baseArrayLayer = 0;
4713 resolveRegion.dstSubresource.layerCount = 1;
4714 resolveRegion.dstOffset.x = 0;
4715 resolveRegion.dstOffset.y = 0;
4716 resolveRegion.dstOffset.z = 0;
4717 resolveRegion.extent.width = 1;
4718 resolveRegion.extent.height = 1;
4719 resolveRegion.extent.depth = 1;
4720
4721 // non-zero value baseArrayLayer
4722 resolveRegion.srcSubresource.baseArrayLayer = 2;
Shannon McPherson74b341c2020-09-08 15:43:05 -06004723 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-04446");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004724 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage3D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4725 &resolveRegion);
4726 m_errorMonitor->VerifyFound();
4727 resolveRegion.srcSubresource.baseArrayLayer = 0;
4728
4729 // Set height with 1D dstImage
4730 resolveRegion.extent.height = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004731 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00276");
sfricke-samsungdfeb3172020-07-25 21:17:07 -07004732 // Also exceed height of both images
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004733 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
4734 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004735 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4736 &resolveRegion);
4737 m_errorMonitor->VerifyFound();
4738 resolveRegion.extent.height = 1;
4739
4740 // Set depth with 1D dstImage and 2D srcImage
4741 resolveRegion.extent.depth = 2;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004742 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278");
4743 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273");
sfricke-samsungf78d0592020-06-11 21:34:44 -07004744 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage1D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4745 &resolveRegion);
4746 m_errorMonitor->VerifyFound();
4747 resolveRegion.extent.depth = 1;
4748
4749 m_commandBuffer->end();
4750}
4751
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004752TEST_F(VkLayerTest, ResolveImageSizeExceeded) {
4753 TEST_DESCRIPTION("Resolve Image with subresource region greater than size of src/dst image");
4754 ASSERT_NO_FATAL_FAILURE(Init());
4755
4756 VkImageObj srcImage2D(m_device);
4757 VkImageObj dstImage2D(m_device);
4758
4759 VkImageCreateInfo image_create_info = {};
4760 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4761 image_create_info.pNext = NULL;
4762 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
4763 image_create_info.extent.width = 32;
4764 image_create_info.extent.height = 32;
4765 image_create_info.extent.depth = 1;
4766 image_create_info.mipLevels = 6; // full chain from 32x32 to 1x1
4767 image_create_info.arrayLayers = 1;
4768 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
4769 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4770 image_create_info.usage =
4771 VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
4772 // Note: Some implementations expect color attachment usage for any
4773 // multisample surface
4774 image_create_info.flags = 0;
4775
4776 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4777 srcImage2D.init(&image_create_info);
4778 ASSERT_TRUE(srcImage2D.initialized());
4779
4780 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4781 dstImage2D.init(&image_create_info);
4782 ASSERT_TRUE(dstImage2D.initialized());
4783
4784 m_commandBuffer->begin();
4785
4786 VkImageResolve resolveRegion = {};
4787 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4788 resolveRegion.srcSubresource.mipLevel = 0;
4789 resolveRegion.srcSubresource.baseArrayLayer = 0;
4790 resolveRegion.srcSubresource.layerCount = 1;
4791 resolveRegion.srcOffset.x = 0;
4792 resolveRegion.srcOffset.y = 0;
4793 resolveRegion.srcOffset.z = 0;
4794 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4795 resolveRegion.dstSubresource.mipLevel = 0;
4796 resolveRegion.dstSubresource.baseArrayLayer = 0;
4797 resolveRegion.dstSubresource.layerCount = 1;
4798 resolveRegion.dstOffset.x = 0;
4799 resolveRegion.dstOffset.y = 0;
4800 resolveRegion.dstOffset.z = 0;
4801 resolveRegion.extent.width = 32;
4802 resolveRegion.extent.height = 32;
4803 resolveRegion.extent.depth = 1;
4804
4805 m_errorMonitor->ExpectSuccess();
4806 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4807 &resolveRegion);
4808 m_errorMonitor->VerifyNotFound();
4809
4810 // srcImage exceeded in x-dim
4811 resolveRegion.srcOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004812 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00269");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004813 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4814 &resolveRegion);
4815 m_errorMonitor->VerifyFound();
4816 resolveRegion.srcOffset.x = 0;
4817
4818 // dstImage exceeded in x-dim
4819 resolveRegion.dstOffset.x = 4;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004820 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00274");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004821 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4822 &resolveRegion);
4823 m_errorMonitor->VerifyFound();
4824 resolveRegion.dstOffset.x = 0;
4825
4826 // both image exceeded in y-dim because mipLevel 3 is a 4x4 size image
4827 resolveRegion.extent = {4, 8, 1};
4828 resolveRegion.srcSubresource.mipLevel = 3;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004829 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00270");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004830 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4831 &resolveRegion);
4832 m_errorMonitor->VerifyFound();
4833 resolveRegion.srcSubresource.mipLevel = 0;
4834
4835 resolveRegion.dstSubresource.mipLevel = 3;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004836 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00275");
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004837 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4838 &resolveRegion);
4839 m_errorMonitor->VerifyFound();
4840 resolveRegion.dstSubresource.mipLevel = 0;
4841
4842 // srcImage exceeded in z-dim
4843 resolveRegion.srcOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004844 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcOffset-00272");
4845 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-srcImage-00273"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004846 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4847 &resolveRegion);
4848 m_errorMonitor->VerifyFound();
4849 resolveRegion.srcOffset.z = 0;
4850
4851 // dstImage exceeded in z-dim
4852 resolveRegion.dstOffset.z = 1;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06004853 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstOffset-00277");
4854 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResolveImage-dstImage-00278"); // because it's a 2d image
sfricke-samsungc967a2d2020-07-25 21:17:16 -07004855 m_commandBuffer->ResolveImage(srcImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, dstImage2D.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
4856 &resolveRegion);
4857 m_errorMonitor->VerifyFound();
4858 resolveRegion.dstOffset.z = 0;
4859
4860 m_commandBuffer->end();
4861}
4862
unknown088160a2019-05-23 17:43:13 -06004863TEST_F(VkLayerTest, ClearImageErrors) {
4864 TEST_DESCRIPTION("Call ClearColorImage w/ a depth|stencil image and ClearDepthStencilImage with a color image.");
4865
4866 ASSERT_NO_FATAL_FAILURE(Init());
4867 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4868
4869 m_commandBuffer->begin();
4870
4871 // Color image
4872 VkClearColorValue clear_color;
4873 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
4874 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
4875 const int32_t img_width = 32;
4876 const int32_t img_height = 32;
4877 VkImageCreateInfo image_create_info = {};
4878 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4879 image_create_info.pNext = NULL;
4880 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4881 image_create_info.format = color_format;
4882 image_create_info.extent.width = img_width;
4883 image_create_info.extent.height = img_height;
4884 image_create_info.extent.depth = 1;
4885 image_create_info.mipLevels = 1;
4886 image_create_info.arrayLayers = 1;
4887 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4888 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4889
4890 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
4891 vk_testing::Image color_image_no_transfer;
4892 color_image_no_transfer.init(*m_device, image_create_info);
4893
4894 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4895 vk_testing::Image color_image;
4896 color_image.init(*m_device, image_create_info);
4897
4898 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
4899
4900 // Depth/Stencil image
4901 VkClearDepthStencilValue clear_value = {0};
4902 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
4903 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
4904 ds_image_create_info.format = VK_FORMAT_D16_UNORM;
4905 ds_image_create_info.extent.width = 64;
4906 ds_image_create_info.extent.height = 64;
4907 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
4908 ds_image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
4909
4910 vk_testing::Image ds_image;
4911 ds_image.init(*m_device, ds_image_create_info);
4912
4913 const VkImageSubresourceRange ds_range = vk_testing::Image::subresource_range(ds_image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
4914
sfricke-samsungcd924d92020-05-20 23:51:17 -07004915 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00007");
unknown088160a2019-05-23 17:43:13 -06004916
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004917 vk::CmdClearColorImage(m_commandBuffer->handle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &color_range);
unknown088160a2019-05-23 17:43:13 -06004918
4919 m_errorMonitor->VerifyFound();
4920
sfricke-samsungcd924d92020-05-20 23:51:17 -07004921 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-image-00002");
unknown088160a2019-05-23 17:43:13 -06004922
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004923 vk::CmdClearColorImage(m_commandBuffer->handle(), color_image_no_transfer.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
4924 &color_range);
unknown088160a2019-05-23 17:43:13 -06004925
4926 m_errorMonitor->VerifyFound();
4927
4928 // Call CmdClearDepthStencilImage with color image
sfricke-samsungcd924d92020-05-20 23:51:17 -07004929 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-00014");
sfricke-samsung30e325a2020-07-25 12:56:13 -07004930 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearDepthStencilImage-image-02826");
unknown088160a2019-05-23 17:43:13 -06004931
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06004932 vk::CmdClearDepthStencilImage(m_commandBuffer->handle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
4933 &clear_value, 1, &ds_range);
unknown088160a2019-05-23 17:43:13 -06004934
4935 m_errorMonitor->VerifyFound();
4936}
4937
4938TEST_F(VkLayerTest, CommandQueueFlags) {
4939 TEST_DESCRIPTION(
4940 "Allocate a command buffer on a queue that does not support graphics and try to issue a graphics-only command");
4941
4942 ASSERT_NO_FATAL_FAILURE(Init());
4943
4944 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4945 if (queueFamilyIndex == UINT32_MAX) {
4946 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4947 return;
4948 } else {
4949 // Create command pool on a non-graphics queue
4950 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
4951
4952 // Setup command buffer on pool
4953 VkCommandBufferObj command_buffer(m_device, &command_pool);
4954 command_buffer.begin();
4955
4956 // Issue a graphics only command
Mark Lobodzinski20310782020-02-28 14:25:17 -07004957 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06004958 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4959 command_buffer.SetViewport(0, 1, &viewport);
4960 m_errorMonitor->VerifyFound();
4961 }
4962}
4963
sfricke-samsung674ba102020-08-18 22:38:49 -07004964TEST_F(VkLayerTest, DepthStencilImageCopyNoGraphicsQueueFlags) {
4965 TEST_DESCRIPTION(
4966 "Allocate a command buffer on a queue that does not support graphics and try to issue a depth/stencil image copy to "
4967 "buffer");
4968
4969 ASSERT_NO_FATAL_FAILURE(Init());
4970
4971 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
4972 if (queueFamilyIndex == UINT32_MAX) {
4973 printf("%s Non-graphics queue family not found; skipped.\n", kSkipPrefix);
4974 return;
4975 } else {
4976 // Create Depth image
4977 const VkFormat ds_format = FindSupportedDepthOnlyFormat(gpu());
4978 if (ds_format == VK_FORMAT_UNDEFINED) {
4979 printf("%s No only Depth format found. Skipped.\n", kSkipPrefix);
4980 return;
4981 }
4982
4983 VkImageObj ds_image(m_device);
4984 ds_image.Init(64, 64, 1, ds_format, VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
4985 VK_IMAGE_TILING_OPTIMAL, 0);
4986 ASSERT_TRUE(ds_image.initialized());
4987
4988 // Allocate buffers
4989 VkBufferObj buffer;
4990 VkMemoryPropertyFlags reqs = 0;
4991 buffer.init_as_src_and_dst(*m_device, 262144, reqs); // 256k to have more then enough to copy
4992
4993 VkBufferImageCopy region = {};
4994 region.bufferRowLength = 0;
4995 region.bufferImageHeight = 0;
4996 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
4997 region.imageSubresource.layerCount = 1;
4998 region.imageOffset = {0, 0, 0};
4999 region.imageExtent = {64, 64, 1};
5000 region.bufferOffset = 0;
5001
5002 // Create command pool on a non-graphics queue
5003 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
5004
5005 // Setup command buffer on pool
5006 VkCommandBufferObj command_buffer(m_device, &command_pool);
5007 command_buffer.begin();
5008
sfricke-samsungea4fd142020-10-17 23:51:59 -07005009 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-04477");
sfricke-samsung674ba102020-08-18 22:38:49 -07005010 vk::CmdCopyBufferToImage(command_buffer.handle(), buffer.handle(), ds_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
5011 1, &region);
5012 m_errorMonitor->VerifyFound();
5013 }
5014}
5015
sfricke-samsungcb467672020-11-25 00:09:28 -08005016TEST_F(VkLayerTest, ExecuteDiffertQueueFlagsSecondaryCB) {
5017 TEST_DESCRIPTION("Allocate a command buffer from two different queues and try to use a secondary command buffer");
5018
5019 ASSERT_NO_FATAL_FAILURE(Init());
5020
5021 if (m_device->queue_props.size() < 2) {
5022 printf("%s Need 2 different queues for testing skipping.\n", kSkipPrefix);
5023 return;
5024 }
5025
5026 // First two queue families
5027 uint32_t queue_index_A = 0;
5028 uint32_t queue_index_B = 1;
5029
5030 VkCommandPoolCreateInfo pool_create_info = {};
5031 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
5032 pool_create_info.pNext = nullptr;
5033 pool_create_info.flags = 0;
5034
5035 VkCommandPool command_pool_A;
5036 pool_create_info.queueFamilyIndex = queue_index_A;
5037 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_A);
5038
5039 VkCommandPool command_pool_B;
5040 pool_create_info.queueFamilyIndex = queue_index_B;
5041 vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_B);
5042
5043 VkCommandBuffer command_buffer[2]; // [0] primary and [1] secondary
5044 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
5045 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5046 command_buffer_allocate_info.commandBufferCount = 1;
5047 command_buffer_allocate_info.commandPool = command_pool_A;
5048 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
5049 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[0]);
5050
5051 command_buffer_allocate_info.commandPool = command_pool_B;
5052 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5053 vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer[1]);
5054
5055 VkCommandBufferBeginInfo begin_info = {};
5056 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5057
5058 // secondary
5059 vk::BeginCommandBuffer(command_buffer[1], &begin_info);
5060 vk::EndCommandBuffer(command_buffer[1]);
5061
5062 // Try using different pool's command buffer as secondary
5063 vk::BeginCommandBuffer(command_buffer[0], &begin_info);
5064 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00094");
5065 vk::CmdExecuteCommands(command_buffer[0], 1, &command_buffer[1]);
5066 m_errorMonitor->VerifyFound();
5067 vk::EndCommandBuffer(command_buffer[0]);
5068
5069 vk::DestroyCommandPool(m_device->device(), command_pool_A, NULL);
5070 vk::DestroyCommandPool(m_device->device(), command_pool_B, NULL);
5071}
5072
unknown088160a2019-05-23 17:43:13 -06005073TEST_F(VkLayerTest, ExecuteUnrecordedSecondaryCB) {
5074 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB in the initial state");
5075 ASSERT_NO_FATAL_FAILURE(Init());
5076 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5077 // never record secondary
5078
Mark Lobodzinski20310782020-02-28 14:25:17 -07005079 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00089");
unknown088160a2019-05-23 17:43:13 -06005080 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005081 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005082 m_errorMonitor->VerifyFound();
5083 m_commandBuffer->end();
5084}
5085
5086TEST_F(VkLayerTest, ExecuteSecondaryCBWithLayoutMismatch) {
5087 TEST_DESCRIPTION("Attempt vkCmdExecuteCommands with a CB with incorrect initial layout.");
5088
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005089 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005090 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
5091
5092 VkImageCreateInfo image_create_info = {};
5093 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5094 image_create_info.pNext = NULL;
5095 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5096 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
5097 image_create_info.extent.width = 32;
5098 image_create_info.extent.height = 1;
5099 image_create_info.extent.depth = 1;
5100 image_create_info.mipLevels = 1;
5101 image_create_info.arrayLayers = 1;
5102 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5103 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5104 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
5105 image_create_info.flags = 0;
5106
5107 VkImageSubresource image_sub = VkImageObj::subresource(VK_IMAGE_ASPECT_COLOR_BIT, 0, 0);
5108 VkImageSubresourceRange image_sub_range = VkImageObj::subresource_range(image_sub);
5109
5110 VkImageObj image(m_device);
5111 image.init(&image_create_info);
5112 ASSERT_TRUE(image.initialized());
5113 VkImageMemoryBarrier image_barrier =
5114 image.image_memory_barrier(0, 0, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_GENERAL, image_sub_range);
5115
5116 auto pipeline = [&image_barrier](const VkCommandBufferObj &cb, VkImageLayout old_layout, VkImageLayout new_layout) {
5117 image_barrier.oldLayout = old_layout;
5118 image_barrier.newLayout = new_layout;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005119 vk::CmdPipelineBarrier(cb.handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr,
5120 0, nullptr, 1, &image_barrier);
unknown088160a2019-05-23 17:43:13 -06005121 };
5122
5123 // Validate that mismatched use of image layout in secondary command buffer is caught at record time
5124 VkCommandBufferObj secondary(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5125 secondary.begin();
5126 pipeline(secondary, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5127 secondary.end();
5128
Mark Lobodzinski20310782020-02-28 14:25:17 -07005129 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdExecuteCommands-commandBuffer-00001");
unknown088160a2019-05-23 17:43:13 -06005130 m_commandBuffer->begin();
5131 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005132 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005133 m_errorMonitor->VerifyFound();
5134
unknown088160a2019-05-23 17:43:13 -06005135 m_commandBuffer->reset();
5136 secondary.reset();
5137
5138 // Validate that UNDEFINED doesn't false positive on us
5139 secondary.begin();
5140 pipeline(secondary, VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5141 secondary.end();
5142 m_commandBuffer->begin();
5143 pipeline(*m_commandBuffer, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL);
5144 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005145 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary.handle());
unknown088160a2019-05-23 17:43:13 -06005146 m_errorMonitor->VerifyNotFound();
5147 m_commandBuffer->end();
5148}
5149
5150TEST_F(VkLayerTest, SetDynViewportParamTests) {
5151 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport without multiViewport feature");
5152
5153 SetTargetApiVersion(VK_API_VERSION_1_1);
5154 VkPhysicalDeviceFeatures features{};
5155 ASSERT_NO_FATAL_FAILURE(Init(&features));
5156
5157 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5158 const VkViewport viewports[] = {vp, vp};
5159
5160 m_commandBuffer->begin();
5161
5162 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005163 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005164 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 1, viewports);
unknown088160a2019-05-23 17:43:13 -06005165 m_errorMonitor->VerifyFound();
5166
Mark Lobodzinski20310782020-02-28 14:25:17 -07005167 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005168 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005169 m_errorMonitor->VerifyFound();
5170
Mark Lobodzinski20310782020-02-28 14:25:17 -07005171 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005172 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005173 m_errorMonitor->VerifyFound();
5174
Mark Lobodzinski20310782020-02-28 14:25:17 -07005175 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01224");
5176 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-01225");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005177 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 2, viewports);
unknown088160a2019-05-23 17:43:13 -06005178 m_errorMonitor->VerifyFound();
5179
Mark Lobodzinski20310782020-02-28 14:25:17 -07005180 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005181 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005182 m_errorMonitor->VerifyFound();
5183
5184 // core viewport tests
5185 using std::vector;
5186 struct TestCase {
5187 VkViewport vp;
5188 std::string veid;
5189 };
5190
5191 // not necessarily boundary values (unspecified cast rounding), but guaranteed to be over limit
5192 const auto one_past_max_w = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[0]));
5193 const auto one_past_max_h = NearestGreater(static_cast<float>(m_device->props.limits.maxViewportDimensions[1]));
5194
5195 const auto min_bound = m_device->props.limits.viewportBoundsRange[0];
5196 const auto max_bound = m_device->props.limits.viewportBoundsRange[1];
5197 const auto one_before_min_bounds = NearestSmaller(min_bound);
5198 const auto one_past_max_bounds = NearestGreater(max_bound);
5199
5200 const auto below_zero = NearestSmaller(0.0f);
5201 const auto past_one = NearestGreater(1.0f);
5202
5203 vector<TestCase> test_cases = {
5204 {{0.0, 0.0, 0.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5205 {{0.0, 0.0, one_past_max_w, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01771"},
5206 {{0.0, 0.0, NAN, 64.0, 0.0, 1.0}, "VUID-VkViewport-width-01770"},
5207 {{0.0, 0.0, 64.0, one_past_max_h, 0.0, 1.0}, "VUID-VkViewport-height-01773"},
5208 {{one_before_min_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5209 {{one_past_max_bounds, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5210 {{NAN, 0.0, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01774"},
5211 {{0.0, one_before_min_bounds, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5212 {{0.0, NAN, 64.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-y-01775"},
5213 {{max_bound, 0.0, 1.0, 64.0, 0.0, 1.0}, "VUID-VkViewport-x-01232"},
5214 {{0.0, max_bound, 64.0, 1.0, 0.0, 1.0}, "VUID-VkViewport-y-01233"},
5215 {{0.0, 0.0, 64.0, 64.0, below_zero, 1.0}, "VUID-VkViewport-minDepth-01234"},
5216 {{0.0, 0.0, 64.0, 64.0, past_one, 1.0}, "VUID-VkViewport-minDepth-01234"},
5217 {{0.0, 0.0, 64.0, 64.0, NAN, 1.0}, "VUID-VkViewport-minDepth-01234"},
5218 {{0.0, 0.0, 64.0, 64.0, 0.0, below_zero}, "VUID-VkViewport-maxDepth-01235"},
5219 {{0.0, 0.0, 64.0, 64.0, 0.0, past_one}, "VUID-VkViewport-maxDepth-01235"},
5220 {{0.0, 0.0, 64.0, 64.0, 0.0, NAN}, "VUID-VkViewport-maxDepth-01235"},
5221 };
5222
5223 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
5224 test_cases.push_back({{0.0, 0.0, 64.0, 0.0, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5225 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01772"});
5226 } else {
5227 test_cases.push_back({{0.0, 0.0, 64.0, NAN, 0.0, 1.0}, "VUID-VkViewport-height-01773"});
5228 }
5229
5230 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005231 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.veid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005232 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &test_case.vp);
unknown088160a2019-05-23 17:43:13 -06005233 m_errorMonitor->VerifyFound();
5234 }
5235}
5236
5237TEST_F(VkLayerTest, SetDynViewportParamMaintenance1Tests) {
5238 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport with a negative viewport extension enabled.");
5239
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005240 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005241
5242 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME)) {
5243 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
5244 } else {
5245 printf("%s VK_KHR_maintenance1 extension not supported -- skipping test\n", kSkipPrefix);
5246 return;
5247 }
5248 ASSERT_NO_FATAL_FAILURE(InitState());
5249
5250 NegHeightViewportTests(m_device, m_commandBuffer, m_errorMonitor);
5251}
5252
5253TEST_F(VkLayerTest, SetDynViewportParamMultiviewportTests) {
5254 TEST_DESCRIPTION("Test parameters of vkCmdSetViewport with multiViewport feature enabled");
5255
5256 ASSERT_NO_FATAL_FAILURE(Init());
5257
5258 if (!m_device->phy().features().multiViewport) {
5259 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5260 return;
5261 }
5262
unknown088160a2019-05-23 17:43:13 -06005263 m_commandBuffer->begin();
5264
Mark Lobodzinski20310782020-02-28 14:25:17 -07005265 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005266 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005267 m_errorMonitor->VerifyFound();
5268
Petr Kraus14e49492019-09-09 20:13:29 +02005269 const auto max_viewports = m_device->props.limits.maxViewports;
5270
Mark Lobodzinski20310782020-02-28 14:25:17 -07005271 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-pViewports-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005272 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports, nullptr);
unknown088160a2019-05-23 17:43:13 -06005273 m_errorMonitor->VerifyFound();
5274
Petr Kraus14e49492019-09-09 20:13:29 +02005275 const uint32_t too_big_max_viewports = 65536 + 1; // let's say this is too much to allocate
5276 if (max_viewports >= too_big_max_viewports) {
5277 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5278 kSkipPrefix);
5279 } else {
5280 const VkViewport vp = {0.0, 0.0, 64.0, 64.0, 0.0, 1.0};
5281 const std::vector<VkViewport> viewports(max_viewports + 1, vp);
5282
Mark Lobodzinski20310782020-02-28 14:25:17 -07005283 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005284 vk::CmdSetViewport(m_commandBuffer->handle(), 0, max_viewports + 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005285 m_errorMonitor->VerifyFound();
5286
Mark Lobodzinski20310782020-02-28 14:25:17 -07005287 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005288 vk::CmdSetViewport(m_commandBuffer->handle(), max_viewports, 1, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005289 m_errorMonitor->VerifyFound();
5290
Mark Lobodzinski20310782020-02-28 14:25:17 -07005291 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-firstViewport-01223");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005292 vk::CmdSetViewport(m_commandBuffer->handle(), 1, max_viewports, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005293 m_errorMonitor->VerifyFound();
5294
Mark Lobodzinski20310782020-02-28 14:25:17 -07005295 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewport-viewportCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005296 vk::CmdSetViewport(m_commandBuffer->handle(), 1, 0, viewports.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005297 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005298 }
unknown088160a2019-05-23 17:43:13 -06005299}
5300
5301TEST_F(VkLayerTest, BadRenderPassScopeSecondaryCmdBuffer) {
5302 TEST_DESCRIPTION(
5303 "Test secondary buffers executed in wrong render pass scope wrt VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT");
5304
5305 ASSERT_NO_FATAL_FAILURE(Init());
5306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5307
5308 VkCommandBufferObj sec_cmdbuff_inside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5309 VkCommandBufferObj sec_cmdbuff_outside_rp(m_device, m_commandPool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
5310
5311 const VkCommandBufferInheritanceInfo cmdbuff_ii = {
5312 VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO,
5313 nullptr, // pNext
5314 m_renderPass,
5315 0, // subpass
5316 m_framebuffer,
5317 };
5318 const VkCommandBufferBeginInfo cmdbuff_bi_tmpl = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO,
5319 nullptr, // pNext
5320 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT, &cmdbuff_ii};
5321
5322 VkCommandBufferBeginInfo cmdbuff_inside_rp_bi = cmdbuff_bi_tmpl;
5323 cmdbuff_inside_rp_bi.flags |= VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5324 sec_cmdbuff_inside_rp.begin(&cmdbuff_inside_rp_bi);
5325 sec_cmdbuff_inside_rp.end();
5326
5327 VkCommandBufferBeginInfo cmdbuff_outside_rp_bi = cmdbuff_bi_tmpl;
5328 cmdbuff_outside_rp_bi.flags &= ~VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5329 sec_cmdbuff_outside_rp.begin(&cmdbuff_outside_rp_bi);
5330 sec_cmdbuff_outside_rp.end();
5331
5332 m_commandBuffer->begin();
5333
Mark Lobodzinski20310782020-02-28 14:25:17 -07005334 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00100");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005335 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_inside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005336 m_errorMonitor->VerifyFound();
5337
5338 const VkRenderPassBeginInfo rp_bi{VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
5339 nullptr, // pNext
5340 m_renderPass,
5341 m_framebuffer,
5342 {{0, 0}, {32, 32}},
5343 static_cast<uint32_t>(m_renderPassClearValues.size()),
5344 m_renderPassClearValues.data()};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005345 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &rp_bi, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005346
Mark Lobodzinski20310782020-02-28 14:25:17 -07005347 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdExecuteCommands-pCommandBuffers-00096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005348 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &sec_cmdbuff_outside_rp.handle());
unknown088160a2019-05-23 17:43:13 -06005349 m_errorMonitor->VerifyFound();
5350}
5351
5352TEST_F(VkLayerTest, SecondaryCommandBufferClearColorAttachmentsRenderArea) {
5353 TEST_DESCRIPTION(
5354 "Create a secondary command buffer with CmdClearAttachments call that has a rect outside of renderPass renderArea");
5355 ASSERT_NO_FATAL_FAILURE(Init());
5356 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5357
5358 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
5359 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
5360 command_buffer_allocate_info.commandPool = m_commandPool->handle();
5361 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
5362 command_buffer_allocate_info.commandBufferCount = 1;
5363
5364 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005365 ASSERT_VK_SUCCESS(vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
unknown088160a2019-05-23 17:43:13 -06005366 VkCommandBufferBeginInfo command_buffer_begin_info = {};
5367 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
5368 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
5369 command_buffer_inheritance_info.renderPass = m_renderPass;
5370 command_buffer_inheritance_info.framebuffer = m_framebuffer;
5371
5372 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5373 command_buffer_begin_info.flags =
5374 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
5375 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
5376
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005377 vk::BeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
unknown088160a2019-05-23 17:43:13 -06005378 VkClearAttachment color_attachment;
5379 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5380 color_attachment.clearValue.color.float32[0] = 0;
5381 color_attachment.clearValue.color.float32[1] = 0;
5382 color_attachment.clearValue.color.float32[2] = 0;
5383 color_attachment.clearValue.color.float32[3] = 0;
5384 color_attachment.colorAttachment = 0;
5385 // x extent of 257 exceeds render area of 256
Mark Lobodzinski62490892019-06-28 09:58:27 -06005386 VkClearRect clear_rect = {{{0, 0}, {257, 32}}, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005387 vk::CmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
5388 vk::EndCommandBuffer(secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005389 m_commandBuffer->begin();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005390 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
unknown088160a2019-05-23 17:43:13 -06005391
Mark Lobodzinski20310782020-02-28 14:25:17 -07005392 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-pRects-00016");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005393 vk::CmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
unknown088160a2019-05-23 17:43:13 -06005394 m_errorMonitor->VerifyFound();
5395
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005396 vk::CmdEndRenderPass(m_commandBuffer->handle());
unknown088160a2019-05-23 17:43:13 -06005397 m_commandBuffer->end();
5398}
5399
5400TEST_F(VkLayerTest, PushDescriptorSetCmdPushBadArgs) {
5401 TEST_DESCRIPTION("Attempt to push a push descriptor set with incorrect arguments.");
5402 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5403 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5404 } else {
5405 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5406 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5407 return;
5408 }
5409
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005410 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005411 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5412 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5413 } else {
5414 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5415 return;
5416 }
5417 ASSERT_NO_FATAL_FAILURE(InitState());
5418
5419 auto push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5420 if (push_descriptor_prop.maxPushDescriptors < 1) {
5421 // Some implementations report an invalid maxPushDescriptors of 0
5422 printf("%s maxPushDescriptors is zero, skipping tests\n", kSkipPrefix);
5423 return;
5424 }
5425
5426 // Create ordinary and push descriptor set layout
5427 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5428 const VkDescriptorSetLayoutObj ds_layout(m_device, {binding});
5429 ASSERT_TRUE(ds_layout.initialized());
5430 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5431 ASSERT_TRUE(push_ds_layout.initialized());
5432
5433 // Now use the descriptor set layouts to create a pipeline layout
5434 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout, &ds_layout});
5435 ASSERT_TRUE(pipeline_layout.initialized());
5436
5437 // Create a descriptor to push
5438 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5439 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data);
5440 ASSERT_TRUE(buffer_obj.initialized());
5441
5442 // Create a "write" struct, noting that the buffer_info cannot be a temporary arg (the return from write_descriptor_set
5443 // references its data), and the DescriptorSet() can be temporary, because the value is ignored
5444 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), 0, VK_WHOLE_SIZE};
5445
5446 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5447 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5448
5449 // Find address of extension call and make the call
5450 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005451 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
unknown088160a2019-05-23 17:43:13 -06005452 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5453
5454 // Section 1: Queue family matching/capabilities.
5455 // Create command pool on a non-graphics queue
5456 const uint32_t no_gfx_qfi = m_device->QueueFamilyMatching(VK_QUEUE_COMPUTE_BIT, VK_QUEUE_GRAPHICS_BIT);
5457 const uint32_t transfer_only_qfi =
5458 m_device->QueueFamilyMatching(VK_QUEUE_TRANSFER_BIT, (VK_QUEUE_COMPUTE_BIT | VK_QUEUE_GRAPHICS_BIT));
5459 if ((UINT32_MAX == transfer_only_qfi) && (UINT32_MAX == no_gfx_qfi)) {
unknownc3033e52019-06-21 16:56:20 -06005460 printf("%s No compute or transfer only queue family, skipping bindpoint and queue tests.\n", kSkipPrefix);
unknown088160a2019-05-23 17:43:13 -06005461 } else {
5462 const uint32_t err_qfi = (UINT32_MAX == no_gfx_qfi) ? transfer_only_qfi : no_gfx_qfi;
5463
5464 VkCommandPoolObj command_pool(m_device, err_qfi);
5465 ASSERT_TRUE(command_pool.initialized());
5466 VkCommandBufferObj command_buffer(m_device, &command_pool);
5467 ASSERT_TRUE(command_buffer.initialized());
5468 command_buffer.begin();
5469
Mark Lobodzinski20310782020-02-28 14:25:17 -07005470 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5471 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005472 if (err_qfi == transfer_only_qfi) {
5473 // This as this queue neither supports the gfx or compute bindpoints, we'll get two errors
Mark Lobodzinski20310782020-02-28 14:25:17 -07005474 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005475 }
5476 vkCmdPushDescriptorSetKHR(command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5477 &descriptor_write);
5478 m_errorMonitor->VerifyFound();
5479 command_buffer.end();
5480
5481 // If we succeed in testing only one condition above, we need to test the other below.
5482 if ((UINT32_MAX != transfer_only_qfi) && (err_qfi != transfer_only_qfi)) {
5483 // Need to test the neither compute/gfx supported case separately.
5484 VkCommandPoolObj tran_command_pool(m_device, transfer_only_qfi);
5485 ASSERT_TRUE(tran_command_pool.initialized());
5486 VkCommandBufferObj tran_command_buffer(m_device, &tran_command_pool);
5487 ASSERT_TRUE(tran_command_buffer.initialized());
5488 tran_command_buffer.begin();
5489
5490 // We can't avoid getting *both* errors in this case
Mark Lobodzinski20310782020-02-28 14:25:17 -07005491 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-pipelineBindPoint-00363");
5492 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
5493 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-commandBuffer-cmdpool");
unknown088160a2019-05-23 17:43:13 -06005494 vkCmdPushDescriptorSetKHR(tran_command_buffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5495 &descriptor_write);
5496 m_errorMonitor->VerifyFound();
5497 tran_command_buffer.end();
5498 }
5499 }
5500
5501 // Push to the non-push binding
5502 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005503 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00365");
unknown088160a2019-05-23 17:43:13 -06005504 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 1, 1,
5505 &descriptor_write);
5506 m_errorMonitor->VerifyFound();
5507
5508 // Specify set out of bounds
Mark Lobodzinski20310782020-02-28 14:25:17 -07005509 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPushDescriptorSetKHR-set-00364");
unknown088160a2019-05-23 17:43:13 -06005510 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 2, 1,
5511 &descriptor_write);
5512 m_errorMonitor->VerifyFound();
5513 m_commandBuffer->end();
5514
5515 // This is a test for VUID-vkCmdPushDescriptorSetKHR-commandBuffer-recording
5516 // TODO: Add VALIDATION_ERROR_ code support to core_validation::ValidateCmd
Mark Lobodzinski20310782020-02-28 14:25:17 -07005517 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06005518 "You must call vkBeginCommandBuffer() before this call to vkCmdPushDescriptorSetKHR()");
Mark Lobodzinski20310782020-02-28 14:25:17 -07005519 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00330");
unknown088160a2019-05-23 17:43:13 -06005520 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5521 &descriptor_write);
5522 m_errorMonitor->VerifyFound();
5523}
5524
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005525TEST_F(VkLayerTest, PushDescriptorSetCmdBufferOffsetUnaligned) {
5526 TEST_DESCRIPTION("Attempt to push a push descriptor set buffer with unaligned offset.");
5527 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5528 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5529 } else {
5530 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix,
5531 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5532 return;
5533 }
5534
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005535 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005536 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME)) {
5537 m_device_extension_names.push_back(VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5538 } else {
5539 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_PUSH_DESCRIPTOR_EXTENSION_NAME);
5540 return;
5541 }
5542 ASSERT_NO_FATAL_FAILURE(InitState());
5543
5544 auto const push_descriptor_prop = GetPushDescriptorProperties(instance(), gpu());
5545 if (push_descriptor_prop.maxPushDescriptors < 1) {
5546 // Some implementations report an invalid maxPushDescriptors of 0.
5547 printf("%s maxPushDescriptors is zero, skipping test\n", kSkipPrefix);
5548 return;
5549 }
5550
5551 auto const min_alignment = m_device->props.limits.minUniformBufferOffsetAlignment;
5552 if (min_alignment == 0) {
5553 printf("%s minUniformBufferOffsetAlignment is zero, skipping test\n", kSkipPrefix);
5554 return;
5555 }
5556
5557 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
5558 const VkDescriptorSetLayoutObj push_ds_layout(m_device, {binding}, VK_DESCRIPTOR_SET_LAYOUT_CREATE_PUSH_DESCRIPTOR_BIT_KHR);
5559 ASSERT_TRUE(push_ds_layout.initialized());
5560
5561 const VkPipelineLayoutObj pipeline_layout(m_device, {&push_ds_layout});
5562 ASSERT_TRUE(pipeline_layout.initialized());
5563
5564 const uint32_t buffer_data[4] = {4, 5, 6, 7};
5565 VkConstantBufferObj buffer_obj(m_device, sizeof(buffer_data), &buffer_data, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
5566 ASSERT_TRUE(buffer_obj.initialized());
5567
5568 // Use an invalid alignment.
5569 VkDescriptorBufferInfo buffer_info = {buffer_obj.handle(), min_alignment - 1, VK_WHOLE_SIZE};
5570 VkWriteDescriptorSet descriptor_write = vk_testing::Device::write_descriptor_set(
5571 vk_testing::DescriptorSet(), 0, 0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, &buffer_info);
5572
5573 PFN_vkCmdPushDescriptorSetKHR vkCmdPushDescriptorSetKHR =
5574 (PFN_vkCmdPushDescriptorSetKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdPushDescriptorSetKHR");
5575 ASSERT_TRUE(vkCmdPushDescriptorSetKHR != nullptr);
5576
5577 m_commandBuffer->begin();
Mark Lobodzinski20310782020-02-28 14:25:17 -07005578 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkWriteDescriptorSet-descriptorType-00327");
Jeremy Hayesf96a5162020-02-10 13:49:31 -07005579 vkCmdPushDescriptorSetKHR(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout.handle(), 0, 1,
5580 &descriptor_write);
5581 m_errorMonitor->VerifyFound();
5582
5583 m_commandBuffer->end();
5584}
5585
unknown088160a2019-05-23 17:43:13 -06005586TEST_F(VkLayerTest, SetDynScissorParamTests) {
5587 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor without multiViewport feature");
5588
5589 VkPhysicalDeviceFeatures features{};
5590 ASSERT_NO_FATAL_FAILURE(Init(&features));
5591
5592 const VkRect2D scissor = {{0, 0}, {16, 16}};
5593 const VkRect2D scissors[] = {scissor, scissor};
5594
5595 m_commandBuffer->begin();
5596
5597 // array tests
Mark Lobodzinski20310782020-02-28 14:25:17 -07005598 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005599 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 1, scissors);
unknown088160a2019-05-23 17:43:13 -06005600 m_errorMonitor->VerifyFound();
5601
Mark Lobodzinski20310782020-02-28 14:25:17 -07005602 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005603 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005604 m_errorMonitor->VerifyFound();
5605
Mark Lobodzinski20310782020-02-28 14:25:17 -07005606 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005607 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005608 m_errorMonitor->VerifyFound();
5609
Mark Lobodzinski20310782020-02-28 14:25:17 -07005610 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00593");
5611 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-00594");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005612 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 2, scissors);
unknown088160a2019-05-23 17:43:13 -06005613 m_errorMonitor->VerifyFound();
5614
Mark Lobodzinski20310782020-02-28 14:25:17 -07005615 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005616 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, nullptr);
unknown088160a2019-05-23 17:43:13 -06005617 m_errorMonitor->VerifyFound();
5618
5619 struct TestCase {
5620 VkRect2D scissor;
5621 std::string vuid;
5622 };
5623
5624 std::vector<TestCase> test_cases = {{{{-1, 0}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5625 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetScissor-x-00595"},
5626 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5627 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5628 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetScissor-offset-00596"},
5629 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetScissor-offset-00597"},
5630 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetScissor-offset-00597"},
5631 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetScissor-offset-00597"}};
5632
5633 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07005634 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005635 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
unknown088160a2019-05-23 17:43:13 -06005636 m_errorMonitor->VerifyFound();
5637 }
5638
5639 m_commandBuffer->end();
5640}
5641
5642TEST_F(VkLayerTest, SetDynScissorParamMultiviewportTests) {
5643 TEST_DESCRIPTION("Test parameters of vkCmdSetScissor with multiViewport feature enabled");
5644
5645 ASSERT_NO_FATAL_FAILURE(Init());
5646
5647 if (!m_device->phy().features().multiViewport) {
5648 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported -- skipping test.\n", kSkipPrefix);
5649 return;
5650 }
5651
unknown088160a2019-05-23 17:43:13 -06005652 m_commandBuffer->begin();
5653
Mark Lobodzinski20310782020-02-28 14:25:17 -07005654 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005655 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06005656 m_errorMonitor->VerifyFound();
5657
Petr Kraus14e49492019-09-09 20:13:29 +02005658 const auto max_scissors = m_device->props.limits.maxViewports;
5659
Mark Lobodzinski20310782020-02-28 14:25:17 -07005660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-pScissors-parameter");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005661 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors, nullptr);
unknown088160a2019-05-23 17:43:13 -06005662 m_errorMonitor->VerifyFound();
5663
Petr Kraus14e49492019-09-09 20:13:29 +02005664 const uint32_t too_big_max_scissors = 65536 + 1; // let's say this is too much to allocate
5665 if (max_scissors >= too_big_max_scissors) {
5666 printf("%s VkPhysicalDeviceLimits::maxViewports is too large to practically test against -- skipping part of test.\n",
5667 kSkipPrefix);
5668 } else {
5669 const VkRect2D scissor = {{0, 0}, {16, 16}};
5670 const std::vector<VkRect2D> scissors(max_scissors + 1, scissor);
5671
Mark Lobodzinski20310782020-02-28 14:25:17 -07005672 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005673 vk::CmdSetScissor(m_commandBuffer->handle(), 0, max_scissors + 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005674 m_errorMonitor->VerifyFound();
5675
Mark Lobodzinski20310782020-02-28 14:25:17 -07005676 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005677 vk::CmdSetScissor(m_commandBuffer->handle(), max_scissors, 1, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005678 m_errorMonitor->VerifyFound();
5679
Mark Lobodzinski20310782020-02-28 14:25:17 -07005680 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-firstScissor-00592");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005681 vk::CmdSetScissor(m_commandBuffer->handle(), 1, max_scissors, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005682 m_errorMonitor->VerifyFound();
5683
Mark Lobodzinski20310782020-02-28 14:25:17 -07005684 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetScissor-scissorCount-arraylength");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005685 vk::CmdSetScissor(m_commandBuffer->handle(), 1, 0, scissors.data());
Petr Kraus14e49492019-09-09 20:13:29 +02005686 m_errorMonitor->VerifyFound();
unknown088160a2019-05-23 17:43:13 -06005687 }
unknown088160a2019-05-23 17:43:13 -06005688}
5689
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005690TEST_F(VkLayerTest, IndirectDrawTests) {
5691 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirect and vkCmdDrawIndexedIndirect");
unknown088160a2019-05-23 17:43:13 -06005692
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005693 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5694 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5695 } else {
5696 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5697 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5698 return;
5699 }
5700 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
5701
5702 if (IsPlatform(kMockICD) || DeviceSimulation()) {
5703 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
5704 return;
5705 }
5706
5707 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
5708 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
5709 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
5710
5711 // Create a device and ensure multiDrawIndirect is disabled
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005712 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
5713 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005714 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
5715 features2.features.multiDrawIndirect = VK_FALSE;
5716
5717 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
unknown088160a2019-05-23 17:43:13 -06005718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5719
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005720 CreatePipelineHelper pipe(*this);
5721 pipe.InitInfo();
5722 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5723 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5724 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5725 dyn_state_ci.dynamicStateCount = size(dyn_states);
5726 dyn_state_ci.pDynamicStates = dyn_states;
5727 pipe.dyn_state_ci_ = dyn_state_ci;
5728 pipe.InitState();
5729 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005730
5731 m_commandBuffer->begin();
5732 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5733
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005734 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5735 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5736 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005737
5738 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005739 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005740 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005741 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005742
5743 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5744 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
5745 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005746 VkBufferObj draw_buffer;
5747 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005748
5749 // VUID-vkCmdDrawIndirect-buffer-02709
Mark Lobodzinski20310782020-02-28 14:25:17 -07005750 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-buffer-02709");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005751 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005752 m_errorMonitor->VerifyFound();
5753
Mark Lobodzinski128608f2020-11-02 13:46:57 -07005754 // VUID-vkCmdDrawIndirect-drawCount-02718
5755 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-drawCount-02718");
5756 vk::CmdDrawIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndirectCommand));
5757 m_errorMonitor->VerifyFound();
5758
5759 // VUID-vkCmdDrawIndexedIndirect-drawCount-02718
5760 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-drawCount-02718");
5761 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), draw_buffer.handle(), 0, 2, sizeof(VkDrawIndexedIndirectCommand));
5762 m_errorMonitor->VerifyFound();
5763
unknown088160a2019-05-23 17:43:13 -06005764 m_commandBuffer->EndRenderPass();
5765 m_commandBuffer->end();
unknown088160a2019-05-23 17:43:13 -06005766}
5767
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005768TEST_F(VkLayerTest, DrawIndirectByteCountEXT) {
5769 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectByteCountEXT");
5770
5771 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
5772 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5773 } else {
5774 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
5775 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
5776 return;
5777 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005778 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005779
5780 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
5781 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5782 } else {
5783 printf("%s VK_EXT_transform_feedback extension not supported, skipping test\n", kSkipPrefix);
Mark Lobodzinskid01b2bc2019-12-20 10:19:36 -07005784 return;
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005785 }
5786
5787 ASSERT_NO_FATAL_FAILURE(InitState());
5788 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5789
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07005790 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
5791 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005792 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
5793
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005794 PFN_vkCmdDrawIndirectByteCountEXT fpvkCmdDrawIndirectByteCountEXT =
5795 (PFN_vkCmdDrawIndirectByteCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdDrawIndirectByteCountEXT");
5796
5797 m_commandBuffer->begin();
5798 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5799 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5800 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5801 buffer_create_info.size = 1024;
5802 VkBufferObj counter_buffer;
5803 counter_buffer.init(*m_device, buffer_create_info);
5804
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005805 // Greater stride than maxTransformFeedbackBufferDataStride
Mark Lobodzinski20310782020-02-28 14:25:17 -07005806 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-vertexStride-02289");
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005807 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 0, 0xCADECADE);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005808 m_errorMonitor->VerifyFound();
5809
sfricke-samsungd5e9adb2020-10-26 03:59:29 -07005810 // some mock ICD json files are missing a valid stride value
5811 if (tf_properties.maxTransformFeedbackBufferDataStride > 0) {
5812 // non-4 multiple stride
5813 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "UNASSIGNED-vkCmdDrawIndirectByteCountEXT-offset");
5814 fpvkCmdDrawIndirectByteCountEXT(m_commandBuffer->handle(), 1, 0, counter_buffer.handle(), 0, 1, 4);
5815 m_errorMonitor->VerifyFound();
5816 }
5817
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005818 m_commandBuffer->EndRenderPass();
5819 m_commandBuffer->end();
Tony-LunarG983bbc52020-11-06 11:04:59 -07005820
5821 if (!tf_properties.maxTransformFeedbackBufferDataStride) {
5822 printf("%s , maxTransformFeedbackBufferDataStride is zero, skipping subtests\n", kSkipPrefix);
5823 return;
5824 }
5825
5826 std::vector<const char *> device_extension_names;
5827 device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
5828 VkDeviceObj test_device(0, gpu(), device_extension_names);
5829 VkCommandPoolObj commandPool(&test_device, 0);
5830 VkCommandBufferObj commandBuffer(&test_device, &commandPool);
5831 VkBufferObj counter_buffer2;
5832 counter_buffer2.init(test_device, buffer_create_info);
5833 VkPipelineLayoutObj pipelineLayout(&test_device);
5834 VkRenderPass renderpass;
5835 VkRenderPassCreateInfo rp_info = {};
5836 VkSubpassDescription subpass = {};
5837 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5838 rp_info.pSubpasses = &subpass;
5839 rp_info.subpassCount = 1;
5840 vk::CreateRenderPass(test_device.handle(), &rp_info, nullptr, &renderpass);
5841 VkPipelineObj pipeline(&test_device);
5842 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
5843 pipeline.AddShader(&vs);
5844 pipeline.CreateVKPipeline(pipelineLayout.handle(), renderpass);
5845 m_renderPassBeginInfo.renderPass = renderpass;
5846 VkFramebuffer fb;
5847 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, renderpass, 0, nullptr, 256, 256, 1};
5848 vk::CreateFramebuffer(test_device.handle(), &fbci, nullptr, &fb);
5849 m_renderPassBeginInfo.framebuffer = fb;
5850 m_renderPassBeginInfo.renderPass = renderpass;
5851 commandBuffer.begin();
5852 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5853 vk::CmdSetViewport(commandBuffer.handle(), 0, 1, &viewport);
5854 VkRect2D scissor = {{0, 0}, {16, 16}};
5855 vk::CmdSetScissor(commandBuffer.handle(), 0, 1, &scissor);
5856 vk::CmdBindPipeline(commandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle());
5857 commandBuffer.BeginRenderPass(m_renderPassBeginInfo);
5858 if (!tf_properties.transformFeedbackDraw) {
sfricke-samsungba459bd2020-12-06 23:20:04 -08005859 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedbackDraw-02288");
Tony-LunarG983bbc52020-11-06 11:04:59 -07005860 }
5861 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectByteCountEXT-transformFeedback-02287");
5862 fpvkCmdDrawIndirectByteCountEXT(commandBuffer.handle(), 1, 0, counter_buffer2.handle(), 0, 0, 1);
5863 m_errorMonitor->VerifyFound();
5864 vk::DestroyRenderPass(test_device.handle(), renderpass, nullptr);
5865 vk::DestroyFramebuffer(test_device.handle(), fb, nullptr);
Mark Lobodzinski977f0342019-12-19 14:24:09 -07005866}
5867
unknown088160a2019-05-23 17:43:13 -06005868TEST_F(VkLayerTest, DrawIndirectCountKHR) {
5869 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndirectCountKHR");
5870
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005871 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005872 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
5873 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
5874 } else {
5875 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
5876 return;
5877 }
5878 ASSERT_NO_FATAL_FAILURE(InitState());
5879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5880
5881 VkMemoryRequirements memory_requirements;
5882 VkMemoryAllocateInfo memory_allocate_info = {VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO};
5883
5884 auto vkCmdDrawIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005885 (PFN_vkCmdDrawIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06005886
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005887 CreatePipelineHelper pipe(*this);
5888 pipe.InitInfo();
5889 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5890 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5891 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5892 dyn_state_ci.dynamicStateCount = size(dyn_states);
5893 dyn_state_ci.pDynamicStates = dyn_states;
5894 pipe.dyn_state_ci_ = dyn_state_ci;
5895 pipe.InitState();
5896 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06005897
5898 m_commandBuffer->begin();
5899 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5900
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005901 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
5902 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
5903 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06005904
5905 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005906 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06005907 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005908 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06005909
5910 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5911 buffer_create_info.size = sizeof(VkDrawIndirectCommand);
5912 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
5913 VkBuffer draw_buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005914 vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &draw_buffer);
unknown088160a2019-05-23 17:43:13 -06005915
5916 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
5917 count_buffer_create_info.size = sizeof(uint32_t);
5918 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005919 VkBufferObj count_buffer;
5920 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06005921
Mike Schuchardt65847d92019-12-20 13:50:47 -08005922 // VUID-vkCmdDrawIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07005923 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005924 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1,
5925 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005926 m_errorMonitor->VerifyFound();
5927
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005928 vk::GetBufferMemoryRequirements(m_device->device(), draw_buffer, &memory_requirements);
unknown088160a2019-05-23 17:43:13 -06005929 memory_allocate_info.allocationSize = memory_requirements.size;
5930 m_device->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
5931 VkDeviceMemory draw_buffer_memory;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005932 vk::AllocateMemory(m_device->device(), &memory_allocate_info, NULL, &draw_buffer_memory);
5933 vk::BindBufferMemory(m_device->device(), draw_buffer, draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06005934
5935 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005936 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06005937
Mike Schuchardt65847d92019-12-20 13:50:47 -08005938 // VUID-vkCmdDrawIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07005939 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBuffer-02714");
unknown088160a2019-05-23 17:43:13 -06005940 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer_unbound, 0, 1, sizeof(VkDrawIndirectCommand));
5941 m_errorMonitor->VerifyFound();
5942
Mike Schuchardt65847d92019-12-20 13:50:47 -08005943 // VUID-vkCmdDrawIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07005944 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005945 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 1, count_buffer.handle(), 0, 1,
5946 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005947 m_errorMonitor->VerifyFound();
5948
Mike Schuchardt65847d92019-12-20 13:50:47 -08005949 // VUID-vkCmdDrawIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07005950 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005951 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 1, 1,
5952 sizeof(VkDrawIndirectCommand));
unknown088160a2019-05-23 17:43:13 -06005953 m_errorMonitor->VerifyFound();
5954
Mike Schuchardt65847d92019-12-20 13:50:47 -08005955 // VUID-vkCmdDrawIndirectCount-stride-03110
Mark Lobodzinski20310782020-02-28 14:25:17 -07005956 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-stride-03110");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005957 vkCmdDrawIndirectCountKHR(m_commandBuffer->handle(), draw_buffer, 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06005958 m_errorMonitor->VerifyFound();
5959
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005960 // 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 -06005961 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08005962 // VUID-vkCmdDrawIndirectCount-renderPass-02684
5963 // VUID-vkCmdDrawIndirectCount-subpass-02685
5964 // VUID-vkCmdDrawIndirectCount-commandBuffer-02701
unknown088160a2019-05-23 17:43:13 -06005965
5966 m_commandBuffer->EndRenderPass();
5967 m_commandBuffer->end();
5968
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005969 vk::DestroyBuffer(m_device->device(), draw_buffer, 0);
5970 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06005971
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005972 vk::FreeMemory(m_device->device(), draw_buffer_memory, 0);
unknown088160a2019-05-23 17:43:13 -06005973}
5974
5975TEST_F(VkLayerTest, DrawIndexedIndirectCountKHR) {
5976 TEST_DESCRIPTION("Test covered valid usage for vkCmdDrawIndexedIndirectCountKHR");
5977
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07005978 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06005979 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME)) {
5980 m_device_extension_names.push_back(VK_KHR_DRAW_INDIRECT_COUNT_EXTENSION_NAME);
5981 } else {
5982 printf(" VK_KHR_draw_indirect_count Extension not supported, skipping test\n");
5983 return;
5984 }
5985 ASSERT_NO_FATAL_FAILURE(InitState());
5986 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5987
unknown088160a2019-05-23 17:43:13 -06005988 auto vkCmdDrawIndexedIndirectCountKHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06005989 (PFN_vkCmdDrawIndexedIndirectCountKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdDrawIndexedIndirectCountKHR");
unknown088160a2019-05-23 17:43:13 -06005990
locke-lunarg8e2c91b2019-06-11 17:53:26 -06005991 CreatePipelineHelper pipe(*this);
5992 pipe.InitInfo();
5993 const VkDynamicState dyn_states[] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR};
5994 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
5995 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
5996 dyn_state_ci.dynamicStateCount = size(dyn_states);
5997 dyn_state_ci.pDynamicStates = dyn_states;
5998 pipe.dyn_state_ci_ = dyn_state_ci;
5999 pipe.InitState();
6000 pipe.CreateGraphicsPipeline();
unknown088160a2019-05-23 17:43:13 -06006001
6002 m_commandBuffer->begin();
6003 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6004
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006005 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6006 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_layout_.handle(), 0, 1,
6007 &pipe.descriptor_set_->set_, 0, NULL);
unknown088160a2019-05-23 17:43:13 -06006008
6009 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006010 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
unknown088160a2019-05-23 17:43:13 -06006011 VkRect2D scissor = {{0, 0}, {16, 16}};
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006012 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
unknown088160a2019-05-23 17:43:13 -06006013
6014 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6015 buffer_create_info.size = sizeof(VkDrawIndexedIndirectCommand);
6016 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006017 VkBufferObj draw_buffer;
6018 draw_buffer.init(*m_device, buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006019
6020 VkBufferCreateInfo count_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6021 count_buffer_create_info.size = sizeof(uint32_t);
6022 count_buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006023 VkBufferObj count_buffer;
6024 count_buffer.init(*m_device, count_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006025
6026 VkBufferCreateInfo index_buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6027 index_buffer_create_info.size = sizeof(uint32_t);
6028 index_buffer_create_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006029 VkBufferObj index_buffer;
6030 index_buffer.init(*m_device, index_buffer_create_info);
unknown088160a2019-05-23 17:43:13 -06006031
Mike Schuchardt65847d92019-12-20 13:50:47 -08006032 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial - only tests whether the index buffer is bound)
Mark Lobodzinski20310782020-02-28 14:25:17 -07006033 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006034 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006035 sizeof(VkDrawIndexedIndirectCommand));
6036 m_errorMonitor->VerifyFound();
6037
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006038 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
unknown088160a2019-05-23 17:43:13 -06006039
6040 VkBuffer draw_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006041 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &draw_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006042
Mike Schuchardt65847d92019-12-20 13:50:47 -08006043 // VUID-vkCmdDrawIndexedIndirectCount-buffer-02708
Mark Lobodzinski20310782020-02-28 14:25:17 -07006044 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-buffer-02708");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006045 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer_unbound, 0, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006046 sizeof(VkDrawIndexedIndirectCommand));
6047 m_errorMonitor->VerifyFound();
6048
6049 VkBuffer count_buffer_unbound;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006050 vk::CreateBuffer(m_device->device(), &count_buffer_create_info, nullptr, &count_buffer_unbound);
unknown088160a2019-05-23 17:43:13 -06006051
Mike Schuchardt65847d92019-12-20 13:50:47 -08006052 // VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714
Mark Lobodzinski20310782020-02-28 14:25:17 -07006053 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBuffer-02714");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006054 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer_unbound, 0, 1,
unknown088160a2019-05-23 17:43:13 -06006055 sizeof(VkDrawIndexedIndirectCommand));
6056 m_errorMonitor->VerifyFound();
6057
Mike Schuchardt65847d92019-12-20 13:50:47 -08006058 // VUID-vkCmdDrawIndexedIndirectCount-offset-02710
Mark Lobodzinski20310782020-02-28 14:25:17 -07006059 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-offset-02710");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006060 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 1, count_buffer.handle(), 0, 1,
unknown088160a2019-05-23 17:43:13 -06006061 sizeof(VkDrawIndexedIndirectCommand));
6062 m_errorMonitor->VerifyFound();
6063
Mike Schuchardt65847d92019-12-20 13:50:47 -08006064 // VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716
Mark Lobodzinski20310782020-02-28 14:25:17 -07006065 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-countBufferOffset-02716");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006066 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 1, 1,
unknown088160a2019-05-23 17:43:13 -06006067 sizeof(VkDrawIndexedIndirectCommand));
6068 m_errorMonitor->VerifyFound();
6069
Mike Schuchardt65847d92019-12-20 13:50:47 -08006070 // VUID-vkCmdDrawIndexedIndirectCount-stride-03142
Mark Lobodzinski20310782020-02-28 14:25:17 -07006071 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-stride-03142");
locke-lunarg8e2c91b2019-06-11 17:53:26 -06006072 vkCmdDrawIndexedIndirectCountKHR(m_commandBuffer->handle(), draw_buffer.handle(), 0, count_buffer.handle(), 0, 1, 1);
unknown088160a2019-05-23 17:43:13 -06006073 m_errorMonitor->VerifyFound();
6074
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006075 // 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 -06006076 // these:
Mike Schuchardt65847d92019-12-20 13:50:47 -08006077 // VUID-vkCmdDrawIndexedIndirectCount-renderPass-02684
6078 // VUID-vkCmdDrawIndexedIndirectCount-subpass-02685
6079 // VUID-vkCmdDrawIndexedIndirectCount-commandBuffer-02701 (partial)
unknown088160a2019-05-23 17:43:13 -06006080
6081 m_commandBuffer->EndRenderPass();
6082 m_commandBuffer->end();
6083
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006084 vk::DestroyBuffer(m_device->device(), draw_buffer_unbound, 0);
6085 vk::DestroyBuffer(m_device->device(), count_buffer_unbound, 0);
unknown088160a2019-05-23 17:43:13 -06006086}
6087
sfricke-samsung860d3b22020-05-04 21:08:29 -07006088TEST_F(VkLayerTest, DrawIndirectCountFeature) {
6089 TEST_DESCRIPTION("Test covered valid usage for the 1.2 drawIndirectCount feature");
6090
6091 SetTargetApiVersion(VK_API_VERSION_1_2);
6092 ASSERT_NO_FATAL_FAILURE(Init());
6093 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6094 if (DeviceValidationVersion() < VK_API_VERSION_1_2) {
6095 printf("%s Tests requires Vulkan 1.2+, skipping test\n", kSkipPrefix);
6096 return;
6097 }
6098
6099 VkBufferObj indirect_buffer;
6100 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6101 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6102
6103 VkBufferObj indexed_indirect_buffer;
6104 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
6105 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6106
6107 VkBufferObj count_buffer;
6108 count_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
6109
6110 VkBufferObj index_buffer;
6111 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
6112
6113 CreatePipelineHelper pipe(*this);
6114 pipe.InitInfo();
6115 pipe.InitState();
6116 pipe.CreateGraphicsPipeline();
6117
6118 // Make calls to valid commands but without the drawIndirectCount feature set
6119 m_commandBuffer->begin();
6120 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
6121
6122 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
6123
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006124 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006125 vk::CmdDrawIndirectCount(m_commandBuffer->handle(), indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6126 sizeof(VkDrawIndirectCommand));
6127 m_errorMonitor->VerifyFound();
6128
6129 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
6130
Shannon McPherson2c793ba2020-08-28 12:13:24 -06006131 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirectCount-None-04445");
sfricke-samsung860d3b22020-05-04 21:08:29 -07006132 vk::CmdDrawIndexedIndirectCount(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, count_buffer.handle(), 0, 1,
6133 sizeof(VkDrawIndexedIndirectCommand));
6134 m_errorMonitor->VerifyFound();
6135
6136 m_commandBuffer->EndRenderPass();
6137 m_commandBuffer->end();
6138}
6139
unknown088160a2019-05-23 17:43:13 -06006140TEST_F(VkLayerTest, ExclusiveScissorNV) {
6141 TEST_DESCRIPTION("Test VK_NV_scissor_exclusive with multiViewport disabled.");
6142
6143 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6144 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6145 } else {
6146 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6147 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6148 return;
6149 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006150 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006151 std::array<const char *, 1> required_device_extensions = {{VK_NV_SCISSOR_EXCLUSIVE_EXTENSION_NAME}};
6152 for (auto device_extension : required_device_extensions) {
6153 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6154 m_device_extension_names.push_back(device_extension);
6155 } else {
6156 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6157 return;
6158 }
6159 }
6160
6161 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006162 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006163 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6164
6165 // Create a device that enables exclusive scissor but disables multiViewport
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006166 auto exclusive_scissor_features = LvlInitStruct<VkPhysicalDeviceExclusiveScissorFeaturesNV>();
6167 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&exclusive_scissor_features);
unknown088160a2019-05-23 17:43:13 -06006168 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6169
6170 features2.features.multiViewport = VK_FALSE;
6171
6172 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6174
6175 if (m_device->phy().properties().limits.maxViewports) {
6176 printf("%s Device doesn't support the necessary number of viewports, skipping test.\n", kSkipPrefix);
6177 return;
6178 }
6179
6180 // Based on PSOViewportStateTests
6181 {
6182 VkViewport viewport = {0.0f, 0.0f, 64.0f, 64.0f, 0.0f, 1.0f};
6183 VkViewport viewports[] = {viewport, viewport};
6184 VkRect2D scissor = {{0, 0}, {64, 64}};
6185 VkRect2D scissors[100] = {scissor, scissor};
6186
6187 using std::vector;
6188 struct TestCase {
6189 uint32_t viewport_count;
6190 VkViewport *viewports;
6191 uint32_t scissor_count;
6192 VkRect2D *scissors;
6193 uint32_t exclusive_scissor_count;
6194 VkRect2D *exclusive_scissors;
6195
6196 vector<std::string> vuids;
6197 };
6198
6199 vector<TestCase> test_cases = {
6200 {1,
6201 viewports,
6202 1,
6203 scissors,
6204 2,
6205 scissors,
6206 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6207 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
6208 {1,
6209 viewports,
6210 1,
6211 scissors,
6212 100,
6213 scissors,
6214 {"VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02027",
6215 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02028",
6216 "VUID-VkPipelineViewportExclusiveScissorStateCreateInfoNV-exclusiveScissorCount-02029"}},
Shannon McPherson24c13d12020-06-18 15:51:41 -06006217 {1, viewports, 1, scissors, 1, nullptr, {"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-04056"}},
unknown088160a2019-05-23 17:43:13 -06006218 };
6219
6220 for (const auto &test_case : test_cases) {
6221 VkPipelineViewportExclusiveScissorStateCreateInfoNV exc = {
6222 VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_EXCLUSIVE_SCISSOR_STATE_CREATE_INFO_NV};
6223
6224 const auto break_vp = [&test_case, &exc](CreatePipelineHelper &helper) {
6225 helper.vp_state_ci_.viewportCount = test_case.viewport_count;
6226 helper.vp_state_ci_.pViewports = test_case.viewports;
6227 helper.vp_state_ci_.scissorCount = test_case.scissor_count;
6228 helper.vp_state_ci_.pScissors = test_case.scissors;
6229 helper.vp_state_ci_.pNext = &exc;
6230
6231 exc.exclusiveScissorCount = test_case.exclusive_scissor_count;
6232 exc.pExclusiveScissors = test_case.exclusive_scissors;
6233 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006234 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit, test_case.vuids);
unknown088160a2019-05-23 17:43:13 -06006235 }
6236 }
6237
6238 // Based on SetDynScissorParamTests
6239 {
6240 auto vkCmdSetExclusiveScissorNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006241 (PFN_vkCmdSetExclusiveScissorNV)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetExclusiveScissorNV");
unknown088160a2019-05-23 17:43:13 -06006242
6243 const VkRect2D scissor = {{0, 0}, {16, 16}};
6244 const VkRect2D scissors[] = {scissor, scissor};
6245
6246 m_commandBuffer->begin();
6247
Mark Lobodzinski20310782020-02-28 14:25:17 -07006248 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006249 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 1, scissors);
6250 m_errorMonitor->VerifyFound();
6251
Mark Lobodzinski20310782020-02-28 14:25:17 -07006252 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006253 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
6254 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 0, nullptr);
6255 m_errorMonitor->VerifyFound();
6256
Mark Lobodzinski20310782020-02-28 14:25:17 -07006257 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006258 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 2, scissors);
6259 m_errorMonitor->VerifyFound();
6260
Mark Lobodzinski20310782020-02-28 14:25:17 -07006261 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006262 "vkCmdSetExclusiveScissorNV: parameter exclusiveScissorCount must be greater than 0");
Mark Lobodzinski20310782020-02-28 14:25:17 -07006263 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
unknown088160a2019-05-23 17:43:13 -06006264 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 0, scissors);
6265 m_errorMonitor->VerifyFound();
6266
Mark Lobodzinski20310782020-02-28 14:25:17 -07006267 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-firstExclusiveScissor-02035");
6268 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetExclusiveScissorNV-exclusiveScissorCount-02036");
unknown088160a2019-05-23 17:43:13 -06006269 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 1, 2, scissors);
6270 m_errorMonitor->VerifyFound();
6271
Mark Lobodzinski20310782020-02-28 14:25:17 -07006272 m_errorMonitor->SetDesiredFailureMsg(kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006273 "vkCmdSetExclusiveScissorNV: required parameter pExclusiveScissors specified as NULL");
6274 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, nullptr);
6275 m_errorMonitor->VerifyFound();
6276
6277 struct TestCase {
6278 VkRect2D scissor;
6279 std::string vuid;
6280 };
6281
6282 std::vector<TestCase> test_cases = {
6283 {{{-1, 0}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6284 {{{0, -1}, {16, 16}}, "VUID-vkCmdSetExclusiveScissorNV-x-02037"},
6285 {{{1, 0}, {INT32_MAX, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6286 {{{INT32_MAX, 0}, {1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6287 {{{0, 0}, {uint32_t{INT32_MAX} + 1, 16}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02038"},
6288 {{{0, 1}, {16, INT32_MAX}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6289 {{{0, INT32_MAX}, {16, 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"},
6290 {{{0, 0}, {16, uint32_t{INT32_MAX} + 1}}, "VUID-vkCmdSetExclusiveScissorNV-offset-02039"}};
6291
6292 for (const auto &test_case : test_cases) {
Mark Lobodzinski20310782020-02-28 14:25:17 -07006293 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, test_case.vuid);
unknown088160a2019-05-23 17:43:13 -06006294 vkCmdSetExclusiveScissorNV(m_commandBuffer->handle(), 0, 1, &test_case.scissor);
6295 m_errorMonitor->VerifyFound();
6296 }
6297
6298 m_commandBuffer->end();
6299 }
6300}
6301
6302TEST_F(VkLayerTest, MeshShaderNV) {
6303 TEST_DESCRIPTION("Test VK_NV_mesh_shader.");
6304
6305 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6306 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6307 } else {
6308 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6309 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6310 return;
6311 }
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006312 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
unknown088160a2019-05-23 17:43:13 -06006313 std::array<const char *, 1> required_device_extensions = {{VK_NV_MESH_SHADER_EXTENSION_NAME}};
6314 for (auto device_extension : required_device_extensions) {
6315 if (DeviceExtensionSupported(gpu(), nullptr, device_extension)) {
6316 m_device_extension_names.push_back(device_extension);
6317 } else {
6318 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, device_extension);
6319 return;
6320 }
6321 }
6322
Tony-LunarG048f5012020-04-29 16:55:11 -06006323 if (IsPlatform(kMockICD) || DeviceSimulation()) {
unknown088160a2019-05-23 17:43:13 -06006324 printf("%sNot suppored by MockICD, skipping tests\n", kSkipPrefix);
6325 return;
6326 }
6327
6328 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006329 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
unknown088160a2019-05-23 17:43:13 -06006330 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6331
6332 // Create a device that enables mesh_shader
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006333 auto mesh_shader_features = LvlInitStruct<VkPhysicalDeviceMeshShaderFeaturesNV>();
6334 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&mesh_shader_features);
unknown088160a2019-05-23 17:43:13 -06006335 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
6336 features2.features.multiDrawIndirect = VK_FALSE;
6337
6338 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
6339 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6340
6341 static const char vertShaderText[] =
6342 "#version 450\n"
6343 "vec2 vertices[3];\n"
6344 "void main() {\n"
6345 " vertices[0] = vec2(-1.0, -1.0);\n"
6346 " vertices[1] = vec2( 1.0, -1.0);\n"
6347 " vertices[2] = vec2( 0.0, 1.0);\n"
6348 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
6349 " gl_PointSize = 1.0f;\n"
6350 "}\n";
6351
6352 static const char meshShaderText[] =
6353 "#version 450\n"
6354 "#extension GL_NV_mesh_shader : require\n"
6355 "layout(local_size_x = 1) in;\n"
6356 "layout(max_vertices = 3) out;\n"
6357 "layout(max_primitives = 1) out;\n"
6358 "layout(triangles) out;\n"
6359 "void main() {\n"
6360 " gl_MeshVerticesNV[0].gl_Position = vec4(-1.0, -1.0, 0, 1);\n"
6361 " gl_MeshVerticesNV[1].gl_Position = vec4( 1.0, -1.0, 0, 1);\n"
6362 " gl_MeshVerticesNV[2].gl_Position = vec4( 0.0, 1.0, 0, 1);\n"
6363 " gl_PrimitiveIndicesNV[0] = 0;\n"
6364 " gl_PrimitiveIndicesNV[1] = 1;\n"
6365 " gl_PrimitiveIndicesNV[2] = 2;\n"
6366 " gl_PrimitiveCountNV = 1;\n"
6367 "}\n";
6368
6369 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6370 VkShaderObj ms(m_device, meshShaderText, VK_SHADER_STAGE_MESH_BIT_NV, this);
6371 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6372
6373 // Test pipeline creation
6374 {
6375 // can't mix mesh with vertex
6376 const auto break_vp = [&](CreatePipelineHelper &helper) {
6377 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo(), ms.GetStageCreateInfo()};
6378 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006379 CreatePipelineHelper::OneshotTest(*this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006380 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02095"}));
6381
6382 // vertex or mesh must be present
6383 const auto break_vp2 = [&](CreatePipelineHelper &helper) { helper.shader_stages_ = {fs.GetStageCreateInfo()}; };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006384 CreatePipelineHelper::OneshotTest(*this, break_vp2, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006385 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-stage-02096"}));
6386
6387 // vertexinput and inputassembly must be valid when vertex stage is present
6388 const auto break_vp3 = [&](CreatePipelineHelper &helper) {
6389 helper.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
6390 helper.gp_ci_.pVertexInputState = nullptr;
6391 helper.gp_ci_.pInputAssemblyState = nullptr;
6392 };
Mark Lobodzinski20310782020-02-28 14:25:17 -07006393 CreatePipelineHelper::OneshotTest(*this, break_vp3, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006394 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pStages-02097",
6395 "VUID-VkGraphicsPipelineCreateInfo-pStages-02098"}));
6396 }
6397
6398 PFN_vkCmdDrawMeshTasksIndirectNV vkCmdDrawMeshTasksIndirectNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006399 (PFN_vkCmdDrawMeshTasksIndirectNV)vk::GetInstanceProcAddr(instance(), "vkCmdDrawMeshTasksIndirectNV");
unknown088160a2019-05-23 17:43:13 -06006400
6401 VkBufferCreateInfo buffer_create_info = {VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO};
6402 buffer_create_info.size = sizeof(uint32_t);
6403 buffer_create_info.usage = VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT;
6404 VkBuffer buffer;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006405 VkResult result = vk::CreateBuffer(m_device->device(), &buffer_create_info, nullptr, &buffer);
unknown088160a2019-05-23 17:43:13 -06006406 ASSERT_VK_SUCCESS(result);
6407
6408 m_commandBuffer->begin();
6409
Mark Lobodzinski20310782020-02-28 14:25:17 -07006410 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02146");
6411 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawMeshTasksIndirectNV-drawCount-02718");
unknown088160a2019-05-23 17:43:13 -06006412 vkCmdDrawMeshTasksIndirectNV(m_commandBuffer->handle(), buffer, 0, 2, 0);
6413 m_errorMonitor->VerifyFound();
6414
6415 m_commandBuffer->end();
6416
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006417 vk::DestroyBuffer(m_device->device(), buffer, 0);
unknown088160a2019-05-23 17:43:13 -06006418}
6419
6420TEST_F(VkLayerTest, MeshShaderDisabledNV) {
6421 TEST_DESCRIPTION("Test VK_NV_mesh_shader VUs with NV_mesh_shader disabled.");
6422 ASSERT_NO_FATAL_FAILURE(Init());
6423 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6424
6425 VkEvent event;
6426 VkEventCreateInfo event_create_info{};
6427 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006428 vk::CreateEvent(m_device->device(), &event_create_info, nullptr, &event);
unknown088160a2019-05-23 17:43:13 -06006429
6430 m_commandBuffer->begin();
6431
Shannon McPherson93970b12020-06-12 14:34:35 -06006432 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006433 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006434 m_errorMonitor->VerifyFound();
6435
Shannon McPherson93970b12020-06-12 14:34:35 -06006436 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006437 vk::CmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006438 m_errorMonitor->VerifyFound();
6439
Shannon McPherson93970b12020-06-12 14:34:35 -06006440 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006441 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006442 m_errorMonitor->VerifyFound();
6443
Shannon McPherson93970b12020-06-12 14:34:35 -06006444 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdResetEvent-stageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006445 vk::CmdResetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV);
unknown088160a2019-05-23 17:43:13 -06006446 m_errorMonitor->VerifyFound();
6447
Shannon McPherson93970b12020-06-12 14:34:35 -06006448 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04095");
6449 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006450 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV,
6451 VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006452 m_errorMonitor->VerifyFound();
6453
Shannon McPherson93970b12020-06-12 14:34:35 -06006454 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-srcStageMask-04096");
6455 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdWaitEvents-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006456 vk::CmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV,
6457 VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006458 m_errorMonitor->VerifyFound();
6459
Shannon McPherson93970b12020-06-12 14:34:35 -06006460 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04095");
6461 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04095");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006462 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV, 0,
6463 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006464 m_errorMonitor->VerifyFound();
6465
Shannon McPherson93970b12020-06-12 14:34:35 -06006466 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-srcStageMask-04096");
6467 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdPipelineBarrier-dstStageMask-04096");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006468 vk::CmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV, 0,
6469 0, nullptr, 0, nullptr, 0, nullptr);
unknown088160a2019-05-23 17:43:13 -06006470 m_errorMonitor->VerifyFound();
6471
6472 m_commandBuffer->end();
6473
6474 VkSemaphoreCreateInfo semaphore_create_info = {};
6475 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
6476 VkSemaphore semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006477 ASSERT_VK_SUCCESS(vk::CreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
unknown088160a2019-05-23 17:43:13 -06006478
6479 VkPipelineStageFlags stage_flags = VK_PIPELINE_STAGE_MESH_SHADER_BIT_NV | VK_PIPELINE_STAGE_TASK_SHADER_BIT_NV;
6480 VkSubmitInfo submit_info = {};
6481
6482 // Signal the semaphore so the next test can wait on it.
6483 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6484 submit_info.signalSemaphoreCount = 1;
6485 submit_info.pSignalSemaphores = &semaphore;
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006486 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006487 m_errorMonitor->VerifyNotFound();
6488
6489 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6490 submit_info.signalSemaphoreCount = 0;
6491 submit_info.pSignalSemaphores = nullptr;
6492 submit_info.waitSemaphoreCount = 1;
6493 submit_info.pWaitSemaphores = &semaphore;
6494 submit_info.pWaitDstStageMask = &stage_flags;
6495
Mark Lobodzinski20310782020-02-28 14:25:17 -07006496 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02089");
6497 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pWaitDstStageMask-02090");
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006498 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
unknown088160a2019-05-23 17:43:13 -06006499 m_errorMonitor->VerifyFound();
6500
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006501 vk::QueueWaitIdle(m_device->m_queue);
unknown088160a2019-05-23 17:43:13 -06006502
6503 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
6504 VkPipelineShaderStageCreateInfo meshStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6505 meshStage = vs.GetStageCreateInfo();
6506 meshStage.stage = VK_SHADER_STAGE_MESH_BIT_NV;
6507 VkPipelineShaderStageCreateInfo taskStage = {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO};
6508 taskStage = vs.GetStageCreateInfo();
6509 taskStage.stage = VK_SHADER_STAGE_TASK_BIT_NV;
6510
6511 // mesh and task shaders not supported
6512 const auto break_vp = [&](CreatePipelineHelper &helper) {
6513 helper.shader_stages_ = {meshStage, taskStage, vs.GetStageCreateInfo()};
6514 };
6515 CreatePipelineHelper::OneshotTest(
Mark Lobodzinski20310782020-02-28 14:25:17 -07006516 *this, break_vp, kErrorBit,
unknown088160a2019-05-23 17:43:13 -06006517 vector<std::string>({"VUID-VkPipelineShaderStageCreateInfo-pName-00707", "VUID-VkPipelineShaderStageCreateInfo-pName-00707",
6518 "VUID-VkPipelineShaderStageCreateInfo-stage-02091",
6519 "VUID-VkPipelineShaderStageCreateInfo-stage-02092"}));
6520
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006521 vk::DestroyEvent(m_device->device(), event, nullptr);
6522 vk::DestroySemaphore(m_device->device(), semaphore, nullptr);
unknown088160a2019-05-23 17:43:13 -06006523}
Chris Mayerc93536f2019-09-19 16:34:49 +02006524
6525TEST_F(VkLayerTest, ViewportWScalingNV) {
6526 TEST_DESCRIPTION("Verify VK_NV_clip_space_w_scaling");
6527
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006528 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
Chris Mayerc93536f2019-09-19 16:34:49 +02006529
6530 VkPhysicalDeviceFeatures device_features = {};
6531 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
6532
6533 if (!device_features.multiViewport) {
6534 printf("%s VkPhysicalDeviceFeatures::multiViewport is not supported, skipping tests\n", kSkipPrefix);
6535 return;
6536 }
6537
6538 if (DeviceExtensionSupported(gpu(), nullptr, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME)) {
6539 m_device_extension_names.push_back(VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6540 } else {
6541 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_NV_CLIP_SPACE_W_SCALING_EXTENSION_NAME);
6542 return;
6543 }
6544
6545 ASSERT_NO_FATAL_FAILURE(InitState(&device_features));
6546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6547
6548 auto vkCmdSetViewportWScalingNV =
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006549 reinterpret_cast<PFN_vkCmdSetViewportWScalingNV>(vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetViewportWScalingNV"));
Chris Mayerc93536f2019-09-19 16:34:49 +02006550
6551 const char vs_src[] = R"(
6552 #version 450
6553 const vec2 positions[] = { vec2(-1.0f, 1.0f),
6554 vec2( 1.0f, 1.0f),
6555 vec2(-1.0f, -1.0f),
6556 vec2( 1.0f, -1.0f) };
6557 out gl_PerVertex {
6558 vec4 gl_Position;
6559 };
6560
6561 void main() {
6562 gl_Position = vec4(positions[gl_VertexIndex % 4], 0.0f, 1.0f);
6563 })";
6564
6565 const char fs_src[] = R"(
6566 #version 450
6567 layout(location = 0) out vec4 outColor;
6568
6569 void main() {
6570 outColor = vec4(0.0f, 1.0f, 0.0f, 1.0f);
6571 })";
6572
6573 const std::vector<VkViewport> vp = {
6574 {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}};
6575 const std::vector<VkRect2D> sc = {{{0, 0}, {32, 32}}, {{32, 0}, {32, 32}}, {{0, 32}, {32, 32}}, {{32, 32}, {32, 32}}};
6576 const std::vector<VkViewportWScalingNV> scale = {{-0.2f, -0.2f}, {0.2f, -0.2f}, {-0.2f, 0.2f}, {0.2f, 0.2f}};
6577
6578 const uint32_t vp_count = static_cast<uint32_t>(vp.size());
6579
6580 VkPipelineViewportWScalingStateCreateInfoNV vpsi = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_W_SCALING_STATE_CREATE_INFO_NV};
6581 vpsi.viewportWScalingEnable = VK_TRUE;
6582 vpsi.viewportCount = vp_count;
6583 vpsi.pViewportWScalings = scale.data();
6584
6585 VkPipelineViewportStateCreateInfo vpci = {VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO};
6586 vpci.viewportCount = vp_count;
6587 vpci.pViewports = vp.data();
6588 vpci.scissorCount = vp_count;
6589 vpci.pScissors = sc.data();
6590 vpci.pNext = &vpsi;
6591
6592 const auto set_vpci = [&vpci](CreatePipelineHelper &helper) { helper.vp_state_ci_ = vpci; };
6593
6594 // Make sure no errors show up when creating the pipeline with w-scaling enabled
Mark Lobodzinski20310782020-02-28 14:25:17 -07006595 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit, vector<std::string>(), true);
Chris Mayerc93536f2019-09-19 16:34:49 +02006596
6597 // Create pipeline with w-scaling enabled but without a valid scaling array
6598 vpsi.pViewportWScalings = nullptr;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006599 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006600 vector<std::string>({"VUID-VkGraphicsPipelineCreateInfo-pDynamicStates-01715"}));
6601
6602 vpsi.pViewportWScalings = scale.data();
6603
6604 // Create pipeline with w-scaling enabled but without matching viewport counts
6605 vpsi.viewportCount = 1;
Mark Lobodzinski20310782020-02-28 14:25:17 -07006606 CreatePipelineHelper::OneshotTest(*this, set_vpci, kErrorBit,
Chris Mayerc93536f2019-09-19 16:34:49 +02006607 vector<std::string>({"VUID-VkPipelineViewportStateCreateInfo-viewportWScalingEnable-01726"}));
6608
6609 const VkPipelineLayoutObj pl(m_device);
6610
6611 VkShaderObj vs(m_device, vs_src, VK_SHADER_STAGE_VERTEX_BIT, this);
6612 VkShaderObj fs(m_device, fs_src, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6613
6614 VkPipelineObj pipe(m_device);
6615 pipe.AddDefaultColorAttachment();
6616 pipe.AddShader(&vs);
6617 pipe.AddShader(&fs);
6618 pipe.SetViewport(vp);
6619 pipe.SetScissor(sc);
6620 pipe.CreateVKPipeline(pl.handle(), renderPass());
6621
6622 VkPipelineObj pipeDynWScale(m_device);
6623 pipeDynWScale.AddDefaultColorAttachment();
6624 pipeDynWScale.AddShader(&vs);
6625 pipeDynWScale.AddShader(&fs);
6626 pipeDynWScale.SetViewport(vp);
6627 pipeDynWScale.SetScissor(sc);
6628 pipeDynWScale.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_W_SCALING_NV);
6629 pipeDynWScale.CreateVKPipeline(pl.handle(), renderPass());
6630
6631 m_commandBuffer->begin();
6632
6633 // Bind pipeline without dynamic w scaling enabled
6634 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006635 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006636 m_errorMonitor->VerifyNotFound();
6637
Chris Mayerc93536f2019-09-19 16:34:49 +02006638 // Bind pipeline that has dynamic w-scaling enabled
6639 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski902cb0f2019-09-27 14:45:36 -06006640 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeDynWScale.handle());
Chris Mayerc93536f2019-09-19 16:34:49 +02006641 m_errorMonitor->VerifyNotFound();
6642
6643 const auto max_vps = m_device->props.limits.maxViewports;
6644
Mark Lobodzinski20310782020-02-28 14:25:17 -07006645 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdSetViewportWScalingNV-firstViewport-01324");
Chris Mayerc93536f2019-09-19 16:34:49 +02006646 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 1, max_vps, scale.data());
6647 m_errorMonitor->VerifyFound();
6648
6649 m_errorMonitor->ExpectSuccess();
6650 vkCmdSetViewportWScalingNV(m_commandBuffer->handle(), 0, vp_count, scale.data());
6651 m_errorMonitor->VerifyNotFound();
6652
6653 m_commandBuffer->end();
6654}
sfricke-samsung914e8002020-01-07 22:26:18 -08006655
6656TEST_F(VkLayerTest, CreateSamplerYcbcrConversionEnable) {
6657 TEST_DESCRIPTION("Checks samplerYcbcrConversion is enabled before calling vkCreateSamplerYcbcrConversion");
6658
6659 // Enable Sampler YCbCr Conversion req'd extensions
6660 // Only need revision 1 of vkGetPhysicalDeviceProperties2 and this allows more device capable for testing
6661 bool mp_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME, 1);
6662 if (mp_extensions) {
6663 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6664 }
6665 SetTargetApiVersion(VK_API_VERSION_1_1);
Mark Lobodzinski09ce9c42020-03-06 10:02:44 -07006666 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
sfricke-samsung914e8002020-01-07 22:26:18 -08006667 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6668 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6669 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6670 mp_extensions = mp_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6671 if (mp_extensions) {
6672 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
6673 m_device_extension_names.push_back(VK_KHR_GET_MEMORY_REQUIREMENTS_2_EXTENSION_NAME);
6674 m_device_extension_names.push_back(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
6675 m_device_extension_names.push_back(VK_KHR_SAMPLER_YCBCR_CONVERSION_EXTENSION_NAME);
6676 } else {
6677 printf("%s test requires Sampler YCbCr Conversion extensions, not available. Skipping.\n", kSkipPrefix);
6678 return;
6679 }
6680
6681 // Explictly not enable Ycbcr Conversion Features
6682 VkPhysicalDeviceSamplerYcbcrConversionFeatures ycbcr_features = {};
6683 ycbcr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SAMPLER_YCBCR_CONVERSION_FEATURES;
6684 ycbcr_features.samplerYcbcrConversion = VK_FALSE;
6685 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &ycbcr_features));
6686
6687 PFN_vkCreateSamplerYcbcrConversionKHR vkCreateSamplerYcbcrConversionFunction =
6688 (PFN_vkCreateSamplerYcbcrConversionKHR)vk::GetDeviceProcAddr(m_device->handle(), "vkCreateSamplerYcbcrConversionKHR");
6689 if (vkCreateSamplerYcbcrConversionFunction == nullptr) {
6690 printf("%s did not find vkCreateSamplerYcbcrConversionKHR function pointer; Skipping.\n", kSkipPrefix);
6691 return;
6692 }
6693
6694 // Create Ycbcr conversion
6695 VkSamplerYcbcrConversion conversions;
6696 VkSamplerYcbcrConversionCreateInfo ycbcr_create_info = {VK_STRUCTURE_TYPE_SAMPLER_YCBCR_CONVERSION_CREATE_INFO,
6697 NULL,
6698 VK_FORMAT_G8_B8R8_2PLANE_420_UNORM_KHR,
6699 VK_SAMPLER_YCBCR_MODEL_CONVERSION_RGB_IDENTITY,
6700 VK_SAMPLER_YCBCR_RANGE_ITU_FULL,
6701 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
6702 VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY},
6703 VK_CHROMA_LOCATION_COSITED_EVEN,
6704 VK_CHROMA_LOCATION_COSITED_EVEN,
6705 VK_FILTER_NEAREST,
6706 false};
6707
Mark Lobodzinski20310782020-02-28 14:25:17 -07006708 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateSamplerYcbcrConversion-None-01648");
sfricke-samsung914e8002020-01-07 22:26:18 -08006709 vkCreateSamplerYcbcrConversionFunction(m_device->handle(), &ycbcr_create_info, nullptr, &conversions);
6710 m_errorMonitor->VerifyFound();
Shannon McPherson50421602020-01-28 15:18:46 -07006711}
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006712
6713TEST_F(VkLayerTest, TransformFeedbackFeatureEnabled) {
6714 TEST_DESCRIPTION("VkPhysicalDeviceTransformFeedbackFeaturesEXT::transformFeedback must be enabled");
6715
6716 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6717 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6718 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6719 return;
6720 }
6721 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6722
6723 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6724
6725 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6726 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6727 return;
6728 }
6729 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6730
6731 {
6732 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6733 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6734 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6735
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006736 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6737 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006738 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6739
6740 if (!tf_features.transformFeedback) {
6741 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6742 return;
6743 }
6744 }
6745
6746 ASSERT_NO_FATAL_FAILURE(InitState());
6747 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6748
6749 {
6750 auto vkCmdBindTransformFeedbackBuffersEXT = (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(
6751 m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6752 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6753
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006754 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006755 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6756 info.size = 4;
6757 VkBufferObj buffer;
6758 buffer.init(*m_device, info);
6759 VkDeviceSize offsets[1]{};
6760
6761 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-transformFeedback-02355");
6762 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer.handle(), offsets, nullptr);
6763 m_errorMonitor->VerifyFound();
6764 }
6765
6766 {
6767 auto vkCmdBeginTransformFeedbackEXT =
6768 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6769 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6770
6771 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-transformFeedback-02366");
6772 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6773 m_errorMonitor->VerifyFound();
6774 }
6775
6776 {
6777 auto vkCmdEndTransformFeedbackEXT =
6778 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6779 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6780
6781 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-transformFeedback-02374");
6782 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-None-02375");
6783 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6784 m_errorMonitor->VerifyFound();
6785 }
6786}
6787
6788TEST_F(VkLayerTest, TransformFeedbackCmdBindTransformFeedbackBuffersEXT) {
6789 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBindTransformFeedbackBuffersEXT");
6790
6791 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6792 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6793 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6794 return;
6795 }
6796 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6797
6798 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6799
6800 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6801 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6802 return;
6803 }
6804 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6805
6806 {
6807 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6808 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6809 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6810
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006811 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6812 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006813 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
6814
6815 if (!tf_features.transformFeedback) {
6816 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
6817 return;
6818 }
6819
6820 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
6821 }
6822
6823 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6824
6825 auto vkCmdBindTransformFeedbackBuffersEXT =
6826 (PFN_vkCmdBindTransformFeedbackBuffersEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBindTransformFeedbackBuffersEXT");
6827 ASSERT_TRUE(vkCmdBindTransformFeedbackBuffersEXT != nullptr);
6828
6829 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006830 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
6831 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006832 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
6833
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006834 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006835 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6836 info.size = 8;
6837 VkBufferObj const buffer_obj(*m_device, info);
6838
6839 // Request a firstBinding that is too large.
6840 {
6841 auto const firstBinding = tf_properties.maxTransformFeedbackBuffers;
6842 VkDeviceSize const offsets[1]{};
6843
6844 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02356");
6845 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6846 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), firstBinding, 1, &buffer_obj.handle(), offsets,
6847 nullptr);
6848 m_errorMonitor->VerifyFound();
6849 }
6850
6851 // Request too many bindings.
6852 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
6853 auto const bindingCount = tf_properties.maxTransformFeedbackBuffers + 1;
6854 std::vector<VkBuffer> buffers(bindingCount, buffer_obj.handle());
6855
6856 std::vector<VkDeviceSize> offsets(bindingCount);
6857
6858 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-firstBinding-02357");
6859 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, bindingCount, buffers.data(), offsets.data(),
6860 nullptr);
6861 m_errorMonitor->VerifyFound();
6862 }
6863
6864 // Request a size that is larger than the maximum size.
6865 if (tf_properties.maxTransformFeedbackBufferSize < std::numeric_limits<VkDeviceSize>::max()) {
6866 VkDeviceSize const offsets[1]{};
6867 VkDeviceSize const sizes[1]{tf_properties.maxTransformFeedbackBufferSize + 1};
6868
6869 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSize-02361");
6870 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
6871 m_errorMonitor->VerifyFound();
6872 }
6873 }
6874
6875 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006876 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006877 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6878 info.size = 8;
6879 VkBufferObj const buffer_obj(*m_device, info);
6880
6881 // Request an offset that is too large.
6882 {
6883 VkDeviceSize const offsets[1]{info.size + 4};
6884
6885 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02358");
6886 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6887 m_errorMonitor->VerifyFound();
6888 }
6889
6890 // Request an offset that is not a multiple of 4.
6891 {
6892 VkDeviceSize const offsets[1]{1};
6893
6894 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02359");
6895 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6896 m_errorMonitor->VerifyFound();
6897 }
6898
6899 // Request a size that is larger than the buffer's size.
6900 {
6901 VkDeviceSize const offsets[1]{};
6902 VkDeviceSize const sizes[1]{info.size + 1};
6903
6904 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pSizes-02362");
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006905 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
6906 m_errorMonitor->VerifyFound();
6907 }
6908
6909 // Request an offset and size whose sum is larger than the buffer's size.
6910 {
6911 VkDeviceSize const offsets[1]{4};
6912 VkDeviceSize const sizes[1]{info.size - 3};
6913
6914 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pOffsets-02363");
6915 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, sizes);
6916 m_errorMonitor->VerifyFound();
6917 }
6918
6919 // Bind while transform feedback is active.
6920 {
6921 auto vkCmdBeginTransformFeedbackEXT =
6922 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
6923 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
6924 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6925
6926 VkDeviceSize const offsets[1]{};
6927
6928 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-None-02365");
6929 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6930 m_errorMonitor->VerifyFound();
6931
6932 auto vkCmdEndTransformFeedbackEXT =
6933 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
6934 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
6935 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
6936 }
6937 }
6938
6939 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT.
6940 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006941 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006942 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6943 info.size = 4;
6944 VkBufferObj const buffer_obj(*m_device, info);
6945
6946 VkDeviceSize const offsets[1]{};
6947
6948 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02360");
6949 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets, nullptr);
6950 m_errorMonitor->VerifyFound();
6951 }
6952
6953 // Don't bind memory.
6954 {
6955 VkBuffer buffer{};
6956 {
6957 auto vkCreateBuffer = (PFN_vkCreateBuffer)vk::GetDeviceProcAddr(m_device->device(), "vkCreateBuffer");
6958 ASSERT_TRUE(vkCreateBuffer != nullptr);
6959
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006960 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006961 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
6962 info.size = 4;
6963 vkCreateBuffer(m_device->device(), &info, nullptr, &buffer);
6964 }
6965
6966 VkDeviceSize const offsets[1]{};
6967
6968 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindTransformFeedbackBuffersEXT-pBuffers-02364");
6969 vkCmdBindTransformFeedbackBuffersEXT(m_commandBuffer->handle(), 0, 1, &buffer, offsets, nullptr);
6970 m_errorMonitor->VerifyFound();
6971 }
6972}
6973
6974TEST_F(VkLayerTest, TransformFeedbackCmdBeginTransformFeedbackEXT) {
6975 TEST_DESCRIPTION("Submit invalid arguments to vkCmdBeginTransformFeedbackEXT");
6976
6977 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
6978 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
6979 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6980 return;
6981 }
6982 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
6983
6984 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
6985
6986 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
6987 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6988 return;
6989 }
6990 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
6991
6992 {
6993 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
6994 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
6995 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
6996
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07006997 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
6998 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06006999 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7000
7001 if (!tf_features.transformFeedback) {
7002 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7003 return;
7004 }
7005
7006 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7007 }
7008
7009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7010
7011 auto vkCmdBeginTransformFeedbackEXT =
7012 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7013 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7014
7015 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007016 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7017 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007018 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7019
7020 // Request a firstCounterBuffer that is too large.
7021 {
7022 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7023
7024 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02368");
7025 m_errorMonitor->SetUnexpectedError("VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7026 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7027 m_errorMonitor->VerifyFound();
7028 }
7029
7030 // Request too many buffers.
7031 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7032 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7033
7034 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-firstCounterBuffer-02369");
7035 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7036 m_errorMonitor->VerifyFound();
7037 }
7038 }
7039
7040 // Request an out-of-bounds location.
7041 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007042 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007043 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7044 info.size = 4;
7045 VkBufferObj const buffer_obj(*m_device, info);
7046
7047 VkDeviceSize const offsets[1]{1};
7048
7049 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBufferOffsets-02370");
7050 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7051 m_errorMonitor->VerifyFound();
7052 }
7053
7054 // Request specific offsets without specifying buffers.
7055 {
7056 VkDeviceSize const offsets[1]{};
7057
7058 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffer-02371");
7059 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7060 m_errorMonitor->VerifyFound();
7061 }
7062
7063 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7064 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007065 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007066 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7067 info.size = 4;
7068 VkBufferObj const buffer_obj(*m_device, info);
7069
7070 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-pCounterBuffers-02372");
7071 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7072 m_errorMonitor->VerifyFound();
7073 }
7074
7075 // Begin while transform feedback is active.
7076 {
7077 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7078
7079 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginTransformFeedbackEXT-None-02367");
7080 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7081 m_errorMonitor->VerifyFound();
7082
7083 auto vkCmdEndTransformFeedbackEXT =
7084 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7085 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7086
7087 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7088 }
7089}
7090
7091TEST_F(VkLayerTest, TransformFeedbackCmdEndTransformFeedbackEXT) {
7092 TEST_DESCRIPTION("Submit invalid arguments to vkCmdEndTransformFeedbackEXT");
7093
7094 if (!InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7095 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7096 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7097 return;
7098 }
7099 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7100
7101 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7102
7103 if (!DeviceExtensionSupported(gpu(), nullptr, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME)) {
7104 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7105 return;
7106 }
7107 m_device_extension_names.push_back(VK_EXT_TRANSFORM_FEEDBACK_EXTENSION_NAME);
7108
7109 {
7110 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7111 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7112 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7113
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007114 auto tf_features = LvlInitStruct<VkPhysicalDeviceTransformFeedbackFeaturesEXT>();
7115 auto pd_features = LvlInitStruct<VkPhysicalDeviceFeatures2>(&tf_features);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007116 vkGetPhysicalDeviceFeatures2KHR(gpu(), &pd_features);
7117
7118 if (!tf_features.transformFeedback) {
7119 printf("%s transformFeedback not supported; skipped.\n", kSkipPrefix);
7120 return;
7121 }
7122
7123 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features));
7124 }
7125
7126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7127
7128 auto vkCmdEndTransformFeedbackEXT =
7129 (PFN_vkCmdEndTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdEndTransformFeedbackEXT");
7130 ASSERT_TRUE(vkCmdEndTransformFeedbackEXT != nullptr);
7131
7132 {
7133 // Activate transform feedback.
7134 auto vkCmdBeginTransformFeedbackEXT =
7135 (PFN_vkCmdBeginTransformFeedbackEXT)vk::GetDeviceProcAddr(m_device->device(), "vkCmdBeginTransformFeedbackEXT");
7136 ASSERT_TRUE(vkCmdBeginTransformFeedbackEXT != nullptr);
7137 vkCmdBeginTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7138
7139 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007140 auto tf_properties = LvlInitStruct<VkPhysicalDeviceTransformFeedbackPropertiesEXT>();
7141 auto pd_properties = LvlInitStruct<VkPhysicalDeviceProperties2>(&tf_properties);
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007142 vk::GetPhysicalDeviceProperties2(gpu(), &pd_properties);
7143
7144 // Request a firstCounterBuffer that is too large.
7145 {
7146 auto const firstCounterBuffer = tf_properties.maxTransformFeedbackBuffers;
7147
7148 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02376");
7149 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7150 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), firstCounterBuffer, 1, nullptr, nullptr);
7151 m_errorMonitor->VerifyFound();
7152 }
7153
7154 // Request too many buffers.
7155 if (tf_properties.maxTransformFeedbackBuffers < std::numeric_limits<uint32_t>::max()) {
7156 auto const counterBufferCount = tf_properties.maxTransformFeedbackBuffers + 1;
7157
7158 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-firstCounterBuffer-02377");
7159 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, counterBufferCount, nullptr, nullptr);
7160 m_errorMonitor->VerifyFound();
7161 }
7162 }
7163
7164 // Request an out-of-bounds location.
7165 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007166 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007167 info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7168 info.size = 4;
7169 VkBufferObj const buffer_obj(*m_device, info);
7170
7171 VkDeviceSize const offsets[1]{1};
7172
7173 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBufferOffsets-02378");
7174 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), offsets);
7175 m_errorMonitor->VerifyFound();
7176 }
7177
7178 // Request specific offsets without specifying buffers.
7179 {
7180 VkDeviceSize const offsets[1]{};
7181
7182 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffer-02379");
7183 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, offsets);
7184 m_errorMonitor->VerifyFound();
7185 }
7186
7187 // Don't set VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT.
7188 {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007189 auto info = LvlInitStruct<VkBufferCreateInfo>();
Jeremy Hayescd7df2c2020-05-21 16:36:47 -06007190 // info.usage = VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_COUNTER_BUFFER_BIT_EXT;
7191 info.size = 4;
7192 VkBufferObj const buffer_obj(*m_device, info);
7193
7194 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-pCounterBuffers-02380");
7195 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, &buffer_obj.handle(), nullptr);
7196 m_errorMonitor->VerifyFound();
7197 }
7198 }
7199
7200 // End while transform feedback is inactive.
7201 {
7202 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7203
7204 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndTransformFeedbackEXT-None-02375");
7205 vkCmdEndTransformFeedbackEXT(m_commandBuffer->handle(), 0, 1, nullptr, nullptr);
7206 m_errorMonitor->VerifyFound();
7207 }
7208}
sfricke-samsung071af2d2020-07-02 10:37:22 -07007209
sfricke-samsung39ee2442020-07-22 21:21:15 -07007210TEST_F(VkLayerTest, InvalidUnprotectedCommands) {
7211 TEST_DESCRIPTION("Test making commands in unprotected command buffers that can't be used");
sfricke-samsung071af2d2020-07-02 10:37:22 -07007212
7213 // protect memory added in VK 1.1
7214 SetTargetApiVersion(VK_API_VERSION_1_1);
7215
7216 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7217 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7218 } else {
7219 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7220 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7221 return;
7222 }
7223 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7224
7225 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7226 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7227 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7228
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007229 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7230 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007231 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7232
7233 if (protected_memory_features.protectedMemory == VK_FALSE) {
7234 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7235 return;
7236 };
7237
7238 // Turns m_commandBuffer into a protected command buffer
7239 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2, VK_COMMAND_POOL_CREATE_PROTECTED_BIT));
7240
7241 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7242 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7243 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7244 return;
7245 }
7246
7247 VkBufferObj indirect_buffer;
7248 indirect_buffer.init(*m_device, sizeof(VkDrawIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7249 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7250
7251 VkBufferObj indexed_indirect_buffer;
7252 indexed_indirect_buffer.init(*m_device, sizeof(VkDrawIndexedIndirectCommand), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
7253 VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT);
7254
7255 VkBufferObj index_buffer;
7256 index_buffer.init(*m_device, sizeof(uint32_t), VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT, VK_BUFFER_USAGE_INDEX_BUFFER_BIT);
7257
7258 CreatePipelineHelper pipe(*this);
7259 pipe.InitInfo();
7260 pipe.InitState();
7261 pipe.CreateGraphicsPipeline();
7262
sfricke-samsung39ee2442020-07-22 21:21:15 -07007263 VkQueryPool query_pool;
7264 VkQueryPoolCreateInfo query_pool_create_info{};
7265 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
7266 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
7267 query_pool_create_info.queryCount = 1;
7268 vk::CreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
7269
sfricke-samsung071af2d2020-07-02 10:37:22 -07007270 m_commandBuffer->begin();
7271 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7272
7273 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7274
7275 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndirect-commandBuffer-02711");
7276 vk::CmdDrawIndirect(m_commandBuffer->handle(), indirect_buffer.handle(), 0, 1, sizeof(VkDrawIndirectCommand));
7277 m_errorMonitor->VerifyFound();
7278
7279 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), index_buffer.handle(), 0, VK_INDEX_TYPE_UINT32);
7280
7281 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexedIndirect-commandBuffer-02711");
7282 vk::CmdDrawIndexedIndirect(m_commandBuffer->handle(), indexed_indirect_buffer.handle(), 0, 1,
7283 sizeof(VkDrawIndexedIndirectCommand));
7284 m_errorMonitor->VerifyFound();
7285
7286 m_commandBuffer->EndRenderPass();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007287
7288 // Query should be outside renderpass
7289 vk::CmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
7290
7291 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBeginQuery-commandBuffer-01885");
7292 vk::CmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
7293 m_errorMonitor->VerifyFound();
7294
7295 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdEndQuery-commandBuffer-01886");
7296 m_errorMonitor->SetUnexpectedError("VUID-vkCmdEndQuery-None-01923");
7297 vk::CmdEndQuery(m_commandBuffer->handle(), query_pool, 0);
7298 m_errorMonitor->VerifyFound();
7299
sfricke-samsung071af2d2020-07-02 10:37:22 -07007300 m_commandBuffer->end();
sfricke-samsung39ee2442020-07-22 21:21:15 -07007301
7302 vk::DestroyQueryPool(m_device->device(), query_pool, nullptr);
sfricke-samsung071af2d2020-07-02 10:37:22 -07007303}
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007304
7305TEST_F(VkLayerTest, InvalidMixingProtectedResources) {
7306 TEST_DESCRIPTION("Test where there is mixing of protectedMemory backed resource in command buffers");
7307
7308 SetTargetApiVersion(VK_API_VERSION_1_1);
7309
7310 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
7311 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7312 } else {
7313 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
7314 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
7315 return;
7316 }
7317 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
7318
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007319 if (IsPlatform(kShieldTV) || IsPlatform(kShieldTVb)) {
7320 printf("%s CreateImageView calls crash ShieldTV, skipped for this platform.\n", kSkipPrefix);
7321 return;
7322 }
7323
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007324 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
7325 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
7326 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
7327
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07007328 auto protected_memory_features = LvlInitStruct<VkPhysicalDeviceProtectedMemoryFeatures>();
7329 auto features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&protected_memory_features);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007330 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
7331
7332 if (protected_memory_features.protectedMemory == VK_FALSE) {
7333 printf("%s protectedMemory feature not supported, skipped.\n", kSkipPrefix);
7334 return;
7335 };
7336
7337 // Turns m_commandBuffer into a unprotected command buffer
7338 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
7339
7340 VkCommandPoolObj protectedCommandPool(m_device, m_device->graphics_queue_node_index_, VK_COMMAND_POOL_CREATE_PROTECTED_BIT);
7341 VkCommandBufferObj protectedCommandBuffer(m_device, &protectedCommandPool);
7342
7343 if (DeviceValidationVersion() < VK_API_VERSION_1_1) {
7344 printf("%s Tests requires Vulkan 1.1+, skipping test\n", kSkipPrefix);
7345 return;
7346 }
7347
7348 // Create actual protected and unprotected buffers
7349 VkBuffer buffer_protected = VK_NULL_HANDLE;
7350 VkBuffer buffer_unprotected = VK_NULL_HANDLE;
7351 VkBufferCreateInfo buffer_create_info = {};
7352 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
7353 buffer_create_info.pNext = nullptr;
7354 buffer_create_info.size = 1 << 20; // 1 MB
locke-lunarg0de02522020-10-27 22:55:17 -06007355 buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT |
7356 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT | VK_BUFFER_USAGE_INDEX_BUFFER_BIT |
7357 VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007358 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
7359
7360 buffer_create_info.flags = VK_BUFFER_CREATE_PROTECTED_BIT;
7361 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_protected);
7362 buffer_create_info.flags = 0;
7363 vk::CreateBuffer(device(), &buffer_create_info, nullptr, &buffer_unprotected);
7364
7365 // Create actual protected and unprotected images
7366 VkImageObj image_protected(m_device);
7367 VkImageObj image_unprotected(m_device);
locke-lunarg0de02522020-10-27 22:55:17 -06007368 VkImageObj image_protected_descriptor(m_device);
7369 VkImageObj image_unprotected_descriptor(m_device);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007370 VkImageView image_views[2];
locke-lunarg0de02522020-10-27 22:55:17 -06007371 VkImageView image_views_descriptor[2];
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007372 VkImageCreateInfo image_create_info = {};
7373 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
7374 image_create_info.pNext = nullptr;
7375 image_create_info.extent = {64, 64, 1};
7376 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
7377 image_create_info.imageType = VK_IMAGE_TYPE_2D;
7378 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
locke-lunarg0de02522020-10-27 22:55:17 -06007379 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT |
7380 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_STORAGE_BIT;
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007381 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
7382 image_create_info.arrayLayers = 1;
7383 image_create_info.mipLevels = 1;
7384
7385 image_create_info.flags = VK_IMAGE_CREATE_PROTECTED_BIT;
7386 image_protected.init_no_mem(*m_device, image_create_info);
7387 image_protected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007388 image_views[0] = image_protected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007389
locke-lunarg0de02522020-10-27 22:55:17 -06007390 image_protected_descriptor.init_no_mem(*m_device, image_create_info);
7391 image_protected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7392 image_views_descriptor[0] = image_protected_descriptor.targetView(VK_FORMAT_R8G8B8A8_UNORM);
7393
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007394 image_create_info.flags = 0;
7395 image_unprotected.init_no_mem(*m_device, image_create_info);
7396 image_unprotected.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007397 image_views[1] = image_unprotected.targetView(VK_FORMAT_R8G8B8A8_UNORM);
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007398
locke-lunarg0de02522020-10-27 22:55:17 -06007399 image_unprotected_descriptor.init_no_mem(*m_device, image_create_info);
7400 image_unprotected_descriptor.SetLayout(VK_IMAGE_ASPECT_COLOR_BIT, VK_IMAGE_LAYOUT_GENERAL);
7401 image_views_descriptor[1] = image_unprotected_descriptor.targetView(VK_FORMAT_R8G8B8A8_UNORM);
7402
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007403 // Create protected and unproteced memory
7404 VkDeviceMemory memory_protected = VK_NULL_HANDLE;
7405 VkDeviceMemory memory_unprotected = VK_NULL_HANDLE;
7406
7407 VkMemoryAllocateInfo alloc_info = {};
7408 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
7409 alloc_info.pNext = nullptr;
7410 alloc_info.allocationSize = 0;
7411
7412 // set allocationSize to buffer as it will be larger than the image, but query image to avoid BP warning
7413 VkMemoryRequirements mem_reqs_protected;
7414 vk::GetImageMemoryRequirements(device(), image_protected.handle(), &mem_reqs_protected);
7415 vk::GetBufferMemoryRequirements(device(), buffer_protected, &mem_reqs_protected);
7416 VkMemoryRequirements mem_reqs_unprotected;
7417 vk::GetImageMemoryRequirements(device(), image_unprotected.handle(), &mem_reqs_unprotected);
7418 vk::GetBufferMemoryRequirements(device(), buffer_unprotected, &mem_reqs_unprotected);
7419
7420 // Get memory index for a protected and unprotected memory
7421 VkPhysicalDeviceMemoryProperties phys_mem_props;
7422 vk::GetPhysicalDeviceMemoryProperties(gpu(), &phys_mem_props);
7423 uint32_t memory_type_protected = phys_mem_props.memoryTypeCount + 1;
7424 uint32_t memory_type_unprotected = phys_mem_props.memoryTypeCount + 1;
7425 for (uint32_t i = 0; i < phys_mem_props.memoryTypeCount; i++) {
7426 if ((mem_reqs_unprotected.memoryTypeBits & (1 << i)) &&
7427 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT) ==
7428 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT)) {
7429 memory_type_unprotected = i;
7430 }
7431 // Check just protected bit is in type at all
7432 if ((mem_reqs_protected.memoryTypeBits & (1 << i)) &&
7433 ((phys_mem_props.memoryTypes[i].propertyFlags & VK_MEMORY_PROPERTY_PROTECTED_BIT) != 0)) {
7434 memory_type_protected = i;
7435 }
7436 }
7437 if ((memory_type_protected >= phys_mem_props.memoryTypeCount) || (memory_type_unprotected >= phys_mem_props.memoryTypeCount)) {
7438 printf("%s No valid memory type index could be found; skipped.\n", kSkipPrefix);
7439 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7440 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7441 return;
7442 }
7443
7444 alloc_info.memoryTypeIndex = memory_type_protected;
7445 alloc_info.allocationSize = mem_reqs_protected.size;
7446 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_protected);
7447
7448 alloc_info.allocationSize = mem_reqs_unprotected.size;
7449 alloc_info.memoryTypeIndex = memory_type_unprotected;
7450 vk::AllocateMemory(device(), &alloc_info, NULL, &memory_unprotected);
7451
7452 vk::BindBufferMemory(device(), buffer_protected, memory_protected, 0);
7453 vk::BindBufferMemory(device(), buffer_unprotected, memory_unprotected, 0);
7454 vk::BindImageMemory(device(), image_protected.handle(), memory_protected, 0);
7455 vk::BindImageMemory(device(), image_unprotected.handle(), memory_unprotected, 0);
7456
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007457 // A renderpass and framebuffer that contains a protected and unprotected image view
7458 VkAttachmentDescription attachments[2] = {
7459 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7460 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7461 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7462 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
7463 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
7464 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7465 };
7466 VkAttachmentReference references[2] = {{0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
7467 {1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}};
7468 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, references, nullptr, nullptr, 0, nullptr};
7469 VkSubpassDependency dependency = {0,
7470 0,
7471 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7472 VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT,
7473 VK_ACCESS_SHADER_WRITE_BIT,
7474 VK_ACCESS_SHADER_WRITE_BIT,
7475 VK_DEPENDENCY_BY_REGION_BIT};
7476 VkRenderPassCreateInfo render_pass_create_info = {
7477 VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 1, &dependency};
7478 VkRenderPass render_pass;
7479 ASSERT_VK_SUCCESS(vk::CreateRenderPass(device(), &render_pass_create_info, nullptr, &render_pass));
7480 VkFramebufferCreateInfo framebuffer_create_info = {
7481 VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, render_pass, 2, image_views, 8, 8, 1};
7482 VkFramebuffer framebuffer;
7483 ASSERT_VK_SUCCESS(vk::CreateFramebuffer(device(), &framebuffer_create_info, nullptr, &framebuffer));
7484
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007485 // Various structs used for commands
7486 VkImageSubresourceLayers image_subresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
7487 VkImageBlit blit_region = {};
7488 blit_region.srcSubresource = image_subresource;
7489 blit_region.dstSubresource = image_subresource;
7490 blit_region.srcOffsets[0] = {0, 0, 0};
7491 blit_region.srcOffsets[1] = {8, 8, 1};
7492 blit_region.dstOffsets[0] = {0, 8, 0};
7493 blit_region.dstOffsets[1] = {8, 8, 1};
7494 VkClearColorValue clear_color = {{0, 0, 0, 0}};
7495 VkImageSubresourceRange subresource_range = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
7496 VkBufferCopy buffer_copy = {0, 0, 64};
7497 VkBufferImageCopy buffer_image_copy = {};
7498 buffer_image_copy.bufferRowLength = 0;
7499 buffer_image_copy.bufferImageHeight = 0;
7500 buffer_image_copy.imageSubresource = image_subresource;
7501 buffer_image_copy.imageOffset = {0, 0, 0};
7502 buffer_image_copy.imageExtent = {1, 1, 1};
7503 buffer_image_copy.bufferOffset = 0;
7504 VkImageCopy image_copy = {};
7505 image_copy.srcSubresource = image_subresource;
7506 image_copy.srcOffset = {0, 0, 0};
7507 image_copy.dstSubresource = image_subresource;
7508 image_copy.dstOffset = {0, 0, 0};
7509 image_copy.extent = {1, 1, 1};
7510 uint32_t update_data[4] = {0, 0, 0, 0};
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007511 VkRect2D render_area = {{0, 0}, {8, 8}};
7512 VkRenderPassBeginInfo render_pass_begin = {
7513 VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, render_pass, framebuffer, render_area, 0, nullptr};
7514 VkClearAttachment clear_attachments[2] = {{VK_IMAGE_ASPECT_COLOR_BIT, 0, {m_clear_color}},
7515 {VK_IMAGE_ASPECT_COLOR_BIT, 1, {m_clear_color}}};
7516 VkClearRect clear_rect[2] = {{render_area, 0, 1}, {render_area, 0, 1}};
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007517
locke-lunarg0de02522020-10-27 22:55:17 -06007518 const char fsSource[] =
7519 "#version 450\n"
7520 "layout(set=0, binding=0) uniform foo { int x; int y; } bar;\n"
7521 "layout(set=0, binding=1, rgba8) uniform image2D si1;\n"
7522 "layout(location=0) out vec4 x;\n"
7523 "void main(){\n"
7524 " x = vec4(bar.y);\n"
7525 " imageStore(si1, ivec2(0), vec4(0));\n"
7526 "}\n";
7527 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7528
7529 CreatePipelineHelper g_pipe(*this);
7530 g_pipe.InitInfo();
7531 g_pipe.gp_ci_.renderPass = render_pass;
7532 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
7533 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7534 {1, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
7535 std::array<VkPipelineColorBlendAttachmentState, 2> color_blend_attachments;
7536 color_blend_attachments[0] = g_pipe.cb_attachments_;
7537 color_blend_attachments[1] = g_pipe.cb_attachments_;
7538 g_pipe.cb_ci_.attachmentCount = color_blend_attachments.size();
7539 g_pipe.cb_ci_.pAttachments = color_blend_attachments.data();
7540 g_pipe.InitState();
7541 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7542
7543 VkSampler sampler;
7544 VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
7545 VkResult err = vk::CreateSampler(m_device->device(), &sampler_ci, nullptr, &sampler);
7546 ASSERT_VK_SUCCESS(err);
7547
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007548 // Use protected resources in unprotected command buffer
locke-lunarg0de02522020-10-27 22:55:17 -06007549 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_protected, 1024);
7550 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[0], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7551 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
7552 g_pipe.descriptor_set_->UpdateDescriptorSets();
7553
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007554 m_commandBuffer->begin();
7555
7556 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01834");
7557 vk::CmdBlitImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7558 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7559 m_errorMonitor->VerifyFound();
7560
7561 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01835");
7562 vk::CmdBlitImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7563 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7564 m_errorMonitor->VerifyFound();
7565
7566 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01805");
7567 vk::CmdClearColorImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7568 &subresource_range);
7569 m_errorMonitor->VerifyFound();
7570
7571 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01822");
7572 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7573 m_errorMonitor->VerifyFound();
7574
7575 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01823");
7576 vk::CmdCopyBuffer(m_commandBuffer->handle(), buffer_unprotected, buffer_protected, 1, &buffer_copy);
7577 m_errorMonitor->VerifyFound();
7578
7579 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01828");
7580 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7581 &buffer_image_copy);
7582 m_errorMonitor->VerifyFound();
7583
7584 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01829");
7585 vk::CmdCopyBufferToImage(m_commandBuffer->handle(), buffer_unprotected, image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
7586 &buffer_image_copy);
7587 m_errorMonitor->VerifyFound();
7588
7589 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01825");
7590 vk::CmdCopyImage(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7591 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7592 m_errorMonitor->VerifyFound();
7593
7594 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01826");
7595 vk::CmdCopyImage(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_protected.handle(),
7596 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7597 m_errorMonitor->VerifyFound();
7598
7599 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01831");
7600 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected, 1,
7601 &buffer_image_copy);
7602 m_errorMonitor->VerifyFound();
7603
7604 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01832");
7605 vk::CmdCopyImageToBuffer(m_commandBuffer->handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_protected, 1,
7606 &buffer_image_copy);
7607 m_errorMonitor->VerifyFound();
7608
7609 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01811");
7610 vk::CmdFillBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, 0);
7611 m_errorMonitor->VerifyFound();
7612
7613 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01813");
7614 vk::CmdUpdateBuffer(m_commandBuffer->handle(), buffer_protected, 0, 4, (void *)update_data);
7615 m_errorMonitor->VerifyFound();
7616
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007617 vk::CmdBeginRenderPass(m_commandBuffer->handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7618
7619 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02504");
7620 vk::CmdClearAttachments(m_commandBuffer->handle(), 2, clear_attachments, 2, clear_rect);
7621 m_errorMonitor->VerifyFound();
7622
locke-lunarg0de02522020-10-27 22:55:17 -06007623 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7624 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7625 &g_pipe.descriptor_set_->set_, 0, nullptr);
7626 VkDeviceSize offset = 0;
7627 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 0, 1, &buffer_protected, &offset);
7628 vk::CmdBindIndexBuffer(m_commandBuffer->handle(), buffer_protected, 0, VK_INDEX_TYPE_UINT16);
7629
7630 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // color attachment
7631 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // buffer descriptorSet
7632 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // image descriptorSet
7633 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // vertex
7634 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02707"); // index
7635
7636 vk::CmdDrawIndexed(m_commandBuffer->handle(), 1, 0, 0, 0, 0);
7637 m_errorMonitor->VerifyFound();
7638
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007639 vk::CmdEndRenderPass(m_commandBuffer->handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007640 m_commandBuffer->end();
7641
7642 // Use unprotected resources in protected command buffer
locke-lunarg0de02522020-10-27 22:55:17 -06007643 g_pipe.descriptor_set_->WriteDescriptorBufferInfo(0, buffer_unprotected, 1024);
locke-lunarg5ec8ddf2020-11-25 01:05:55 -07007644 g_pipe.descriptor_set_->WriteDescriptorImageInfo(1, image_views_descriptor[1], sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
7645 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL);
locke-lunarg0de02522020-10-27 22:55:17 -06007646 g_pipe.descriptor_set_->UpdateDescriptorSets();
7647
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007648 protectedCommandBuffer.begin();
7649
7650 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBlitImage-commandBuffer-01836");
7651 vk::CmdBlitImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7652 VK_IMAGE_LAYOUT_GENERAL, 1, &blit_region, VK_FILTER_NEAREST);
7653 m_errorMonitor->VerifyFound();
7654
7655 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearColorImage-commandBuffer-01806");
7656 vk::CmdClearColorImage(protectedCommandBuffer.handle(), image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
7657 &subresource_range);
7658 m_errorMonitor->VerifyFound();
7659
7660 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBuffer-commandBuffer-01824");
7661 vk::CmdCopyBuffer(protectedCommandBuffer.handle(), buffer_protected, buffer_unprotected, 1, &buffer_copy);
7662 m_errorMonitor->VerifyFound();
7663
7664 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyBufferToImage-commandBuffer-01830");
7665 vk::CmdCopyBufferToImage(protectedCommandBuffer.handle(), buffer_protected, image_unprotected.handle(), VK_IMAGE_LAYOUT_GENERAL,
7666 1, &buffer_image_copy);
7667 m_errorMonitor->VerifyFound();
7668
7669 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImage-commandBuffer-01827");
7670 vk::CmdCopyImage(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, image_unprotected.handle(),
7671 VK_IMAGE_LAYOUT_GENERAL, 1, &image_copy);
7672 m_errorMonitor->VerifyFound();
7673
7674 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdCopyImageToBuffer-commandBuffer-01833");
7675 vk::CmdCopyImageToBuffer(protectedCommandBuffer.handle(), image_protected.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_unprotected,
7676 1, &buffer_image_copy);
7677 m_errorMonitor->VerifyFound();
7678
7679 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commandBuffer-01812");
7680 vk::CmdFillBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, 0);
7681 m_errorMonitor->VerifyFound();
7682
7683 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdUpdateBuffer-commandBuffer-01814");
7684 vk::CmdUpdateBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, 4, (void *)update_data);
7685 m_errorMonitor->VerifyFound();
7686
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007687 vk::CmdBeginRenderPass(protectedCommandBuffer.handle(), &render_pass_begin, VK_SUBPASS_CONTENTS_INLINE);
7688
7689 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdClearAttachments-commandBuffer-02505");
7690 vk::CmdClearAttachments(protectedCommandBuffer.handle(), 2, clear_attachments, 2, clear_rect);
7691 m_errorMonitor->VerifyFound();
7692
locke-lunarg0de02522020-10-27 22:55:17 -06007693 vk::CmdBindPipeline(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7694 vk::CmdBindDescriptorSets(protectedCommandBuffer.handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0,
7695 1, &g_pipe.descriptor_set_->set_, 0, nullptr);
7696 vk::CmdBindVertexBuffers(protectedCommandBuffer.handle(), 0, 1, &buffer_unprotected, &offset);
7697 vk::CmdBindIndexBuffer(protectedCommandBuffer.handle(), buffer_unprotected, 0, VK_INDEX_TYPE_UINT16);
7698
7699 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // color attachment
7700 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdDrawIndexed-commandBuffer-02712"); // descriptorSet
7701 vk::CmdDrawIndexed(protectedCommandBuffer.handle(), 1, 0, 0, 0, 0);
7702 m_errorMonitor->VerifyFound();
7703
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007704 vk::CmdEndRenderPass(protectedCommandBuffer.handle());
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007705 protectedCommandBuffer.end();
7706
sfricke-samsung96cd9932020-08-23 20:57:11 -07007707 // Try submitting together to test only 1 error occurs for the corresponding command buffer
7708 VkCommandBuffer comman_buffers[2] = {m_commandBuffer->handle(), protectedCommandBuffer.handle()};
7709
7710 VkProtectedSubmitInfo protected_submit_info = {};
7711 protected_submit_info.sType = VK_STRUCTURE_TYPE_PROTECTED_SUBMIT_INFO;
7712 protected_submit_info.pNext = nullptr;
7713
7714 VkSubmitInfo submit_info = {};
7715 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
7716 submit_info.pNext = &protected_submit_info;
7717 submit_info.commandBufferCount = 2;
7718 submit_info.pCommandBuffers = comman_buffers;
7719
7720 protected_submit_info.protectedSubmit = VK_TRUE;
Shannon McPherson2c793ba2020-08-28 12:13:24 -06007721 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04148");
sfricke-samsung96cd9932020-08-23 20:57:11 -07007722 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7723 m_errorMonitor->VerifyFound();
7724
7725 protected_submit_info.protectedSubmit = VK_FALSE;
7726 m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSubmitInfo-pNext-04120");
7727 vk::QueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
7728 m_errorMonitor->VerifyFound();
7729
sfricke-samsung2aaf66f2020-07-24 03:26:22 -07007730 vk::DestroyBuffer(device(), buffer_protected, nullptr);
7731 vk::DestroyBuffer(device(), buffer_unprotected, nullptr);
7732 vk::FreeMemory(device(), memory_protected, nullptr);
7733 vk::FreeMemory(device(), memory_unprotected, nullptr);
sfricke-samsungc1c43b02020-08-04 00:21:48 -07007734 vk::DestroyFramebuffer(device(), framebuffer, nullptr);
7735 vk::DestroyRenderPass(device(), render_pass, nullptr);
Mark Lobodzinskic2312742020-08-05 13:57:11 -06007736}
locke-lunarg6b0de702020-08-07 17:42:13 -06007737
7738TEST_F(VkLayerTest, InvailStorageAtomicOperation) {
7739 TEST_DESCRIPTION(
7740 "If storage view use atomic operation, the view's format MUST support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT or "
7741 "VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT ");
7742
7743 ASSERT_NO_FATAL_FAILURE(Init());
7744
7745 VkImageUsageFlags usage = VK_IMAGE_USAGE_STORAGE_BIT;
7746 VkFormat image_format = VK_FORMAT_R8G8B8A8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT to
7747 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7748 auto image_ci = VkImageObj::ImageCreateInfo2D(64, 64, 1, 1, image_format, usage, VK_IMAGE_TILING_OPTIMAL);
7749
7750 if (ImageFormatAndFeaturesSupported(instance(), gpu(), image_ci, VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT)) {
7751 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_IMAGE_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7752 return;
7753 }
7754
7755 VkFormat buffer_view_format =
7756 VK_FORMAT_R8_UNORM; // The format doesn't support VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT to
7757 // cause DesiredFailure. VK_FORMAT_R32_UINT is right format.
7758 if (BufferFormatAndFeaturesSupported(gpu(), buffer_view_format, VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT)) {
7759 printf("%s Cannot make VK_FORMAT_FEATURE_STORAGE_TEXEL_BUFFER_ATOMIC_BIT not supported. Skipping test.\n", kSkipPrefix);
7760 return;
7761 }
7762 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7763
7764 VkPhysicalDeviceFeatures device_features = {};
7765 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
7766 if (!device_features.vertexPipelineStoresAndAtomics || !device_features.fragmentStoresAndAtomics) {
7767 printf("%s vertexPipelineStoresAndAtomics & fragmentStoresAndAtomics NOT supported. skipped.\n", kSkipPrefix);
7768 return;
7769 }
7770
7771 VkImageObj image(m_device);
7772 image.Init(image_ci);
7773 VkImageView image_view = image.targetView(image_format);
7774
7775 VkSampler sampler = VK_NULL_HANDLE;
7776 VkSamplerCreateInfo sampler_info = SafeSaneSamplerCreateInfo();
7777 vk::CreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
7778
7779 VkBufferObj buffer;
7780 buffer.init(*m_device, 64, 0, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
7781
7782 VkBufferViewCreateInfo bvci = {};
7783 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
7784 bvci.buffer = buffer.handle();
7785 bvci.format = buffer_view_format;
7786 bvci.range = VK_WHOLE_SIZE;
7787 VkBufferView buffer_view;
7788 vk::CreateBufferView(m_device->device(), &bvci, NULL, &buffer_view);
7789
7790 char const *fsSource =
7791 "#version 450\n"
locke-lunarg76e8dee2020-08-21 13:20:02 -06007792 "layout(set=0, binding=3, rgba8) uniform image2D si0;\n "
7793 "layout(set=0, binding=2, rgba8) uniform image2D si1[2];\n "
7794 "layout(set = 0, binding = 1, r8) uniform imageBuffer stb2;\n"
7795 "layout(set = 0, binding = 0, r8) uniform imageBuffer stb3[2];\n"
locke-lunarg6b0de702020-08-07 17:42:13 -06007796 "void main() {\n"
7797 " imageAtomicExchange(si0, ivec2(0), 1);\n"
7798 " imageAtomicExchange(si1[0], ivec2(0), 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007799 " imageAtomicExchange(si1[1], ivec2(0), 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007800 " imageAtomicExchange(stb2, 0, 1);\n"
7801 " imageAtomicExchange(stb3[0], 0, 1);\n "
locke-lunarg76e8dee2020-08-21 13:20:02 -06007802 " imageAtomicExchange(stb3[1], 0, 1);\n "
locke-lunarg6b0de702020-08-07 17:42:13 -06007803 "}\n";
7804
7805 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7806 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7807
7808 CreatePipelineHelper g_pipe(*this);
7809 g_pipe.InitInfo();
7810 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
locke-lunarg76e8dee2020-08-21 13:20:02 -06007811 g_pipe.dsl_bindings_ = {{3, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7812 {2, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7813 {1, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr},
7814 {0, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
locke-lunarg6b0de702020-08-07 17:42:13 -06007815 g_pipe.InitState();
7816 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7817
locke-lunarg76e8dee2020-08-21 13:20:02 -06007818 g_pipe.descriptor_set_->WriteDescriptorImageInfo(3, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007819 VK_IMAGE_LAYOUT_GENERAL);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007820 g_pipe.descriptor_set_->WriteDescriptorImageInfo(2, image_view, sampler, VK_DESCRIPTOR_TYPE_STORAGE_IMAGE,
locke-lunarg6b0de702020-08-07 17:42:13 -06007821 VK_IMAGE_LAYOUT_GENERAL, 2);
locke-lunarg76e8dee2020-08-21 13:20:02 -06007822 g_pipe.descriptor_set_->WriteDescriptorBufferView(1, buffer_view);
7823 g_pipe.descriptor_set_->WriteDescriptorBufferView(0, buffer_view, VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER, 2);
locke-lunarg6b0de702020-08-07 17:42:13 -06007824 g_pipe.descriptor_set_->UpdateDescriptorSets();
7825
7826 m_commandBuffer->begin();
7827 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7828 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7829 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7830 &g_pipe.descriptor_set_->set_, 0, nullptr);
7831
7832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7833 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02691");
7834 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-None-MismatchAtomicBufferFeature");
7836 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7837 m_errorMonitor->VerifyFound();
7838
7839 m_commandBuffer->EndRenderPass();
7840 m_commandBuffer->end();
7841}
locke-lunargae1bbab2020-09-10 11:55:56 -06007842
7843TEST_F(VkLayerTest, DrawWithoutUpdatePushConstants) {
7844 TEST_DESCRIPTION("Not every bytes in used push constant ranges has been set before Draw ");
7845
7846 ASSERT_NO_FATAL_FAILURE(Init());
7847 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7848
7849 // push constant range: 0-99
7850 char const *const vsSource =
7851 "#version 450\n"
7852 "\n"
7853 "layout(push_constant, std430) uniform foo {\n"
7854 " bool b;\n"
7855 " float f2[3];\n"
7856 " vec3 v;\n"
7857 " vec4 v2[2];\n"
7858 " mat3 m;\n"
7859 "} constants;\n"
7860 "void func1( float f ){\n"
7861 // use the whole v2[1]. byte: 48-63.
7862 " vec2 v2 = constants.v2[1].yz;\n"
7863 "}\n"
7864 "void main(){\n"
7865 // use only v2[0].z. byte: 40-43.
7866 " func1( constants.v2[0].z);\n"
7867 // index of m is variable. The all m is used. byte: 64-99.
7868 " for(int i=1;i<2;++i) {\n"
7869 " vec3 v3 = constants.m[i]; \n"
7870 " }\n"
7871 "}\n";
7872
7873 // push constant range: 0 - 95
7874 char const *const fsSource =
7875 "#version 450\n"
7876 "\n"
7877 "struct foo1{\n"
7878 " int i[4];"
7879 "}f;\n"
7880 "layout(push_constant, std430) uniform foo {\n"
7881 " float x[2][2][2];\n"
7882 " foo1 s;\n"
7883 " foo1 ss[3];\n"
7884 "} constants;\n"
7885 "void main(){\n"
7886 // use s. byte: 32-47.
7887 " f = constants.s;\n"
7888 // use every i[3] in ss. byte: 60-63, 76-79, 92-95.
7889 " for(int i=1;i<2;++i) {\n"
7890 " int ii = constants.ss[i].i[3]; \n"
7891 " }\n"
7892 "}\n";
7893
7894 VkShaderObj const vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7895 VkShaderObj const fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7896
7897 VkPushConstantRange push_constant_range = {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 128};
7898 VkPushConstantRange push_constant_range_small = {VK_SHADER_STAGE_VERTEX_BIT, 4, 4};
7899
7900 VkPipelineLayoutCreateInfo pipeline_layout_info{
7901 VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &push_constant_range};
7902
7903 VkPipelineLayout pipeline_layout;
7904 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout);
7905
7906 CreatePipelineHelper g_pipe(*this);
7907 g_pipe.InitInfo();
7908 g_pipe.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
7909 g_pipe.pipeline_layout_ci_ = pipeline_layout_info;
7910 g_pipe.InitState();
7911 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
7912
7913 pipeline_layout_info.pPushConstantRanges = &push_constant_range_small;
7914 VkPipelineLayout pipeline_layout_small;
7915 vk::CreatePipelineLayout(m_device->device(), &pipeline_layout_info, NULL, &pipeline_layout_small);
7916
7917 CreatePipelineHelper g_pipe_small_range(*this);
7918 g_pipe_small_range.InitInfo();
7919 g_pipe_small_range.shader_stages_ = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
7920 g_pipe_small_range.pipeline_layout_ci_ = pipeline_layout_info;
7921 g_pipe_small_range.InitState();
7922
7923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-CoreValidation-Shader-PushConstantOutOfRange");
7924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "UNASSIGNED-CoreValidation-Shader-PushConstantOutOfRange");
7925 g_pipe_small_range.CreateGraphicsPipeline();
7926 m_errorMonitor->VerifyFound();
7927
7928 m_commandBuffer->begin();
7929 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7930
7931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
7932 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
7933 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
7934 &g_pipe.descriptor_set_->set_, 0, nullptr);
7935 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7936 m_errorMonitor->VerifyFound();
7937
7938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
7939 const float dummy_values[128] = {};
7940 vk::CmdPushConstants(m_commandBuffer->handle(), g_pipe.pipeline_layout_.handle(),
7941 VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 96, dummy_values);
7942 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7943 m_errorMonitor->VerifyFound();
7944
7945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02698");
7946 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout_small, VK_SHADER_STAGE_VERTEX_BIT, 4, 4, dummy_values);
7947 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7948 m_errorMonitor->VerifyFound();
7949
7950 m_errorMonitor->ExpectSuccess();
7951 vk::CmdPushConstants(m_commandBuffer->handle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 32,
7952 68, dummy_values);
7953 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7954 m_errorMonitor->VerifyNotFound();
locke-lunarg41b8c362020-10-16 23:30:12 -06007955}
7956
7957TEST_F(VkLayerTest, VerifyVertextBinding) {
7958 TEST_DESCRIPTION("Verify if VkPipelineVertexInputStateCreateInfo matches vkCmdBindVertexBuffers");
7959
7960 ASSERT_NO_FATAL_FAILURE(Init());
7961 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7962
7963 VkBufferObj vtx_buf;
7964 auto info = vtx_buf.create_info(32, VK_BUFFER_USAGE_VERTEX_BUFFER_BIT);
7965 vtx_buf.init(*m_device, info);
7966
7967 CreatePipelineHelper pipe(*this);
7968 pipe.InitInfo();
7969 // CmdBindVertexBuffers only has binding:1. It causes 04007 & 04008 desired fail.
7970 VkVertexInputBindingDescription vtx_binding_des[3] = {
7971 {0, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {1, 64, VK_VERTEX_INPUT_RATE_VERTEX}, {2, 64, VK_VERTEX_INPUT_RATE_VERTEX}};
7972
7973 // CmdBindVertexBuffers only has binding:1. It causes twice 02721 desired fail.
7974 // Plus, binding:1's offset is wrong. It causes 02721 desired fail, again.
7975 VkVertexInputAttributeDescription vtx_attri_des[3] = {{0, 0, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
7976 {1, 1, VK_FORMAT_R32G32B32A32_SFLOAT, 10},
7977 {2, 2, VK_FORMAT_R32G32B32A32_SFLOAT, 10}};
7978 pipe.vi_ci_.vertexBindingDescriptionCount = 3;
7979 pipe.vi_ci_.pVertexBindingDescriptions = vtx_binding_des;
7980 pipe.vi_ci_.vertexAttributeDescriptionCount = 3;
7981 pipe.vi_ci_.pVertexAttributeDescriptions = vtx_attri_des;
7982 pipe.InitState();
7983 pipe.CreateGraphicsPipeline();
7984
7985 m_commandBuffer->begin();
7986 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
7987 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
7988 VkDeviceSize offset = 0;
7989 vk::CmdBindVertexBuffers(m_commandBuffer->handle(), 1, 1, &vtx_buf.handle(), &offset);
7990
7991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04008");
7992 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-04007");
7993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
7994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
7995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02721");
7996 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
7997 m_errorMonitor->VerifyFound();
locke-lunargae1bbab2020-09-10 11:55:56 -06007998
7999 m_commandBuffer->EndRenderPass();
8000 m_commandBuffer->end();
8001}
locke-lunargd7a08e92020-10-21 00:24:00 -06008002
8003TEST_F(VkLayerTest, VerifyDynamicStateSettingCommands) {
8004 TEST_DESCRIPTION("Verify if pipeline doesn't setup dynamic state, but set dynamic commands");
8005 ASSERT_NO_FATAL_FAILURE(Init());
8006 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8007
8008 CreatePipelineHelper pipe(*this);
8009 pipe.InitInfo();
8010
8011 std::vector<VkDynamicState> dyn_states = {VK_DYNAMIC_STATE_VIEWPORT};
8012
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008013 auto dyn_state_ci = LvlInitStruct<VkPipelineDynamicStateCreateInfo>();
locke-lunargd7a08e92020-10-21 00:24:00 -06008014 dyn_state_ci.dynamicStateCount = static_cast<uint32_t>(dyn_states.size());
8015 dyn_state_ci.pDynamicStates = dyn_states.data();
8016 pipe.dyn_state_ci_ = dyn_state_ci;
8017 pipe.InitState();
8018 pipe.CreateGraphicsPipeline();
8019
8020 m_commandBuffer->begin();
8021 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8022 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8023
8024 VkViewport viewport = {0, 0, 16, 16, 0, 1};
8025 vk::CmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
8026 VkRect2D scissor = {{0, 0}, {16, 16}};
8027 vk::CmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
8028 vk::CmdSetLineWidth(m_commandBuffer->handle(), 1);
8029
8030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02859");
8031 vk::CmdDraw(m_commandBuffer->handle(), 1, 0, 0, 0);
8032 m_errorMonitor->VerifyFound();
8033
8034 m_commandBuffer->EndRenderPass();
8035 m_commandBuffer->end();
8036}
locke-lunarg0de02522020-10-27 22:55:17 -06008037
8038TEST_F(VkLayerTest, VerifyFilterCubicSamplerInCmdDraw) {
8039 TEST_DESCRIPTION("Verify if sampler is filter cubic, image view needs to support it.");
8040 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8041 if (version < VK_API_VERSION_1_1) {
8042 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8043 return;
8044 }
8045 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8046
8047 if (DeviceExtensionSupported(gpu(), nullptr, VK_EXT_FILTER_CUBIC_EXTENSION_NAME)) {
8048 m_device_extension_names.push_back(VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8049 } else {
8050 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_EXT_FILTER_CUBIC_EXTENSION_NAME);
8051 return;
8052 }
8053
8054 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8055 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8056
8057 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8058 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
sfricke-samsung715e3d12020-12-01 22:45:49 -08008059
8060 VkFormatProperties format_props;
8061 vk::GetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &format_props);
8062 if ((format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_FILTER_CUBIC_BIT_EXT) == 0) {
8063 printf("%s SAMPLED_IMAGE_FILTER_CUBIC_BIT for format is not supported.\n", kSkipPrefix);
8064 return;
8065 }
8066
locke-lunarg0de02522020-10-27 22:55:17 -06008067 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8068 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8069
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008070 auto imageview_format_info = LvlInitStruct<VkPhysicalDeviceImageViewImageFormatInfoEXT>();
locke-lunarg0de02522020-10-27 22:55:17 -06008071 imageview_format_info.imageViewType = imageViewType;
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008072 auto image_format_info = LvlInitStruct<VkPhysicalDeviceImageFormatInfo2>(&imageview_format_info);
locke-lunarg0de02522020-10-27 22:55:17 -06008073 image_format_info.type = image_ci.imageType;
8074 image_format_info.format = image_ci.format;
8075 image_format_info.tiling = image_ci.tiling;
8076 image_format_info.usage = image_ci.usage;
8077 image_format_info.flags = image_ci.flags;
8078
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008079 auto filter_cubic_props = LvlInitStruct<VkFilterCubicImageViewImageFormatPropertiesEXT>();
8080 auto image_format_properties = LvlInitStruct<VkImageFormatProperties2>(&filter_cubic_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008081
8082 vk::GetPhysicalDeviceImageFormatProperties2(gpu(), &image_format_info, &image_format_properties);
8083
8084 if (filter_cubic_props.filterCubic || filter_cubic_props.filterCubicMinmax) {
8085 printf("%s Image and ImageView supports filter cubic ; skipped.\n", kSkipPrefix);
8086 return;
8087 }
8088
8089 VkImageObj image(m_device);
8090 image.Init(image_ci);
8091 VkImageView imageView = image.targetView(format, imageViewType);
8092
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008093 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008094 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8095 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8096 VkSampler sampler;
8097 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8098
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008099 auto reduction_mode_ci = LvlInitStruct<VkSamplerReductionModeCreateInfo>();
locke-lunarg0de02522020-10-27 22:55:17 -06008100 reduction_mode_ci.reductionMode = VK_SAMPLER_REDUCTION_MODE_MIN;
8101 sampler_ci.pNext = &reduction_mode_ci;
8102 VkSampler sampler_rediction;
8103 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler_rediction);
8104
8105 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8106
8107 CreatePipelineHelper g_pipe(*this);
8108 g_pipe.InitInfo();
8109 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8110 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8111 g_pipe.InitState();
8112 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8113
8114 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler_rediction);
8115 g_pipe.descriptor_set_->UpdateDescriptorSets();
8116
8117 m_commandBuffer->begin();
8118 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8119 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8120 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8121 &g_pipe.descriptor_set_->set_, 0, nullptr);
8122
8123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubicMinmax-02695");
8124 m_commandBuffer->Draw(1, 0, 0, 0);
8125 m_errorMonitor->VerifyFound();
8126
8127 m_commandBuffer->EndRenderPass();
8128 m_commandBuffer->end();
8129 m_commandBuffer->reset();
8130
8131 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8132 g_pipe.descriptor_set_->UpdateDescriptorSets();
8133
8134 m_commandBuffer->begin();
8135 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8136 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8137 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8138 &g_pipe.descriptor_set_->set_, 0, nullptr);
8139
8140 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-filterCubic-02694");
8141 m_commandBuffer->Draw(1, 0, 0, 0);
8142 m_errorMonitor->VerifyFound();
8143
8144 m_commandBuffer->EndRenderPass();
8145 m_commandBuffer->end();
8146}
8147
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008148TEST_F(VkLayerTest, VerifyImgFilterCubicSamplerInCmdDraw) {
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008149 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 -07008150 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8151
8152 if (DeviceExtensionSupported(gpu(), nullptr, VK_IMG_FILTER_CUBIC_EXTENSION_NAME)) {
8153 m_device_extension_names.push_back(VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8154 } else {
8155 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_IMG_FILTER_CUBIC_EXTENSION_NAME);
8156 return;
8157 }
8158
8159 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
8160 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8161
8162 VkImageUsageFlags usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
8163 VkFormat format = VK_FORMAT_R8G8B8A8_UNORM;
8164 auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, format, usage, VK_IMAGE_TILING_OPTIMAL);
8165 VkImageViewType imageViewType = VK_IMAGE_VIEW_TYPE_2D;
8166
8167 VkImageObj image(m_device);
8168 image.Init(image_ci);
8169 VkImageView imageView = image.targetView(format, VK_IMAGE_ASPECT_COLOR_BIT, 0, VK_REMAINING_MIP_LEVELS, 0,
8170 VK_REMAINING_ARRAY_LAYERS, imageViewType);
8171
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008172 auto sampler_ci = LvlInitStruct<VkSamplerCreateInfo>();
Mark Lobodzinski28168c52020-12-01 14:25:05 -07008173 sampler_ci.minFilter = VK_FILTER_CUBIC_EXT;
8174 sampler_ci.magFilter = VK_FILTER_CUBIC_EXT;
8175 VkSampler sampler;
8176 vk::CreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
8177
8178 VkShaderObj fs(m_device, bindStateFragSamplerShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8179
8180 CreatePipelineHelper g_pipe(*this);
8181 g_pipe.InitInfo();
8182 g_pipe.shader_stages_ = {g_pipe.vs_->GetStageCreateInfo(), fs.GetStageCreateInfo()};
8183 g_pipe.dsl_bindings_ = {{0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr}};
8184 g_pipe.InitState();
8185 ASSERT_VK_SUCCESS(g_pipe.CreateGraphicsPipeline());
8186
8187 g_pipe.descriptor_set_->WriteDescriptorImageInfo(0, imageView, sampler);
8188 g_pipe.descriptor_set_->UpdateDescriptorSets();
8189
8190 m_commandBuffer->begin();
8191 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8192 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_);
8193 vk::CmdBindDescriptorSets(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe.pipeline_layout_.handle(), 0, 1,
8194 &g_pipe.descriptor_set_->set_, 0, nullptr);
8195
8196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-None-02693");
8197 m_commandBuffer->Draw(1, 0, 0, 0);
8198 m_errorMonitor->VerifyFound();
8199
8200 m_commandBuffer->EndRenderPass();
8201 m_commandBuffer->end();
8202}
8203
locke-lunarg0de02522020-10-27 22:55:17 -06008204TEST_F(VkLayerTest, VerifyMaxMultiviewInstanceIndex) {
8205 TEST_DESCRIPTION("Verify if instance index in CmdDraw is greater than maxMultiviewInstanceIndex.");
8206 uint32_t version = SetTargetApiVersion(VK_API_VERSION_1_1);
8207 if (version < VK_API_VERSION_1_1) {
8208 printf("%s At least Vulkan version 1.1 is required, skipping test.\n", kSkipPrefix);
8209 return;
8210 }
8211 if (InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME)) {
8212 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8213 } else {
8214 printf("%s Did not find required instance extension %s; skipped.\n", kSkipPrefix,
8215 VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8216 return;
8217 }
8218 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8219
8220 if (DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME)) {
8221 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8222 } else {
8223 printf("%s %s Extension not supported, skipping tests\n", kSkipPrefix, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8224 return;
8225 }
8226
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008227 auto multiview_features = LvlInitStruct<VkPhysicalDeviceMultiviewFeatures>();
locke-lunarg0de02522020-10-27 22:55:17 -06008228 multiview_features.multiview = VK_TRUE;
8229 VkPhysicalDeviceFeatures2 pd_features2 = {};
8230 pd_features2.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8231 pd_features2.pNext = &multiview_features;
8232
8233 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &pd_features2));
8234 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8235
8236 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8237 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8238 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008239 auto multiview_props = LvlInitStruct<VkPhysicalDeviceMultiviewProperties>();
8240 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&multiview_props);
locke-lunarg0de02522020-10-27 22:55:17 -06008241 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8242 if (multiview_props.maxMultiviewInstanceIndex == std::numeric_limits<uint32_t>::max()) {
8243 printf("%s maxMultiviewInstanceIndex is uint32_t max, skipping tests\n", kSkipPrefix);
8244 return;
8245 }
8246 CreatePipelineHelper pipe(*this);
8247 pipe.InitInfo();
8248 pipe.InitState();
8249 pipe.CreateGraphicsPipeline();
8250
8251 m_commandBuffer->begin();
8252 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8253 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.pipeline_);
8254
8255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdDraw-maxMultiviewInstanceIndex-02688");
8256 m_commandBuffer->Draw(1, multiview_props.maxMultiviewInstanceIndex + 1, 0, 0);
8257 m_errorMonitor->VerifyFound();
8258
8259 m_commandBuffer->EndRenderPass();
8260 m_commandBuffer->end();
8261}
Tobias Hector04f2ab22020-12-01 10:59:33 +00008262
8263TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValues) {
8264 TEST_DESCRIPTION("Specify invalid fragment shading rate values");
8265
8266 // Enable KHR_fragment_shading_rate and all of its required extensions
8267 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8268 if (fsr_extensions) {
8269 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8270 }
8271 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8272
8273 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8274 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8275 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8276 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8277 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8278 if (fsr_extensions) {
8279 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8280 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8281 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8282 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8283 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8284 } else {
8285 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8286 return;
8287 }
8288
8289 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = {};
8290 fsr_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FRAGMENT_SHADING_RATE_FEATURES_KHR;
8291 fsr_features.pipelineFragmentShadingRate = true;
8292
8293 VkPhysicalDeviceFeatures2 device_features = {};
8294 device_features.sType = VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_FEATURES_2;
8295 device_features.pNext = &fsr_features;
8296
8297 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &device_features));
8298
8299 // Find address of extension call and make the call
8300 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8301 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8302 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8303
8304 VkExtent2D fragmentSize = {1, 1};
8305 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8306 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8307
8308 m_commandBuffer->begin();
8309 fragmentSize.width = 0;
8310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04513");
8311 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8312 m_errorMonitor->VerifyFound();
8313 fragmentSize.width = 1;
8314
8315 fragmentSize.height = 0;
8316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04514");
8317 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8318 m_errorMonitor->VerifyFound();
8319 fragmentSize.height = 1;
8320
8321 fragmentSize.width = 3;
8322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04515");
8323 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8324 m_errorMonitor->VerifyFound();
8325 fragmentSize.width = 1;
8326
8327 fragmentSize.height = 3;
8328 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04516");
8329 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8330 m_errorMonitor->VerifyFound();
8331 fragmentSize.height = 1;
8332
8333 fragmentSize.width = 8;
8334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04517");
8335 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8336 m_errorMonitor->VerifyFound();
8337 fragmentSize.width = 1;
8338
8339 fragmentSize.height = 8;
8340 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VUID-vkCmdSetFragmentShadingRateKHR-pFragmentSize-04518");
8341 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8342 m_errorMonitor->VerifyFound();
8343 fragmentSize.height = 1;
8344 m_commandBuffer->end();
8345}
8346
8347TEST_F(VkLayerTest, InvalidSetFragmentShadingRateValuesNoFeatures) {
8348 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8349
8350 // Enable KHR_fragment_shading_rate and all of its required extensions
8351 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8352 if (fsr_extensions) {
8353 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8354 }
8355 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8356
8357 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8358 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8359 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8360 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8361 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8362 if (fsr_extensions) {
8363 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8364 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8365 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8366 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8367 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8368 } else {
8369 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8370 return;
8371 }
8372
8373 ASSERT_NO_FATAL_FAILURE(InitState());
8374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8375
8376 // Find address of extension call and make the call
8377 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8378 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8379 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8380
8381 VkExtent2D fragmentSize = {1, 1};
8382 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8383 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8384
8385 m_commandBuffer->begin();
8386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8387 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04509");
8388 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8389 m_errorMonitor->VerifyFound();
8390 m_commandBuffer->end();
8391}
8392
8393TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoFeatures) {
8394 TEST_DESCRIPTION("Specify combiner operations when only pipeline rate is supported");
8395
8396 // Enable KHR_fragment_shading_rate and all of its required extensions
8397 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8398 if (fsr_extensions) {
8399 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8400 }
8401 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8402
8403 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8404 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8405 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8406 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8407 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8408 if (fsr_extensions) {
8409 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8410 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8411 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8412 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8413 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8414 } else {
8415 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8416 return;
8417 }
8418
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008419 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8420 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008421
8422 fsr_features.pipelineFragmentShadingRate = VK_TRUE;
8423 fsr_features.primitiveFragmentShadingRate = VK_FALSE;
8424 fsr_features.attachmentFragmentShadingRate = VK_FALSE;
8425
8426 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8428
8429 // Find address of extension call and make the call
8430 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8431 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8432 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8433
8434 VkExtent2D fragmentSize = {1, 1};
8435 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8436 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8437
8438 m_commandBuffer->begin();
8439
8440 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8442 "VUID-vkCmdSetFragmentShadingRateKHR-primitiveFragmentShadingRate-04510");
8443 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8444 m_errorMonitor->VerifyFound();
8445 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8446
8447 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_REPLACE_KHR;
8448 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8449 "VUID-vkCmdSetFragmentShadingRateKHR-attachmentFragmentShadingRate-04511");
8450 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8451 m_errorMonitor->VerifyFound();
8452 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8453
8454 m_commandBuffer->end();
8455}
8456
8457TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsNoPipelineRate) {
8458 TEST_DESCRIPTION("Specify pipeline rate when only attachment or primitive rate are supported");
8459
8460 // Enable KHR_fragment_shading_rate and all of its required extensions
8461 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8462 if (fsr_extensions) {
8463 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8464 }
8465 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8466
8467 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8468 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8469 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8470 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8471 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8472 if (fsr_extensions) {
8473 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8474 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8475 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8476 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8477 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8478 } else {
8479 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8480 return;
8481 }
8482
8483 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8484 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8485 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008486 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8487 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008488 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8489
8490 if (fsr_features.attachmentFragmentShadingRate == VK_FALSE && fsr_features.primitiveFragmentShadingRate == VK_FALSE) {
8491 printf("%s requires attachmentFragmentShadingRate or primitiveFragmentShadingRate.\n", kSkipPrefix);
8492 return;
8493 }
8494
8495 fsr_features.pipelineFragmentShadingRate = VK_FALSE;
8496
8497 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8498 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8499
8500 // Find address of extension call and make the call
8501 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8502 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8503 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8504
8505 VkExtent2D fragmentSize = {1, 1};
8506 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8507 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8508
8509 m_commandBuffer->begin();
8510 fragmentSize.width = 2;
8511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8512 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04507");
8513 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8514 m_errorMonitor->VerifyFound();
8515 fragmentSize.width = 1;
8516
8517 fragmentSize.height = 2;
8518 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8519 "VUID-vkCmdSetFragmentShadingRateKHR-pipelineFragmentShadingRate-04508");
8520 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8521 m_errorMonitor->VerifyFound();
8522 fragmentSize.height = 1;
8523}
8524
8525TEST_F(VkLayerTest, InvalidSetFragmentShadingRateCombinerOpsLimit) {
8526 TEST_DESCRIPTION("Specify invalid fsr pipeline settings for the enabled features");
8527
8528 // Enable KHR_fragment_shading_rate and all of its required extensions
8529 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8530 if (fsr_extensions) {
8531 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8532 }
8533 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8534
8535 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8536 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8537 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8538 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8539 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8540 if (fsr_extensions) {
8541 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8542 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8543 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8544 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8545 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8546 } else {
8547 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8548 return;
8549 }
8550
8551 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8552 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8553 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8554 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008555 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8556 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008557 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8558
8559 if (fsr_properties.fragmentShadingRateNonTrivialCombinerOps) {
8560 printf("%s requires fragmentShadingRateNonTrivialCombinerOps to be unsupported.\n", kSkipPrefix);
8561 return;
8562 }
8563
8564 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8565 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8566 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008567 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features = LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>();
8568 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008569 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8570
8571 if (!fsr_features.primitiveFragmentShadingRate && !fsr_features.attachmentFragmentShadingRate) {
8572 printf("%s requires primitiveFragmentShadingRate or attachmentFragmentShadingRate to be supported.\n", kSkipPrefix);
8573 return;
8574 }
8575
8576 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8578
8579 // Find address of extension call and make the call
8580 PFN_vkCmdSetFragmentShadingRateKHR vkCmdSetFragmentShadingRateKHR =
8581 (PFN_vkCmdSetFragmentShadingRateKHR)vk::GetDeviceProcAddr(m_device->device(), "vkCmdSetFragmentShadingRateKHR");
8582 ASSERT_TRUE(vkCmdSetFragmentShadingRateKHR != nullptr);
8583
8584 VkExtent2D fragmentSize = {1, 1};
8585 VkFragmentShadingRateCombinerOpKHR combinerOps[2] = {VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR,
8586 VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR};
8587
8588 m_commandBuffer->begin();
8589 if (fsr_features.primitiveFragmentShadingRate) {
8590 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8591 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8592 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8593 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8594 m_errorMonitor->VerifyFound();
8595 combinerOps[0] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8596 }
8597
8598 if (fsr_features.attachmentFragmentShadingRate) {
8599 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_MUL_KHR;
8600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8601 "VUID-vkCmdSetFragmentShadingRateKHR-fragmentSizeNonTrivialCombinerOps-04512");
8602 vkCmdSetFragmentShadingRateKHR(m_commandBuffer->handle(), &fragmentSize, combinerOps);
8603 m_errorMonitor->VerifyFound();
8604 combinerOps[1] = VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR;
8605 }
8606 m_commandBuffer->end();
8607}
8608
8609TEST_F(VkLayerTest, InvalidPrimitiveFragmentShadingRateWriteMultiViewportLimitDynamic) {
8610 TEST_DESCRIPTION("Test dynamic validation of the primitiveFragmentShadingRateWithMultipleViewports limit");
8611
8612 // Enable KHR_fragment_shading_rate and all of its required extensions
8613 bool fsr_extensions = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8614 if (fsr_extensions) {
8615 m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
8616 }
8617 ASSERT_NO_FATAL_FAILURE(InitFramework(m_errorMonitor));
8618
8619 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8620 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8621 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_MULTIVIEW_EXTENSION_NAME);
8622 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8623 fsr_extensions = fsr_extensions && DeviceExtensionSupported(gpu(), nullptr, VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8624 if (fsr_extensions) {
8625 m_device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
8626 m_device_extension_names.push_back(VK_KHR_MAINTENANCE2_EXTENSION_NAME);
8627 m_device_extension_names.push_back(VK_KHR_MULTIVIEW_EXTENSION_NAME);
8628 m_device_extension_names.push_back(VK_KHR_CREATE_RENDERPASS_2_EXTENSION_NAME);
8629 m_device_extension_names.push_back(VK_KHR_FRAGMENT_SHADING_RATE_EXTENSION_NAME);
8630 } else {
8631 printf("%s requires VK_KHR_fragment_shading_rate.\n", kSkipPrefix);
8632 return;
8633 }
8634
8635 bool eds_extension = DeviceExtensionSupported(gpu(), nullptr, VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8636 if (eds_extension) {
8637 m_device_extension_names.push_back(VK_EXT_EXTENDED_DYNAMIC_STATE_EXTENSION_NAME);
8638 } else {
8639 printf("%s requires VK_EXT_extended_dynamic_state.\n", kSkipPrefix);
8640 return;
8641 }
8642
8643 PFN_vkGetPhysicalDeviceProperties2KHR vkGetPhysicalDeviceProperties2KHR =
8644 (PFN_vkGetPhysicalDeviceProperties2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceProperties2KHR");
8645 ASSERT_TRUE(vkGetPhysicalDeviceProperties2KHR != nullptr);
8646 VkPhysicalDeviceFragmentShadingRatePropertiesKHR fsr_properties =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008647 LvlInitStruct<VkPhysicalDeviceFragmentShadingRatePropertiesKHR>();
8648 VkPhysicalDeviceProperties2KHR properties2 = LvlInitStruct<VkPhysicalDeviceProperties2KHR>(&fsr_properties);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008649 vkGetPhysicalDeviceProperties2KHR(gpu(), &properties2);
8650
8651 if (fsr_properties.primitiveFragmentShadingRateWithMultipleViewports) {
8652 printf("%s requires primitiveFragmentShadingRateWithMultipleViewports to be unsupported.\n", kSkipPrefix);
8653 return;
8654 }
8655
8656 PFN_vkGetPhysicalDeviceFeatures2KHR vkGetPhysicalDeviceFeatures2KHR =
8657 (PFN_vkGetPhysicalDeviceFeatures2KHR)vk::GetInstanceProcAddr(instance(), "vkGetPhysicalDeviceFeatures2KHR");
8658 ASSERT_TRUE(vkGetPhysicalDeviceFeatures2KHR != nullptr);
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008659 VkPhysicalDeviceExtendedDynamicStateFeaturesEXT eds_features = LvlInitStruct<VkPhysicalDeviceExtendedDynamicStateFeaturesEXT>();
Tobias Hector04f2ab22020-12-01 10:59:33 +00008660 VkPhysicalDeviceFragmentShadingRateFeaturesKHR fsr_features =
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008661 LvlInitStruct<VkPhysicalDeviceFragmentShadingRateFeaturesKHR>(&eds_features);
8662 VkPhysicalDeviceFeatures2KHR features2 = LvlInitStruct<VkPhysicalDeviceFeatures2KHR>(&fsr_features);
Tobias Hector04f2ab22020-12-01 10:59:33 +00008663 vkGetPhysicalDeviceFeatures2KHR(gpu(), &features2);
8664
8665 if (!fsr_features.primitiveFragmentShadingRate) {
8666 printf("%s requires primitiveFragmentShadingRate to be supported.\n", kSkipPrefix);
8667 return;
8668 }
8669
8670 if (!features2.features.multiViewport) {
8671 printf("%s requires multiViewport to be supported.\n", kSkipPrefix);
8672 return;
8673 }
8674
8675 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, &features2));
8676 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8677
8678 char const *vsSource =
8679 "#version 450\n"
8680 "#extension GL_EXT_fragment_shading_rate : enable\n"
8681 "void main() {\n"
8682 " gl_PrimitiveShadingRateEXT = gl_ShadingRateFlag4VerticalPixelsEXT | gl_ShadingRateFlag4HorizontalPixelsEXT;\n"
8683 "}\n";
8684
8685 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
8686 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8687
8688 VkPipelineObj pipe(m_device);
8689 pipe.AddShader(&vs);
8690 pipe.AddShader(&fs);
8691 pipe.AddDefaultColorAttachment();
8692 pipe.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT_WITH_COUNT_EXT);
8693
8694 std::vector<VkRect2D> scissors = {{{0, 0}, {16, 16}}, {{1, 1}, {16, 16}}};
8695 pipe.SetScissor(scissors);
8696
8697 const VkPipelineLayoutObj pl(m_device);
8698
8699 VkResult err = pipe.CreateVKPipeline(pl.handle(), renderPass());
8700 ASSERT_VK_SUCCESS(err);
8701
8702 m_commandBuffer->begin();
8703 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8704
8705 vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
8706
8707 VkViewport viewports[] = {{0, 0, 16, 16, 0, 1}, {1, 1, 16, 16, 0, 1}};
8708 PFN_vkCmdSetViewportWithCountEXT vkCmdSetViewportWithCountEXT =
8709 (PFN_vkCmdSetViewportWithCountEXT)vk::GetDeviceProcAddr(device(), "vkCmdSetViewportWithCountEXT");
8710 vkCmdSetViewportWithCountEXT(m_commandBuffer->handle(), 2, viewports);
8711
8712 // error produced here.
8713 vk::CmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
8714
8715 m_errorMonitor->VerifyFound();
8716
8717 m_commandBuffer->EndRenderPass();
8718 m_commandBuffer->end();
Mark Lobodzinski07d0a612020-12-30 15:42:31 -07008719}