tests: Use global command pool and buffer where possible
diff --git a/tests/vkrenderframework.cpp b/tests/vkrenderframework.cpp
index 49a2bc3..4c03073 100644
--- a/tests/vkrenderframework.cpp
+++ b/tests/vkrenderframework.cpp
@@ -30,7 +30,7 @@
 #define ARRAY_SIZE(a) (sizeof(a) / sizeof(a[0]))
 
 VkRenderFramework::VkRenderFramework() :
-    m_cmdBuffer( VK_NULL_HANDLE ),
+    m_cmdBuffer(),
     m_renderPass(VK_NULL_HANDLE),
     m_framebuffer(VK_NULL_HANDLE),
     m_stateRaster( VK_NULL_HANDLE ),
@@ -149,7 +149,8 @@
     if (m_colorBlend) vkDestroyDynamicColorBlendState(device(), m_colorBlend);
     if (m_stateDepthStencil) vkDestroyDynamicDepthStencilState(device(), m_stateDepthStencil);
     if (m_stateRaster) vkDestroyDynamicRasterState(device(), m_stateRaster);
-    if (m_cmdBuffer) vkDestroyCommandBuffer(device(), m_cmdBuffer);
+    if (m_cmdBuffer)
+        delete m_cmdBuffer;
     if (m_cmdPool) vkDestroyCommandPool(device(), m_cmdPool);
     if (m_framebuffer) vkDestroyFramebuffer(device(), m_framebuffer);
     if (m_renderPass) vkDestroyRenderPass(device(), m_renderPass);
@@ -221,10 +222,7 @@
     err = vkCreateCommandPool(device(), &cmd_pool_info, &m_cmdPool);
     assert(!err);
 
-    VkCmdBufferCreateInfo cmdInfo = vk_testing::CmdBuffer::create_info(m_cmdPool);
-
-    err = vkCreateCommandBuffer(device(), &cmdInfo, &m_cmdBuffer);
-    ASSERT_VK_SUCCESS(err) << "vkCreateCommandBuffer failed";
+    m_cmdBuffer = new VkCommandBufferObj(m_device, m_cmdPool);
 }
 
 void VkRenderFramework::InitViewport(float width, float height)
@@ -654,7 +652,13 @@
         return;
     }
 
-    VkCommandBufferObj cmd_buf(m_device);
+    VkCmdPoolCreateInfo cmd_pool_info = {};
+        cmd_pool_info.sType = VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO;
+        cmd_pool_info.pNext = NULL;
+        cmd_pool_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
+        cmd_pool_info.flags = 0;
+    vk_testing::CmdPool pool(*m_device, cmd_pool_info);
+    VkCommandBufferObj cmd_buf(m_device, pool.handle());
 
     /* Build command buffer to set image layout in the driver */
     err = cmd_buf.BeginCommandBuffer();
@@ -739,9 +743,16 @@
 VkResult VkImageObj::CopyImage(VkImageObj &src_image)
 {
     VkResult U_ASSERT_ONLY err;
-    VkCommandBufferObj cmd_buf(m_device);
     VkImageLayout src_image_layout, dest_image_layout;
 
+    VkCmdPoolCreateInfo cmd_pool_info = {};
+        cmd_pool_info.sType = VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO;
+        cmd_pool_info.pNext = NULL;
+        cmd_pool_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
+        cmd_pool_info.flags = 0;
+    vk_testing::CmdPool pool(*m_device, cmd_pool_info);
+    VkCommandBufferObj cmd_buf(m_device, pool.handle());
+
     /* Build command buffer to copy staging texture to usable texture */
     err = cmd_buf.BeginCommandBuffer();
     assert(!err);
@@ -877,6 +888,7 @@
 {
     // TODO: Should we call QueueRemoveMemReference for the constant buffer memory here?
     if (m_commandBuffer) {
+        delete m_cmdPool;
         delete m_commandBuffer;
     }
 }
@@ -939,8 +951,13 @@
     if (!m_commandBuffer)
     {
         m_fence.init(*m_device, vk_testing::Fence::create_info());
-
-        m_commandBuffer = new VkCommandBufferObj(m_device);
+        VkCmdPoolCreateInfo cmd_pool_info = {};
+            cmd_pool_info.sType = VK_STRUCTURE_TYPE_CMD_POOL_CREATE_INFO;
+            cmd_pool_info.pNext = NULL;
+            cmd_pool_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
+            cmd_pool_info.flags = 0;
+        m_cmdPool = new vk_testing::CmdPool(*m_device, cmd_pool_info);
+        m_commandBuffer = new VkCommandBufferObj(m_device, m_cmdPool->handle());
     }
     else
     {
@@ -1243,12 +1260,11 @@
     return init_try(*m_device, info);
 }
 
-VkCommandBufferObj::VkCommandBufferObj(VkDeviceObj *device)
+VkCommandBufferObj::VkCommandBufferObj(VkDeviceObj *device, VkCmdPool pool)
 {
     m_device = device;
 
-    m_cmdPool.init(*device, vk_testing::CmdPool::create_info(device->graphics_queue_node_index_));
-    init(*device, vk_testing::CmdBuffer::create_info(m_cmdPool.handle()));
+    init(*device, vk_testing::CmdBuffer::create_info(pool));
 }
 
 VkCmdBuffer VkCommandBufferObj::GetBufferHandle()