blob: fbd2f45d760fdf67e305e35d40fd9a8908f039c0 [file] [log] [blame]
/*
* Copyright (c) 2023-2025 Valve Corporation
* Copyright (c) 2023-2025 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"
#include "../framework/pipeline_helper.h"
class NegativeDeviceQueue : public VkLayerTest {};
TEST_F(NegativeDeviceQueue, FamilyIndex) {
TEST_DESCRIPTION("Create device queue with invalid queue family index.");
RETURN_IF_SKIP(InitFramework());
uint32_t queue_family_count;
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, nullptr);
std::vector<VkQueueFamilyProperties> queue_props(queue_family_count);
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, queue_props.data());
uint32_t queue_family_index = queue_family_count;
float priority = 1.0f;
VkDeviceQueueCreateInfo device_queue_ci = vku::InitStructHelper();
device_queue_ci.queueFamilyIndex = queue_family_index;
device_queue_ci.queueCount = 1;
device_queue_ci.pQueuePriorities = &priority;
VkDeviceCreateInfo device_ci = vku::InitStructHelper();
device_ci.queueCreateInfoCount = 1;
device_ci.pQueueCreateInfos = &device_queue_ci;
device_ci.enabledLayerCount = 0;
device_ci.enabledExtensionCount = m_device_extension_names.size();
device_ci.ppEnabledExtensionNames = m_device_extension_names.data();
m_errorMonitor->SetDesiredError("VUID-VkDeviceQueueCreateInfo-queueFamilyIndex-00381");
VkDevice device;
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeDeviceQueue, FamilyIndexUsage) {
TEST_DESCRIPTION("Using device queue with invalid queue family index.");
bool get_physical_device_properties2 = InstanceExtensionSupported(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
if (get_physical_device_properties2) {
m_instance_extension_names.push_back(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME);
}
all_queue_count_ = true;
RETURN_IF_SKIP(Init());
InitRenderTarget();
VkBufferCreateInfo buffer_ci = vku::InitStructHelper();
buffer_ci.size = 1024;
buffer_ci.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
buffer_ci.queueFamilyIndexCount = 2;
// Introduce failure by specifying invalid queue_family_index
uint32_t qfi[2];
qfi[0] = 777;
qfi[1] = 0;
buffer_ci.pQueueFamilyIndices = qfi;
buffer_ci.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
// Test for queue family index out of range
CreateBufferTest(buffer_ci, "VUID-VkBufferCreateInfo-sharingMode-01419");
// Test for non-unique QFI in array
qfi[0] = 0;
CreateBufferTest(buffer_ci, "VUID-VkBufferCreateInfo-sharingMode-01419");
if (m_device->Physical().queue_properties_.size() > 2) {
m_errorMonitor->SetDesiredError("VUID-vkQueueSubmit-pSubmits-04626");
// Create buffer shared to queue families 1 and 2, but submitted on queue family 0
buffer_ci.queueFamilyIndexCount = 2;
qfi[0] = 1;
qfi[1] = 2;
vkt::Buffer ib(*m_device, buffer_ci);
m_command_buffer.Begin();
vk::CmdFillBuffer(m_command_buffer, ib, 0, 16, 5);
m_command_buffer.End();
m_default_queue->SubmitAndWait(m_command_buffer);
m_errorMonitor->VerifyFound();
}
// If there is more than one queue family, create a device with a single queue family, then create a buffer
// with SHARING_MODE_CONCURRENT that uses a non-device PDEV queue family.
uint32_t queue_count;
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_count, NULL);
std::vector<VkQueueFamilyProperties> queue_props;
queue_props.resize(queue_count);
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_count, queue_props.data());
if (queue_count < 3) {
GTEST_SKIP() << "Multiple queue families are required to run this test.";
}
std::vector<float> priorities(queue_props.at(0).queueCount, 1.0f);
VkDeviceQueueCreateInfo queue_info = vku::InitStructHelper();
queue_info.queueFamilyIndex = 0;
queue_info.queueCount = queue_props.at(0).queueCount;
queue_info.pQueuePriorities = priorities.data();
VkDeviceCreateInfo dev_info = vku::InitStructHelper();
dev_info.queueCreateInfoCount = 1;
dev_info.pQueueCreateInfos = &queue_info;
dev_info.enabledLayerCount = 0;
dev_info.enabledExtensionCount = m_device_extension_names.size();
dev_info.ppEnabledExtensionNames = m_device_extension_names.data();
// Create a device with a single queue family
VkDevice second_device;
ASSERT_EQ(VK_SUCCESS, vk::CreateDevice(Gpu(), &dev_info, nullptr, &second_device));
// Select Queue family for CONCURRENT buffer that is not owned by device
buffer_ci.queueFamilyIndexCount = 2;
qfi[1] = 2;
VkBuffer buffer = VK_NULL_HANDLE;
vk::CreateBuffer(second_device, &buffer_ci, NULL, &buffer);
vk::DestroyBuffer(second_device, buffer, nullptr);
vk::DestroyDevice(second_device, nullptr);
}
TEST_F(NegativeDeviceQueue, FamilyIndexUnique) {
TEST_DESCRIPTION("Vulkan 1.0 unique queue detection");
SetTargetApiVersion(VK_API_VERSION_1_0);
RETURN_IF_SKIP(InitFramework());
// use first queue family with at least 2 queues in it
bool found_queue = false;
VkQueueFamilyProperties queue_properties; // selected queue family used
uint32_t queue_family_index = 0;
uint32_t queue_family_count = 0;
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, nullptr);
std::vector<VkQueueFamilyProperties> queue_families(queue_family_count);
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, queue_families.data());
for (size_t i = 0; i < queue_families.size(); i++) {
if (queue_families[i].queueCount > 1) {
found_queue = true;
queue_family_index = i;
queue_properties = queue_families[i];
break;
}
}
if (found_queue == false) {
GTEST_SKIP() << "test requires queue family with 2 queues, not available";
}
float queue_priority = 1.0;
VkDeviceQueueCreateInfo queue_create_info[2];
queue_create_info[0] = vku::InitStructHelper();
queue_create_info[0].flags = 0;
queue_create_info[0].queueFamilyIndex = queue_family_index;
queue_create_info[0].queueCount = 1;
queue_create_info[0].pQueuePriorities = &queue_priority;
// queueFamilyIndex is the same
queue_create_info[1] = queue_create_info[0];
VkDevice test_device = VK_NULL_HANDLE;
VkDeviceCreateInfo device_create_info = vku::InitStructHelper();
device_create_info.flags = 0;
device_create_info.pQueueCreateInfos = queue_create_info;
device_create_info.queueCreateInfoCount = 2;
device_create_info.pEnabledFeatures = nullptr;
device_create_info.enabledLayerCount = 0;
device_create_info.enabledExtensionCount = 0;
m_errorMonitor->SetDesiredError("VUID-VkDeviceCreateInfo-queueFamilyIndex-02802");
vk::CreateDevice(Gpu(), &device_create_info, nullptr, &test_device);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeDeviceQueue, MismatchedGlobalPriority) {
TEST_DESCRIPTION("Create multiple device queues with same queue family index but different global priorty.");
SetTargetApiVersion(VK_API_VERSION_1_1);
AddRequiredExtensions(VK_KHR_GLOBAL_PRIORITY_EXTENSION_NAME);
RETURN_IF_SKIP(InitFramework());
uint32_t queue_family_count;
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, nullptr);
std::vector<VkQueueFamilyProperties> queue_props(queue_family_count);
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, queue_props.data());
uint32_t queue_family_index = queue_family_count;
for (uint32_t i = 0; i < queue_family_count; ++i) {
if (queue_props[i].queueCount > 1) {
queue_family_index = i;
break;
}
}
if (queue_family_index == queue_family_count) {
GTEST_SKIP() << "Multiple queues from same queue family are required to run this test";
}
VkDeviceQueueGlobalPriorityCreateInfo queue_global_priority_ci[2] = {};
queue_global_priority_ci[0] = vku::InitStructHelper();
queue_global_priority_ci[0].globalPriority = VK_QUEUE_GLOBAL_PRIORITY_LOW;
queue_global_priority_ci[1] = vku::InitStructHelper();
queue_global_priority_ci[1].globalPriority = VK_QUEUE_GLOBAL_PRIORITY_MEDIUM;
float priorities[] = {1.0f, 1.0f};
VkDeviceQueueCreateInfo device_queue_ci[2] = {};
device_queue_ci[0] = vku::InitStructHelper(&queue_global_priority_ci[0]);
device_queue_ci[0].queueFamilyIndex = queue_family_index;
device_queue_ci[0].queueCount = 1;
device_queue_ci[0].pQueuePriorities = &priorities[0];
device_queue_ci[1] = vku::InitStructHelper(&queue_global_priority_ci[1]);
device_queue_ci[1].queueFamilyIndex = queue_family_index;
device_queue_ci[1].queueCount = 1;
device_queue_ci[1].pQueuePriorities = &priorities[1];
VkDeviceCreateInfo device_ci = vku::InitStructHelper();
device_ci.queueCreateInfoCount = 2;
device_ci.pQueueCreateInfos = device_queue_ci;
device_ci.enabledLayerCount = 0;
device_ci.enabledExtensionCount = m_device_extension_names.size();
device_ci.ppEnabledExtensionNames = m_device_extension_names.data();
m_errorMonitor->SetDesiredError("VUID-VkDeviceCreateInfo-queueFamilyIndex-02802");
m_errorMonitor->SetDesiredError("VUID-VkDeviceCreateInfo-pQueueCreateInfos-06654");
VkDevice device;
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeDeviceQueue, QueueCount) {
TEST_DESCRIPTION("Create device queue with too high of a queueCount.");
RETURN_IF_SKIP(InitFramework());
uint32_t queue_family_count;
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, nullptr);
std::vector<VkQueueFamilyProperties> queue_props(queue_family_count);
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, queue_props.data());
const uint32_t invalid_count = queue_props[0].queueCount + 1;
std::vector<float> priorities(invalid_count);
std::fill(priorities.begin(), priorities.end(), 0.0f);
VkDeviceQueueCreateInfo device_queue_ci = vku::InitStructHelper();
device_queue_ci.queueFamilyIndex = 0;
device_queue_ci.queueCount = queue_props[0].queueCount + 1;
device_queue_ci.pQueuePriorities = priorities.data();
VkDeviceCreateInfo device_ci = vku::InitStructHelper();
device_ci.queueCreateInfoCount = 1;
device_ci.pQueueCreateInfos = &device_queue_ci;
device_ci.enabledLayerCount = 0;
device_ci.enabledExtensionCount = m_device_extension_names.size();
device_ci.ppEnabledExtensionNames = m_device_extension_names.data();
VkDevice device = VK_NULL_HANDLE;
m_errorMonitor->SetDesiredError("VUID-VkDeviceQueueCreateInfo-queueCount-00382");
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeDeviceQueue, QueuePriorities) {
TEST_DESCRIPTION("Create device queue with invalid QueuePriorities");
RETURN_IF_SKIP(InitFramework());
uint32_t queue_family_count;
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, nullptr);
std::vector<VkQueueFamilyProperties> queue_props(queue_family_count);
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, queue_props.data());
VkDeviceQueueCreateInfo device_queue_ci = vku::InitStructHelper();
device_queue_ci.queueFamilyIndex = 0;
device_queue_ci.queueCount = 1;
VkDeviceCreateInfo device_ci = vku::InitStructHelper();
device_ci.queueCreateInfoCount = 1;
device_ci.pQueueCreateInfos = &device_queue_ci;
device_ci.enabledLayerCount = 0;
device_ci.enabledExtensionCount = m_device_extension_names.size();
device_ci.ppEnabledExtensionNames = m_device_extension_names.data();
VkDevice device = VK_NULL_HANDLE;
const float priority_high = 2.0f;
device_queue_ci.pQueuePriorities = &priority_high;
m_errorMonitor->SetDesiredError("VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383");
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
const float priority_low = -1.0f;
device_queue_ci.pQueuePriorities = &priority_low;
m_errorMonitor->SetDesiredError("VUID-VkDeviceQueueCreateInfo-pQueuePriorities-00383");
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeDeviceQueue, BindPipeline) {
TEST_DESCRIPTION("vkCmdPipelineBarrier with command pool with wrong queues");
RETURN_IF_SKIP(Init());
InitRenderTarget();
uint32_t only_transfer_queueFamilyIndex = vvl::kU32Max;
const auto q_props = m_device->Physical().queue_properties_;
for (uint32_t i = 0; i < (uint32_t)q_props.size(); i++) {
if (q_props[i].queueFlags == VK_QUEUE_TRANSFER_BIT) {
only_transfer_queueFamilyIndex = i;
break;
}
}
if (only_transfer_queueFamilyIndex == vvl::kU32Max) {
GTEST_SKIP() << "Only VK_QUEUE_TRANSFER_BIT Queue is not supported";
}
vkt::CommandPool commandPool(*m_device, only_transfer_queueFamilyIndex);
vkt::CommandBuffer commandBuffer(*m_device, commandPool);
CreatePipelineHelper g_pipe(*this);
g_pipe.CreateGraphicsPipeline();
CreateComputePipelineHelper c_pipe(*this);
c_pipe.CreateComputePipeline();
// Get implicit VU because using Transfer only instead of a Graphics-only or Compute-only queue
commandBuffer.Begin();
m_errorMonitor->SetDesiredError("VUID-vkCmdBindPipeline-commandBuffer-cmdpool");
m_errorMonitor->SetDesiredError("VUID-vkCmdBindPipeline-pipelineBindPoint-00777");
vk::CmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_COMPUTE, c_pipe);
m_errorMonitor->VerifyFound();
m_errorMonitor->SetDesiredError("VUID-vkCmdBindPipeline-commandBuffer-cmdpool");
m_errorMonitor->SetDesiredError("VUID-vkCmdBindPipeline-pipelineBindPoint-00778");
vk::CmdBindPipeline(commandBuffer, VK_PIPELINE_BIND_POINT_GRAPHICS, g_pipe);
m_errorMonitor->VerifyFound();
commandBuffer.End();
}
TEST_F(NegativeDeviceQueue, CreateCommandPool) {
TEST_DESCRIPTION("vkCreateCommandPool with bad queue");
RETURN_IF_SKIP(Init());
const size_t queue_count = m_device->Physical().queue_properties_.size();
m_errorMonitor->SetDesiredError("VUID-vkCreateCommandPool-queueFamilyIndex-01937");
vkt::CommandPool commandPool(*m_device, queue_count + 1);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeDeviceQueue, QueuesSameQueueFamily) {
TEST_DESCRIPTION("Request more queues than available from queue family");
SetTargetApiVersion(VK_API_VERSION_1_1);
RETURN_IF_SKIP(InitFramework());
VkPhysicalDeviceProtectedMemoryFeatures protected_memory_features = vku::InitStructHelper();
auto features2 = GetPhysicalDeviceFeatures2(protected_memory_features);
if (!protected_memory_features.protectedMemory) {
GTEST_SKIP() << "protectedMemory not supported";
}
uint32_t qf_count;
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &qf_count, nullptr);
std::vector<VkQueueFamilyProperties> qf_props(qf_count);
vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &qf_count, qf_props.data());
uint32_t index = UINT32_MAX;
for (uint32_t i = 0; i < qf_count; ++i) {
if (qf_props[i].queueFlags & VK_QUEUE_PROTECTED_BIT) {
index = i;
break;
}
}
if (UINT32_MAX == index) {
GTEST_SKIP() << "no queue supports protected memory";
}
std::vector<float> priorities(qf_props[index].queueCount, 1.0f);
VkDeviceQueueCreateInfo device_queue_ci[2];
device_queue_ci[0] = vku::InitStructHelper();
device_queue_ci[0].queueFamilyIndex = index;
device_queue_ci[0].queueCount = qf_props[index].queueCount;
device_queue_ci[0].pQueuePriorities = priorities.data();
device_queue_ci[1] = vku::InitStructHelper();
device_queue_ci[1].flags = VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT;
device_queue_ci[1].queueFamilyIndex = index;
device_queue_ci[1].queueCount = 1u;
device_queue_ci[1].pQueuePriorities = priorities.data();
VkDeviceCreateInfo device_ci = vku::InitStructHelper(&features2);
device_ci.queueCreateInfoCount = 2u;
device_ci.pQueueCreateInfos = device_queue_ci;
VkDevice device;
m_errorMonitor->SetDesiredError("VUID-VkDeviceCreateInfo-pQueueCreateInfos-06755");
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeDeviceQueue, MismatchedQueueFamiliesOnSubmit) {
TEST_DESCRIPTION(
"Submit command buffer created using one queue family and attempt to submit them on a queue created in a different queue "
"family.");
RETURN_IF_SKIP(Init()); // assumes it initializes all queue families on vk::CreateDevice
// This test is meaningless unless we have multiple queue families
auto queue_family_properties = m_device->Physical().queue_properties_;
std::vector<uint32_t> queue_families;
for (uint32_t i = 0; i < queue_family_properties.size(); ++i)
if (queue_family_properties[i].queueCount > 0) queue_families.push_back(i);
if (queue_families.size() < 2) {
GTEST_SKIP() << "Device only has one queue family";
}
const uint32_t queue_family = queue_families[0];
const uint32_t other_queue_family = queue_families[1];
VkQueue other_queue;
vk::GetDeviceQueue(device(), other_queue_family, 0, &other_queue);
vkt::CommandPool cmd_pool(*m_device, queue_family);
vkt::CommandBuffer cmd_buff(*m_device, cmd_pool);
cmd_buff.Begin();
cmd_buff.End();
// Submit on the wrong queue
VkSubmitInfo submit_info = vku::InitStructHelper();
submit_info.commandBufferCount = 1;
submit_info.pCommandBuffers = &cmd_buff.handle();
m_errorMonitor->SetDesiredError("VUID-vkQueueSubmit-pCommandBuffers-00074");
vk::QueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeDeviceQueue, DeviceCreateInvalidParameters) {
SetTargetApiVersion(VK_API_VERSION_1_2);
RETURN_IF_SKIP(InitFramework());
float priority = 1.0f;
VkDeviceQueueCreateInfo device_queue_ci = vku::InitStructHelper();
device_queue_ci.queueFamilyIndex = 0u;
device_queue_ci.queueCount = 1;
device_queue_ci.pQueuePriorities = &priority;
VkPhysicalDeviceVulkan11Features features11 = vku::InitStructHelper();
VkPhysicalDeviceVulkan11Features features11_duplicated = vku::InitStructHelper(&features11);
VkDeviceCreateInfo device_ci = vku::InitStructHelper(&features11_duplicated);
device_ci.queueCreateInfoCount = 1u;
device_ci.pQueueCreateInfos = &device_queue_ci;
device_ci.enabledLayerCount = 0u;
device_ci.enabledExtensionCount = m_device_extension_names.size();
device_ci.ppEnabledExtensionNames = m_device_extension_names.data();
VkDevice device;
m_errorMonitor->SetDesiredError("VUID-VkDeviceCreateInfo-sType-unique");
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
device_ci.pNext = nullptr;
device_ci.flags = 1u;
m_errorMonitor->SetDesiredError("VUID-VkDeviceCreateInfo-flags-zerobitmask");
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
device_ci.flags = 0u;
device_ci.pQueueCreateInfos = nullptr;
m_errorMonitor->SetDesiredError("VUID-VkDeviceCreateInfo-pQueueCreateInfos-parameter");
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
if (!DeviceExtensionSupported(VK_KHR_MAINTENANCE_9_EXTENSION_NAME)) {
device_ci.pQueueCreateInfos = &device_queue_ci;
device_ci.queueCreateInfoCount = 0u;
m_errorMonitor->SetDesiredError("VUID-VkDeviceCreateInfo-None-10778");
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
}
}
TEST_F(NegativeDeviceQueue, NoQueues) {
SetTargetApiVersion(VK_API_VERSION_1_1);
AddRequiredExtensions(VK_KHR_MAINTENANCE_9_EXTENSION_NAME);
AddRequiredFeature(vkt::Feature::maintenance9);
RETURN_IF_SKIP(InitFramework());
VkDeviceCreateInfo device_ci = vku::InitStructHelper();
device_ci.pNext = requested_features_.GetEnabledFeatures2();
device_ci.enabledExtensionCount = static_cast<uint32_t>(m_device_extension_names.size());
device_ci.ppEnabledExtensionNames = m_device_extension_names.data();
vkt::Device device(gpu_, device_ci);
VkBufferCreateInfo buffer_create_info = vku::InitStructHelper();
buffer_create_info.size = 4096;
buffer_create_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
VkBuffer buffer;
m_errorMonitor->SetDesiredError("VUID-vkCreateBuffer-device-queuecount");
vk::CreateBuffer(device, &buffer_create_info, nullptr, &buffer);
m_errorMonitor->VerifyFound();
}
TEST_F(NegativeDeviceQueue, DeviceCreateEnabledLayerNamesPointer) {
SetTargetApiVersion(VK_API_VERSION_1_2);
RETURN_IF_SKIP(InitFramework());
float priority = 1.0f;
VkDeviceQueueCreateInfo device_queue_ci = vku::InitStructHelper();
device_queue_ci.queueFamilyIndex = 0u;
device_queue_ci.queueCount = 1;
device_queue_ci.pQueuePriorities = &priority;
VkDevice device;
VkDeviceCreateInfo device_ci = vku::InitStructHelper();
device_ci.queueCreateInfoCount = 1u;
device_ci.pQueueCreateInfos = &device_queue_ci;
device_ci.enabledExtensionCount = m_device_extension_names.size();
device_ci.ppEnabledExtensionNames = m_device_extension_names.data();
device_ci.enabledLayerCount = 1u;
device_ci.ppEnabledLayerNames = nullptr;
m_errorMonitor->SetDesiredError("VUID-VkDeviceCreateInfo-ppEnabledLayerNames-parameter");
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
}
// Test works, but needs Loader fix in 369afe24d1351d6e03cbfc3daf1fc5f6cd103649
// Enable once enough CI machines have loader patch
TEST_F(NegativeDeviceQueue, DISABLED_DeviceCreateEnabledExtensionNamesPointer) {
SetTargetApiVersion(VK_API_VERSION_1_2);
RETURN_IF_SKIP(InitFramework());
float priority = 1.0f;
VkDeviceQueueCreateInfo device_queue_ci = vku::InitStructHelper();
device_queue_ci.queueFamilyIndex = 0u;
device_queue_ci.queueCount = 1;
device_queue_ci.pQueuePriorities = &priority;
VkDevice device;
VkDeviceCreateInfo device_ci = vku::InitStructHelper();
device_ci.queueCreateInfoCount = 1u;
device_ci.pQueueCreateInfos = &device_queue_ci;
device_ci.enabledLayerCount = 0u;
device_ci.ppEnabledLayerNames = nullptr;
device_ci.enabledExtensionCount = 1u;
device_ci.ppEnabledExtensionNames = nullptr;
m_errorMonitor->SetDesiredError("VUID-VkDeviceCreateInfo-ppEnabledExtensionNames-parameter");
vk::CreateDevice(Gpu(), &device_ci, nullptr, &device);
m_errorMonitor->VerifyFound();
}