layers: Reenable fix for DS layout transitions
Fix for GH650, plus added fix for cube/tri.
Change-Id: I66c2332c30eb34a0f022c033efd9b1c5b8284c32
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 7ef8562..9984dc3 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -4095,145 +4095,144 @@
vkDestroyImageView(m_device->device(), view, nullptr);
}
-// TODO : Re-enable this test when DS-layout workaround is fixed
-//TEST_F(VkLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
-// TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
-// "is used as a depth/stencil framebuffer attachment, the "
-// "aspectMask is ignored and both depth and stencil image "
-// "subresources are used.");
-//
-// VkFormatProperties format_properties;
-// vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT,
-// &format_properties);
-// if (!(format_properties.optimalTilingFeatures &
-// VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
-// return;
-// }
-//
-// m_errorMonitor->ExpectSuccess();
-//
-// ASSERT_NO_FATAL_FAILURE(InitState());
-//
-// VkAttachmentDescription attachment = {
-// 0,
-// VK_FORMAT_D32_SFLOAT_S8_UINT,
-// VK_SAMPLE_COUNT_1_BIT,
-// VK_ATTACHMENT_LOAD_OP_DONT_CARE,
-// VK_ATTACHMENT_STORE_OP_STORE,
-// VK_ATTACHMENT_LOAD_OP_DONT_CARE,
-// VK_ATTACHMENT_STORE_OP_DONT_CARE,
-// VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
-// VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
-//
-// VkAttachmentReference att_ref = {
-// 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
-//
-// VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
-// 0, nullptr,
-// 0, nullptr,
-// nullptr, &att_ref,
-// 0, nullptr};
-//
-// VkSubpassDependency dep = {0,
-// 0,
-// VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
-// VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
-// VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-// VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
-// VK_DEPENDENCY_BY_REGION_BIT};
-//
-// VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
-// nullptr,
-// 0,
-// 1,
-// &attachment,
-// 1,
-// &subpass,
-// 1,
-// &dep};
-//
-// VkResult err;
-// VkRenderPass rp;
-// err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
-// ASSERT_VK_SUCCESS(err);
-//
-// VkImageObj image(m_device);
-// image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
-// 0x26, // usage
-// VK_IMAGE_TILING_OPTIMAL, 0);
-// ASSERT_TRUE(image.initialized());
-// image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
-//
-// VkImageViewCreateInfo ivci = {
-// VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
-// nullptr,
-// 0,
-// image.handle(),
-// VK_IMAGE_VIEW_TYPE_2D,
-// VK_FORMAT_D32_SFLOAT_S8_UINT,
-// {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B,
-// VK_COMPONENT_SWIZZLE_A},
-// {0x2, 0, 1, 0, 1},
-// };
-// VkImageView view;
-// err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
-// ASSERT_VK_SUCCESS(err);
-//
-// VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
-// nullptr,
-// 0,
-// rp,
-// 1,
-// &view,
-// 32,
-// 32,
-// 1};
-// VkFramebuffer fb;
-// err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
-// ASSERT_VK_SUCCESS(err);
-//
-// VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
-// nullptr,
-// rp,
-// fb,
-// {{0, 0}, {32, 32}},
-// 0,
-// nullptr};
-// BeginCommandBuffer();
-// vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
-// VK_SUBPASS_CONTENTS_INLINE);
-//
-// VkImageMemoryBarrier imb = {};
-// imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
-// imb.pNext = nullptr;
-// imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
-// imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
-// imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
-// imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
-// imb.srcQueueFamilyIndex = 0;
-// imb.dstQueueFamilyIndex = 0;
-// imb.image = image.handle();
-// imb.subresourceRange.aspectMask = 0x6;
-// imb.subresourceRange.baseMipLevel = 0;
-// imb.subresourceRange.levelCount = 0x1;
-// imb.subresourceRange.baseArrayLayer = 0;
-// imb.subresourceRange.layerCount = 0x1;
-//
-// vkCmdPipelineBarrier(m_commandBuffer->handle(),
-// VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
-// VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
-// VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
-// &imb);
-//
-// vkCmdEndRenderPass(m_commandBuffer->handle());
-// EndCommandBuffer();
-// QueueCommandBuffer(false);
-// m_errorMonitor->VerifyNotFound();
-//
-// vkDestroyFramebuffer(m_device->device(), fb, nullptr);
-// vkDestroyRenderPass(m_device->device(), rp, nullptr);
-// vkDestroyImageView(m_device->device(), view, nullptr);
-//}
+TEST_F(VkLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
+ TEST_DESCRIPTION("Validate that when an imageView of a depth/stencil image "
+ "is used as a depth/stencil framebuffer attachment, the "
+ "aspectMask is ignored and both depth and stencil image "
+ "subresources are used.");
+
+ VkFormatProperties format_properties;
+ vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT,
+ &format_properties);
+ if (!(format_properties.optimalTilingFeatures &
+ VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
+ return;
+ }
+
+ m_errorMonitor->ExpectSuccess();
+
+ ASSERT_NO_FATAL_FAILURE(InitState());
+
+ VkAttachmentDescription attachment = {
+ 0,
+ VK_FORMAT_D32_SFLOAT_S8_UINT,
+ VK_SAMPLE_COUNT_1_BIT,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_STORE,
+ VK_ATTACHMENT_LOAD_OP_DONT_CARE,
+ VK_ATTACHMENT_STORE_OP_DONT_CARE,
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
+ VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
+
+ VkAttachmentReference att_ref = {
+ 0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
+
+ VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS,
+ 0, nullptr,
+ 0, nullptr,
+ nullptr, &att_ref,
+ 0, nullptr};
+
+ VkSubpassDependency dep = {0,
+ 0,
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ VK_DEPENDENCY_BY_REGION_BIT};
+
+ VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO,
+ nullptr,
+ 0,
+ 1,
+ &attachment,
+ 1,
+ &subpass,
+ 1,
+ &dep};
+
+ VkResult err;
+ VkRenderPass rp;
+ err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
+ ASSERT_VK_SUCCESS(err);
+
+ VkImageObj image(m_device);
+ image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
+ 0x26, // usage
+ VK_IMAGE_TILING_OPTIMAL, 0);
+ ASSERT_TRUE(image.initialized());
+ image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
+
+ VkImageViewCreateInfo ivci = {
+ VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
+ nullptr,
+ 0,
+ image.handle(),
+ VK_IMAGE_VIEW_TYPE_2D,
+ VK_FORMAT_D32_SFLOAT_S8_UINT,
+ {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B,
+ VK_COMPONENT_SWIZZLE_A},
+ {0x2, 0, 1, 0, 1},
+ };
+ VkImageView view;
+ err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
+ ASSERT_VK_SUCCESS(err);
+
+ VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO,
+ nullptr,
+ 0,
+ rp,
+ 1,
+ &view,
+ 32,
+ 32,
+ 1};
+ VkFramebuffer fb;
+ err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
+ ASSERT_VK_SUCCESS(err);
+
+ VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
+ nullptr,
+ rp,
+ fb,
+ {{0, 0}, {32, 32}},
+ 0,
+ nullptr};
+ BeginCommandBuffer();
+ vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi,
+ VK_SUBPASS_CONTENTS_INLINE);
+
+ VkImageMemoryBarrier imb = {};
+ imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
+ imb.pNext = nullptr;
+ imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
+ imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
+ imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
+ imb.srcQueueFamilyIndex = 0;
+ imb.dstQueueFamilyIndex = 0;
+ imb.image = image.handle();
+ imb.subresourceRange.aspectMask = 0x6;
+ imb.subresourceRange.baseMipLevel = 0;
+ imb.subresourceRange.levelCount = 0x1;
+ imb.subresourceRange.baseArrayLayer = 0;
+ imb.subresourceRange.layerCount = 0x1;
+
+ vkCmdPipelineBarrier(m_commandBuffer->handle(),
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
+ VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
+ &imb);
+
+ vkCmdEndRenderPass(m_commandBuffer->handle());
+ EndCommandBuffer();
+ QueueCommandBuffer(false);
+ m_errorMonitor->VerifyNotFound();
+
+ vkDestroyFramebuffer(m_device->device(), fb, nullptr);
+ vkDestroyRenderPass(m_device->device(), rp, nullptr);
+ vkDestroyImageView(m_device->device(), view, nullptr);
+}
TEST_F(VkLayerTest, RenderPassTransitionsAttachmentUnused) {
TEST_DESCRIPTION("Ensure that layout transitions work correctly without "