Vulkan-Utility-Libraries/tests/struct_helper/struct_helper.cpp
unknown 6774c9b24b util: Add vk_struct_helper.hpp
Move the vk_typemap_helper.h file in Vulkan-ValidationLayers over to this
repo with a different name to reflect the use of it

Changes from that include:
 * Rename the functions to be more obvious as to what they do
 * Placing them in the `vku` namespace
 * Adding the `InitStructHelper` class which deduces the type based on the
   variable that is being initialized
 * Compiler error if there is no corresponding sType
2023-09-19 10:10:31 -06:00

91 lines
5.1 KiB
C++

// Copyright 2023 The Khronos Group Inc.
// Copyright 2023 Valve Corporation
// Copyright 2023 LunarG, Inc.
//
// SPDX-License-Identifier: Apache-2.0
//
#include <gtest/gtest.h>
#include <vulkan/utility/vk_struct_helper.hpp>
#include <limits>
TEST(struct_helper, structure_type_matches) {
ASSERT_EQ(VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO, vku::GetSType<VkInstanceCreateInfo>());
VkDeviceCreateInfo device_create_info = vku::InitStructHelper();
ASSERT_EQ(VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO, device_create_info.sType);
VkImageDrmFormatModifierExplicitCreateInfoEXT image_drm_format_modifier_explicit_create_info = vku::InitStructHelper{};
VkImageCreateInfo image_create_info = vku::InitStructHelper(&image_drm_format_modifier_explicit_create_info);
ASSERT_EQ(VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO, image_create_info.sType);
ASSERT_EQ(&image_drm_format_modifier_explicit_create_info, image_create_info.pNext);
auto buffer_create_info = vku::InitStruct<VkBufferCreateInfo>(
nullptr, static_cast<VkBufferCreateFlags>(VK_BUFFER_CREATE_SPARSE_BINDING_BIT), std::numeric_limits<uint64_t>::max(),
static_cast<VkBufferUsageFlags>(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT), VK_SHARING_MODE_EXCLUSIVE, 0U, nullptr);
ASSERT_EQ(VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO, buffer_create_info.sType);
ASSERT_EQ(VK_BUFFER_CREATE_SPARSE_BINDING_BIT, buffer_create_info.flags);
ASSERT_EQ(std::numeric_limits<uint64_t>::max(), buffer_create_info.size);
ASSERT_EQ(VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, buffer_create_info.usage);
ASSERT_EQ(VK_SHARING_MODE_EXCLUSIVE, buffer_create_info.sharingMode);
ASSERT_EQ(0, buffer_create_info.queueFamilyIndexCount);
ASSERT_EQ(nullptr, buffer_create_info.pQueueFamilyIndices);
}
TEST(struct_helper, find_struct_in_pnext_chain) {
VkPhysicalDeviceIDProperties id_props = vku::InitStructHelper();
VkPhysicalDeviceDriverProperties driver_props = vku::InitStructHelper(&id_props);
VkPhysicalDeviceCustomBorderColorPropertiesEXT custom_border_color_props = vku::InitStructHelper(&driver_props);
VkPhysicalDeviceMultiDrawPropertiesEXT multi_draw_props = vku::InitStructHelper(&custom_border_color_props);
VkPhysicalDeviceProperties2 props2 = vku::InitStructHelper(&multi_draw_props);
ASSERT_EQ(&id_props, vku::FindStructInPNextChain<VkPhysicalDeviceIDProperties>(props2.pNext));
ASSERT_EQ(&driver_props, vku::FindStructInPNextChain<VkPhysicalDeviceDriverProperties>(props2.pNext));
ASSERT_EQ(&custom_border_color_props,
vku::FindStructInPNextChain<VkPhysicalDeviceCustomBorderColorPropertiesEXT>(props2.pNext));
ASSERT_EQ(&multi_draw_props, vku::FindStructInPNextChain<VkPhysicalDeviceMultiDrawPropertiesEXT>(props2.pNext));
ASSERT_EQ(reinterpret_cast<VkBaseOutStructure*>(&id_props), vku::FindLastStructInPNextChain(props2.pNext));
}
TEST(struct_helper, find_const_struct_in_pnext_chain) {
VkImageViewUsageCreateInfo image_view_usage_create_info = vku::InitStructHelper();
VkImageViewSlicedCreateInfoEXT image_view_sliced_create_info = vku::InitStructHelper(&image_view_usage_create_info);
VkSamplerYcbcrConversionInfo sampler_ycbcr_conversion_info = vku::InitStructHelper(&image_view_sliced_create_info);
VkOpaqueCaptureDescriptorDataCreateInfoEXT opaque_capture_descriptor_data_create_info =
vku::InitStructHelper(&sampler_ycbcr_conversion_info);
VkImageViewCreateInfo image_view = vku::InitStructHelper(&opaque_capture_descriptor_data_create_info);
ASSERT_EQ(static_cast<const void*>(&image_view_usage_create_info),
vku::FindStructInPNextChain<VkImageViewUsageCreateInfo>(image_view.pNext));
ASSERT_EQ(static_cast<const void*>(&image_view_sliced_create_info),
vku::FindStructInPNextChain<VkImageViewSlicedCreateInfoEXT>(image_view.pNext));
ASSERT_EQ(static_cast<const void*>(&sampler_ycbcr_conversion_info),
vku::FindStructInPNextChain<VkSamplerYcbcrConversionInfo>(image_view.pNext));
ASSERT_EQ(static_cast<const void*>(&opaque_capture_descriptor_data_create_info),
vku::FindStructInPNextChain<VkOpaqueCaptureDescriptorDataCreateInfoEXT>(image_view.pNext));
ASSERT_EQ(reinterpret_cast<VkBaseOutStructure*>(&image_view_usage_create_info),
vku::FindLastStructInPNextChain(const_cast<void*>(image_view.pNext)));
}
struct SomeVkTypes {
VkImageViewUsageCreateInfo t0{};
VkImageDrmFormatModifierExplicitCreateInfoEXT t1 = vku::InitStructHelper();
VkBufferCreateInfo t2 = vku::InitStruct<VkBufferCreateInfo>();
inline static const auto t3 = vku::InitStruct<VkInstanceCreateInfo>();
inline static const VkDeviceCreateInfo t4 = vku::InitStructHelper();
};
TEST(struct_helper, struct_defaults_correct) {
SomeVkTypes s;
ASSERT_EQ(s.t0.sType, VK_STRUCTURE_TYPE_APPLICATION_INFO); // should be zero because we didn't initialize it
ASSERT_EQ(s.t1.sType, VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_EXPLICIT_CREATE_INFO_EXT);
ASSERT_EQ(s.t2.sType, VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO);
ASSERT_EQ(s.t3.sType, VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO);
ASSERT_EQ(s.t4.sType, VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO);
}