tests: Use global command pool and buffer where possible
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
index 84dc7b4..b174d84 100644
--- a/tests/layer_validation_tests.cpp
+++ b/tests/layer_validation_tests.cpp
@@ -140,7 +140,22 @@
     VkResult EndCommandBuffer(VkCommandBufferObj &cmdBuffer);
     void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
     void GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask);
+    void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,  BsoFailSelect failMask)
+             { GenericDrawPreparation(m_cmdBuffer, pipelineobj, descriptorSet, failMask); }
 
+    /* Convenience functions that use built-in command buffer */
+    VkResult BeginCommandBuffer() { return BeginCommandBuffer(*m_cmdBuffer); }
+    VkResult EndCommandBuffer() { return EndCommandBuffer(*m_cmdBuffer); }
+    void Draw(uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
+        { m_cmdBuffer->Draw(firstVertex, vertexCount, firstInstance, instanceCount); }
+    void DrawIndexed(uint32_t firstVertex, uint32_t vertexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
+        { m_cmdBuffer->DrawIndexed(firstVertex, vertexCount, vertexOffset,firstInstance, instanceCount); }
+    void QueueCommandBuffer() { m_cmdBuffer->QueueCommandBuffer(); }
+    void QueueCommandBuffer(const VkFence& fence) { m_cmdBuffer->QueueCommandBuffer(fence); }
+    void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding)
+        { m_cmdBuffer->BindVertexBuffer(vertexBuffer, offset, binding); }
+    void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset)
+        { m_cmdBuffer->BindIndexBuffer(indexBuffer, offset); }
 protected:
         ErrorMonitor               *m_errorMonitor;
 
@@ -270,20 +285,17 @@
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet, failMask);
+    GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
 
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
+    EndCommandBuffer();
 
-    cmdBuffer.QueueCommandBuffer();
+    QueueCommandBuffer();
 }
 
 void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask)
@@ -354,21 +366,20 @@
     vk_testing::Buffer buffer;
     buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
 
-    VkCommandBufferObj cmdBuffer(m_device);
-    BeginCommandBuffer(cmdBuffer);
-    cmdBuffer.FillBuffer(buffer.handle(), 0, 4, 0x11111111);
-    EndCommandBuffer(cmdBuffer);
+    BeginCommandBuffer();
+    m_cmdBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
+    EndCommandBuffer();
 
     testFence.init(*m_device, fenceInfo);
 
     // Bypass framework since it does the waits automatically
     VkResult err = VK_SUCCESS;
-    err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.handle(), testFence.handle());
+    err = vkQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer->handle(), testFence.handle());
     ASSERT_VK_SUCCESS( err );
 
     m_errorMonitor->ClearState();
     // Introduce failure by calling begin again before checking fence
-    vkResetCommandBuffer(cmdBuffer.handle(), 0);
+    vkResetCommandBuffer(m_cmdBuffer->handle(), 0);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an err after calling ResetCommandBuffer on an active Command Buffer";
@@ -392,23 +403,20 @@
     ASSERT_NO_FATAL_FAILURE(InitViewport());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
 
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-
-    cmdBuffer.BeginCommandBuffer();
-    cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
-    cmdBuffer.EndCommandBuffer();
+    BeginCommandBuffer();
+    m_cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
+    EndCommandBuffer();
 
     testFence.init(*m_device, fenceInfo);
 
     // Bypass framework since it does the waits automatically
     VkResult err = VK_SUCCESS;
-    err = vkQueueSubmit( m_device->m_queue, 1, &cmdBuffer.handle(), testFence.handle());
+    err = vkQueueSubmit( m_device->m_queue, 1, &m_cmdBuffer->handle(), testFence.handle());
     ASSERT_VK_SUCCESS( err );
 
     m_errorMonitor->ClearState();
     // Introduce failure by calling begin again before checking fence
-    cmdBuffer.BeginCommandBuffer();
+    BeginCommandBuffer();
 
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an err after calling BeginCommandBuffer on an active Command Buffer";
@@ -789,16 +797,13 @@
     ASSERT_NO_FATAL_FAILURE(InitViewport());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
 
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-
-    BeginCommandBuffer(cmdBuffer);
-    cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
-    EndCommandBuffer(cmdBuffer);
+    BeginCommandBuffer();
+    m_cmdBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
+    EndCommandBuffer();
 
     testFence.init(*m_device, fenceInfo);
     m_errorMonitor->ClearState();
