blob: 4d27dd28b9c0cbed34233f6ccf0ea6dde5fc471d [file] [log] [blame]
/*
* Copyright (c) 2024 The Khronos Group Inc.
* Copyright (c) 2024 Valve Corporation
* Copyright (c) 2024 LunarG, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*/
//stype-check off
#include <cstdint>
#include "../framework/layer_validation_tests.h"
class NegativeLayerSettings : public VkLayerTest {};
TEST_F(NegativeLayerSettings, CustomStypeStructString) {
TEST_DESCRIPTION("Positive Test for ability to specify custom pNext structs using a list (string)");
// Create a custom structure
typedef struct CustomStruct {
VkStructureType sType;
const void *pNext;
uint32_t custom_data;
} CustomStruct;
uint32_t custom_stype = 3000300000;
CustomStruct custom_struct;
custom_struct.pNext = nullptr;
custom_struct.sType = static_cast<VkStructureType>(custom_stype);
custom_struct.custom_data = 44;
// Communicate list of structinfo pairs to layers
const char *id[] = {"3000300000", "24"};
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "custom_stype_list", VK_LAYER_SETTING_TYPE_STRING_EXT,
static_cast<uint32_t>(std::size(id)), &id};
VkLayerSettingsCreateInfoEXT layer_setting_create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
RETURN_IF_SKIP(InitFramework(&layer_setting_create_info));
RETURN_IF_SKIP(InitState());
vkt::Buffer buffer(*m_device, 1024, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
VkBufferViewCreateInfo bvci = vku::InitStructHelper(&custom_struct); // Add custom struct through pNext
bvci.buffer = buffer.handle();
bvci.format = VK_FORMAT_R32_SFLOAT;
bvci.range = VK_WHOLE_SIZE;
vkt::BufferView buffer_view(*m_device, bvci);
}
static std::string format(const char *message, ...) {
std::size_t const STRING_BUFFER(4096);
assert(message != nullptr);
assert(strlen(message) < STRING_BUFFER);
char buffer[STRING_BUFFER];
va_list list;
va_start(list, message);
vsnprintf(buffer, STRING_BUFFER, message, list);
va_end(list);
return buffer;
}
TEST_F(NegativeLayerSettings, CustomStypeStructStringArray) {
TEST_DESCRIPTION("Positive Test for ability to specify custom pNext structs using a vector of strings");
// Create a custom structure
typedef struct CustomStruct {
VkStructureType sType;
const void *pNext;
uint32_t custom_data;
} CustomStruct;
const uint32_t custom_stype_a = 3000300000;
CustomStruct custom_struct_a;
custom_struct_a.pNext = nullptr;
custom_struct_a.sType = static_cast<VkStructureType>(custom_stype_a);
custom_struct_a.custom_data = 44;
const uint32_t custom_stype_b = 3000300001;
CustomStruct custom_struct_b;
custom_struct_b.pNext = &custom_struct_a;
custom_struct_b.sType = static_cast<VkStructureType>(custom_stype_b);
custom_struct_b.custom_data = 88;
// Communicate list of structinfo pairs to layers, including a duplicate which should get filtered out
const std::string string_stype_a = format("%u", custom_stype_a);
const std::string string_stype_b = format("%u", custom_stype_b);
const std::string sizeof_struct = format("%d", sizeof(CustomStruct));
const char *ids[] = {
string_stype_a.c_str(), sizeof_struct.c_str(),
string_stype_b.c_str(), sizeof_struct.c_str(),
string_stype_a.c_str(), sizeof_struct.c_str(),
};
const VkLayerSettingEXT setting = {
OBJECT_LAYER_NAME, "custom_stype_list", VK_LAYER_SETTING_TYPE_STRING_EXT, static_cast<uint32_t>(std::size(ids)), &ids};
VkLayerSettingsCreateInfoEXT layer_setting_create_info = {
VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
RETURN_IF_SKIP(InitFramework(&layer_setting_create_info));
RETURN_IF_SKIP(InitState());
vkt::Buffer buffer(*m_device, 1024, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
VkBufferViewCreateInfo bvci = vku::InitStructHelper(&custom_struct_b); // Add custom struct through pNext
bvci.buffer = buffer.handle();
bvci.format = VK_FORMAT_R32_SFLOAT;
bvci.range = VK_WHOLE_SIZE;
vkt::BufferView buffer_view(*m_device, bvci);
}
TEST_F(NegativeLayerSettings, CustomStypeStructIntegerArray) {
TEST_DESCRIPTION("Positive Test for ability to specify custom pNext structs using a vector of integers");
// Create a custom structure
typedef struct CustomStruct {
VkStructureType sType;
const void *pNext;
uint32_t custom_data;
} CustomStruct;
const uint32_t custom_stype_a = 3000300000;
CustomStruct custom_struct_a;
custom_struct_a.pNext = nullptr;
custom_struct_a.sType = static_cast<VkStructureType>(custom_stype_a);
custom_struct_a.custom_data = 44;
const uint32_t custom_stype_b = 3000300001;
CustomStruct custom_struct_b;
custom_struct_b.pNext = &custom_struct_a;
custom_struct_b.sType = static_cast<VkStructureType>(custom_stype_b);
custom_struct_b.custom_data = 88;
// Communicate list of structinfo pairs to layers, including a duplicate which should get filtered out
const uint32_t ids[] = {
custom_stype_a, sizeof(CustomStruct),
custom_stype_b, sizeof(CustomStruct),
custom_stype_a, sizeof(CustomStruct)
};
const VkLayerSettingEXT setting[] = {
{OBJECT_LAYER_NAME, "custom_stype_list", VK_LAYER_SETTING_TYPE_UINT32_EXT, static_cast<uint32_t>(std::size(ids)), ids}
};
VkLayerSettingsCreateInfoEXT layer_setting_create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, setting};
RETURN_IF_SKIP(InitFramework(&layer_setting_create_info));
RETURN_IF_SKIP(InitState());
vkt::Buffer buffer(*m_device, 1024, VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT);
VkBufferViewCreateInfo bvci = vku::InitStructHelper(&custom_struct_b); // Add custom struct through pNext
bvci.buffer = buffer.handle();
bvci.format = VK_FORMAT_R32_SFLOAT;
bvci.range = VK_WHOLE_SIZE;
vkt::BufferView buffer_view(*m_device, bvci);
}
TEST_F(NegativeLayerSettings, DuplicateMessageLimit) {
TEST_DESCRIPTION("Use the duplicate_message_limit setting and verify correct operation");
AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
uint32_t value = 3;
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "duplicate_message_limit", VK_LAYER_SETTING_TYPE_UINT32_EXT, 1, &value};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
// Create an invalid pNext structure to trigger the stateless validation warning
VkBaseOutStructure bogus_struct{};
bogus_struct.sType = static_cast<VkStructureType>(0x33333333);
VkPhysicalDeviceProperties2KHR properties2 = vku::InitStructHelper(&bogus_struct);
// Should get the first three errors just fine
m_errorMonitor->SetDesiredError("VUID-VkPhysicalDeviceProperties2-pNext-pNext");
vk::GetPhysicalDeviceProperties2KHR(Gpu(), &properties2);
m_errorMonitor->VerifyFound();
m_errorMonitor->SetDesiredError("VUID-VkPhysicalDeviceProperties2-pNext-pNext");
vk::GetPhysicalDeviceProperties2KHR(Gpu(), &properties2);
m_errorMonitor->VerifyFound();
m_errorMonitor->SetDesiredError("VUID-VkPhysicalDeviceProperties2-pNext-pNext");
vk::GetPhysicalDeviceProperties2KHR(Gpu(), &properties2);
m_errorMonitor->VerifyFound();
// Limit should prevent the message from coming through a fourth time
vk::GetPhysicalDeviceProperties2KHR(Gpu(), &properties2);
}
TEST_F(NegativeLayerSettings, DuplicateMessageLimitZero) {
TEST_DESCRIPTION("Use the duplicate_message_limit setting with zero explicitly");
AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
uint32_t value = 0;
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "duplicate_message_limit", VK_LAYER_SETTING_TYPE_UINT32_EXT, 1, &value};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
// Create an invalid pNext structure to trigger the stateless validation warning
VkBaseOutStructure bogus_struct{};
bogus_struct.sType = static_cast<VkStructureType>(0x33333333);
VkPhysicalDeviceProperties2KHR properties2 = vku::InitStructHelper(&bogus_struct);
const uint32_t default_value = 10; // what we set in vkconfig
for (uint32_t i = 0; i < default_value + 1; i++) {
m_errorMonitor->SetDesiredError("VUID-VkPhysicalDeviceProperties2-pNext-pNext");
vk::GetPhysicalDeviceProperties2KHR(Gpu(), &properties2);
m_errorMonitor->VerifyFound();
}
}
TEST_F(NegativeLayerSettings, DuplicateMessageLimitNone) {
TEST_DESCRIPTION("Don't use duplicate_message_limit setting it with zero implicitly");
AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
RETURN_IF_SKIP(Init());
// Create an invalid pNext structure to trigger the stateless validation warning
VkBaseOutStructure bogus_struct{};
bogus_struct.sType = static_cast<VkStructureType>(0x33333333);
VkPhysicalDeviceProperties2KHR properties2 = vku::InitStructHelper(&bogus_struct);
const uint32_t default_value = 10; // what we set in vkconfig
for (uint32_t i = 0; i < default_value; i++) {
m_errorMonitor->SetDesiredError("VUID-VkPhysicalDeviceProperties2-pNext-pNext");
vk::GetPhysicalDeviceProperties2KHR(Gpu(), &properties2);
m_errorMonitor->VerifyFound();
}
// Limit should prevent the message from coming through now
vk::GetPhysicalDeviceProperties2KHR(Gpu(), &properties2);
}
TEST_F(NegativeLayerSettings, DuplicateMessageLimitDisable) {
TEST_DESCRIPTION("use enable_message_limit explicitly");
AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
VkBool32 enable_message_limit = VK_FALSE;
uint32_t value = 3;
const VkLayerSettingEXT settings[2] = {
{OBJECT_LAYER_NAME, "enable_message_limit", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1, &enable_message_limit},
{OBJECT_LAYER_NAME, "duplicate_message_limit", VK_LAYER_SETTING_TYPE_UINT32_EXT, 1, &value}};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 2, settings};
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
// Create an invalid pNext structure to trigger the stateless validation warning
VkBaseOutStructure bogus_struct{};
bogus_struct.sType = static_cast<VkStructureType>(0x33333333);
VkPhysicalDeviceProperties2KHR properties2 = vku::InitStructHelper(&bogus_struct);
const uint32_t default_value = 10; // what we set in vkconfig
const uint32_t count = default_value + 5;
for (uint32_t i = 0; i < count; i++) {
m_errorMonitor->SetDesiredError("VUID-VkPhysicalDeviceProperties2-pNext-pNext");
vk::GetPhysicalDeviceProperties2KHR(Gpu(), &properties2);
m_errorMonitor->VerifyFound();
}
}
TEST_F(NegativeLayerSettings, VuidIdFilterString) {
TEST_DESCRIPTION("Validate that message id string filtering is working");
AddRequiredExtensions(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
// This test would normally produce an unexpected error or two. Use the message filter instead of
// the error_monitor's SetUnexpectedError to test the filtering.
const char *ids[] = {"VUID-VkRenderPassCreateInfo-pNext-01963"};
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "message_id_filter", VK_LAYER_SETTING_TYPE_STRING_EXT, 1, ids};
VkLayerSettingsCreateInfoEXT layer_settings_create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
RETURN_IF_SKIP(InitFramework(&layer_settings_create_info));
RETURN_IF_SKIP(InitState());
VkAttachmentDescription attach = {0,
VK_FORMAT_R8G8B8A8_UNORM,
VK_SAMPLE_COUNT_1_BIT,
VK_ATTACHMENT_LOAD_OP_DONT_CARE,
VK_ATTACHMENT_STORE_OP_DONT_CARE,
VK_ATTACHMENT_LOAD_OP_DONT_CARE,
VK_ATTACHMENT_STORE_OP_DONT_CARE,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &ref, 0, nullptr, nullptr, nullptr, 0, nullptr};
VkInputAttachmentAspectReference iaar = {0, 0, VK_IMAGE_ASPECT_METADATA_BIT};
VkRenderPassInputAttachmentAspectCreateInfo rpiaaci = {VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO,
nullptr, 1, &iaar};
VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, &rpiaaci, 0, 1, &attach, 1, &subpass, 0, nullptr};
m_errorMonitor->SetUnexpectedError("VUID-VkRenderPassCreateInfo2-attachment-02525");
TestRenderPassCreate(m_errorMonitor, *m_device, rpci, false, "VUID-VkInputAttachmentAspectReference-aspectMask-01964", nullptr);
}
TEST_F(NegativeLayerSettings, VuidFilterHexInt) {
TEST_DESCRIPTION("Validate that message id hex int filtering is working");
AddRequiredExtensions(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
// This test would normally produce an unexpected error or two. Use the message filter instead of
// the error_monitor's SetUnexpectedError to test the filtering.
const char *ids[] = {"0xa19880e3"};
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "message_id_filter", VK_LAYER_SETTING_TYPE_STRING_EXT, 1, ids};
VkLayerSettingsCreateInfoEXT layer_settings_create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
RETURN_IF_SKIP(InitFramework(&layer_settings_create_info));
RETURN_IF_SKIP(InitState());
VkAttachmentDescription attach = {0,
VK_FORMAT_R8G8B8A8_UNORM,
VK_SAMPLE_COUNT_1_BIT,
VK_ATTACHMENT_LOAD_OP_DONT_CARE,
VK_ATTACHMENT_STORE_OP_DONT_CARE,
VK_ATTACHMENT_LOAD_OP_DONT_CARE,
VK_ATTACHMENT_STORE_OP_DONT_CARE,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &ref, 0, nullptr, nullptr, nullptr, 0, nullptr};
VkInputAttachmentAspectReference iaar = {0, 0, VK_IMAGE_ASPECT_METADATA_BIT};
VkRenderPassInputAttachmentAspectCreateInfo rpiaaci = {VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO,
nullptr, 1, &iaar};
VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, &rpiaaci, 0, 1, &attach, 1, &subpass, 0, nullptr};
m_errorMonitor->SetUnexpectedError("VUID-VkRenderPassCreateInfo2-attachment-02525");
TestRenderPassCreate(m_errorMonitor, *m_device, rpci, false, "VUID-VkInputAttachmentAspectReference-aspectMask-01964", nullptr);
}
TEST_F(NegativeLayerSettings, VuidFilterInt) {
TEST_DESCRIPTION("Validate that message id decimal int filtering is working");
AddRequiredExtensions(VK_KHR_MAINTENANCE_2_EXTENSION_NAME);
// This test would normally produce an unexpected error or two. Use the message filter instead of
// the error_monitor's SetUnexpectedError to test the filtering.
const char *ids[] = {"2711126243"};
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "message_id_filter", VK_LAYER_SETTING_TYPE_STRING_EXT, 1, ids};
VkLayerSettingsCreateInfoEXT layer_settings_create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
RETURN_IF_SKIP(InitFramework(&layer_settings_create_info));
RETURN_IF_SKIP(InitState());
VkAttachmentDescription attach = {0,
VK_FORMAT_R8G8B8A8_UNORM,
VK_SAMPLE_COUNT_1_BIT,
VK_ATTACHMENT_LOAD_OP_DONT_CARE,
VK_ATTACHMENT_STORE_OP_DONT_CARE,
VK_ATTACHMENT_LOAD_OP_DONT_CARE,
VK_ATTACHMENT_STORE_OP_DONT_CARE,
VK_IMAGE_LAYOUT_UNDEFINED,
VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL};
VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &ref, 0, nullptr, nullptr, nullptr, 0, nullptr};
VkInputAttachmentAspectReference iaar = {0, 0, VK_IMAGE_ASPECT_METADATA_BIT};
VkRenderPassInputAttachmentAspectCreateInfo rpiaaci = {VK_STRUCTURE_TYPE_RENDER_PASS_INPUT_ATTACHMENT_ASPECT_CREATE_INFO,
nullptr, 1, &iaar};
VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, &rpiaaci, 0, 1, &attach, 1, &subpass, 0, nullptr};
m_errorMonitor->SetUnexpectedError("VUID-VkRenderPassCreateInfo2-attachment-02525");
TestRenderPassCreate(m_errorMonitor, *m_device, rpci, false, "VUID-VkInputAttachmentAspectReference-aspectMask-01964", nullptr);
}
TEST_F(NegativeLayerSettings, DebugAction) {
const char *action = "VK_DBG_LAYER_ACTION_NOT_A_REAL_THING";
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "debug_action", VK_LAYER_SETTING_TYPE_STRING_EXT, 1, &action};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
Monitor().SetDesiredWarning("was not a valid option for VK_LAYER_DEBUG_ACTION");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}
TEST_F(NegativeLayerSettings, DebugAction2) {
const char *actions[2] = {"VK_DBG_LAYER_ACTION_IGNORE,VK_DBG_LAYER_ACTION_CALLBACK"};
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "debug_action", VK_LAYER_SETTING_TYPE_STRING_EXT, 1, actions};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
Monitor().SetDesiredWarning("was not a valid option for VK_LAYER_DEBUG_ACTION");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}
TEST_F(NegativeLayerSettings, DebugAction3) {
const char *actions[2] = {"VK_DBG_LAYER_ACTION_DEFAULT", "VK_DBG_LAYER_ACTION_NOT_A_REAL_THING"};
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "debug_action", VK_LAYER_SETTING_TYPE_STRING_EXT, 2, actions};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
Monitor().SetDesiredWarning("was not a valid option for VK_LAYER_DEBUG_ACTION");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}
TEST_F(NegativeLayerSettings, ReportFlags) {
const char *report_flag = "fake";
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "report_flags", VK_LAYER_SETTING_TYPE_STRING_EXT, 1, &report_flag};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
Monitor().SetDesiredWarning("was not a valid option for VK_LAYER_REPORT_FLAGS");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}
TEST_F(NegativeLayerSettings, ReportFlags2) {
const char *report_flag = "warn,fake,info";
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "report_flags", VK_LAYER_SETTING_TYPE_STRING_EXT, 1, &report_flag};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
Monitor().SetDesiredWarning("was not a valid option for VK_LAYER_REPORT_FLAGS");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}
TEST_F(NegativeLayerSettings, ReportFlags3) {
const char *report_flag = "error,warn,info,verbose";
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "report_flags", VK_LAYER_SETTING_TYPE_STRING_EXT, 1, &report_flag};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
Monitor().SetDesiredWarning("was not a valid option for VK_LAYER_REPORT_FLAGS");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}
#ifndef WIN32
TEST_F(NegativeLayerSettings, LogFilename) {
const char *path[] = {"/fake/path"};
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "log_filename", VK_LAYER_SETTING_TYPE_STRING_EXT, 1, path};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
Monitor().SetDesiredWarning("(/fake/path) could not be opened, falling back to stdout instead");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}
#endif
TEST_F(NegativeLayerSettings, NotRealSetting) {
int32_t enable = 1;
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "not_a_real_setting", VK_LAYER_SETTING_TYPE_INT32_EXT, 1, &enable};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
Monitor().ExpectSuccess(kErrorBit | kWarningBit);
Monitor().SetDesiredWarning(
"The setting not_a_real_setting in VkLayerSettingsCreateInfoEXT was not recognize by the Validation Layers.");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}
TEST_F(NegativeLayerSettings, WrongSettingType) {
// Actually needs a VK_LAYER_SETTING_TYPE_BOOL32_EXT
int32_t enable = 1;
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "enable_message_limit", VK_LAYER_SETTING_TYPE_UINT32_EXT, 1, &enable};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
Monitor().ExpectSuccess(kErrorBit | kWarningBit);
Monitor().SetDesiredWarning(
" The setting enable_message_limit in VkLayerSettingsCreateInfoEXT was set to type VK_LAYER_SETTING_TYPE_UINT32_EXT but "
"requires type VK_LAYER_SETTING_TYPE_BOOL32_EXT and the value may be parsed incorrectly.");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}
TEST_F(NegativeLayerSettings, WrongSettingType2) {
// Actually needs a VK_LAYER_SETTING_TYPE_BOOL32_EXT
int32_t enable = 1;
const VkLayerSettingEXT setting = {OBJECT_LAYER_NAME, "thread_safety", VK_LAYER_SETTING_TYPE_UINT32_EXT, 1, &enable};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 1, &setting};
Monitor().ExpectSuccess(kErrorBit | kWarningBit);
Monitor().SetDesiredWarning(
" The setting thread_safety in VkLayerSettingsCreateInfoEXT was set to type VK_LAYER_SETTING_TYPE_UINT32_EXT but requires "
"type VK_LAYER_SETTING_TYPE_BOOL32_EXT and the value may be parsed incorrectly.");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}
TEST_F(NegativeLayerSettings, DuplicateSettings) {
VkBool32 enable = VK_TRUE;
VkBool32 disable = VK_FALSE;
const VkLayerSettingEXT settings[2] = {
{OBJECT_LAYER_NAME, "enable_message_limit", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1, &enable},
{OBJECT_LAYER_NAME, "enable_message_limit", VK_LAYER_SETTING_TYPE_BOOL32_EXT, 1, &disable}};
VkLayerSettingsCreateInfoEXT create_info = {VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT, nullptr, 2, settings};
Monitor().ExpectSuccess(kErrorBit | kWarningBit);
Monitor().SetDesiredWarning(
"The setting enable_message_limit in VkLayerSettingsCreateInfoEXT was listed twice and only the first one listed will be "
"recognized");
RETURN_IF_SKIP(InitFramework(&create_info));
RETURN_IF_SKIP(InitState());
Monitor().VerifyFound();
}