blob: 45b6b4db3ee8cccb4bdcc58fe2fa924d74890d80 [file] [log] [blame]
#include "utils/cast_utils.h"
#include "generated/enum_flag_bits.h"
#include "../framework/layer_validation_tests.h"
namespace {
VKAPI_ATTR VkBool32 VKAPI_CALL EmptyDebugReportCallback(VkDebugReportFlagsEXT message_flags, VkDebugReportObjectTypeEXT, uint64_t,
size_t, int32_t, const char *, const char *message, void *user_data) {
return VK_FALSE;
}
struct Instance {
VkInstance handle = VK_NULL_HANDLE;
~Instance() {
if (handle != VK_NULL_HANDLE) {
vk::DestroyInstance(handle, nullptr);
}
}
operator VkInstance() const { return handle; }
};
struct Surface {
VkInstance instance = VK_NULL_HANDLE;
VkSurfaceKHR handle = VK_NULL_HANDLE;
Surface(VkInstance instance) : instance(instance) {}
~Surface() {
if (handle != VK_NULL_HANDLE) {
vk::DestroySurfaceKHR(instance, handle, nullptr);
}
}
operator VkSurfaceKHR() const { return handle; }
};
} // namespace
ParentTest::~ParentTest() {
if (m_second_device) {
delete m_second_device;
m_second_device = nullptr;
}
}
TEST_F(NegativeParent, FillBuffer) {
TEST_DESCRIPTION("Test VUID-*-commonparent checks not sharing the same Device");
RETURN_IF_SKIP(Init())
auto features = m_device->phy().features();
m_second_device = new vkt::Device(gpu_, m_device_extension_names, &features, nullptr);
VkBufferCreateInfo buffer_ci = vku::InitStructHelper();
buffer_ci.size = 4096;
buffer_ci.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
buffer_ci.queueFamilyIndexCount = 0;
vkt::Buffer buffer(*m_second_device, buffer_ci);
m_commandBuffer->begin();
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdFillBuffer-commonparent");
vk::CmdFillBuffer(m_commandBuffer->handle(), buffer, 0, VK_WHOLE_SIZE, 0);
m_errorMonitor->VerifyFound();
m_commandBuffer->end();
}
TEST_F(NegativeParent, BindBuffer) {
TEST_DESCRIPTION("Test VUID-*-commonparent checks not sharing the same Device");
AddRequiredExtensions(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
auto features = m_device->phy().features();
m_second_device = new vkt::Device(gpu_, m_device_extension_names, &features, nullptr);
VkBufferCreateInfo buffer_ci = vku::InitStructHelper();
buffer_ci.size = 4096;
buffer_ci.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
buffer_ci.queueFamilyIndexCount = 0;
vkt::Buffer buffer;
buffer.init_no_mem(*m_device, buffer_ci);
VkMemoryRequirements mem_reqs;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetBufferMemoryRequirements-buffer-parent");
vk::GetBufferMemoryRequirements(m_second_device->device(), buffer.handle(), &mem_reqs);
m_errorMonitor->VerifyFound();
vk::GetBufferMemoryRequirements(device(), buffer.handle(), &mem_reqs);
VkMemoryAllocateInfo mem_alloc = vku::InitStructHelper();
mem_alloc.allocationSize = mem_reqs.size;
m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
vkt::DeviceMemory memory(*m_second_device, mem_alloc);
VkBindBufferMemoryInfo bind_buffer_info = vku::InitStructHelper();
bind_buffer_info.buffer = buffer.handle();
bind_buffer_info.memory = memory.handle();
bind_buffer_info.memoryOffset = 0;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindBufferMemoryInfo-commonparent");
vk::BindBufferMemory2KHR(device(), 1, &bind_buffer_info);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeParent, BindImage) {
TEST_DESCRIPTION("Test VUID-*-commonparent checks not sharing the same Device");
AddRequiredExtensions(VK_KHR_BIND_MEMORY_2_EXTENSION_NAME);
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
auto features = m_device->phy().features();
m_second_device = new vkt::Device(gpu_, m_device_extension_names, &features, nullptr);
VkImageObj image(m_device);
auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT,
VK_IMAGE_TILING_OPTIMAL);
image.Init(image_ci);
VkMemoryRequirements mem_reqs;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetImageMemoryRequirements-image-parent");
vk::GetImageMemoryRequirements(m_second_device->device(), image.handle(), &mem_reqs);
m_errorMonitor->VerifyFound();
vk::GetImageMemoryRequirements(device(), image.handle(), &mem_reqs);
VkMemoryAllocateInfo mem_alloc = vku::InitStructHelper();
mem_alloc.allocationSize = mem_reqs.size;
m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
vkt::DeviceMemory memory(*m_second_device, mem_alloc);
VkBindImageMemoryInfo bind_image_info = vku::InitStructHelper();
bind_image_info.image = image.handle();
bind_image_info.memory = memory.handle();
bind_image_info.memoryOffset = 0;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkBindImageMemoryInfo-commonparent");
vk::BindImageMemory2KHR(device(), 1, &bind_image_info);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeParent, ImageView) {
TEST_DESCRIPTION("Test VUID-*-commonparent checks not sharing the same Device");
RETURN_IF_SKIP(Init())
auto features = m_device->phy().features();
m_second_device = new vkt::Device(gpu_, m_device_extension_names, &features, nullptr);
VkImageObj image(m_device);
auto image_ci = VkImageObj::ImageCreateInfo2D(128, 128, 1, 1, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT,
VK_IMAGE_TILING_OPTIMAL);
image.Init(image_ci);
VkImageView image_view;
VkImageViewCreateInfo ivci = vku::InitStructHelper();
ivci.image = image.handle();
ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
ivci.subresourceRange.layerCount = 1;
ivci.subresourceRange.baseMipLevel = 0;
ivci.subresourceRange.levelCount = 1;
ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCreateImageView-image-09179");
vk::CreateImageView(m_second_device->device(), &ivci, nullptr, &image_view);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeParent, BindPipeline) {
TEST_DESCRIPTION("Test binding pipeline from another device");
RETURN_IF_SKIP(Init())
auto features = m_device->phy().features();
m_second_device = new vkt::Device(gpu_, m_device_extension_names, &features, nullptr);
VkPipelineLayoutCreateInfo pipeline_layout_ci = vku::InitStructHelper();
pipeline_layout_ci.setLayoutCount = 0;
vkt::PipelineLayout pipeline_layout(*m_second_device, pipeline_layout_ci);
VkShaderObj cs(this, kMinimalShaderGlsl, VK_SHADER_STAGE_COMPUTE_BIT, SPV_ENV_VULKAN_1_0, SPV_SOURCE_GLSL_TRY);
cs.InitFromGLSLTry(false, m_second_device);
VkComputePipelineCreateInfo pipeline_ci = vku::InitStructHelper();
pipeline_ci.layout = pipeline_layout.handle();
pipeline_ci.stage = cs.GetStageCreateInfo();
vkt::Pipeline pipeline(*m_second_device, pipeline_ci);
m_commandBuffer->begin();
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkCmdBindPipeline-commonparent");
vk::CmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_COMPUTE, pipeline.handle());
m_errorMonitor->VerifyFound();
m_commandBuffer->end();
}
TEST_F(NegativeParent, Instance_PhysicalDeviceAndSurface) {
TEST_DESCRIPTION("Surface from a different instance in vkGetPhysicalDeviceSurfaceSupportKHR");
AddSurfaceExtension();
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
const auto instance_create_info = GetInstanceCreateInfo();
Instance instance2;
ASSERT_EQ(VK_SUCCESS, vk::CreateInstance(&instance_create_info, nullptr, &instance2.handle));
SurfaceContext surface_context;
Surface instance2_surface(instance2);
if (!CreateSurface(surface_context, instance2_surface.handle, instance2)) {
GTEST_SKIP() << "Cannot create surface";
}
VkBool32 supported = VK_FALSE;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetPhysicalDeviceSurfaceSupportKHR-commonparent");
vk::GetPhysicalDeviceSurfaceSupportKHR(gpu(), m_device->graphics_queue_node_index_, instance2_surface, &supported);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeParent, Instance_DeviceAndSurface) {
TEST_DESCRIPTION("Surface from a different instance in vkGetDeviceGroupSurfacePresentModesKHR");
AddSurfaceExtension();
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
const auto instance_create_info = GetInstanceCreateInfo();
Instance instance2;
ASSERT_EQ(VK_SUCCESS, vk::CreateInstance(&instance_create_info, nullptr, &instance2.handle));
SurfaceContext surface_context;
Surface instance2_surface(instance2);
if (!CreateSurface(surface_context, instance2_surface.handle, instance2)) {
GTEST_SKIP() << "Cannot create surface";
}
VkDeviceGroupPresentModeFlagsKHR flags = 0;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetDeviceGroupSurfacePresentModesKHR-commonparent");
vk::GetDeviceGroupSurfacePresentModesKHR(m_device->handle(), instance2_surface, &flags);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeParent, Instance_Surface) {
TEST_DESCRIPTION("Surface from a different instance in vkCreateSwapchainKHR");
AddSurfaceExtension();
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
if (!InitSurface()) {
GTEST_SKIP() << "Cannot create surface";
}
InitSwapchainInfo();
const auto instance_create_info = GetInstanceCreateInfo();
Instance instance2;
ASSERT_EQ(VK_SUCCESS, vk::CreateInstance(&instance_create_info, nullptr, &instance2.handle));
SurfaceContext surface_context;
Surface instance2_surface(instance2);
if (!CreateSurface(surface_context, instance2_surface.handle, instance2)) {
GTEST_SKIP() << "Cannot create surface";
}
auto swapchain_ci = vku::InitStruct<VkSwapchainCreateInfoKHR>();
swapchain_ci.surface = instance2_surface;
swapchain_ci.minImageCount = m_surface_capabilities.minImageCount;
swapchain_ci.imageFormat = m_surface_formats[0].format;
swapchain_ci.imageColorSpace = m_surface_formats[0].colorSpace;
swapchain_ci.imageExtent = {m_surface_capabilities.minImageExtent.width, m_surface_capabilities.minImageExtent.height};
swapchain_ci.imageArrayLayers = 1;
swapchain_ci.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
swapchain_ci.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
swapchain_ci.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
swapchain_ci.compositeAlpha = m_surface_composite_alpha;
swapchain_ci.presentMode = m_surface_non_shared_present_mode;
swapchain_ci.clipped = VK_FALSE;
swapchain_ci.oldSwapchain = VK_NULL_HANDLE;
// surface from a different instance
VkSwapchainKHR swapchain = VK_NULL_HANDLE;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSwapchainCreateInfoKHR-commonparent");
vk::CreateSwapchainKHR(device(), &swapchain_ci, nullptr, &swapchain);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeParent, Device_OldSwapchain) {
TEST_DESCRIPTION("oldSwapchain from a different device in vkCreateSwapchainKHR");
AddSurfaceExtension();
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
if (!InitSurface()) {
GTEST_SKIP() << "Cannot create surface";
}
InitSwapchainInfo();
const auto instance_create_info = GetInstanceCreateInfo();
Instance instance2;
ASSERT_EQ(VK_SUCCESS, vk::CreateInstance(&instance_create_info, nullptr, &instance2.handle));
SurfaceContext surface_context;
Surface instance2_surface(instance2);
if (!CreateSurface(surface_context, instance2_surface.handle, instance2)) {
GTEST_SKIP() << "Cannot create surface";
}
VkPhysicalDevice instance2_physical_device = VK_NULL_HANDLE;
{
uint32_t gpu_count = 0;
vk::EnumeratePhysicalDevices(instance2, &gpu_count, nullptr);
assert(gpu_count > 0);
std::vector<VkPhysicalDevice> physical_devices(gpu_count);
vk::EnumeratePhysicalDevices(instance2, &gpu_count, physical_devices.data());
instance2_physical_device = physical_devices[0];
}
vkt::Device instance2_device(instance2_physical_device, m_device_extension_names);
auto swapchain_ci = vku::InitStruct<VkSwapchainCreateInfoKHR>();
swapchain_ci.surface = instance2_surface;
swapchain_ci.minImageCount = m_surface_capabilities.minImageCount;
swapchain_ci.imageFormat = m_surface_formats[0].format;
swapchain_ci.imageColorSpace = m_surface_formats[0].colorSpace;
swapchain_ci.imageExtent = {m_surface_capabilities.minImageExtent.width, m_surface_capabilities.minImageExtent.height};
swapchain_ci.imageArrayLayers = 1;
swapchain_ci.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
swapchain_ci.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
swapchain_ci.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
swapchain_ci.compositeAlpha = m_surface_composite_alpha;
swapchain_ci.presentMode = m_surface_non_shared_present_mode;
swapchain_ci.clipped = VK_FALSE;
swapchain_ci.oldSwapchain = VK_NULL_HANDLE;
VkSwapchainKHR other_device_swapchain = VK_NULL_HANDLE;
ASSERT_EQ(VK_SUCCESS, vk::CreateSwapchainKHR(instance2_device.device(), &swapchain_ci, nullptr, &other_device_swapchain));
// oldSwapchain from a different device
swapchain_ci.surface = m_surface;
swapchain_ci.oldSwapchain = other_device_swapchain;
VkSwapchainKHR swapchain = VK_NULL_HANDLE;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-VkSwapchainCreateInfoKHR-commonparent");
vk::CreateSwapchainKHR(device(), &swapchain_ci, nullptr, &swapchain);
m_errorMonitor->VerifyFound();
vk::DestroySwapchainKHR(instance2_device.device(), other_device_swapchain, nullptr);
}
TEST_F(NegativeParent, Instance_Surface_2) {
TEST_DESCRIPTION("Surface from a different instance in vkDestroySurfaceKHR");
AddSurfaceExtension();
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
const auto instance_create_info = GetInstanceCreateInfo();
Instance instance2;
ASSERT_EQ(VK_SUCCESS, vk::CreateInstance(&instance_create_info, nullptr, &instance2.handle));
SurfaceContext surface_context;
Surface instance2_surface(instance2);
if (!CreateSurface(surface_context, instance2_surface.handle, instance2)) {
GTEST_SKIP() << "Cannot create surface";
}
// surface from a different instance
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkDestroySurfaceKHR-surface-parent");
vk::DestroySurfaceKHR(instance(), instance2_surface, nullptr);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeParent, Instance_DebugUtilsMessenger) {
TEST_DESCRIPTION("VkDebugUtilsMessengerEXT from a different instance in vkDestroyDebugUtilsMessengerEXT");
AddRequiredExtensions(VK_EXT_DEBUG_UTILS_EXTENSION_NAME);
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
const VkInstanceCreateInfo instance_create_info = GetInstanceCreateInfo();
Instance instance2;
ASSERT_EQ(VK_SUCCESS, vk::CreateInstance(&instance_create_info, nullptr, &instance2.handle));
auto empty_callback = [](const VkDebugUtilsMessengerCallbackDataEXT *pCallbackData, DebugUtilsLabelCheckData *data) {};
DebugUtilsLabelCheckData callback_data{};
callback_data.callback = empty_callback;
VkDebugUtilsMessengerEXT messenger = VK_NULL_HANDLE;
{
auto messenger_ci = vku::InitStruct<VkDebugUtilsMessengerCreateInfoEXT>();
messenger_ci.messageSeverity = VK_DEBUG_UTILS_MESSAGE_SEVERITY_ERROR_BIT_EXT;
messenger_ci.messageType = VK_DEBUG_UTILS_MESSAGE_TYPE_VALIDATION_BIT_EXT;
messenger_ci.pfnUserCallback = DebugUtilsCallback;
messenger_ci.pUserData = &callback_data;
ASSERT_EQ(VK_SUCCESS, vk::CreateDebugUtilsMessengerEXT(instance2, &messenger_ci, nullptr, &messenger));
}
// debug utils messenger from a different instance
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkDestroyDebugUtilsMessengerEXT-messenger-parent");
vk::DestroyDebugUtilsMessengerEXT(instance(), messenger, nullptr);
m_errorMonitor->VerifyFound();
vk::DestroyDebugUtilsMessengerEXT(instance2, messenger, nullptr);
}
TEST_F(NegativeParent, Instance_DebugReportCallback) {
TEST_DESCRIPTION("VkDebugReportCallbackEXT from a different instance in vkDestroyDebugReportCallbackEXT");
AddRequiredExtensions(VK_EXT_DEBUG_MARKER_EXTENSION_NAME);
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
const auto instance_create_info = GetInstanceCreateInfo();
Instance instance2;
ASSERT_EQ(VK_SUCCESS, vk::CreateInstance(&instance_create_info, nullptr, &instance2.handle));
VkDebugReportCallbackEXT callback = VK_NULL_HANDLE;
{
auto callback_ci = vku::InitStruct<VkDebugReportCallbackCreateInfoEXT>();
callback_ci.flags = VK_DEBUG_REPORT_ERROR_BIT_EXT;
callback_ci.pfnCallback = &EmptyDebugReportCallback;
ASSERT_EQ(VK_SUCCESS, vk::CreateDebugReportCallbackEXT(instance2, &callback_ci, nullptr, &callback));
}
// debug report callback from a different instance
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkDestroyDebugReportCallbackEXT-callback-parent");
vk::DestroyDebugReportCallbackEXT(instance(), callback, nullptr);
m_errorMonitor->VerifyFound();
vk::DestroyDebugReportCallbackEXT(instance2, callback, nullptr);
}
TEST_F(NegativeParent, PhysicalDevice_Display) {
TEST_DESCRIPTION("VkDisplayKHR from a different physical device in vkGetDisplayModePropertiesKHR");
AddRequiredExtensions(VK_KHR_DISPLAY_EXTENSION_NAME);
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
const VkInstanceCreateInfo instance_create_info = GetInstanceCreateInfo();
Instance instance2;
ASSERT_EQ(VK_SUCCESS, vk::CreateInstance(&instance_create_info, nullptr, &instance2.handle));
VkPhysicalDevice instance2_gpu = VK_NULL_HANDLE;
{
uint32_t gpu_count = 0;
vk::EnumeratePhysicalDevices(instance2, &gpu_count, nullptr);
ASSERT_GT(gpu_count, 0);
std::vector<VkPhysicalDevice> physical_devices(gpu_count);
vk::EnumeratePhysicalDevices(instance2, &gpu_count, physical_devices.data());
instance2_gpu = physical_devices[0];
}
VkDisplayKHR display = VK_NULL_HANDLE;
{
uint32_t display_count = 0;
ASSERT_EQ(VK_SUCCESS, vk::GetPhysicalDeviceDisplayPropertiesKHR(instance2_gpu, &display_count, nullptr));
if (display_count == 0) {
GTEST_SKIP() << "No VkDisplayKHR displays found";
}
std::vector<VkDisplayPropertiesKHR> display_props{display_count};
ASSERT_EQ(VK_SUCCESS, vk::GetPhysicalDeviceDisplayPropertiesKHR(instance2_gpu, &display_count, display_props.data()));
display = display_props[0].display;
}
// display from a different physical device
uint32_t mode_count = 0;
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetDisplayModePropertiesKHR-display-parent");
vk::GetDisplayModePropertiesKHR(gpu(), display, &mode_count, nullptr);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeParent, PhysicalDevice_DisplayMode) {
TEST_DESCRIPTION("VkDisplayModeKHR from a different physical device in vkGetDisplayPlaneCapabilitiesKHR");
AddRequiredExtensions(VK_KHR_DISPLAY_EXTENSION_NAME);
RETURN_IF_SKIP(InitFramework())
RETURN_IF_SKIP(InitState())
const VkInstanceCreateInfo instance_create_info = GetInstanceCreateInfo();
Instance instance2;
ASSERT_EQ(VK_SUCCESS, vk::CreateInstance(&instance_create_info, nullptr, &instance2.handle));
VkPhysicalDevice instance2_gpu = VK_NULL_HANDLE;
{
uint32_t gpu_count = 0;
vk::EnumeratePhysicalDevices(instance2, &gpu_count, nullptr);
ASSERT_GT(gpu_count, 0);
std::vector<VkPhysicalDevice> physical_devices(gpu_count);
vk::EnumeratePhysicalDevices(instance2, &gpu_count, physical_devices.data());
instance2_gpu = physical_devices[0];
}
VkDisplayKHR display = VK_NULL_HANDLE;
{
uint32_t plane_count = 0;
ASSERT_EQ(VK_SUCCESS, vk::GetPhysicalDeviceDisplayPlanePropertiesKHR(instance2_gpu, &plane_count, nullptr));
if (plane_count == 0) {
GTEST_SKIP() << "No display planes found";
}
std::vector<VkDisplayPlanePropertiesKHR> display_planes(plane_count);
ASSERT_EQ(VK_SUCCESS, vk::GetPhysicalDeviceDisplayPlanePropertiesKHR(instance2_gpu, &plane_count, display_planes.data()));
display = display_planes[0].currentDisplay;
if (display == VK_NULL_HANDLE) {
GTEST_SKIP() << "Null display";
}
}
VkDisplayModeKHR display_mode = VK_NULL_HANDLE;
{
uint32_t mode_count = 0;
ASSERT_EQ(VK_SUCCESS, vk::GetDisplayModePropertiesKHR(instance2_gpu, display, &mode_count, nullptr));
if (mode_count == 0) {
GTEST_SKIP() << "No display modes found";
}
std::vector<VkDisplayModePropertiesKHR> display_modes(mode_count);
ASSERT_EQ(VK_SUCCESS, vk::GetDisplayModePropertiesKHR(instance2_gpu, display, &mode_count, display_modes.data()));
display_mode = display_modes[0].displayMode;
if (display_mode == VK_NULL_HANDLE) {
GTEST_SKIP() << "Null display mode";
}
}
// display mode from a different physical device
VkDisplayPlaneCapabilitiesKHR plane_capabilities{};
m_errorMonitor->SetDesiredFailureMsg(kErrorBit, "VUID-vkGetDisplayPlaneCapabilitiesKHR-mode-parent");
vk::GetDisplayPlaneCapabilitiesKHR(gpu(), display_mode, 0, &plane_capabilities);
m_errorMonitor->VerifyFound();
}