-    cmdBuffer.QueueCommandBuffer(testFence.handle());
+    QueueCommandBuffer(testFence.handle());
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an err from using a fence in SIGNALED state in call to vkQueueSubmit";
     if (!strstr(msgString.c_str(),"submitted in SIGNALED state.  Fences must be reset before being submitted")) {
@@ -840,7 +845,7 @@
     ASSERT_NO_FATAL_FAILURE(InitState());
     m_errorMonitor->ClearState();
     VkCommandBufferObj cmdBuffer(m_device);
-    BeginCommandBuffer(cmdBuffer);
+    BeginCommandBuffer();
 
     const VkExtent3D e3d = {
         .width = 128,
@@ -960,10 +965,9 @@
 
     ASSERT_NO_FATAL_FAILURE(InitState());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
-    BeginCommandBuffer(cmdBuffer);
+    BeginCommandBuffer();
     VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
-    vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
+    vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding pipeline to CmdBuffer w/o active RenderPass";
     if (!strstr(msgString.c_str(),"Incorrectly binding graphics pipeline ")) {
@@ -1014,7 +1018,7 @@
 //    ASSERT_NO_FATAL_FAILURE(InitState());
 //    m_errorMonitor->ClearState();
 //    VkCommandBufferObj cmdBuffer(m_device);
-//    BeginCommandBuffer(cmdBuffer);
+//    BeginCommandBuffer();
 //    VkPipeline badPipeline = (VkPipeline)0xbaadb1be;
 //    vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
 //    msgFlags = m_errorMonitor->GetState(&msgString);
@@ -1033,7 +1037,6 @@
 
     ASSERT_NO_FATAL_FAILURE(InitState());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
     VkDescriptorTypeCount ds_type_count = {};
         ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
         ds_type_count.count = 1;
@@ -1120,10 +1123,10 @@
     ASSERT_NO_FATAL_FAILURE(InitState());
     ASSERT_NO_FATAL_FAILURE(InitViewport());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    BeginCommandBuffer(cmdBuffer);
-    vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
-    vkCmdBindDescriptorSets(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
+
+    BeginCommandBuffer();
+    vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
+    vkCmdBindDescriptorSets(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &descriptorSet, 0, NULL);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not warn after binding a DescriptorSet that was never updated.";
@@ -1139,7 +1142,7 @@
 
     ASSERT_NO_FATAL_FAILURE(InitState());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
+    VkCommandBufferObj cmdBuffer(m_device, m_cmdPool);
     // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
     vkEndCommandBuffer(cmdBuffer.GetBufferHandle());
     msgFlags = m_errorMonitor->GetState(&msgString);
@@ -1158,7 +1161,6 @@
 
     ASSERT_NO_FATAL_FAILURE(InitState());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
     
     VkDescriptorTypeCount ds_type_count = {};
         ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
@@ -1251,12 +1253,10 @@
     ASSERT_NO_FATAL_FAILURE(InitState());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
 
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    BeginCommandBuffer(cmdBuffer);
+    BeginCommandBuffer();
     // Don't care about RenderPass handle b/c error should be flagged before that
-    vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), NULL, VK_RENDER_PASS_CONTENTS_INLINE);
+    vkCmdBeginRenderPass(m_cmdBuffer->GetBufferHandle(), NULL, VK_RENDER_PASS_CONTENTS_INLINE);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding NULL RenderPass.";
@@ -1274,10 +1274,8 @@
     ASSERT_NO_FATAL_FAILURE(InitState());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
 
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    BeginCommandBuffer(cmdBuffer);
+    BeginCommandBuffer();
     // Just create a dummy Renderpass that's non-NULL so we can get to the proper error
     VkRenderPassBeginInfo rp_begin = {};
         rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
@@ -1285,7 +1283,7 @@
         rp_begin.renderPass = (VkRenderPass)0xc001d00d;
         rp_begin.framebuffer = 0;
  
-    vkCmdBeginRenderPass(cmdBuffer.GetBufferHandle(), &rp_begin, VK_RENDER_PASS_CONTENTS_INLINE);
+    vkCmdBeginRenderPass(m_cmdBuffer->GetBufferHandle(), &rp_begin, VK_RENDER_PASS_CONTENTS_INLINE);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding RenderPass w/i an active RenderPass.";
@@ -1311,7 +1309,6 @@
 
     ASSERT_NO_FATAL_FAILURE(InitState());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
 
     VkDescriptorTypeCount ds_type_count = {};
         ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
@@ -1398,11 +1395,11 @@
     err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
     ASSERT_VK_SUCCESS(err);
 
-    err= cmdBuffer.BeginCommandBuffer();
+    BeginCommandBuffer();
     ASSERT_VK_SUCCESS(err);
-    vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
+    vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
     // Should error before calling to driver so don't care about actual data
-    vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
+    vkCmdBindVertexBuffers(m_cmdBuffer->GetBufferHandle(), 0, 1, NULL, NULL);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after vkCmdBindVertexBuffers() w/o active RenderPass.";
@@ -1771,7 +1768,6 @@
     ASSERT_NO_FATAL_FAILURE(InitState());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
     VkDescriptorTypeCount ds_type_count = {};
     ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
     ds_type_count.count = 1;
@@ -1863,9 +1859,8 @@
     err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
     ASSERT_VK_SUCCESS(err);
 
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    BeginCommandBuffer(cmdBuffer);
-    vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
+    BeginCommandBuffer();
+    vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding RenderPass w/ mismatched MSAA from PSO.";
@@ -1883,7 +1878,6 @@
     ASSERT_NO_FATAL_FAILURE(InitState());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
   
     VkDescriptorTypeCount ds_type_count = {};
         ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
@@ -1934,9 +1928,9 @@
     //err = vkCreateGraphicsPipeline(m_device->device(), &gp_ci, &pipeline);
     ASSERT_VK_SUCCESS(err);
 
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    BeginCommandBuffer(cmdBuffer);
-    vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
+
+    BeginCommandBuffer();
+    vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding invalid pipeline to CmdBuffer";
@@ -1955,7 +1949,6 @@
     ASSERT_NO_FATAL_FAILURE(InitState());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
 
     VkDescriptorTypeCount ds_type_count = {};
         ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
@@ -2078,8 +2071,8 @@
     err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, &pipeline);
     ASSERT_VK_SUCCESS(err);
 
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    BeginCommandBuffer(cmdBuffer);
+
+    BeginCommandBuffer();
 
     m_errorMonitor->ClearState();
     // Main thing we care about for this test is that the VkImage obj we're clearing matches Color Attachment of FB
@@ -2090,7 +2083,7 @@
     cCV.f32[2] = 1.0;
     cCV.f32[3] = 1.0;
 
-    vkCmdClearColorAttachment(cmdBuffer.GetBufferHandle(), 0, (VkImageLayout)NULL, &cCV, 0, NULL);
+    vkCmdClearColorAttachment(m_cmdBuffer->GetBufferHandle(), 0, (VkImageLayout)NULL, &cCV, 0, NULL);
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_WARN_BIT) << "Did not receive error after issuing Clear Cmd on FB color attachment prior to Draw Cmd.";
     if (!strstr(msgString.c_str(),"vkCmdClearColorAttachment() issued on CB object ")) {
@@ -2108,7 +2101,6 @@
     ASSERT_NO_FATAL_FAILURE(InitState());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     m_errorMonitor->ClearState();
-    VkCommandBufferObj cmdBuffer(m_device);
 
     VkDescriptorTypeCount ds_type_count = {};
         ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
@@ -2199,11 +2191,11 @@
     err = vkCreateGraphicsPipelines(m_device->device(), pipeline_cache, 1, &gp_ci, &pipeline);
     ASSERT_VK_SUCCESS(err);
 
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    BeginCommandBuffer(cmdBuffer);
-    vkCmdBindPipeline(cmdBuffer.GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
+
+    BeginCommandBuffer();
+    vkCmdBindPipeline(m_cmdBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
     // Should error before calling to driver so don't care about actual data
-    vkCmdBindVertexBuffers(cmdBuffer.GetBufferHandle(), 0, 1, NULL, NULL);
+    vkCmdBindVertexBuffers(m_cmdBuffer->GetBufferHandle(), 0, 1, NULL, NULL);
 
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive error after binding Vtx Buffer w/o VBO attached to PSO.";
@@ -2244,10 +2236,8 @@
     ASSERT_NO_FATAL_FAILURE(InitViewport());
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
 
-    VkCommandBufferObj cmdBuffer(m_device);
-
     m_errorMonitor->ClearState();
-    BeginCommandBuffer(cmdBuffer);
+    BeginCommandBuffer();
 
     VkEventCreateInfo event_info;
     VkEvent event;
@@ -2263,7 +2253,7 @@
     ASSERT_VK_SUCCESS(err);
 
     struct thread_data_struct data;
-    data.cmdBuffer = cmdBuffer.handle();
+    data.cmdBuffer = m_cmdBuffer->handle();
     data.event = event;
     data.bailout = false;
     m_errorMonitor->SetBailout(&data.bailout);
@@ -2272,7 +2262,7 @@
     // Add many entries to command buffer from this thread at the same time.
     AddToCommandBuffer(&data);
     test_platform_thread_join(thread, NULL);
-    EndCommandBuffer(cmdBuffer);
+    EndCommandBuffer();
 
     msgFlags = m_errorMonitor->GetState(&msgString);
     ASSERT_TRUE(msgFlags & VK_DBG_REPORT_ERROR_BIT) << "Did not receive an err from using one VkCommandBufferObj in two threads";
@@ -2319,10 +2309,9 @@
     pipe.AddShader(&vs);
     pipe.AddShader(&fs);
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     m_errorMonitor->ClearState();
     pipe.CreateVKPipeline(descriptorSet, renderPass());
@@ -2369,10 +2358,9 @@
     pipe.AddShader(&vs);
     pipe.AddShader(&fs);
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     m_errorMonitor->ClearState();
     pipe.CreateVKPipeline(descriptorSet, renderPass());
@@ -2421,10 +2409,9 @@
     pipe.AddShader(&vs);
     pipe.AddShader(&fs);
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     m_errorMonitor->ClearState();
     pipe.CreateVKPipeline(descriptorSet, renderPass());
@@ -2480,10 +2467,9 @@
     pipe.AddVertexInputBindings(&input_binding, 1);
     pipe.AddVertexInputAttribs(&input_attrib, 1);
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     m_errorMonitor->ClearState();
     pipe.CreateVKPipeline(descriptorSet, renderPass());
@@ -2530,10 +2516,9 @@
     pipe.AddShader(&vs);
     pipe.AddShader(&fs);
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     m_errorMonitor->ClearState();
     pipe.CreateVKPipeline(descriptorSet, renderPass());
@@ -2590,10 +2575,9 @@
     pipe.AddVertexInputBindings(&input_binding, 1);
     pipe.AddVertexInputAttribs(&input_attrib, 1);
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     m_errorMonitor->ClearState();
     pipe.CreateVKPipeline(descriptorSet, renderPass());
@@ -2651,10 +2635,9 @@
     pipe.AddVertexInputBindings(input_bindings, 2);
     pipe.AddVertexInputAttribs(&input_attrib, 1);
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     m_errorMonitor->ClearState();
     pipe.CreateVKPipeline(descriptorSet, renderPass());
@@ -2704,10 +2687,9 @@
     pipe.AddColorAttachment();
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     m_errorMonitor->ClearState();
     pipe.CreateVKPipeline(descriptorSet, renderPass());
@@ -2759,10 +2741,9 @@
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
     /* FS writes CB 1, but we don't configure it */
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     m_errorMonitor->ClearState();
     pipe.CreateVKPipeline(descriptorSet, renderPass());
@@ -2811,10 +2792,9 @@
     pipe.AddColorAttachment();
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     m_errorMonitor->ClearState();
     pipe.CreateVKPipeline(descriptorSet, renderPass());
@@ -2867,10 +2847,9 @@
     pipe.AddColorAttachment();
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
 
-    VkCommandBufferObj dummyCmd(m_device);
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendDummy();
-    descriptorSet.CreateVKDescriptorSet(&dummyCmd);
+    descriptorSet.CreateVKDescriptorSet(m_cmdBuffer);
 
     VkResult res = pipe.CreateVKPipeline(descriptorSet, renderPass());
     /* pipeline creation should have succeeded */
diff --git a/tests/render_tests.cpp b/tests/render_tests.cpp
index 02427a9..4f8a070 100644
--- a/tests/render_tests.cpp
+++ b/tests/render_tests.cpp
@@ -268,11 +268,30 @@
     void RotateTriangleVSUniform(glm::mat4 Projection, glm::mat4 View, glm::mat4 Model,
                                  VkConstantBufferObj *constantBuffer, VkCommandBufferObj *cmdBuffer);
     void GenericDrawPreparation(VkCommandBufferObj *cmdBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet);
+    void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet)
+             { GenericDrawPreparation(m_cmdBuffer, pipelineobj, descriptorSet); }
     void InitDepthStencil();
     void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, const bool rotate);
 
     VkResult BeginCommandBuffer(VkCommandBufferObj &cmdBuffer);
     VkResult EndCommandBuffer(VkCommandBufferObj &cmdBuffer);
+    /* Convenience functions that use built-in command buffer */
+    VkResult BeginCommandBuffer() { return BeginCommandBuffer(*m_cmdBuffer); }
+    VkResult EndCommandBuffer() { return EndCommandBuffer(*m_cmdBuffer); }
+    void Draw(uint32_t firstVertex, uint32_t vertexCount, uint32_t firstInstance, uint32_t instanceCount)
+        { m_cmdBuffer->Draw(firstVertex, vertexCount, firstInstance, instanceCount); }
+    void DrawIndexed(uint32_t firstVertex, uint32_t vertexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
+        { m_cmdBuffer->DrawIndexed(firstVertex, vertexCount, vertexOffset,firstInstance, instanceCount); }
+    void QueueCommandBuffer() { m_cmdBuffer->QueueCommandBuffer(); }
+    void RotateTriangleVSUniform(glm::mat4 Projection, glm::mat4 View, glm::mat4 Model,
+                                 VkConstantBufferObj *constantBuffer)
+        {RotateTriangleVSUniform(Projection, View, Model, constantBuffer, m_cmdBuffer); }
+    void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding)
+        { m_cmdBuffer->BindVertexBuffer(vertexBuffer, offset, binding); }
+    void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset)
+        { m_cmdBuffer->BindIndexBuffer(indexBuffer, offset); }
+
+
 
 protected:
     VkImage m_texture;
