Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 85 additions & 1 deletion lib/API/VK/Device.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ static VkDescriptorType getDescriptorType(const ResourceKind RK) {
static VkBufferUsageFlagBits getFlagBits(const ResourceKind RK) {
switch (RK) {
case ResourceKind::Buffer:
return VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
case ResourceKind::RWBuffer:
return VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
case ResourceKind::ByteAddressBuffer:
Expand All @@ -67,7 +68,7 @@ static VkBufferUsageFlagBits getFlagBits(const ResourceKind RK) {
case ResourceKind::RWStructuredBuffer:
return VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
case ResourceKind::ConstantBuffer:
return VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
return VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
}
llvm_unreachable("All cases handled");
}
Expand All @@ -86,6 +87,73 @@ static bool isUniform(const ResourceKind RK) {
}
llvm_unreachable("All cases handled");
}

static std::string getMessageSeverityString(
VkDebugUtilsMessageSeverityFlagBitsEXT MessageSeverity) {
if (MessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT)
return "Error";
if (MessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT)
return "Warning";
if (MessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_INFO_BIT_EXT)
return "Info";
if (MessageSeverity & VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT)
return "Verbose";
return "Unknown";
}

static VkBool32
debugCallback(VkDebugUtilsMessageSeverityFlagBitsEXT MessageSeverity,
VkDebugUtilsMessageTypeFlagsEXT MessageType,
const VkDebugUtilsMessengerCallbackDataEXT *Data, void *) {
// Only interested in messages from the validation layers.
if (!(MessageType & VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT))
return VK_FALSE;

llvm::dbgs() << "Validation " << getMessageSeverityString(MessageSeverity);
llvm::dbgs() << ": [ " << Data->pMessageIdName << " ]\n";
llvm::dbgs() << Data->pMessage;

for (uint32_t I = 0; I < Data->objectCount; I++) {
llvm::dbgs() << '\n';
if (Data->pObjects[I].pObjectName) {
llvm::dbgs() << "[" << Data->pObjects[I].pObjectName << "]";
}
}
llvm::dbgs() << '\n';

// Return true to turn the validation error or warning into an error in the
// vulkan API. This should causes tests to fail.
const bool IsErrorOrWarning =
MessageSeverity & (VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT);
if (IsErrorOrWarning)
return VK_TRUE;

// Continue to run even with VERBOSE and INFO messages.
return VK_FALSE;
}

static VkDebugUtilsMessengerEXT registerDebugUtilCallback(VkInstance Instance) {
VkDebugUtilsMessengerCreateInfoEXT CreateInfo = {};
CreateInfo.sType = VK_STRUCTURE_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT;
CreateInfo.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_VERBOSE_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
CreateInfo.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_GENERAL_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT |
VK_DEBUG_UTILS_MESSAGE_TYPE_PERFORMANCE_BIT_EXT;
CreateInfo.pfnUserCallback = debugCallback;
CreateInfo.pUserData = nullptr; // Optional
auto Func = (PFN_vkCreateDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
Instance, "vkCreateDebugUtilsMessengerEXT");
if (Func == nullptr)
return VK_NULL_HANDLE;

VkDebugUtilsMessengerEXT DebugMessenger;
Func(Instance, &CreateInfo, nullptr, &DebugMessenger);
return DebugMessenger;
}

namespace {

class VKDevice : public offloadtest::Device {
Expand Down Expand Up @@ -800,6 +868,7 @@ class VKDevice : public offloadtest::Device {
class VKContext {
private:
VkInstance Instance = VK_NULL_HANDLE;
VkDebugUtilsMessengerEXT DebugMessenger = VK_NULL_HANDLE;
llvm::SmallVector<std::shared_ptr<VKDevice>> Devices;

VKContext() = default;
Expand All @@ -813,6 +882,13 @@ class VKContext {
}

void cleanup() {
#ifndef NDEBUG
auto Func = (PFN_vkDestroyDebugUtilsMessengerEXT)vkGetInstanceProcAddr(
Instance, "vkDestroyDebugUtilsMessengerEXT");
if (Func != nullptr) {
Func(Instance, DebugMessenger, nullptr);
}
#endif
vkDestroyInstance(Instance, NULL);
Instance = VK_NULL_HANDLE;
}
Expand Down Expand Up @@ -860,6 +936,10 @@ class VKContext {
const char *ValidationLayer = "VK_LAYER_KHRONOS_validation";
CreateInfo.ppEnabledLayerNames = &ValidationLayer;
CreateInfo.enabledLayerCount = 1;

const char *DebugUtilsExtensionName = "VK_EXT_debug_utils";
CreateInfo.ppEnabledExtensionNames = &DebugUtilsExtensionName;
CreateInfo.enabledExtensionCount = 1;
#endif

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

#ifndef NDEBUG
DebugMessenger = registerDebugUtilCallback(Instance);
#endif

DeviceCount = 0;
if (vkEnumeratePhysicalDevices(Instance, &DeviceCount, nullptr))
return llvm::createStringError(std::errc::no_such_device,
Expand Down
3 changes: 3 additions & 0 deletions test/Basic/TestPipeline.test
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ DescriptorSets:
...
#--- end

# Tracking issue: https://github.com/llvm/llvm-project/issues/144580
# XFAIL: Clang-Vulkan

# RUN: split-file %s %t
# RUN: %dxc_target -T cs_6_0 -E CSMain -Fo %t.o %t/source.hlsl
# RUN: %offloader %t/pipeline.yaml %t.o | FileCheck %s
Expand Down
3 changes: 3 additions & 0 deletions test/Feature/WaveOps/WaveActiveAllTrue.test
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,9 @@ DescriptorSets:
...
#--- end

# https://github.com/llvm/llvm-project/issues/145513
# XFAIL: Clang-Vulkan

# RUN: split-file %s %t
# RUN: %dxc_target -T cs_6_5 -Fo %t.o %t/source.hlsl
# RUN: %offloader %t/pipeline.yaml %t.o
3 changes: 3 additions & 0 deletions test/Feature/WaveOps/WaveActiveAnyTrue.test
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,9 @@ DescriptorSets:
...
#--- end

# https://github.com/llvm/llvm-project/issues/145513
# XFAIL: Clang-Vulkan

# RUN: split-file %s %t
# RUN: %dxc_target -T cs_6_5 -Fo %t.o %t/source.hlsl
# RUN: %offloader %t/pipeline.yaml %t.o
3 changes: 3 additions & 0 deletions test/Feature/WaveOps/WaveActiveCountBits.test
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,9 @@ DescriptorSets:
...
#--- end

# https://github.com/llvm/llvm-project/issues/145513
# XFAIL: Clang-Vulkan

# RUN: split-file %s %t
# RUN: %dxc_target -T cs_6_5 -Fo %t.o %t/source.hlsl
# RUN: %offloader %t/pipeline.yaml %t.o
Expand Down
3 changes: 3 additions & 0 deletions test/Feature/WaveOps/WaveIsFirstLane.test
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,9 @@ DescriptorSets:
...
#--- end

# https://github.com/llvm/llvm-project/issues/145513
# XFAIL: Clang-Vulkan

# RUN: split-file %s %t
# RUN: %dxc_target -T cs_6_5 -Fo %t.o %t/source.hlsl
# RUN: %offloader %t/pipeline.yaml %t.o