Skip to content

Commit b3b08da

Browse files
authored
Fix VUID 11799 (KhronosGroup#11505)
* layers: Fix VUID 11799 * tests: Test image resolve with color format
1 parent 4f68774 commit b3b08da

File tree

5 files changed

+48
-100
lines changed

5 files changed

+48
-100
lines changed

layers/core_checks/cc_copy_blit_resolve.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3479,7 +3479,8 @@ bool CoreChecks::ValidateCmdResolveImage(VkCommandBuffer commandBuffer, VkImage
34793479
vuid = is_2 ? "VUID-VkResolveImageInfo2-maintenance10-11799" : "VUID-vkCmdResolveImage-maintenance10-11799";
34803480
skip |= ValidateImageFormatFeatureFlags(
34813481
commandBuffer, *dst_image_state,
3482-
VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT, dst_image_loc, vuid);
3482+
VK_FORMAT_FEATURE_2_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_2_DEPTH_STENCIL_ATTACHMENT_BIT, dst_image_loc, vuid,
3483+
false);
34833484
}
34843485
vuid = is_2 ? "VUID-vkCmdResolveImage2-commandBuffer-01838" : "VUID-vkCmdResolveImage-commandBuffer-01838";
34853486
skip |= ValidateProtectedImage(cb_state, *dst_image_state, dst_image_loc, vuid);