@@ -467,29 +486,26 @@
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
+    ASSERT_VK_SUCCESS(EndCommandBuffer());
 
-    cmdBuffer.QueueCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 
     if (rotate)
-        RotateTriangleVSUniform(Projection, View, Model, &constantBuffer, &cmdBuffer);
+        RotateTriangleVSUniform(Projection, View, Model, &constantBuffer);
 
 #ifdef PRINT_OBJECTS
     OBJ_TRACK_GET_OBJECTS_COUNT pObjTrackGetObjectsCount = (OBJ_TRACK_GET_OBJECTS_COUNT)vkGetProcAddr(gpu(), (char*)"objTrackGetObjectsCount");
@@ -748,22 +764,19 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer, MESH_BIND_ID);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
-
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
+    BindVertexBuffer(&meshBuffer, 0, 0);
 
     // render two triangles
-    cmdBuffer.Draw(0, 6, 0, 1);
+    Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
+    ASSERT_VK_SUCCESS(EndCommandBuffer());
 
-    cmdBuffer.QueueCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -836,27 +849,22 @@
     att.channelWriteMask = 0xf;
     pipelineobj.AddColorAttachment(1, &att);
 
-    VkCommandBufferObj cmdBuffer(m_device);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    cmdBuffer.AddRenderTarget(m_renderTargets[1]);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
-
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
+    BindVertexBuffer(&meshBuffer, 0, 0);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    ASSERT_VK_SUCCESS(EndCommandBuffer());
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -948,26 +956,24 @@
     pipelineobj.AddVertexInputBindings(&vi_binding,1);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, MESH_BIND_ID);
