aboutsummaryrefslogtreecommitdiff
path: root/tests/positive/best_practices.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/positive/best_practices.cpp')
-rw-r--r--tests/positive/best_practices.cpp115
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);
+}