Skip to content

Commit eab99f1

Browse files
layers: Add AHB YCbCr Heap/Buffer check
1 parent 68d384d commit eab99f1

2 files changed

Lines changed: 175 additions & 11 deletions

File tree

layers/core_checks/cc_descriptor.cpp

Lines changed: 57 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3488,6 +3488,27 @@ bool CoreChecks::ValidateGetDescriptorDataSize(const VkDescriptorGetInfoEXT& des
34883488
} else {
34893489
const auto image_view_state = Get<vvl::ImageView>(combined_image_sampler->imageView);
34903490
if (image_view_state && image_view_state->sampler_conversion != VK_NULL_HANDLE) {
3491+
uint64_t ahb_external_format = 0;
3492+
if (const auto conversion_state = Get<vvl::SamplerYcbcrConversion>(image_view_state->sampler_conversion)) {
3493+
ahb_external_format = conversion_state->external_format;
3494+
}
3495+
3496+
if (ahb_external_format != 0) {
3497+
size *= static_cast<size_t>(phys_dev_props_core14.maxCombinedImageSamplerDescriptorCount);
3498+
if (phys_dev_props_core14.maxCombinedImageSamplerDescriptorCount != 0 && size != data_size) {
3499+
skip |=
3500+
LogError("VUID-vkGetDescriptorEXT-pDescriptorInfo-12521", device, descriptor_info_loc.dot(Field::type),
3501+
"(VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER) has %s created with an Android external "
3502+
"format (%" PRIu64
3503+
") and descriptor size is %zu [maxCombinedImageSamplerDescriptorCount "
3504+
"(%" PRIu32 ") times combinedImageSamplerDescriptorSize (%zu)], but dataSize is %zu",
3505+
FormatHandle(image_view_state->sampler_conversion).c_str(), ahb_external_format, size,
3506+
phys_dev_props_core14.maxCombinedImageSamplerDescriptorCount,
3507+
phys_dev_ext_props.descriptor_buffer_props.combinedImageSamplerDescriptorSize, data_size);
3508+
}
3509+
return skip; // the 08125 VU doesn't apply if we are using a SamplerYcbcrConversion
3510+
}
3511+
34913512
VkImageUsageFlags2CreateInfoKHR usage_flags_2 = vku::InitStructHelper();
34923513
usage_flags_2.usage = image_view_state->inherited_usage;
34933514
VkPhysicalDeviceImageFormatInfo2 image_format_info = image_view_state->image_state->GetImageFormatInfo2();
@@ -5483,24 +5504,49 @@ bool CoreChecks::PreCallValidateWriteResourceDescriptorsEXT(VkDevice device, uin
54835504
}
54845505
}
54855506

5486-
if (vku::FindStructInPNextChain<VkSamplerYcbcrConversionInfo>(image_view_ci.pNext)) {
5487-
VkPhysicalDeviceImageFormatInfo2 image_format_info = image_state->GetImageFormatInfo2();
5488-
VkSamplerYcbcrConversionImageFormatProperties sampler_ycbcr_image_format_info = vku::InitStructHelper();
5489-
VkImageFormatProperties2 image_format_properties = vku::InitStructHelper(&sampler_ycbcr_image_format_info);
5490-
DispatchGetPhysicalDeviceImageFormatProperties2Helper(api_version, physical_device, &image_format_info,
5491-
&image_format_properties);
5492-
const VkDeviceSize size =
5493-
phys_dev_ext_props.descriptor_heap_props.imageDescriptorSize *
5494-
static_cast<VkDeviceSize>(sampler_ycbcr_image_format_info.combinedImageSamplerDescriptorCount);
5495-
if (static_cast<VkDeviceSize>(descriptor_range.size) < size) {
5496-
skip |= LogError("VUID-vkWriteResourceDescriptorsEXT-pResources-11208", image_view_ci.image,
5507+
if (const auto* ycbcr_conversion_info =
5508+
vku::FindStructInPNextChain<VkSamplerYcbcrConversionInfo>(image_view_ci.pNext)) {
5509+
uint64_t ahb_external_format = 0;
5510+
if (const auto conversion_state = Get<vvl::SamplerYcbcrConversion>(ycbcr_conversion_info->conversion)) {
5511+
ahb_external_format = conversion_state->external_format;
5512+
}
5513+
5514+
if (ahb_external_format != 0) {
5515+
const VkDeviceSize size =
5516+
expected_size * static_cast<VkDeviceSize>(phys_dev_props_core14.maxCombinedImageSamplerDescriptorCount);
5517+
if (phys_dev_props_core14.maxCombinedImageSamplerDescriptorCount != 0 &&
5518+
static_cast<VkDeviceSize>(descriptor_range.size) < size) {
5519+
skip |= LogError("VUID-vkWriteResourceDescriptorsEXT-pResources-12522", image_view_ci.image,
5520+
error_obj.location.dot(Field::pDescriptors, i).dot(Field::size),
5521+
"is %" PRIu64 ", that is less than the descriptor size (%" PRIu64
5522+
") * maxCombinedImageSamplerDescriptorCount (%" PRIu32
5523+
"), required because %s was created with an Android external format (%" PRIu64
5524+
").\npResources[%" PRIu32 "].type = %s",
5525+
static_cast<VkDeviceSize>(descriptor_range.size), expected_size,
5526+
phys_dev_props_core14.maxCombinedImageSamplerDescriptorCount,
5527+
FormatHandle(ycbcr_conversion_info->conversion).c_str(), ahb_external_format, i,
5528+
string_VkDescriptorType(resource.type));
5529+
}
5530+
} else {
5531+
VkPhysicalDeviceImageFormatInfo2 image_format_info = image_state->GetImageFormatInfo2();
5532+
VkSamplerYcbcrConversionImageFormatProperties sampler_ycbcr_image_format_info = vku::InitStructHelper();
5533+
VkImageFormatProperties2 image_format_properties = vku::InitStructHelper(&sampler_ycbcr_image_format_info);
5534+
DispatchGetPhysicalDeviceImageFormatProperties2Helper(api_version, physical_device, &image_format_info,
5535+
&image_format_properties);
5536+
const VkDeviceSize size =
5537+
phys_dev_ext_props.descriptor_heap_props.imageDescriptorSize *
5538+
static_cast<VkDeviceSize>(sampler_ycbcr_image_format_info.combinedImageSamplerDescriptorCount);
5539+
if (static_cast<VkDeviceSize>(descriptor_range.size) < size) {
5540+
skip |=
5541+
LogError("VUID-vkWriteResourceDescriptorsEXT-pResources-11208", image_view_ci.image,
54975542
error_obj.location.dot(Field::pDescriptors, i).dot(Field::size),
54985543
"is %" PRIu64 ", that is less than imageDescriptorSize (%" PRIu64
54995544
") * combinedImageSamplerDescriptorCount (%" PRIu64 ").\npResources[%" PRIu32 "].type = %s",
55005545
static_cast<VkDeviceSize>(descriptor_range.size),
55015546
phys_dev_ext_props.descriptor_heap_props.imageDescriptorSize,
55025547
static_cast<VkDeviceSize>(sampler_ycbcr_image_format_info.combinedImageSamplerDescriptorCount),
55035548
i, string_VkDescriptorType(resource.type));
5549+
}
55045550
}
55055551
}
55065552
if (image_state->GetImageType() == VK_IMAGE_TYPE_3D) {

tests/unit/android_hardware_buffer.cpp

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1423,4 +1423,122 @@ TEST_F(NegativeAndroidHardwareBuffer, NullAHBImport) {
14231423
m_errorMonitor->VerifyFound();
14241424
}
14251425

1426+
TEST_F(NegativeAndroidHardwareBuffer, DescriptorBufferDescriptorHeapYcbcr) {
1427+
SetTargetApiVersion(VK_API_VERSION_1_2);
1428+
AddRequiredExtensions(VK_ANDROID_EXTERNAL_MEMORY_ANDROID_HARDWARE_BUFFER_EXTENSION_NAME);
1429+
AddRequiredExtensions(VK_KHR_MAINTENANCE_6_EXTENSION_NAME);
1430+
AddRequiredExtensions(VK_KHR_MAINTENANCE_5_EXTENSION_NAME);
1431+
AddRequiredExtensions(VK_EXT_DESCRIPTOR_BUFFER_EXTENSION_NAME);
1432+
AddRequiredExtensions(VK_EXT_DESCRIPTOR_HEAP_EXTENSION_NAME);
1433+
AddRequiredExtensions(VK_KHR_BUFFER_DEVICE_ADDRESS_EXTENSION_NAME);
1434+
AddRequiredFeature(vkt::Feature::samplerYcbcrConversion);
1435+
AddRequiredFeature(vkt::Feature::maintenance5);
1436+
AddRequiredFeature(vkt::Feature::descriptorBuffer);
1437+
AddRequiredFeature(vkt::Feature::descriptorHeap);
1438+
AddRequiredFeature(vkt::Feature::bufferDeviceAddress);
1439+
RETURN_IF_SKIP(Init());
1440+
1441+
vkt::AHB ahb(AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420, AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE, 64, 64);
1442+
if (!ahb.handle()) {
1443+
GTEST_SKIP() << "could not allocate AHARDWAREBUFFER_FORMAT_Y8Cb8Cr8_420";
1444+
}
1445+
1446+
VkAndroidHardwareBufferFormatPropertiesANDROID ahb_fmt_props = vku::InitStructHelper();
1447+
VkAndroidHardwareBufferPropertiesANDROID ahb_props = vku::InitStructHelper(&ahb_fmt_props);
1448+
vk::GetAndroidHardwareBufferPropertiesANDROID(device(), ahb.handle(), &ahb_props);
1449+
if (ahb_fmt_props.externalFormat == 0) {
1450+
GTEST_SKIP() << "externalFormat was zero which is not valid";
1451+
}
1452+
1453+
VkExternalFormatANDROID external_format = vku::InitStructHelper();
1454+
external_format.externalFormat = ahb_fmt_props.externalFormat;
1455+
1456+
VkExternalMemoryImageCreateInfo external_image_info = vku::InitStructHelper(&external_format);
1457+
external_image_info.handleTypes = VK_EXTERNAL_MEMORY_HANDLE_TYPE_ANDROID_HARDWARE_BUFFER_BIT_ANDROID;
1458+
1459+
VkImageCreateInfo image_ci = vku::InitStructHelper(&external_image_info);
1460+
image_ci.imageType = VK_IMAGE_TYPE_2D;
1461+
image_ci.format = VK_FORMAT_UNDEFINED;
1462+
image_ci.extent = {64, 64, 1};
1463+
image_ci.mipLevels = 1;
1464+
image_ci.arrayLayers = 1;
1465+
image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
1466+
image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
1467+
image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
1468+
image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1469+
image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
1470+
vkt::Image image(*m_device, image_ci, vkt::no_mem);
1471+
1472+
VkMemoryDedicatedAllocateInfo dedicated_info = vku::InitStructHelper();
1473+
dedicated_info.image = image;
1474+
1475+
VkImportAndroidHardwareBufferInfoANDROID import_info = vku::InitStructHelper(&dedicated_info);
1476+
import_info.buffer = ahb.handle();
1477+
1478+
VkMemoryAllocateInfo memory_ci = vku::InitStructHelper(&import_info);
1479+
if (!SetAllocationInfoImportAHB(m_device, ahb_props, memory_ci)) {
1480+
GTEST_SKIP() << "No valid memory type index could be found";
1481+
}
1482+
vkt::DeviceMemory memory(*m_device, memory_ci);
1483+
vk::BindImageMemory(device(), image, memory, 0);
1484+
1485+
VkSamplerYcbcrConversionCreateInfo conversion_ci = vku::InitStructHelper(&external_format);
1486+
conversion_ci.format = VK_FORMAT_UNDEFINED;
1487+
conversion_ci.ycbcrModel = ahb_fmt_props.suggestedYcbcrModel;
1488+
conversion_ci.ycbcrRange = ahb_fmt_props.suggestedYcbcrRange;
1489+
conversion_ci.components = ahb_fmt_props.samplerYcbcrConversionComponents;
1490+
conversion_ci.xChromaOffset = ahb_fmt_props.suggestedXChromaOffset;
1491+
conversion_ci.yChromaOffset = ahb_fmt_props.suggestedYChromaOffset;
1492+
conversion_ci.chromaFilter = VK_FILTER_NEAREST;
1493+
conversion_ci.forceExplicitReconstruction = VK_FALSE;
1494+
vkt::SamplerYcbcrConversion conversion(*m_device, conversion_ci);
1495+
1496+
VkSamplerYcbcrConversionInfo conversion_info = vku::InitStructHelper();
1497+
conversion_info.conversion = conversion;
1498+
1499+
VkImageViewCreateInfo image_view_ci = vku::InitStructHelper(&conversion_info);
1500+
image_view_ci.image = image;
1501+
image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
1502+
image_view_ci.format = VK_FORMAT_UNDEFINED;
1503+
image_view_ci.subresourceRange = {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1};
1504+
vkt::ImageView image_view(*m_device, image_view_ci);
1505+
1506+
VkSamplerCreateInfo sampler_ci = SafeSaneSamplerCreateInfo();
1507+
sampler_ci.pNext = &conversion_info;
1508+
sampler_ci.magFilter = VK_FILTER_NEAREST;
1509+
sampler_ci.minFilter = VK_FILTER_NEAREST;
1510+
vkt::Sampler sampler(*m_device, sampler_ci);
1511+
1512+
uint8_t descriptor_data[256];
1513+
1514+
// VK_EXT_descriptor_buffer
1515+
{
1516+
VkDescriptorImageInfo image_info = {sampler, image_view, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
1517+
VkDescriptorGetInfoEXT get_info = vku::InitStructHelper();
1518+
get_info.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
1519+
get_info.data.pCombinedImageSampler = &image_info;
1520+
1521+
m_errorMonitor->SetDesiredError("VUID-vkGetDescriptorEXT-pDescriptorInfo-12521");
1522+
vk::GetDescriptorEXT(device(), &get_info, 256, descriptor_data);
1523+
m_errorMonitor->VerifyFound();
1524+
}
1525+
1526+
// VK_EXT_descriptor_heap
1527+
{
1528+
VkImageDescriptorInfoEXT image_info = vku::InitStructHelper();
1529+
image_info.pView = &image_view_ci;
1530+
image_info.layout = VK_IMAGE_LAYOUT_GENERAL;
1531+
1532+
VkResourceDescriptorInfoEXT resource_desc_info = vku::InitStructHelper();
1533+
resource_desc_info.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
1534+
resource_desc_info.data.pImage = &image_info;
1535+
1536+
VkHostAddressRangeEXT descriptors = {descriptor_data, 256};
1537+
1538+
m_errorMonitor->SetDesiredError("VUID-vkWriteResourceDescriptorsEXT-pResources-12522");
1539+
vk::WriteResourceDescriptorsEXT(device(), 1u, &resource_desc_info, &descriptors);
1540+
m_errorMonitor->VerifyFound();
1541+
}
1542+
}
1543+
14261544
#endif // VK_USE_PLATFORM_ANDROID_KHR

0 commit comments

Comments
 (0)