layers/core_checks/cc_image.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
/* Copyright (c) 2015-2025 The Khronos Group Inc.
2-
* Copyright (c) 2015-2025 Valve Corporation
3-
* Copyright (c) 2015-2025 LunarG, Inc.
4-
* Copyright (C) 2015-2025 Google Inc.
1+
/* Copyright (c) 2015-2026 The Khronos Group Inc.
2+
* Copyright (c) 2015-2026 Valve Corporation
3+
* Copyright (c) 2015-2026 LunarG, Inc.
4+
* Copyright (C) 2015-2026 Google Inc.
55
* Modifications Copyright (C) 2020-2024 Advanced Micro Devices, Inc. All rights reserved.
66
* Modifications Copyright (C) 2022-2024 RasterGrid Kft.
77
*
@@ -1344,10 +1344,12 @@ bool CoreChecks::ValidateImageUsageFlags(VkCommandBuffer commandBuffer, vvl::Ima
13441344
}
13451345

13461346
bool CoreChecks::ValidateImageFormatFeatureFlags(VkCommandBuffer commandBuffer, vvl::Image const &image_state,
1347-
VkFormatFeatureFlags2 desired, const Location &image_loc, const char *vuid) const {
1347+
VkFormatFeatureFlags2 desired, const Location &image_loc, const char *vuid,
1348+
bool all_bits_required) const {
13481349
bool skip = false;
13491350
const VkFormatFeatureFlags2 image_format_features = image_state.format_features;
1350-
if ((image_format_features & desired) != desired) {
1351+
if ((all_bits_required && (image_format_features & desired) != desired) ||
1352+
(!all_bits_required && (image_format_features & desired) == 0)) {
13511353
const LogObjectList objlist(commandBuffer, image_state.Handle());
13521354
// Same error, but more details if it was an AHB external format
13531355
if (image_state.HasAHBFormat()) {

layers/core_checks/core_validation.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1255,7 +1255,8 @@ class CoreChecks : public vvl::DeviceProxy {
12551255
bool strict, const char* vuid, const Location& image_loc) const;
12561256

12571257
bool ValidateImageFormatFeatureFlags(VkCommandBuffer commandBuffer, vvl::Image const& image_state,
1258-
VkFormatFeatureFlags2 desired, const Location& image_loc, const char* vuid) const;
1258+
VkFormatFeatureFlags2 desired, const Location& image_loc, const char* vuid,
1259+
bool all_bits_required = true) const;
12591260

12601261
template <typename HandleT>
12611262
bool ValidateImageSubresourceLayers(HandleT handle, const vvl::Image& image_state,

tests/unit/command.cpp

Lines changed: 0 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -4428,17 +4428,6 @@ TEST_F(NegativeCommand, ResolveImage2ColorImageResolveModeNone) {
44284428

44294429
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-srcImage-10985");
44304430
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-srcImage-10983");
4431-
{
4432-
const VkFormatFeatureFlags features =
4433-
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
4434-
VkFormatProperties format_props;
4435-
vk::GetPhysicalDeviceFormatProperties(Gpu(), image_ci.format, &format_props);
4436-
VkFormatFeatureFlags gpu_features =
4437-
(VK_IMAGE_TILING_OPTIMAL == image_ci.tiling ? format_props.optimalTilingFeatures : format_props.linearTilingFeatures);
4438-
if (features != (gpu_features & features)) {
4439-
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-maintenance10-11799");
4440-
}
4441-
}
44424431
vk::CmdResolveImage2KHR(m_command_buffer, &resolve_info);
44434432
m_errorMonitor->VerifyFound();
44444433
}
@@ -4493,17 +4482,6 @@ TEST_F(NegativeCommand, ResolveImage2DepthImageAspectMask) {
44934482

44944483
m_errorMonitor->SetDesiredError("VUID-vkCmdResolveImage-srcSubresource-11800");
44954484
m_errorMonitor->SetDesiredError("VUID-vkCmdResolveImage-dstSubresource-11801");
4496-
{
4497-
const VkFormatFeatureFlags features =
4498-
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
4499-
VkFormatProperties format_props;
4500-
vk::GetPhysicalDeviceFormatProperties(Gpu(), image_ci.format, &format_props);
4501-
VkFormatFeatureFlags gpu_features =
4502-
(VK_IMAGE_TILING_OPTIMAL == image_ci.tiling ? format_props.optimalTilingFeatures : format_props.linearTilingFeatures);
4503-
if (features != (gpu_features & features)) {
4504-
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-maintenance10-11799");
4505-
}
4506-
}
45074485
resolve_info.srcImage = src_depth_image;
45084486
vk::CmdResolveImage2KHR(m_command_buffer, &resolve_info);
45094487
m_errorMonitor->VerifyFound();
@@ -4680,17 +4658,6 @@ TEST_F(NegativeCommand, ResolveImage2DepthImageResolveModeNone) {
46804658
if (!has_stencil_resolve_mode_sample_average) {
46814659
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-srcImage-10990");
46824660
}
4683-
{
4684-
const VkFormatFeatureFlags features =
4685-
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
4686-
VkFormatProperties format_props;
4687-
vk::GetPhysicalDeviceFormatProperties(Gpu(), image_ci.format, &format_props);
4688-
VkFormatFeatureFlags gpu_features =
4689-
(VK_IMAGE_TILING_OPTIMAL == image_ci.tiling ? format_props.optimalTilingFeatures : format_props.linearTilingFeatures);
4690-
if (features != (gpu_features & features)) {
4691-
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-maintenance10-11799");
4692-
}
4693-
}
46944661
vk::CmdResolveImage2KHR(m_command_buffer, &resolve_info);
46954662
m_errorMonitor->VerifyFound();
46964663
}
@@ -4758,17 +4725,6 @@ TEST_F(NegativeCommand, ResolveImage2DepthImageResolveMode) {
47584725
if (!has_stencil_resolve_mode_sample_average) {
47594726
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-srcImage-10990");
47604727
}
4761-
{
4762-
const VkFormatFeatureFlags features =
4763-
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
4764-
VkFormatProperties format_props;
4765-
vk::GetPhysicalDeviceFormatProperties(Gpu(), image_ci.format, &format_props);
4766-
VkFormatFeatureFlags gpu_features =
4767-
(VK_IMAGE_TILING_OPTIMAL == image_ci.tiling ? format_props.optimalTilingFeatures : format_props.linearTilingFeatures);
4768-
if (features != (gpu_features & features)) {
4769-
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-maintenance10-11799");
4770-
}
4771-
}
47724728
vk::CmdResolveImage2KHR(m_command_buffer, &resolve_info);
47734729
m_errorMonitor->VerifyFound();
47744730
}
@@ -4841,17 +4797,6 @@ TEST_F(NegativeCommand, ResolveImage2StencilImageResolveMode) {
48414797
if (!depth_stencil_resolve_props.independentResolve) {
48424798
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-srcImage-10991");
48434799
}
4844-
{
4845-
const VkFormatFeatureFlags features =
4846-
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
4847-
VkFormatProperties format_props;
4848-
vk::GetPhysicalDeviceFormatProperties(Gpu(), image_ci.format, &format_props);
4849-
VkFormatFeatureFlags gpu_features =
4850-
(VK_IMAGE_TILING_OPTIMAL == image_ci.tiling ? format_props.optimalTilingFeatures : format_props.linearTilingFeatures);
4851-
if (features != (gpu_features & features)) {
4852-
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-maintenance10-11799");
4853-
}
4854-
}
48554800
vk::CmdResolveImage2KHR(m_command_buffer, &resolve_info);
48564801
m_errorMonitor->VerifyFound();
48574802
}
@@ -4930,17 +4875,6 @@ TEST_F(NegativeCommand, ResolveImage2DepthStencilImageResolveMode) {
49304875
if (!depth_stencil_resolve_props.independentResolveNone) {
49314876
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-srcImage-10992");
49324877
}
4933-
{
4934-
const VkFormatFeatureFlags features =
4935-
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
4936-
VkFormatProperties format_props;
4937-
vk::GetPhysicalDeviceFormatProperties(Gpu(), image_ci.format, &format_props);
4938-
VkFormatFeatureFlags gpu_features =
4939-
(VK_IMAGE_TILING_OPTIMAL == image_ci.tiling ? format_props.optimalTilingFeatures : format_props.linearTilingFeatures);
4940-
if (features != (gpu_features & features)) {
4941-
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-maintenance10-11799");
4942-
}
4943-
}
49444878
vk::CmdResolveImage2KHR(m_command_buffer, &resolve_info);
49454879
m_errorMonitor->VerifyFound();
49464880
}
@@ -5172,17 +5106,6 @@ TEST_F(NegativeCommand, ResolveImage2ColorImageResolveModeSampleZero) {
51725106
resolve_info.pRegions = &resolve_region;
51735107

51745108
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-srcImage-10984");
5175-
{
5176-
const VkFormatFeatureFlags features =
5177-
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
5178-
VkFormatProperties format_props;
5179-
vk::GetPhysicalDeviceFormatProperties(Gpu(), image_ci.format, &format_props);
5180-
VkFormatFeatureFlags gpu_features =
5181-
(VK_IMAGE_TILING_OPTIMAL == image_ci.tiling ? format_props.optimalTilingFeatures : format_props.linearTilingFeatures);
5182-
if (features != (gpu_features & features)) {
5183-
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-maintenance10-11799");
5184-
}
5185-
}
51865109
vk::CmdResolveImage2KHR(m_command_buffer, &resolve_info);
51875110
m_errorMonitor->VerifyFound();
51885111
}
@@ -5266,17 +5189,6 @@ TEST_F(NegativeCommand, ResolveImage2StencilResolveMode) {
52665189

52675190
resolve_info.srcImage = src_depth_image;
52685191
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-srcImage-10988");
5269-
{
5270-
const VkFormatFeatureFlags features =
5271-
VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT;
5272-
VkFormatProperties format_props;
5273-
vk::GetPhysicalDeviceFormatProperties(Gpu(), image_ci.format, &format_props);
5274-
VkFormatFeatureFlags gpu_features =
5275-
(VK_IMAGE_TILING_OPTIMAL == image_ci.tiling ? format_props.optimalTilingFeatures : format_props.linearTilingFeatures);
5276-
if (features != (gpu_features & features)) {
5277-
m_errorMonitor->SetDesiredError("VUID-VkResolveImageInfo2-maintenance10-11799");
5278-
}
5279-
}
52805192
vk::CmdResolveImage2KHR(m_command_buffer, &resolve_info);
52815193
m_errorMonitor->VerifyFound();
52825194
}

tests/unit/command_positive.cpp

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
/*
2-
* Copyright (c) 2015-2025 The Khronos Group Inc.
3-
* Copyright (c) 2015-2025 Valve Corporation
4-
* Copyright (c) 2015-2025 LunarG, Inc.
5-
* Copyright (c) 2015-2025 Google, Inc.
2+
* Copyright (c) 2015-2026 The Khronos Group Inc.
3+
* Copyright (c) 2015-2026 Valve Corporation
4+
* Copyright (c) 2015-2026 LunarG, Inc.
5+
* Copyright (c) 2015-2026 Google, Inc.
66
*
77
* Licensed under the Apache License, Version 2.0 (the "License");
88
* you may not use this file except in compliance with the License.
@@ -912,3 +912,35 @@ TEST_F(PositiveCommand, ResolveImage2StencilResolveMode) {
912912
resolve_info.srcImage = src_depth_image;
913913
vk::CmdResolveImage2KHR(m_command_buffer, &resolve_info);
914914
}
915+
916+
TEST_F(PositiveCommand, ResolveImageFormat) {
917+
AddRequiredExtensions(VK_KHR_MAINTENANCE_10_EXTENSION_NAME);
918+
AddRequiredFeature(vkt::Feature::maintenance10);
919+
RETURN_IF_SKIP(Init());
920+
921+
VkImageCreateInfo image_ci = vku::InitStructHelper();
922+
image_ci.imageType = VK_IMAGE_TYPE_2D;
923+
image_ci.format = VK_FORMAT_R8G8B8A8_UNORM;
924+
image_ci.extent = {32, 32, 1};
925+
image_ci.mipLevels = 1;
926+
image_ci.arrayLayers = 1;
927+
image_ci.samples = VK_SAMPLE_COUNT_4_BIT;
928+
image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
929+
image_ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
930+
image_ci.flags = 0;
931+
932+
vkt::Image src_image(*m_device, image_ci, vkt::set_layout);
933+
image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
934+
vkt::Image dst_image(*m_device, image_ci, vkt::set_layout);
935+
936+
m_command_buffer.Begin();
937+
VkImageResolve resolve_region;
938+
resolve_region.srcSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
939+
resolve_region.srcOffset = {0, 0, 0};
940+
resolve_region.dstSubresource = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 0, 1};
941+
resolve_region.dstOffset = {0, 0, 0};
942+
resolve_region.extent = {1, 1, 1};
943+
vk::CmdResolveImage(m_command_buffer, src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1,
944+
&resolve_region);
945+
m_command_buffer.End();
946+
}

0 commit comments

Comments
 (0)