test/binding: inherit Pipeline from NonDispHandle

This also assumes VkPipeline does not require any VkDeviceMemory.
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 10722e9..8f3eeeb 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -1469,7 +1469,7 @@
 
 void VkCommandBufferObj::BindPipeline(VkPipelineObj &pipeline)
 {
-    vkCmdBindPipeline( obj(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.obj() );
+    vkCmdBindPipeline( obj(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline.handle() );
 }
 
 void VkCommandBufferObj::BindDescriptorSet(VkDescriptorSetObj &descriptorSet)
diff --git a/tests/vktestbinding.cpp b/tests/vktestbinding.cpp
index 8ffe9cc..4028578 100644
--- a/tests/vktestbinding.cpp
+++ b/tests/vktestbinding.cpp
@@ -802,6 +802,8 @@
     return err;
 }
 
+NON_DISPATCHABLE_HANDLE_DTOR(Pipeline, vkDestroyObject, VK_OBJECT_TYPE_PIPELINE)
+
 void Pipeline::init(const Device &dev, const VkGraphicsPipelineCreateInfo &info)
 {
     VkPipelineCache cache;
@@ -810,8 +812,7 @@
     ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
     VkResult err = vkCreatePipelineCache(dev.handle(), &ci, &cache);
     if (err == VK_SUCCESS) {
-        DERIVED_OBJECT_TYPE_INIT(vkCreateGraphicsPipelines, dev, VK_OBJECT_TYPE_PIPELINE, cache, 1, &info);
-        alloc_memory();
+        NON_DISPATCHABLE_HANDLE_INIT(vkCreateGraphicsPipelines, dev, cache, 1, &info);
         vkDestroyPipelineCache(dev.handle(), cache);
     }
 }
@@ -821,7 +822,6 @@
     VkPipeline pipe;
     VkPipelineCache cache;
     VkPipelineCacheCreateInfo ci;
-    dev_ = &dev;
     memset((void *) &ci, 0, sizeof(VkPipelineCacheCreateInfo));
     ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
     VkResult err = vkCreatePipelineCache(dev.handle(), &ci, &cache);
@@ -829,8 +829,7 @@
     if (err == VK_SUCCESS) {
         err = vkCreateGraphicsPipelines(dev.handle(), cache, 1, &info, &pipe);
         if (err == VK_SUCCESS) {
-            Object::init(pipe, VK_OBJECT_TYPE_PIPELINE);
-            alloc_memory();
+            NonDispHandle::init(dev.handle(), pipe);
             vkDestroyPipelineCache(dev.handle(), cache);
         }
     }
@@ -838,7 +837,6 @@
     return err;
 }
 
-
 void Pipeline::init(const Device &dev, const VkComputePipelineCreateInfo &info)
 {
     VkPipelineCache cache;
@@ -847,8 +845,7 @@
     ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
     VkResult err = vkCreatePipelineCache(dev.handle(), &ci, &cache);
     if (err == VK_SUCCESS) {
-        DERIVED_OBJECT_TYPE_INIT(vkCreateComputePipelines, dev, VK_OBJECT_TYPE_PIPELINE, cache, 1, &info);
-        alloc_memory();
+        NON_DISPATCHABLE_HANDLE_INIT(vkCreateComputePipelines, dev, cache, 1, &info);
         vkDestroyPipelineCache(dev.handle(), cache);
     }
 }
diff --git a/tests/vktestbinding.h b/tests/vktestbinding.h
index 9ba23c4..412525d 100644
--- a/tests/vktestbinding.h
+++ b/tests/vktestbinding.h
@@ -558,8 +558,10 @@
     static VkShaderCreateInfo create_info(VkShaderModule module, const char *pName, VkFlags flags);
 };
 
-class Pipeline : public DerivedObject<VkPipeline, Object, VK_OBJECT_TYPE_PIPELINE> {
+class Pipeline : public internal::NonDispHandle<VkPipeline> {
 public:
+    ~Pipeline();
+
     // vkCreateGraphicsPipeline()
     void init(const Device &dev, const VkGraphicsPipelineCreateInfo &info);
     // vkCreateGraphicsPipelineDerivative()