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);
 }