-    cmdBuffer.BindIndexBuffer(&indexBuffer, 0);
+    BindVertexBuffer(&meshBuffer, 0, MESH_BIND_ID);
+    BindIndexBuffer(&indexBuffer, 0);
 
     // render two triangles
-    cmdBuffer.DrawIndexed(0, 6, 0, 0, 1);
+    DrawIndexed(0, 6, 0, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    ASSERT_VK_SUCCESS(EndCommandBuffer());
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -1041,25 +1047,23 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,MESH_BIND_ID);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
+    BindVertexBuffer(&meshBuffer, 0, 0);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
     // render triangle
-    cmdBuffer.Draw(0, 6, 0, 1);
+    Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -1133,24 +1137,21 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,MESH_BIND_ID);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
-
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
+    BindVertexBuffer(&meshBuffer, 0, 0);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render two triangles
-    cmdBuffer.Draw(0, 6, 0, 1);
+    Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -1236,25 +1237,23 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,MESH_BIND_ID);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
+    BindVertexBuffer(&meshBuffer, 0, 0);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
     // render two triangles
-    cmdBuffer.Draw(0, 6, 0, 1);
+    Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -1329,25 +1328,23 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,MESH_BIND_ID);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
+    BindVertexBuffer(&meshBuffer, 0, 0);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
     // render two triangles
