Skip to content

Commit cf9299d

Browse files
committed
Make validation errors a test error.
The current use of the validation layer will emit a message, but it will not case a test to fail. By adding a call back that returns true for error messages and warnings, test that have a validation error or warning will fail. I've made other changes to keep tests that already pass passing. xfail test/Basic/TestPipeline.test. Modify the VkBufferUsageFlagBits for cbuffers. They are uniform buffers not uniform texel buffers.
1 parent 81e73ae commit cf9299d

File tree

2 files changed

+88
-1
lines changed

2 files changed

+88
-1
lines changed

lib/API/VK/Device.cpp

Lines changed: 85 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ static VkBufferUsageFlagBits getFlagBits(const ResourceKind RK) {
6767
case ResourceKind::RWStructuredBuffer:
6868
return VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
6969
case ResourceKind::ConstantBuffer:
70-
return VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
70+
return VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
7171
}
7272
llvm_unreachable("All cases handled");
7373
}
@@ -86,6 +86,74 @@ static bool isUniform(const ResourceKind RK) {
8686
}
8787
llvm_unreachable("All cases handled");
8888
}
89+
90+
static std::string getMessageSeverityString(
91+
VkDebugUtilsMessageSeverityFlagBitsEXT MessageSeverity) {
92+
if (MessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
93+
return "Error";
94+
if (MessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT)
95+
return "Warning";
96+
if (MessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT)
97+
return "Info";
98+
if (MessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT)
99+
return "Verbose";
100+
return "Unknown";
101+
}
102+
103+
static VkBool32
104+
debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT MessageSeverity,
105+
VkDebugUtilsMessageTypeFlagsEXT MessageType,
106+
const VkDebugUtilsMessengerCallbackDataEXT *Data, void *) {
107+
// Only interested in messages from the validation layers.
108+
if (!(MessageType & VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT))
109+
return VK_FALSE;
110+
111+
llvm::dbgs() << "Validation " << getMessageSeverityString(MessageSeverity);
112+
llvm::dbgs() << ": [ " << Data->pMessageIdName << " ]\n";
113+
llvm::dbgs() << Data->pMessage;
114+
115+
for (uint32_t I = 0; I < Data->objectCount; I++) {
116+
llvm::dbgs() << '\n';
117+
if (Data->pObjects[I].pObjectName) {
118+
llvm::dbgs() << "[" << Data->pObjects[I].pObjectName << "]";
119+
}
120+
}
121+
llvm::dbgs() << '\n';
122+
123+
// Return true to true the validation error or warning into an error in the
124+
// vulkan API. This should causes tests to fail.
125+
const bool IsErrorOrWarning =
126+
MessageSeverity & (VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT |
127+
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT);
128+
if (IsErrorOrWarning)
129+
return VK_TRUE;
130+
131+
// Continue to run even with VERBOSE and INFO messages.
132+
return VK_FALSE;
133+
}
134+
135+
static VkDebugUtilsMessengerEXT registerDebugUtilCallback(VkInstance Instance) {
136+
VkDebugUtilsMessengerCreateInfoEXT CreateInfo = {};
137+
CreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
138+
CreateInfo.messageSeverity =
139+
VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
140+
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
141+
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
142+
CreateInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
143+
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
144+
VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
145+
CreateInfo.pfnUserCallback = debugCallback;
146+
CreateInfo.pUserData = nullptr; // Optional
147+
auto Func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
148+
Instance, "vkCreateDebugUtilsMessengerEXT");
149+
if (Func == nullptr)
150+
return VK_NULL_HANDLE;
151+
152+
VkDebugUtilsMessengerEXT DebugMessenger;
153+
Func(Instance, &CreateInfo, nullptr, &DebugMessenger);
154+
return DebugMessenger;
155+
}
156+
89157
namespace {
90158

91159
class VKDevice : public offloadtest::Device {
@@ -800,6 +868,7 @@ class VKDevice : public offloadtest::Device {
800868
class VKContext {
801869
private:
802870
VkInstance Instance = VK_NULL_HANDLE;
871+
VkDebugUtilsMessengerEXT DebugMessenger = VK_NULL_HANDLE;
803872
llvm::SmallVector<std::shared_ptr<VKDevice>> Devices;
804873

805874
VKContext() = default;
@@ -813,6 +882,13 @@ class VKContext {
813882
}
814883

815884
void cleanup() {
885+
#ifndef NDEBUG
886+
auto Func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
887+
Instance, "vkDestroyDebugUtilsMessengerEXT");
888+
if (Func != nullptr) {
889+
Func(Instance, DebugMessenger, nullptr);
890+
}
891+
#endif
816892
vkDestroyInstance(Instance, NULL);
817893
Instance = VK_NULL_HANDLE;
818894
}
@@ -860,6 +936,10 @@ class VKContext {
860936
const char *ValidationLayer = "VK_LAYER_KHRONOS_validation";
861937
CreateInfo.ppEnabledLayerNames = &ValidationLayer;
862938
CreateInfo.enabledLayerCount = 1;
939+
940+
const char *DebugUtilsExtensionName = "VK_EXT_debug_utils";
941+
CreateInfo.ppEnabledExtensionNames = &DebugUtilsExtensionName;
942+
CreateInfo.enabledExtensionCount = 1;
863943
#endif
864944

865945
Res = vkCreateInstance(&CreateInfo, NULL, &Instance);
@@ -871,6 +951,10 @@ class VKContext {
871951
"Unknown Vulkan initialization error %d",
872952
Res);
873953

954+
#ifndef NDEBUG
955+
DebugMessenger = registerDebugUtilCallback(Instance);
956+
#endif
957+
874958
DeviceCount = 0;
875959
if (vkEnumeratePhysicalDevices(Instance, &DeviceCount, nullptr))
876960
return llvm::createStringError(std::errc::no_such_device,

test/Basic/TestPipeline.test

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ DescriptorSets:
4040
...
4141
#--- end
4242

43+
# Tracking issue: https://github.com/llvm/llvm-project/issues/144580
44+
# XFAIL: Clang-Vulkan
45+
4346
# RUN: split-file %s %t
4447
# RUN: %dxc_target -T cs_6_0 -E CSMain -Fo %t.o %t/source.hlsl
4548
# RUN: %offloader %t/pipeline.yaml %t.o | FileCheck %s

0 commit comments

Comments
 (0)