| 17 | class PositiveProtectedMemory : public VkLayerTest {}; |
| 18 | |
| 19 | TEST_F(PositiveProtectedMemory, MixProtectedQueue) { |
| 20 | TEST_DESCRIPTION("Test creating 2 queues, 1 protected, and getting both with vkGetDeviceQueue2"); |
| 21 | all_queue_count_ = true; |
| 22 | SetTargetApiVersion(VK_API_VERSION_1_1); |
| 23 | AddRequiredExtensions(VK_KHR_GET_PHYSICAL_DEVICE_PROPERTIES_2_EXTENSION_NAME); |
| 24 | RETURN_IF_SKIP(InitFramework()); |
| 25 | |
| 26 | // Needed for both protected memory and vkGetDeviceQueue2 |
| 27 | |
| 28 | VkPhysicalDeviceProtectedMemoryFeatures protected_features = vku::InitStructHelper(); |
| 29 | GetPhysicalDeviceFeatures2(protected_features); |
| 30 | if (protected_features.protectedMemory == VK_FALSE) { |
| 31 | GTEST_SKIP() << "test requires protectedMemory"; |
| 32 | } |
| 33 | |
| 34 | // Try to find a protected queue family type |
| 35 | bool protected_queue = false; |
| 36 | VkQueueFamilyProperties queue_properties; // selected queue family used |
| 37 | uint32_t queue_family_index = 0; |
| 38 | uint32_t queue_family_count = 0; |
| 39 | vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, nullptr); |
| 40 | std::vector<VkQueueFamilyProperties> queue_families(queue_family_count); |
| 41 | vk::GetPhysicalDeviceQueueFamilyProperties(Gpu(), &queue_family_count, queue_families.data()); |
| 42 | |
| 43 | for (size_t i = 0; i < queue_families.size(); i++) { |
| 44 | // need to have at least 2 queues to use |
| 45 | if (((queue_families[i].queueFlags & VK_QUEUE_PROTECTED_BIT) != 0) && (queue_families[i].queueCount > 1)) { |
| 46 | protected_queue = true; |
| 47 | queue_family_index = i; |
| 48 | queue_properties = queue_families[i]; |
| 49 | break; |
| 50 | } |
| 51 | } |
| 52 | |
| 53 | if (protected_queue == false) { |
| 54 | GTEST_SKIP() << "test requires queue family with VK_QUEUE_PROTECTED_BIT and 2 queues, not available."; |
| 55 | } |
| 56 | |
| 57 | float queue_priority = 1.0; |
| 58 | |
| 59 | VkDeviceQueueCreateInfo queue_create_info[2]; |
| 60 | queue_create_info[0] = vku::InitStructHelper(); |
| 61 | queue_create_info[0].flags = VK_DEVICE_QUEUE_CREATE_PROTECTED_BIT; |
| 62 | queue_create_info[0].queueFamilyIndex = queue_family_index; |
| 63 | queue_create_info[0].queueCount = 1; |
| 64 | queue_create_info[0].pQueuePriorities = &queue_priority; |
| 65 | |
| 66 | queue_create_info[1] = vku::InitStructHelper(); |
| 67 | queue_create_info[1].flags = 0; // unprotected because the protected flag is not set |
| 68 | queue_create_info[1].queueFamilyIndex = queue_family_index; |
| 69 | queue_create_info[1].queueCount = 1; |
| 70 | queue_create_info[1].pQueuePriorities = &queue_priority; |
| 71 | |
| 72 | VkDevice test_device = VK_NULL_HANDLE; |
| 73 | VkDeviceCreateInfo device_create_info = vku::InitStructHelper(&protected_features); |
| 74 | device_create_info.flags = 0; |
| 75 | device_create_info.pQueueCreateInfos = queue_create_info; |
| 76 | device_create_info.queueCreateInfoCount = 2; |
nothing calls this directly
no test coverage detected