-    cmdBuffer.Draw(0, 6, 0, 1);
+    Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -1404,29 +1401,25 @@
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, MVPBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
-
-    // cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
     // render two triangles
-    cmdBuffer.Draw(0, 6, 0, 1);
+    Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 
-    RotateTriangleVSUniform(Projection, View, Model, &MVPBuffer, &cmdBuffer);
+    RotateTriangleVSUniform(Projection, View, Model, &MVPBuffer);
 }
 
 TEST_F(VkRenderTest, MixTriangle)
@@ -1483,12 +1476,10 @@
     descriptorSet.AppendDummy();
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
@@ -1496,11 +1487,11 @@
 #endif
 
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -1575,25 +1566,23 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer, MESH_BUF_ID);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
+    BindVertexBuffer(&meshBuffer, 0, 0);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
     // render two triangles
-    cmdBuffer.Draw(0, 6, 0, 1);
+    Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -1682,25 +1671,23 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer, MESH_BUF_ID);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, MESH_BUF_ID);
+    BindVertexBuffer(&meshBuffer, 0, MESH_BUF_ID);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
     // render two triangles
-    cmdBuffer.Draw(0, 6, 0, 1);
+    Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -1779,25 +1766,23 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer, MESH_BUF_ID);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
+    BindVertexBuffer(&meshBuffer, 0, 0);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
     // render two triangles
