| 24 | class NegativeImage : public ImageTest {}; |
| 25 | |
| 26 | TEST_F(NegativeImage, UsageBits) { |
| 27 | TEST_DESCRIPTION( |
| 28 | "Specify wrong usage for image then create conflicting view of image Initialize buffer with wrong usage then perform copy " |
| 29 | "expecting errors from both the image and the buffer (2 calls)"); |
| 30 | |
| 31 | AddOptionalExtensions(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME); |
| 32 | RETURN_IF_SKIP(Init()); |
| 33 | const bool copy_commands2 = IsExtensionsEnabled(VK_KHR_COPY_COMMANDS_2_EXTENSION_NAME); |
| 34 | |
| 35 | auto format = FindSupportedDepthStencilFormat(Gpu()); |
| 36 | // Initialize image with transfer source usage |
| 37 | vkt::Image image(*m_device, 128, 128, format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT); |
| 38 | |
| 39 | VkImageViewCreateInfo dsvci = vku::InitStructHelper(); |
| 40 | dsvci.image = image; |
| 41 | dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D; |
| 42 | dsvci.format = format; |
| 43 | dsvci.subresourceRange = {VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT, 0, 1, 0, 1}; |
| 44 | |
| 45 | // Create a view with depth / stencil aspect for image with different usage |
| 46 | CreateImageViewTest(dsvci, "VUID-VkImageViewCreateInfo-image-04441"); |
| 47 | |
| 48 | // Initialize buffer with TRANSFER_DST usage |
| 49 | vkt::Buffer buffer(*m_device, 128 * 128, VK_BUFFER_USAGE_TRANSFER_DST_BIT); |
| 50 | VkBufferImageCopy region = {}; |
| 51 | region.bufferRowLength = 128; |
| 52 | region.bufferImageHeight = 128; |
| 53 | region.imageSubresource = {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 0, 1}; |
| 54 | region.imageExtent = {16, 16, 1}; |
| 55 | |
| 56 | // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST |
| 57 | m_command_buffer.Begin(); |
| 58 | |
| 59 | // two separate errors from this call: |
| 60 | m_errorMonitor->SetDesiredError("VUID-vkCmdCopyBufferToImage-dstImage-00177"); |
| 61 | m_errorMonitor->SetDesiredError("VUID-vkCmdCopyBufferToImage-srcBuffer-00174"); |
| 62 | |
| 63 | vk::CmdCopyBufferToImage(m_command_buffer, buffer, image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); |
| 64 | m_errorMonitor->VerifyFound(); |
| 65 | |
| 66 | // equvalent test using using KHR_copy_commands2 |
| 67 | if (copy_commands2) { |
| 68 | const VkBufferImageCopy2 region2 = {VK_STRUCTURE_TYPE_BUFFER_IMAGE_COPY_2, |
| 69 | NULL, |
| 70 | region.bufferRowLength, |
| 71 | region.bufferImageHeight, |
| 72 | region.bufferImageHeight, |
| 73 | region.imageSubresource, |
| 74 | region.imageOffset, |
| 75 | region.imageExtent}; |
| 76 | VkCopyBufferToImageInfo2 buffer_to_image_info2 = {VK_STRUCTURE_TYPE_COPY_BUFFER_TO_IMAGE_INFO_2, NULL, buffer, image, |
| 77 | VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion2}; |
| 78 | // two separate errors from this call: |
| 79 | m_errorMonitor->SetDesiredError("VUID-VkCopyBufferToImageInfo2-dstImage-00177"); |
| 80 | m_errorMonitor->SetDesiredError("VUID-VkCopyBufferToImageInfo2-srcBuffer-00174"); |
| 81 | vk::CmdCopyBufferToImage2KHR(m_command_buffer, &buffer_to_image_info2); |
| 82 | m_errorMonitor->VerifyFound(); |
| 83 | } |
nothing calls this directly
no test coverage detected