blob: 3be1211415391f841ce2ffabac33ac2afba7cb73 [file] [log] [blame]
/*
* Copyright (c) 2015-2024 Valve Corporation
* Copyright (c) 2015-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
*/
#include "../framework/layer_validation_tests.h"
class PositiveDebugExtensions : public VkLayerTest {};
TEST_F(PositiveDebugExtensions, SetDebugUtilsObjectBuffer) {
TEST_DESCRIPTION("call vkSetDebugUtilsObjectNameEXT on a VkBuffer");
AddRequiredExtensions(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
RETURN_IF_SKIP(Init());
if (IsPlatformMockICD()) {
GTEST_SKIP() << "Skipping object naming test with MockICD.";
}
DebugUtilsLabelCheckData callback_data;
auto empty_callback = [](const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, DebugUtilsLabelCheckData *data) {
data->count++;
};
callback_data.count = 0;
callback_data.callback = empty_callback;
VkDebugUtilsMessengerCreateInfoEXT callback_create_info = vku::InitStructHelper();
callback_create_info.messageSeverity =
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
callback_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT;
callback_create_info.pfnUserCallback = DebugUtilsCallback;
callback_create_info.pUserData = &callback_data;
VkDebugUtilsMessengerEXT my_messenger = VK_NULL_HANDLE;
vk::CreateDebugUtilsMessengerEXT(instance(), &callback_create_info, nullptr, &my_messenger);
vkt::Buffer buffer(*m_device, 64, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
const char* object_name = "buffer_object";
VkDebugUtilsObjectNameInfoEXT name_info = vku::InitStructHelper();
name_info.objectType = VK_OBJECT_TYPE_BUFFER;
name_info.objectHandle = (uint64_t)buffer.handle();
name_info.pObjectName = object_name;
vk::SetDebugUtilsObjectNameEXT(device(), &name_info);
vk::DestroyDebugUtilsMessengerEXT(instance(), my_messenger, nullptr);
}
TEST_F(PositiveDebugExtensions, SetDebugUtilsObjectDevice) {
TEST_DESCRIPTION("call vkSetDebugUtilsObjectNameEXT on a itself as a VkDevice object");
AddRequiredExtensions(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
RETURN_IF_SKIP(Init());
if (IsPlatformMockICD()) {
GTEST_SKIP() << "Skipping object naming test with MockICD.";
}
DebugUtilsLabelCheckData callback_data;
auto empty_callback = [](const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, DebugUtilsLabelCheckData *data) {
data->count++;
};
callback_data.count = 0;
callback_data.callback = empty_callback;
VkDebugUtilsMessengerCreateInfoEXT callback_create_info = vku::InitStructHelper();
callback_create_info.messageSeverity =
VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT | VK_DEBUG_UTILS_MESSAGE_SEVERITY_WARNING_BIT_EXT;
callback_create_info.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT;
callback_create_info.pfnUserCallback = DebugUtilsCallback;
callback_create_info.pUserData = &callback_data;
VkDebugUtilsMessengerEXT my_messenger = VK_NULL_HANDLE;
vk::CreateDebugUtilsMessengerEXT(instance(), &callback_create_info, nullptr, &my_messenger);
const char* object_name = "device_object";
VkDebugUtilsObjectNameInfoEXT name_info = vku::InitStructHelper();
name_info.objectType = VK_OBJECT_TYPE_DEVICE;
name_info.objectHandle = (uint64_t)device();
name_info.pObjectName = object_name;
vk::SetDebugUtilsObjectNameEXT(device(), &name_info);
vk::DestroyDebugUtilsMessengerEXT(instance(), my_messenger, nullptr);
}
TEST_F(PositiveDebugExtensions, DebugLabelPrimaryCommandBuffer) {
TEST_DESCRIPTION("Test primary command buffer debug labels");
AddRequiredExtensions(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
RETURN_IF_SKIP(Init());
m_command_buffer.Begin();
VkDebugUtilsLabelEXT label = vku::InitStructHelper();
label.pLabelName = "test";
vk::CmdBeginDebugUtilsLabelEXT(m_command_buffer, &label);
vk::CmdEndDebugUtilsLabelEXT(m_command_buffer);
m_command_buffer.End();
m_default_queue->Submit(m_command_buffer);
m_default_queue->Wait();
}
TEST_F(PositiveDebugExtensions, DebugLabelPrimaryCommandBuffer2) {
TEST_DESCRIPTION("Test primary command buffer debug labels with multiple submits");
AddRequiredExtensions(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
RETURN_IF_SKIP(Init());
VkDebugUtilsLabelEXT label = vku::InitStructHelper();
label.pLabelName = "test";
vkt::CommandBuffer cb0(*m_device, m_command_pool);
cb0.Begin();
vk::CmdBeginDebugUtilsLabelEXT(cb0, &label);
cb0.End();
m_default_queue->Submit(cb0);
vkt::CommandBuffer cb1(*m_device, m_command_pool);
cb1.Begin();
vk::CmdEndDebugUtilsLabelEXT(cb1);
cb1.End();
m_default_queue->Submit(cb1);
m_default_queue->Wait();
}
TEST_F(PositiveDebugExtensions, DebugLabelPrimaryCommandBuffer3) {
TEST_DESCRIPTION("Test primary command buffer debug labels with multiple submits");
AddRequiredExtensions(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
RETURN_IF_SKIP(Init());
VkDebugUtilsLabelEXT label = vku::InitStructHelper();
label.pLabelName = "test";
vkt::CommandBuffer cb0(*m_device, m_command_pool);
cb0.Begin();
vk::CmdBeginDebugUtilsLabelEXT(cb0, &label);
cb0.End();
vkt::CommandBuffer cb1(*m_device, m_command_pool);
cb1.Begin();
vk::CmdEndDebugUtilsLabelEXT(cb1);
cb1.End();
std::array cbs = {&cb0, &cb1};
m_default_queue->Submit(cbs);
m_default_queue->Wait();
}
TEST_F(PositiveDebugExtensions, DebugLabelSecondaryCommandBuffer) {
AddRequiredExtensions(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
RETURN_IF_SKIP(Init());
vkt::CommandBuffer cb(*m_device, m_command_pool, VK_COMMAND_BUFFER_LEVEL_SECONDARY);
cb.Begin();
{
VkDebugUtilsLabelEXT label = vku::InitStructHelper();
label.pLabelName = "test";
vk::CmdBeginDebugUtilsLabelEXT(cb, &label);
vk::CmdEndDebugUtilsLabelEXT(cb);
}
cb.End();
}
TEST_F(PositiveDebugExtensions, SwapchainImagesDebugMarker) {
TEST_DESCRIPTION("https://github.com/KhronosGroup/Vulkan-ValidationLayers/issues/7977");
SetTargetApiVersion(VK_API_VERSION_1_1);
AddRequiredExtensions(VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
AddSurfaceExtension();
RETURN_IF_SKIP(Init());
RETURN_IF_SKIP(InitSurface());
SurfaceInformation info = GetSwapchainInfo(m_surface.Handle());
InitSwapchainInfo();
VkSwapchainCreateInfoKHR swapchain_create_info = vku::InitStructHelper();
swapchain_create_info.surface = m_surface.Handle();
swapchain_create_info.minImageCount = info.surface_capabilities.minImageCount;
swapchain_create_info.imageFormat = info.surface_formats[0].format;
swapchain_create_info.imageColorSpace = info.surface_formats[0].colorSpace;
swapchain_create_info.imageExtent = {info.surface_capabilities.minImageExtent.width,
info.surface_capabilities.minImageExtent.height};
swapchain_create_info.imageArrayLayers = 1;
swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
swapchain_create_info.compositeAlpha = info.surface_composite_alpha;
swapchain_create_info.presentMode = info.surface_non_shared_present_mode;
swapchain_create_info.clipped = VK_FALSE;
swapchain_create_info.oldSwapchain = VK_NULL_HANDLE;
vkt::Swapchain swapchain(*m_device, swapchain_create_info);
const auto images = swapchain.GetImages();
{
VkDebugMarkerObjectNameInfoEXT name_info = vku::InitStructHelper();
name_info.object = (uint64_t)images[0];
name_info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
std::string image_name = "swapchain [0]";
name_info.pObjectName = image_name.c_str();
vk::DebugMarkerSetObjectNameEXT(device(), &name_info);
}
{
int tags[2] = {1, 2};
VkDebugMarkerObjectTagInfoEXT name_info = vku::InitStructHelper();
name_info.object = (uint64_t)images[0];
name_info.objectType = VK_DEBUG_REPORT_OBJECT_TYPE_IMAGE_EXT;
name_info.tagName = 1;
name_info.tagSize = 2;
name_info.pTag = tags;
vk::DebugMarkerSetObjectTagEXT(device(), &name_info);
}
}