diff options
Diffstat (limited to 'tests/positive/best_practices.cpp')
-rw-r--r-- | tests/positive/best_practices.cpp | 115 |
1 files changed, 115 insertions, 0 deletions
diff --git a/tests/positive/best_practices.cpp b/tests/positive/best_practices.cpp new file mode 100644 index 000000000..e0c8499da --- /dev/null +++ b/tests/positive/best_practices.cpp @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2015-2023 The Khronos Group Inc. + * Copyright (c) 2015-2023 Valve Corporation + * Copyright (c) 2015-2023 LunarG, Inc. + * Copyright (c) 2015-2023 Google, 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 + * + * Author: Chia-I Wu <olvaffe@gmail.com> + * Author: Chris Forbes <chrisf@ijw.co.nz> + * Author: Courtney Goeltzenleuchter <courtney@LunarG.com> + * Author: Mark Lobodzinski <mark@lunarg.com> + * Author: Mike Stroyan <mike@LunarG.com> + * Author: Tobin Ehlis <tobine@google.com> + * Author: Tony Barbour <tony@LunarG.com> + * Author: Cody Northrop <cnorthrop@google.com> + * Author: Dave Houlton <daveh@lunarg.com> + * Author: Jeremy Kniager <jeremyk@lunarg.com> + * Author: Shannon McPherson <shannon@lunarg.com> + * Author: John Zulauf <jzulauf@lunarg.com> + */ + +#include "../layer_validation_tests.h" + +class VkPositiveBestPracticesLayerTest : public VkBestPracticesLayerTest {}; + +TEST_F(VkPositiveBestPracticesLayerTest, TestDestroyFreeNullHandles) { + VkResult err; + + TEST_DESCRIPTION("Call all applicable destroy and free routines with NULL handles, expecting no validation errors"); + + ASSERT_NO_FATAL_FAILURE(InitBestPracticesFramework()); + ASSERT_NO_FATAL_FAILURE(InitState()); + ASSERT_NO_FATAL_FAILURE(InitViewport()); + ASSERT_NO_FATAL_FAILURE(InitRenderTarget()); + + vk::DestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyDevice(VK_NULL_HANDLE, NULL); + vk::DestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyFence(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyImage(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyInstance(VK_NULL_HANDLE, NULL); + vk::DestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroySampler(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL); + vk::DestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL); + + VkCommandPool command_pool; + VkCommandPoolCreateInfo pool_create_info{}; + pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; + pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_; + pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT; + vk::CreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool); + VkCommandBuffer command_buffers[3] = {}; + VkCommandBufferAllocateInfo command_buffer_allocate_info{}; + command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO; + command_buffer_allocate_info.commandPool = command_pool; + command_buffer_allocate_info.commandBufferCount = 1; + command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY; + vk::AllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]); + vk::FreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers); + vk::DestroyCommandPool(m_device->device(), command_pool, NULL); + + VkDescriptorPoolSize ds_type_count = {}; + ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; + ds_type_count.descriptorCount = 1; + + VkDescriptorPoolCreateInfo ds_pool_ci = {}; + ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO; + ds_pool_ci.pNext = NULL; + ds_pool_ci.maxSets = 1; + ds_pool_ci.poolSizeCount = 1; + ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT; + ds_pool_ci.pPoolSizes = &ds_type_count; + + VkDescriptorPool ds_pool; + err = vk::CreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool); + ASSERT_VK_SUCCESS(err); + + VkDescriptorSetLayoutBinding dsl_binding = {}; + dsl_binding.binding = 2; + dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC; + dsl_binding.descriptorCount = 1; + dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; + dsl_binding.pImmutableSamplers = NULL; + + const VkDescriptorSetLayoutObj ds_layout(m_device, {dsl_binding}); + + VkDescriptorSet descriptor_sets[3] = {}; + VkDescriptorSetAllocateInfo alloc_info = {}; + alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO; + alloc_info.descriptorSetCount = 1; + alloc_info.descriptorPool = ds_pool; + alloc_info.pSetLayouts = &ds_layout.handle(); + err = vk::AllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]); + ASSERT_VK_SUCCESS(err); + vk::FreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets); + vk::DestroyDescriptorPool(m_device->device(), ds_pool, NULL); + + vk::FreeMemory(m_device->device(), VK_NULL_HANDLE, NULL); +} |