-    cmdBuffer.Draw(0, 6, 0, 1);
+    Draw(0, 6, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -1900,25 +1885,22 @@
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget(m_depthStencil->BindInfo()));
 
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
-
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
+    BindVertexBuffer(&meshBuffer, 0, 0);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
 
     // render triangles
-    cmdBuffer.Draw(0, 36, 0, 1);
+    Draw(0, 36, 0, 1);
 
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -1974,12 +1956,9 @@
     descriptorSet.AppendSamplerTexture(&sampler, &texture);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
@@ -1987,11 +1966,11 @@
 #endif
 
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -2048,23 +2027,20 @@
     descriptorSet.AppendSamplerTexture(&sampler, &texture);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -2129,23 +2105,20 @@
     descriptorSet.AppendSamplerTexture(&sampler, &texture);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -2200,23 +2173,20 @@
     descriptorSet.AppendSamplerTexture(&sampler, &texture);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -2290,23 +2260,20 @@
     descriptorSet.AppendSamplerTexture(&sampler3, &texture3);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -2373,23 +2340,20 @@
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, colorBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -2475,23 +2439,20 @@
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, whiteBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -2572,23 +2533,20 @@
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, whiteBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -2693,23 +2651,20 @@
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, whiteBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -2818,27 +2773,24 @@
     pipelineobj.SetDepthStencil(&ds_state);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget(m_depthStencil->BindInfo()));
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
-
-    cmdBuffer.BindVertexBuffer(&meshBuffer, 0, 0);
+    BindVertexBuffer(&meshBuffer, 0, 0);
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, num_verts, 0, 1);
+    Draw(0, num_verts, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
-    RotateTriangleVSUniform(Projection, View, Model, &mvpBuffer, &cmdBuffer);
+    RotateTriangleVSUniform(Projection, View, Model, &mvpBuffer);
 }
 
 TEST_F(VkRenderTest, TriangleMixedSamplerUniformBlockBinding)
@@ -2935,23 +2887,20 @@
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, whiteBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -3044,23 +2993,20 @@
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, whiteBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -3296,23 +3242,20 @@
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, mixedBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
 #ifdef DUMP_STATE_DOT
     DRAW_STATE_DUMP_DOT_FILE pDSDumpDot = (DRAW_STATE_DUMP_DOT_FILE)vkGetProcAddr(gpu(), (char*)"drawStateDumpDotFile");
     pDSDumpDot((char*)"triTest2.dot");
 #endif
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -3407,19 +3350,16 @@
     descriptorSet.AppendSamplerTexture(&sampler3, &texture3);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
