test/binding: inherit Descriptor* from NonDispHandle

This also assumes VkDescriptor{SetLayout,Pool,Set} does not require any
VkDeviceMemory.
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index e66384b..d502aa4 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -482,7 +482,7 @@
 
 VkDescriptorSet VkDescriptorSetObj::GetDescriptorSetHandle() const
 {
-    return m_set->obj();
+    return m_set->handle();
 }
 
 void VkDescriptorSetObj::CreateVKDescriptorSet(VkCommandBufferObj *cmdBuffer)
@@ -529,7 +529,7 @@
     size_t imageSamplerCount = 0;
     for (std::vector<VkWriteDescriptorSet>::iterator it = m_writes.begin();
          it != m_writes.end(); it++) {
-        it->destSet = m_set->obj();
+        it->destSet = m_set->handle();
         if (it->descriptorType == VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER)
             it->pDescriptors = &m_imageSamplerDescriptors[imageSamplerCount++];
     }
diff --git a/tests/vktestbinding.cpp b/tests/vktestbinding.cpp
index a72a628..74a92d7 100644
--- a/tests/vktestbinding.cpp
+++ b/tests/vktestbinding.cpp
@@ -854,8 +854,8 @@
 
 void PipelineLayout::init(const Device &dev, VkPipelineLayoutCreateInfo &info, const std::vector<const DescriptorSetLayout *> &layouts)
 {
-    const std::vector<VkDescriptorSetLayout> layout_objs = make_objects<VkDescriptorSetLayout>(layouts);
-    info.pSetLayouts = &layout_objs[0];
+    const std::vector<VkDescriptorSetLayout> layout_handles = make_handles<VkDescriptorSetLayout>(layouts);
+    info.pSetLayouts = &layout_handles[0];
 
     NON_DISPATCHABLE_HANDLE_INIT(vkCreatePipelineLayout, dev, &info);
 }
@@ -867,40 +867,42 @@
     NON_DISPATCHABLE_HANDLE_INIT(vkCreateSampler, dev, &info);
 }
 
+NON_DISPATCHABLE_HANDLE_DTOR(DescriptorSetLayout, vkDestroyObject, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT)
+
 void DescriptorSetLayout::init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info)
 {
-    DERIVED_OBJECT_TYPE_INIT(vkCreateDescriptorSetLayout, dev, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT, &info);
-    alloc_memory();
+    NON_DISPATCHABLE_HANDLE_INIT(vkCreateDescriptorSetLayout, dev, &info);
 }
 
