Skip to content

Commit f0cb53a

Browse files
layers: Missing sync object VUIDs
1 parent c717893 commit f0cb53a

6 files changed

Lines changed: 113 additions & 0 deletions

File tree

layers/core_checks/cc_image.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2885,6 +2885,9 @@ bool CoreChecks::PreCallValidateTransitionImageLayout(VkDevice device, uint32_t
28852885
transition_loc.dot(Field::subresourceRange));
28862886
skip |= ValidateMemoryIsBoundToImage(LogObjectList(device, transition.image), *image_state,
28872887
transition_loc.dot(Field::image), "VUID-VkHostImageLayoutTransitionInfo-image-01932");
2888+
skip |= ValidateImageAspectMask(image_state->VkHandle(), image_format, aspect_mask, image_state->disjoint,
2889+
transition_loc.dot(Field::subresourceRange).dot(Field::aspectMask),
2890+
"VUID-VkHostImageLayoutTransitionInfo-subresourceRange-09601");
28882891

28892892
if (vkuFormatIsColor(image_format) && (aspect_mask != VK_IMAGE_ASPECT_COLOR_BIT)) {
28902893
if (!vkuFormatIsMultiplane(image_format)) {

layers/core_checks/cc_sync_vuid_maps.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1515,6 +1515,16 @@ const vvl::unordered_map<ImageError, std::vector<Entry>>& GetImageErrorsMap() {
15151515
{Key(Struct::VkImageMemoryBarrier), "VUID-VkImageMemoryBarrier-image-03320"},
15161516
{Key(Struct::VkImageMemoryBarrier2), "VUID-VkImageMemoryBarrier2-image-03320"},
15171517
}},
1518+
{ImageError::kNotDepthOnlyAspect,
1519+
{
1520+
{Key(Struct::VkImageMemoryBarrier), "VUID-VkImageMemoryBarrier-image-10749"},
1521+
{Key(Struct::VkImageMemoryBarrier2), "VUID-VkImageMemoryBarrier2-image-10749"},
1522+
}},
1523+
{ImageError::kNotStencilOnlyAspect,
1524+
{
1525+
{Key(Struct::VkImageMemoryBarrier), "VUID-VkImageMemoryBarrier-image-10750"},
1526+
{Key(Struct::VkImageMemoryBarrier2), "VUID-VkImageMemoryBarrier2-image-10750"},
1527+
}},
15181528
{ImageError::kSeparateDepthWithStencilLayout,
15191529
{
15201530
{Key(Struct::VkImageMemoryBarrier), "VUID-VkImageMemoryBarrier-aspectMask-08702"},

layers/core_checks/cc_sync_vuid_maps.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ enum class ImageError {
7979
kBadPlaneCount,
8080
kNotDepthOrStencilAspect,
8181
kNotDepthAndStencilAspect,
82+
kNotDepthOnlyAspect,
83+
kNotStencilOnlyAspect,
8284
kSeparateDepthWithStencilLayout,
8385
kSeparateStencilhWithDepthLayout,
8486
kRenderPassMismatch,

layers/core_checks/cc_synchronization.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2119,6 +2119,22 @@ bool CoreChecks::ValidateImageBarrierAgainstImage(const vvl::CommandBuffer& cb_s
21192119
string_VkImageAspectFlags(barrier_aspect_mask).c_str());
21202120
}
21212121
}
2122+
} else if (vkuFormatIsDepthOnly(image_format)) {
2123+
if (!has_depth_aspect) {
2124+
const LogObjectList objlist(cb_state.Handle(), image);
2125+
auto vuid = GetImageBarrierVUID(barrier_loc, vvl::ImageError::kNotDepthOnlyAspect);
2126+
skip |= LogError(vuid, objlist, image_loc, "(%s) has depth-only format %s, but its aspectMask is %s.",
2127+
FormatHandle(image).c_str(), string_VkFormat(image_format),
2128+
string_VkImageAspectFlags(barrier_aspect_mask).c_str());
2129+
}
2130+
} else if (vkuFormatIsStencilOnly(image_format)) {
2131+
if (!has_stencil_aspect) {
2132+
const LogObjectList objlist(cb_state.Handle(), image);
2133+
auto vuid = GetImageBarrierVUID(barrier_loc, vvl::ImageError::kNotStencilOnlyAspect);
2134+
skip |= LogError(vuid, objlist, image_loc, "(%s) has stencil-only format %s, but its aspectMask is %s.",
2135+
FormatHandle(image).c_str(), string_VkFormat(image_format),
2136+
string_VkImageAspectFlags(barrier_aspect_mask).c_str());
2137+
}
21222138
}
21232139

21242140
if (has_depth_aspect) {

tests/unit/host_image_copy.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1873,6 +1873,13 @@ TEST_F(NegativeHostImageCopy, TransitionImageLayout) {
18731873
// Bad aspectMask
18741874
transition_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
18751875
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-image-09241");
1876+
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-subresourceRange-09601");
1877+
vk::TransitionImageLayoutEXT(*m_device, 1, &transition_info);
1878+
m_errorMonitor->VerifyFound();
1879+
1880+
transition_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
1881+
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-image-09241");
1882+
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-subresourceRange-09601");
18761883
vk::TransitionImageLayoutEXT(*m_device, 1, &transition_info);
18771884
m_errorMonitor->VerifyFound();
18781885
}
@@ -2117,6 +2124,7 @@ TEST_F(NegativeHostImageCopy, TransitionImageLayoutMultiPlanar) {
21172124
transition_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
21182125
transition_info.image = image_multi_planar;
21192126
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-image-01672");
2127+
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-subresourceRange-09601");
21202128
vk::TransitionImageLayoutEXT(*m_device, 1, &transition_info);
21212129
m_errorMonitor->VerifyFound();
21222130
vk::FreeMemory(device(), plane_0_memory, nullptr);
@@ -2461,6 +2469,12 @@ TEST_F(NegativeHostImageCopy, TransitionImageLayoutDepthWrongAspect) {
24612469
transition_info.newLayout = VK_IMAGE_LAYOUT_GENERAL;
24622470
transition_info.subresourceRange = range;
24632471
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-image-10749");
2472+
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-subresourceRange-09601");
2473+
vk::TransitionImageLayoutEXT(*m_device, 1, &transition_info);
2474+
m_errorMonitor->VerifyFound();
2475+
2476+
transition_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
2477+
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-subresourceRange-09601");
24642478
vk::TransitionImageLayoutEXT(*m_device, 1, &transition_info);
24652479
m_errorMonitor->VerifyFound();
24662480
}
@@ -2505,6 +2519,12 @@ TEST_F(NegativeHostImageCopy, TransitionImageLayoutStencilWrongAspect) {
25052519
transition_info.newLayout = VK_IMAGE_LAYOUT_GENERAL;
25062520
transition_info.subresourceRange = range;
25072521
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-image-10750");
2522+
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-subresourceRange-09601");
2523+
vk::TransitionImageLayoutEXT(*m_device, 1, &transition_info);
2524+
m_errorMonitor->VerifyFound();
2525+
2526+
transition_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
2527+
m_errorMonitor->SetDesiredError("VUID-VkHostImageLayoutTransitionInfo-subresourceRange-09601");
25082528
vk::TransitionImageLayoutEXT(*m_device, 1, &transition_info);
25092529
m_errorMonitor->VerifyFound();
25102530
}

tests/unit/sync_object.cpp

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@ TEST_F(NegativeSyncObject, Barriers) {
399399

400400
// DEPTH bit must be set
401401
conc_test.image_barrier_.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
402+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier-image-10749");
402403
conc_test("VUID-VkImageMemoryBarrier-subresourceRange-09601");
403404

404405
// No bits other than DEPTH may be set
@@ -418,6 +419,7 @@ TEST_F(NegativeSyncObject, Barriers) {
418419
// Use of COLOR aspect on depth image is error
419420
conc_test.image_barrier_.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
420421
// must have the VK_IMAGE_ASPECT_STENCIL_BIT set
422+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier-image-10750");
421423
conc_test("VUID-VkImageMemoryBarrier-subresourceRange-09601");
422424
}
423425

@@ -912,6 +914,7 @@ TEST_F(NegativeSyncObject, Sync2Barriers) {
912914

913915
// DEPTH bit must be set
914916
conc_test.image_barrier_.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
917+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier2-image-10749");
915918
conc_test("depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
916919

917920
// No bits other than DEPTH may be set
@@ -930,6 +933,7 @@ TEST_F(NegativeSyncObject, Sync2Barriers) {
930933

931934
// Use of COLOR aspect on depth image is error
932935
conc_test.image_barrier_.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
936+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier2-image-10750");
933937
conc_test("stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
934938
}
935939

@@ -1191,6 +1195,64 @@ TEST_F(NegativeSyncObject, DepthStencilImageNonSeparateSync2) {
11911195
conc_test("VUID-VkImageMemoryBarrier2-image-03320");
11921196
}
11931197

1198+
TEST_F(NegativeSyncObject, DepthOnlyStencilOnlyImageAspect) {
1199+
SetTargetApiVersion(VK_API_VERSION_1_3);
1200+
AddRequiredFeature(vkt::Feature::synchronization2);
1201+
RETURN_IF_SKIP(Init());
1202+
1203+
m_command_buffer.Begin();
1204+
1205+
VkImageMemoryBarrier barrier = vku::InitStructHelper();
1206+
barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1207+
barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
1208+
barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
1209+
barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
1210+
1211+
VkImageMemoryBarrier2 barrier2 = vku::InitStructHelper();
1212+
barrier2.srcStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
1213+
barrier2.dstStageMask = VK_PIPELINE_STAGE_2_ALL_COMMANDS_BIT;
1214+
barrier2.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1215+
barrier2.newLayout = VK_IMAGE_LAYOUT_GENERAL;
1216+
barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
1217+
barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
1218+
1219+
const VkFormat depth_format = FindSupportedDepthOnlyFormat(Gpu());
1220+
vkt::Image depth_image(*m_device, 32, 32, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT);
1221+
barrier.image = depth_image;
1222+
barrier.subresourceRange = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 1, 0, 1};
1223+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier-subresourceRange-09601");
1224+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier-image-10749");
1225+
m_command_buffer.Barrier(barrier, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1226+
m_errorMonitor->VerifyFound();
1227+
1228+
barrier2.image = depth_image;
1229+
barrier2.subresourceRange = {VK_IMAGE_ASPECT_STENCIL_BIT, 0, 1, 0, 1};
1230+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier2-subresourceRange-09601");
1231+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier2-image-10749");
1232+
m_command_buffer.Barrier(barrier2);
1233+
m_errorMonitor->VerifyFound();
1234+
1235+
const VkFormat stencil_format = FindSupportedStencilOnlyFormat(Gpu());
1236+
if (stencil_format != VK_FORMAT_UNDEFINED) {
1237+
vkt::Image stencil_image(*m_device, 32, 32, stencil_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT);
1238+
barrier.image = stencil_image;
1239+
barrier.subresourceRange = {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1};
1240+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier-subresourceRange-09601");
1241+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier-image-10750");
1242+
m_command_buffer.Barrier(barrier, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
1243+
m_errorMonitor->VerifyFound();
1244+
1245+
barrier2.image = stencil_image;
1246+
barrier2.subresourceRange = {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1};
1247+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier2-subresourceRange-09601");
1248+
m_errorMonitor->SetDesiredError("VUID-VkImageMemoryBarrier2-image-10750");
1249+
m_command_buffer.Barrier(barrier2);
1250+
m_errorMonitor->VerifyFound();
1251+
}
1252+
1253+
m_command_buffer.End();
1254+
}
1255+
11941256
TEST_F(NegativeSyncObject, BarrierQueueFamily) {
11951257
TEST_DESCRIPTION("Create and submit barriers with invalid queue families");
11961258
SetTargetApiVersion(VK_API_VERSION_1_0);

0 commit comments

Comments
 (0)