11/*
22 * Copyright (c) 2026 The Khronos Group Inc.
3+ * Copyright (c) 2026 Valve Corporation
4+ * Copyright (c) 2026 LunarG, Inc.
35 * Copyright (C) 2026 Qualcomm Technologies, Inc.
46 *
57 * Licensed under the Apache License, Version 2.0 (the "License");
1012 */
1113
1214#include " layer_validation_tests.h"
13- #include " pipeline_helper.h"
1415
1516class NegativeTileShading : public TileShadingTest {};
1617
1718TEST_F (NegativeTileShading, EndPerTileExecutionWithNonTileShadingRenderPass) {
18- TEST_DESCRIPTION (" End per-tile execution model in a non-tile-shading render pass." );
19- SetTargetApiVersion (VK_API_VERSION_1_3);
20- AddRequiredExtensions (VK_QCOM_TILE_SHADING_EXTENSION_NAME);
21- AddRequiredFeature (vkt::Feature::tileShading);
22- AddRequiredFeature (vkt::Feature::tileShadingPerTileDraw);
23- RETURN_IF_SKIP (Init ());
19+ RETURN_IF_SKIP (InitBasicTileShading ());
2420 InitRenderTarget ();
2521
2622 VkPerTileEndInfoQCOM per_tile_end_info = vku::InitStructHelper ();
@@ -36,12 +32,7 @@ TEST_F(NegativeTileShading, EndPerTileExecutionWithNonTileShadingRenderPass) {
3632}
3733
3834TEST_F (NegativeTileShading, BeginPerTileExecutionWithNonTileShadingRenderPass) {
39- TEST_DESCRIPTION (" Begin per-tile execution model in a non-tile-shading render pass." );
40- SetTargetApiVersion (VK_API_VERSION_1_3);
41- AddRequiredExtensions (VK_QCOM_TILE_SHADING_EXTENSION_NAME);
42- AddRequiredFeature (vkt::Feature::tileShading);
43- AddRequiredFeature (vkt::Feature::tileShadingPerTileDraw);
44- RETURN_IF_SKIP (Init ());
35+ RETURN_IF_SKIP (InitBasicTileShading ());
4536 InitRenderTarget ();
4637
4738 VkPerTileBeginInfoQCOM per_tile_begin_info = vku::InitStructHelper ();
@@ -55,7 +46,7 @@ TEST_F(NegativeTileShading, BeginPerTileExecutionWithNonTileShadingRenderPass) {
5546 m_command_buffer.End ();
5647}
5748
58- TEST_F (NegativeTileShading, CreateTileShadingRenderPassButTileShadingFeatureNotEnabled ) {
49+ TEST_F (NegativeTileShading, RenderPassButTileShadingFeatureNotEnabled ) {
5950 TEST_DESCRIPTION (" Try to create a tile-shading render pass, but tileShading feature is not enabled." );
6051 SetTargetApiVersion (VK_API_VERSION_1_3);
6152 AddRequiredExtensions (VK_QCOM_TILE_SHADING_EXTENSION_NAME);
@@ -90,15 +81,13 @@ TEST_F(NegativeTileShading, CreateTileShadingRenderPassButTileShadingFeatureNotE
9081 rp_ci.subpassCount = 1 ;
9182 rp_ci.pSubpasses = &subpass_desc;
9283
93- VkRenderPass tile_shading_render_pass = VK_NULL_HANDLE;
94-
9584 m_errorMonitor->SetDesiredError (" VUID-VkRenderPassTileShadingCreateInfoQCOM-tileShading-10658" );
96- vk::CreateRenderPass (device (), &rp_ci, nullptr , &tile_shading_render_pass);
85+ VkRenderPass rp = VK_NULL_HANDLE;
86+ vk::CreateRenderPass (device (), &rp_ci, nullptr , &rp);
9787 m_errorMonitor->VerifyFound ();
98- vk::DestroyRenderPass (device (), tile_shading_render_pass, nullptr );
9988}
10089
101- TEST_F (NegativeTileShading, UseNonZeroTileApronSizeButTileShadingApronFeatureNotEnabled ) {
90+ TEST_F (NegativeTileShading, NonZeroTileApronSizeButTileShadingApronFeatureNotEnabled ) {
10291 TEST_DESCRIPTION (" Try to use non-zero tile-apron size when creates a render pass, but "
10392 " tileShadingApron feature is not enabled." );
10493 SetTargetApiVersion (VK_API_VERSION_1_3);
@@ -147,7 +136,7 @@ TEST_F(NegativeTileShading, UseNonZeroTileApronSizeButTileShadingApronFeatureNot
147136 vk::DestroyRenderPass (device (), tile_shading_render_pass, nullptr );
148137}
149138
150- TEST_F (NegativeTileShading, UseAnisotropicApronSizeButTileShadingAnisotropicApronFeatureNotEnabled ) {
139+ TEST_F (NegativeTileShading, AnisotropicApronSizeButTileShadingAnisotropicApronFeatureNotEnabled ) {
151140 TEST_DESCRIPTION (" Try to use anisotropic apron size when creates a render pass, but "
152141 " tileShadingAnisotropicApron feature is not enabled." );
153142 SetTargetApiVersion (VK_API_VERSION_1_3);
@@ -197,13 +186,10 @@ TEST_F(NegativeTileShading, UseAnisotropicApronSizeButTileShadingAnisotropicApro
197186 vk::DestroyRenderPass (device (), tile_shading_render_pass, nullptr );
198187}
199188
200- TEST_F (NegativeTileShading, UseLargerTileApronSize ) {
189+ TEST_F (NegativeTileShading, LargerTileApronSize ) {
201190 TEST_DESCRIPTION (" Try to use tile apron size larger than maxApronSize when creates a render pass." );
202- SetTargetApiVersion (VK_API_VERSION_1_3);
203- AddRequiredExtensions (VK_QCOM_TILE_SHADING_EXTENSION_NAME);
204- AddRequiredFeature (vkt::Feature::tileShading);
205191 AddRequiredFeature (vkt::Feature::tileShadingApron);
206- RETURN_IF_SKIP (Init ());
192+ RETURN_IF_SKIP (InitBasicTileShading ());
207193
208194 VkPhysicalDeviceTileShadingPropertiesQCOM tile_shading_props = vku::InitStructHelper ();
209195 VkPhysicalDeviceProperties2 props2 = vku::InitStructHelper (&tile_shading_props);
@@ -247,7 +233,7 @@ TEST_F(NegativeTileShading, UseLargerTileApronSize) {
247233 vk::DestroyRenderPass (device (), tile_shading_render_pass, nullptr );
248234}
249235
250- TEST_F (NegativeTileShading, CreateTileShadingRenderPassWithPerTileExecutionBit ) {
236+ TEST_F (NegativeTileShading, RenderPassWithPerTileExecutionBit ) {
251237 TEST_DESCRIPTION (" Try to create a tile-shading render pass with per-tile-execution bit, but "
252238 " tileShadingPerTileDispatch and tileShadingPerTileDraw features are not enabled." );
253239 SetTargetApiVersion (VK_API_VERSION_1_3);
@@ -337,7 +323,7 @@ TEST_F(NegativeTileShading, CreateTileShadingRenderPassWithPerTileExecutionBit)
337323 }
338324}
339325
340- TEST_F (NegativeTileShading, BeginTileShadingDynamicRenderingButTileShadingFeatureNotEnabled ) {
326+ TEST_F (NegativeTileShading, DynamicRenderingButTileShadingFeatureNotEnabled ) {
341327 TEST_DESCRIPTION (" Try to launch a tile-shading dynamic rendering, but tileShading feature isn't enabled." );
342328 SetTargetApiVersion (VK_API_VERSION_1_3);
343329 AddRequiredExtensions (VK_QCOM_TILE_SHADING_EXTENSION_NAME);
@@ -373,7 +359,7 @@ TEST_F(NegativeTileShading, BeginTileShadingDynamicRenderingButTileShadingFeatur
373359 m_command_buffer.End ();
374360}
375361
376- TEST_F (NegativeTileShading, BeginTileShadingDynamicRenderingWithApronSizeButRequiredFeaturesNotEnabled ) {
362+ TEST_F (NegativeTileShading, DynamicRenderingWithApronSizeButRequiredFeaturesNotEnabled ) {
377363 TEST_DESCRIPTION (" Try to launch a tile-shading dynamic rendering with specified anisotropic apron size, "
378364 " but tileShadingApron and tileShadingAnisotropicApron features aren't enabled." );
379365 SetTargetApiVersion (VK_API_VERSION_1_3);
@@ -416,10 +402,9 @@ TEST_F(NegativeTileShading, BeginTileShadingDynamicRenderingWithApronSizeButRequ
416402 m_command_buffer.End ();
417403}
418404
419- TEST_F (NegativeTileShading, CreateTileShadingRenderPassWithUndefinedFormatResolveAttachment ) {
405+ TEST_F (NegativeTileShading, RenderPassWithUndefinedFormatResolveAttachment ) {
420406 TEST_DESCRIPTION (" Try to create a tile-shading render pass, but provides a undefined format resolve attachment." );
421- InitBasicTileShading ();
422- RETURN_IF_SKIP (Init ());
407+ RETURN_IF_SKIP (InitBasicTileShading ());
423408
424409 {
425410 std::array<VkAttachmentDescription, 2 > attachment_descs{};
@@ -527,11 +512,10 @@ TEST_F(NegativeTileShading, CreateTileShadingRenderPassWithUndefinedFormatResolv
527512 }
528513}
529514
530- TEST_F (NegativeTileShading, CreateTileShadingRenderPassWithFragmentDensityMapAttachment ) {
515+ TEST_F (NegativeTileShading, RenderPassWithFragmentDensityMapAttachment ) {
531516 TEST_DESCRIPTION (" Try to create a tile-shading render pass, but provides an available fragment-density-map attachment." );
532517 AddRequiredExtensions (VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
533- InitBasicTileShading ();
534- RETURN_IF_SKIP (Init ());
518+ RETURN_IF_SKIP (InitBasicTileShading ());
535519
536520 {
537521 std::array<VkAttachmentDescription, 2 > attachment_descs{};
@@ -635,12 +619,11 @@ TEST_F(NegativeTileShading, CreateTileShadingRenderPassWithFragmentDensityMapAtt
635619 }
636620}
637621
638- TEST_F (NegativeTileShading, BeginTileShadingDynamicRenderingInSimultaneousUseBitCommandBuffer ) {
622+ TEST_F (NegativeTileShading, DynamicRenderingInSimultaneousUseBitCommandBuffer ) {
639623 TEST_DESCRIPTION (" Try to launch a dynamic rendering in a recorded command buffer "
640624 " with simultaneous-use-bit used." );
641625 AddRequiredFeature (vkt::Feature::dynamicRendering);
642- InitBasicTileShading ();
643- RETURN_IF_SKIP (Init ());
626+ RETURN_IF_SKIP (InitBasicTileShading ());
644627
645628 constexpr uint32_t image_width = 32 ;
646629 constexpr uint32_t image_height = 32 ;
@@ -671,11 +654,10 @@ TEST_F(NegativeTileShading, BeginTileShadingDynamicRenderingInSimultaneousUseBit
671654 m_command_buffer.End ();
672655}
673656
674- TEST_F (NegativeTileShading, BeginTileShadingDynamicRenderingWithPerTileExecutionBit ) {
657+ TEST_F (NegativeTileShading, DynamicRenderingWithPerTileExecutionBit ) {
675658 TEST_DESCRIPTION (" Try to launch a tile-shading dynamic rendering but per-tile-execution bit is used." );
676659 AddRequiredFeature (vkt::Feature::dynamicRendering);
677- InitBasicTileShading ();
678- RETURN_IF_SKIP (Init ());
660+ RETURN_IF_SKIP (InitBasicTileShading ());
679661
680662 constexpr uint32_t image_width = 32 ;
681663 constexpr uint32_t image_height = 32 ;
@@ -706,14 +688,11 @@ TEST_F(NegativeTileShading, BeginTileShadingDynamicRenderingWithPerTileExecution
706688 m_command_buffer.End ();
707689}
708690
709- TEST_F (NegativeTileShading, EndTileShadingDynamicRenderingButPerTileExecutionModelEnabled ) {
691+ TEST_F (NegativeTileShading, DynamicRenderingButPerTileExecutionModelEnabled ) {
710692 TEST_DESCRIPTION (" Try to end a tile-shading dynamic rendering, but per-tile-execution model is still enabled." );
711693 AddRequiredFeature (vkt::Feature::dynamicRendering);
712- InitBasicTileShading ();
713- RETURN_IF_SKIP (Init ());
714-
715- TileShadingRenderTargetConfig tile_shading_rp_config{};
716- InitTileShadingRenderTarget (tile_shading_rp_config);
694+ RETURN_IF_SKIP (InitBasicTileShading ());
695+ InitTileShadingRenderTarget ();
717696
718697 VkClearValue clear_value{};
719698 clear_value.color = {{0 .0f , 0 .0f , 0 .0f , 0 .0f }};
@@ -753,15 +732,13 @@ TEST_F(NegativeTileShading, EndTileShadingDynamicRenderingButPerTileExecutionMod
753732 m_command_buffer.End ();
754733}
755734
756- TEST_F (NegativeTileShading, BeginTileShadingRenderPassWithSimultaneousUseBit ) {
735+ TEST_F (NegativeTileShading, RenderPassWithSimultaneousUseBit ) {
757736 TEST_DESCRIPTION (" Try to launch a tile-shading render pass in a recorded command buffer "
758737 " with simultaneous-use-bit used." );
759- InitBasicTileShading ();
760- RETURN_IF_SKIP (Init ());
738+ RETURN_IF_SKIP (InitBasicTileShading ());
761739
762- TileShadingRenderTargetConfig tile_shading_rp_config{};
763740 tile_shading_rp_config.use_render_pass2 = true ;
764- InitTileShadingRenderTarget (tile_shading_rp_config );
741+ InitTileShadingRenderTarget ();
765742
766743 VkClearValue clear_value{};
767744 clear_value.color = {{0 .0f , 0 .0f , 0 .0f , 0 .0f }};
@@ -784,13 +761,10 @@ TEST_F(NegativeTileShading, BeginTileShadingRenderPassWithSimultaneousUseBit) {
784761 m_command_buffer.End ();
785762}
786763
787- TEST_F (NegativeTileShading, EndTileShadingRenderPassButPerTileExecutionModelEnabled ) {
764+ TEST_F (NegativeTileShading, RenderPassButPerTileExecutionModelEnabled ) {
788765 TEST_DESCRIPTION (" Try to end a tile-shading render pass, but per-tile execution model is still enabled." );
789- InitBasicTileShading ();
790- RETURN_IF_SKIP (Init ());
791-
792- TileShadingRenderTargetConfig tile_shading_rp_config{};
793- InitTileShadingRenderTarget (tile_shading_rp_config);
766+ RETURN_IF_SKIP (InitBasicTileShading ());
767+ InitTileShadingRenderTarget ();
794768
795769 VkClearValue clear_value{};
796770 clear_value.color = {{0 .0f , 0 .0f , 0 .0f , 0 .0f }};
@@ -817,20 +791,18 @@ TEST_F(NegativeTileShading, EndTileShadingRenderPassButPerTileExecutionModelEnab
817791 m_command_buffer.End ();
818792}
819793
820- TEST_F (NegativeTileShading, TileShadingDynamicRenderingWithFragmentDensityMapAttachment ) {
794+ TEST_F (NegativeTileShading, DynamicRenderingWithFragmentDensityMapAttachment ) {
821795 TEST_DESCRIPTION (" Try to launch a dynamic rendering when tile-shading is enabled and fragment-density-map attachment is provided." );
822796 AddRequiredExtensions (VK_EXT_FRAGMENT_DENSITY_MAP_EXTENSION_NAME);
823797 AddRequiredFeature (vkt::Feature::dynamicRendering);
824798 AddRequiredFeature (vkt::Feature::fragmentDensityMap);
825799 AddRequiredFeature (vkt::Feature::fragmentDensityMapNonSubsampledImages);
826- InitBasicTileShading ();
827- RETURN_IF_SKIP (Init ());
800+ RETURN_IF_SKIP (InitBasicTileShading ());
828801
829- constexpr uint32_t image_width = 32 ;
830- constexpr uint32_t image_height = 32 ;
831- vkt::Image color_image{*m_device, image_width, image_height, m_render_target_fmt, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT };
802+ vkt::Image color_image{*m_device, 32 , 32 , m_render_target_fmt,
803+ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT};
832804 vkt::ImageView color_view = color_image.CreateView ();
833- vkt::Image fdm_image{*m_device, image_width, image_height , VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT};
805+ vkt::Image fdm_image{*m_device, 32 , 32 , VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_FRAGMENT_DENSITY_MAP_BIT_EXT};
834806 vkt::ImageView fdm_view = fdm_image.CreateView ();
835807
836808 VkRenderingAttachmentInfo color_attachment = vku::InitStructHelper ();
@@ -849,7 +821,7 @@ TEST_F(NegativeTileShading, TileShadingDynamicRenderingWithFragmentDensityMapAtt
849821 tile_shading_ci.tileApronSize = {0 , 0 };
850822
851823 VkRenderingInfo rendering_info = vku::InitStructHelper (&tile_shading_ci);
852- rendering_info.renderArea = {{0 , 0 }, {image_width, image_height }};
824+ rendering_info.renderArea = {{0 , 0 }, {32 , 32 }};
853825 rendering_info.layerCount = 1 ;
854826 rendering_info.colorAttachmentCount = 1 ;
855827 rendering_info.pColorAttachments = &color_attachment;
@@ -861,11 +833,10 @@ TEST_F(NegativeTileShading, TileShadingDynamicRenderingWithFragmentDensityMapAtt
861833 m_command_buffer.End ();
862834}
863835
864- TEST_F (NegativeTileShading, TileShadingSubpassDescriptionWithZeroApronSize ) {
836+ TEST_F (NegativeTileShading, SubpassDescriptionWithZeroApronSize ) {
865837 TEST_DESCRIPTION (" Try to create a tile-shading render pass, but provides a tile-shading-apron subpass "
866838 " description with zero apron size." );
867- InitBasicTileShading ();
868- RETURN_IF_SKIP (Init ());
839+ RETURN_IF_SKIP (InitBasicTileShading ());
869840
870841 {
871842 VkAttachmentDescription attachment_desc{};
@@ -901,12 +872,10 @@ TEST_F(NegativeTileShading, TileShadingSubpassDescriptionWithZeroApronSize) {
901872 rp_ci.subpassCount = 1 ;
902873 rp_ci.pSubpasses = &subpass_desc;
903874
904- VkRenderPass tile_shading_render_pass = VK_NULL_HANDLE;
905-
875+ VkRenderPass rp = VK_NULL_HANDLE;
906876 m_errorMonitor->SetDesiredError (" VUID-VkSubpassDescription-flags-10683" );
907- vk::CreateRenderPass (device (), &rp_ci, nullptr , &tile_shading_render_pass );
877+ vk::CreateRenderPass (device (), &rp_ci, nullptr , &rp );
908878 m_errorMonitor->VerifyFound ();
909- vk::DestroyRenderPass (device (), tile_shading_render_pass, nullptr );
910879 }
911880 {
912881 VkAttachmentDescription2 attachment_desc2 = vku::InitStructHelper ();
@@ -944,11 +913,9 @@ TEST_F(NegativeTileShading, TileShadingSubpassDescriptionWithZeroApronSize) {
944913 rpci2.subpassCount = 1 ;
945914 rpci2.pSubpasses = &subpass_desc2;
946915
947- VkRenderPass tile_shading_render_pass = VK_NULL_HANDLE;
948-
916+ VkRenderPass rp = VK_NULL_HANDLE;
949917 m_errorMonitor->SetDesiredError (" VUID-VkSubpassDescription2-flags-10683" );
950- vk::CreateRenderPass2 (device (), &rpci2, nullptr , &tile_shading_render_pass );
918+ vk::CreateRenderPass2 (device (), &rpci2, nullptr , &rp );
951919 m_errorMonitor->VerifyFound ();
952- vk::DestroyRenderPass (device (), tile_shading_render_pass, nullptr );
953920 }
954921}
0 commit comments