+NON_DISPATCHABLE_HANDLE_DTOR(DescriptorPool, vkDestroyObject, VK_OBJECT_TYPE_DESCRIPTOR_POOL)
+
 void DescriptorPool::init(const Device &dev, VkDescriptorPoolUsage usage,
                           uint32_t max_sets, const VkDescriptorPoolCreateInfo &info)
 {
-    DERIVED_OBJECT_TYPE_INIT(vkCreateDescriptorPool, dev, VK_OBJECT_TYPE_DESCRIPTOR_POOL, usage, max_sets, &info);
-    alloc_memory();
+    NON_DISPATCHABLE_HANDLE_INIT(vkCreateDescriptorPool, dev, usage, max_sets, &info);
 }
 
 void DescriptorPool::reset()
 {
-    EXPECT(vkResetDescriptorPool(dev_->handle(), obj()) == VK_SUCCESS);
+    EXPECT(vkResetDescriptorPool(device(), handle()) == VK_SUCCESS);
 }
 
 std::vector<DescriptorSet *> DescriptorPool::alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const std::vector<const DescriptorSetLayout *> &layouts)
 {
-    const std::vector<VkDescriptorSetLayout> layout_objs = make_objects<VkDescriptorSetLayout>(layouts);
+    const std::vector<VkDescriptorSetLayout> layout_handles = make_handles<VkDescriptorSetLayout>(layouts);
 
-    std::vector<VkDescriptorSet> set_objs;
-    set_objs.resize(layout_objs.size());
+    std::vector<VkDescriptorSet> set_handles;
+    set_handles.resize(layout_handles.size());
 
     uint32_t set_count;
-    VkResult err = vkAllocDescriptorSets(dev_->handle(), obj(), usage, layout_objs.size(), &layout_objs[0], &set_objs[0], &set_count);
+    VkResult err = vkAllocDescriptorSets(device(), handle(), usage, layout_handles.size(), &layout_handles[0], &set_handles[0], &set_count);
     if (err == VK_SUCCESS)
-        EXPECT(set_count == set_objs.size());
-    set_objs.resize(set_count);
+        EXPECT(set_count == set_handles.size());
+    set_handles.resize(set_count);
 
     std::vector<DescriptorSet *> sets;
     sets.reserve(set_count);
-    for (std::vector<VkDescriptorSet>::const_iterator it = set_objs.begin(); it != set_objs.end(); it++) {
+    for (std::vector<VkDescriptorSet>::const_iterator it = set_handles.begin(); it != set_handles.end(); it++) {
         // do descriptor sets need memories bound?
         DescriptorSet *descriptorSet = new DescriptorSet(dev, *it);
         sets.push_back(descriptorSet);
@@ -919,6 +921,8 @@
     return (set.empty()) ? NULL : set[0];
 }
 
+NON_DISPATCHABLE_HANDLE_DTOR(DescriptorSet, vkDestroyObject, VK_OBJECT_TYPE_DESCRIPTOR_SET)
+
 void DynamicVpStateObject::init(const Device &dev, const VkDynamicVpStateCreateInfo &info)
 {
     DERIVED_OBJECT_TYPE_INIT(vkCreateDynamicViewportState, dev, VK_OBJECT_TYPE_DYNAMIC_VP_STATE, &info);
diff --git a/tests/vktestbinding.h b/tests/vktestbinding.h
index fd3ecd1..057ce7e 100644
--- a/tests/vktestbinding.h
+++ b/tests/vktestbinding.h
@@ -596,14 +596,18 @@
     void init(const Device &dev, const VkSamplerCreateInfo &info);
 };
 
-class DescriptorSetLayout : public DerivedObject<VkDescriptorSetLayout, Object, VK_OBJECT_TYPE_DESCRIPTOR_SET_LAYOUT> {
+class DescriptorSetLayout : public internal::NonDispHandle<VkDescriptorSetLayout> {
 public:
+    ~DescriptorSetLayout();
+
     // vkCreateDescriptorSetLayout()
     void init(const Device &dev, const VkDescriptorSetLayoutCreateInfo &info);
 };
 
-class DescriptorPool : public DerivedObject<VkDescriptorPool, Object, VK_OBJECT_TYPE_DESCRIPTOR_POOL> {
+class DescriptorPool : public internal::NonDispHandle<VkDescriptorPool> {
 public:
+    ~DescriptorPool();
+
     // vkCreateDescriptorPool()
     void init(const Device &dev, VkDescriptorPoolUsage usage,
               uint32_t max_sets, const VkDescriptorPoolCreateInfo &info);
@@ -617,10 +621,12 @@
     DescriptorSet *alloc_sets(const Device &dev, VkDescriptorSetUsage usage, const DescriptorSetLayout &layout);
 };
 
-class DescriptorSet : public DerivedObject<VkDescriptorSet, Object, VK_OBJECT_TYPE_DESCRIPTOR_SET> {
+class DescriptorSet : public internal::NonDispHandle<VkDescriptorSet> {
 public:
-    explicit DescriptorSet() : DerivedObject() {}
-    explicit DescriptorSet(const Device &dev, VkDescriptorSet set) : DerivedObject(dev, set) {}
+    ~DescriptorSet();
+
+    explicit DescriptorSet() : NonDispHandle() {}
+    explicit DescriptorSet(const Device &dev, VkDescriptorSet set) : NonDispHandle(dev.handle(), set) {}
 };
 
 class DynamicVpStateObject : public DerivedObject<VkDynamicVpState, DynamicStateObject, VK_OBJECT_TYPE_DYNAMIC_VP_STATE> {
@@ -852,7 +858,7 @@
 {
     VkWriteDescriptorSet write = {};
     write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
-    write.destSet = set.obj();
+    write.destSet = set.handle();
     write.destBinding = binding;
     write.destArrayElement = array_element;
     write.count = count;
@@ -873,10 +879,10 @@
 {
     VkCopyDescriptorSet copy = {};
     copy.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
-    copy.srcSet = src_set.obj();
+    copy.srcSet = src_set.handle();
     copy.srcBinding = src_binding;
     copy.srcArrayElement = src_array_element;
-    copy.destSet = dst_set.obj();
+    copy.destSet = dst_set.handle();
     copy.destBinding = dst_binding;
     copy.destArrayElement = dst_array_element;
     copy.count = count;