-
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -3512,21 +3452,18 @@
     pipelineobj.AddShader(&ps);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
     VkDescriptorSetObj descriptorSet(m_device);
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -3865,22 +3802,19 @@
     pipelineobj.AddShader(&ps);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, mixedBuffer);
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -3994,21 +3928,18 @@
     pipelineobj.AddShader(&ps);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
     VkDescriptorSetObj descriptorSet(m_device);
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -4131,22 +4062,19 @@
     VkConstantBufferObj windowDimensions(m_device, sizeof(dimensions) / sizeof(dimensions[0]), sizeof(dimensions[0]), (const void*) dimensions);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
     VkDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, windowDimensions);
 
-    GenericDrawPreparation(&cmdBuffer, pipelineobj, descriptorSet);
+    GenericDrawPreparation(pipelineobj, descriptorSet);
 
     // render triangle
-    cmdBuffer.Draw(0, 3, 0, 1);
+    Draw(0, 3, 0, 1);
 
     // finalize recording of the command buffer
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -4163,13 +4091,10 @@
     m_clear_color.f32[2] = 0;
     m_clear_color.f32[3] = 0;
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
     /* This command buffer contains ONLY the load op! */
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
@@ -4186,10 +4111,7 @@
     m_clear_color.f32[2] = 0;
     m_clear_color.f32[3] = 0;
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-
-    VkCommandBufferObj cmdBuffer(m_device);
-    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
-    ASSERT_VK_SUCCESS(BeginCommandBuffer(cmdBuffer));
+    ASSERT_VK_SUCCESS(BeginCommandBuffer());
 
     /* Load op has cleared to red */
 
@@ -4204,12 +4126,12 @@
     clear_color.f32[2] = 0;
     clear_color.f32[3] = 0;
     VkRect3D clear_rect = { { 0, 0, 0 }, { (int)m_width, (int)m_height, 1 } };
-    vkCmdClearColorAttachment(cmdBuffer.handle(), 0,
+    vkCmdClearColorAttachment(m_cmdBuffer->handle(), 0,
                               VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
                               &clear_color, 1, &clear_rect);
 
-    EndCommandBuffer(cmdBuffer);
-    cmdBuffer.QueueCommandBuffer();
+    EndCommandBuffer();
+    QueueCommandBuffer();
 
     RecordImages(m_renderTargets);
 }
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()
diff --git a/tests/vkrenderframework.h b/tests/vkrenderframework.h
index 351bf2e2..d7c1958 100644
--- a/tests/vkrenderframework.h
+++ b/tests/vkrenderframework.h
@@ -67,6 +67,8 @@
     VkAttachmentBindInfo                m_attachmentBindInfo;
 };
 
+class VkCommandBufferObj;
+
 class VkRenderFramework : public VkTestFramework
 {
 public:
@@ -105,7 +107,7 @@
     uint32_t                            gpu_count;
     VkDeviceObj                        *m_device;
     VkCmdPool                           m_cmdPool;
-    VkCmdBuffer                         m_cmdBuffer;
+    VkCommandBufferObj                 *m_cmdBuffer;
     VkRenderPass                        m_renderPass;
     VkFramebuffer                       m_framebuffer;
     std::vector<VkClearValue>           m_renderPassClearValues;
@@ -158,7 +160,7 @@
 class VkCommandBufferObj : public vk_testing::CmdBuffer
 {
 public:
-    VkCommandBufferObj(VkDeviceObj *device);
+    VkCommandBufferObj(VkDeviceObj *device, VkCmdPool pool);
     VkCmdBuffer GetBufferHandle();
     VkResult BeginCommandBuffer();
     VkResult BeginCommandBuffer(VkCmdBufferBeginInfo *pInfo);
@@ -186,7 +188,6 @@
 
 protected:
     VkDeviceObj                        *m_device;
-    vk_testing::CmdPool                 m_cmdPool;
     vector<VkImageObj*>                 m_renderTargets;
 };
 
@@ -223,6 +224,7 @@
     vk_testing::BufferView              m_bufferView;
     int                                 m_numVertices;
     int                                 m_stride;
+    vk_testing::CmdPool                *m_cmdPool;
     VkCommandBufferObj                 *m_commandBuffer;
     vk_testing::Fence                   m_fence;
 };