diff --git a/tests/render_tests.cpp b/tests/render_tests.cpp
index 7112f51..947c8fe 100644
--- a/tests/render_tests.cpp
+++ b/tests/render_tests.cpp
@@ -299,7 +299,7 @@
         // Wait for work to finish before cleaning up.
         xglDeviceWaitIdle(m_device->device());
 
-        assert(m_renderTargetCount == 1);
+        assert(m_renderTargets.size() == 1);
         RecordImage(m_renderTargets[0]);
     }
 }
@@ -493,7 +493,7 @@
     m_memoryRefManager.AddMemoryRef(&constantBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -511,7 +511,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
     if (rotate)
@@ -792,7 +792,7 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -808,7 +808,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 
@@ -863,9 +863,8 @@
     XglDescriptorSetObj descriptorSet(m_device);
     descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &meshBuffer);
 
-    m_renderTargetCount = 2;
-    ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    ASSERT_NO_FATAL_FAILURE(InitRenderTarget(2));
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     m_memoryRefManager.AddMemoryRef(&meshBuffer);
 
     XGL_PIPELINE_CB_ATTACHMENT_STATE att = {};
@@ -895,7 +894,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -984,7 +983,7 @@
     pipelineobj.AddVertexInputBindings(&vi_binding,1);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
     ASSERT_XGL_SUCCESS(cmdBuffer.BeginCommandBuffer(renderPass()));
@@ -1006,7 +1005,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -1081,7 +1080,7 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1101,7 +1100,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -1176,7 +1175,7 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1196,7 +1195,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -1281,7 +1280,7 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1301,7 +1300,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 
@@ -1376,7 +1375,7 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1396,7 +1395,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -1451,7 +1450,7 @@
     m_memoryRefManager.AddMemoryRef(&MVPBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1471,7 +1470,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
     RotateTriangleVSUniform(Projection, View, Model, &MVPBuffer, &cmdBuffer);
@@ -1529,7 +1528,7 @@
     descriptorSet.AppendDummy();
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1548,7 +1547,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 
@@ -1618,7 +1617,7 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1638,7 +1637,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 
@@ -1712,7 +1711,7 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1732,7 +1731,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 
@@ -1826,7 +1825,7 @@
     pipelineobj.AddVertexDataBuffer(&meshBuffer,0);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1845,7 +1844,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 
@@ -1896,7 +1895,7 @@
     m_memoryRefManager.AddMemoryRef(&texture);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1915,7 +1914,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 TEST_F(XglRenderTest, TexturedTriangle)
@@ -1969,7 +1968,7 @@
     m_memoryRefManager.AddMemoryRef(&texture);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -1988,7 +1987,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 TEST_F(XglRenderTest, TexturedTriangleClip)
@@ -2053,7 +2052,7 @@
     m_memoryRefManager.AddMemoryRef(&texture);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -2072,7 +2071,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 TEST_F(XglRenderTest, FSTriangle)
@@ -2126,7 +2125,7 @@
     m_memoryRefManager.AddMemoryRef(&texture);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -2145,7 +2144,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 TEST_F(XglRenderTest, SamplerBindingsTriangle)
@@ -2220,7 +2219,7 @@
     m_memoryRefManager.AddMemoryRef(&texture3);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -2239,7 +2238,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -2304,7 +2303,7 @@
     descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &colorBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -2323,7 +2322,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -2407,7 +2406,7 @@
     descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &whiteBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -2426,7 +2425,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 
@@ -2505,7 +2504,7 @@
     descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &whiteBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -2524,7 +2523,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -2635,7 +2634,7 @@
     pipelineobj.SetDepthStencil(&ds_state);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -2654,7 +2653,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -2757,7 +2756,7 @@
     m_memoryRefManager.AddMemoryRef(&texture7);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -2776,7 +2775,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -2873,7 +2872,7 @@
     m_memoryRefManager.AddMemoryRef(&texture7);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -2892,7 +2891,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 
 }
@@ -3126,7 +3125,7 @@
     descriptorSet.AppendBuffer(XGL_DESCRIPTOR_TYPE_UNIFORM_BUFFER, &mixedBuffer);
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
-    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargetCount);
+    m_memoryRefManager.AddRTMemoryRefs(m_renderTargets, m_renderTargets.size());
     XglCommandBufferObj cmdBuffer(m_device);
     cmdBuffer.AddRenderTarget(m_renderTargets[0]);
 
@@ -3145,7 +3144,7 @@
     cmdBuffer.EndCommandBuffer();
     cmdBuffer.QueueCommandBuffer(m_memoryRefManager.GetMemoryRefList(), m_memoryRefManager.GetNumRefs());
 
-    for (int i = 0; i < m_renderTargetCount; i++)
+    for (int i = 0; i < m_renderTargets.size(); i++)
         RecordImage(m_renderTargets[i]);
 }
 
diff --git a/tests/xglrenderframework.cpp b/tests/xglrenderframework.cpp
index aaf4e86..6538ea2 100644
--- a/tests/xglrenderframework.cpp
+++ b/tests/xglrenderframework.cpp
@@ -36,9 +36,7 @@
     m_width( 256.0 ),                   // default window width
     m_height( 256.0 )                   // default window height
 {
-    m_renderTargetCount = 1;
-
-    m_render_target_fmt = XGL_FMT_B8G8R8A8_UNORM;
+    m_render_target_fmt = XGL_FMT_R8G8B8A8_UNORM;
 
     m_depthStencilBinding.view = XGL_NULL_HANDLE;
 }
@@ -162,9 +160,14 @@
 
 void XglRenderFramework::InitRenderTarget()
 {
+    InitRenderTarget(1);
+}
+
+void XglRenderFramework::InitRenderTarget(uint32_t targets)
+{
     uint32_t i;
 
-    for (i = 0; i < m_renderTargetCount; i++) {
+    for (i = 0; i < targets; i++) {
         XglImage *img = new XglImage(m_device);
         img->init(m_width, m_height, m_render_target_fmt,
                 XGL_IMAGE_USAGE_SHADER_ACCESS_WRITE_BIT |
@@ -190,7 +193,7 @@
     XGL_FRAMEBUFFER_CREATE_INFO fb_info = {};
     fb_info.sType = XGL_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
     fb_info.pNext = NULL;
-    fb_info.colorAttachmentCount = m_renderTargetCount;
+    fb_info.colorAttachmentCount = m_renderTargets.size();
     fb_info.pColorAttachments = m_colorBindings;
     fb_info.pDepthStencilAttachment = dsBinding;
     fb_info.sampleCount = 1;
@@ -205,7 +208,7 @@
     rp_info.sType = XGL_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
     rp_info.renderArea.extent.width = m_width;
     rp_info.renderArea.extent.height = m_height;
-    rp_info.colorAttachmentCount = m_renderTargetCount;
+    rp_info.colorAttachmentCount = m_renderTargets.size();
     rp_info.pColorLoadOps = &load_op;
     rp_info.pColorStoreOps = &store_op;
     rp_info.pColorLoadClearValues = &clear_color;
@@ -455,7 +458,7 @@
     XGL_CMD_BUFFER_CREATE_INFO  cmd_buf_create_info = {};
     cmd_buf_create_info.sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO;
     cmd_buf_create_info.pNext = NULL;
-    cmd_buf_create_info.queueNodeIndex = 0;
+    cmd_buf_create_info.queueNodeIndex = m_device->graphics_queue_node_index_;
     cmd_buf_create_info.flags = 0;
 
     err = xglCreateCommandBuffer(m_device->device(), &cmd_buf_create_info, &cmd_buf);
@@ -1103,7 +1106,6 @@
     : xgl_testing::CmdBuffer(*device, xgl_testing::CmdBuffer::create_info(device->graphics_queue_node_index_))
 {
     m_device = device;
-    m_renderTargetCount = 0;
 }
 
 XGL_CMD_BUFFER XglCommandBufferObj::GetBufferHandle()
@@ -1185,7 +1187,7 @@
     clearColor.color.rawColor[3] = 0;
     clearColor.useRawValue = true;
 
-    for (i = 0; i < m_renderTargetCount; i++) {
+    for (i = 0; i < m_renderTargets.size(); i++) {
         memory_barrier.image = m_renderTargets[i]->image();
         memory_barrier.oldLayout = m_renderTargets[i]->layout();
         xglCmdPipelineBarrier( obj(), &pipeline_barrier);
@@ -1269,7 +1271,7 @@
     pipeline_barrier.memBarrierCount = 1;
     pipeline_barrier.ppMemBarriers = (const void **)&pmemory_barrier;
 
-    for(i=0; i<m_renderTargetCount; i++)
+    for(i=0; i<m_renderTargets.size(); i++)
     {
         memory_barrier.image = m_renderTargets[i]->image();
         memory_barrier.oldLayout = m_renderTargets[i]->layout();
@@ -1286,7 +1288,6 @@
 void XglCommandBufferObj::AddRenderTarget(XglImage *renderTarget)
 {
     m_renderTargets.push_back(renderTarget);
-    m_renderTargetCount++;
 }
 
 void XglCommandBufferObj::DrawIndexed(uint32_t firstIndex, uint32_t indexCount, int32_t vertexOffset, uint32_t firstInstance, uint32_t instanceCount)
diff --git a/tests/xglrenderframework.h b/tests/xglrenderframework.h
index b8f0698..b774e8f 100644
--- a/tests/xglrenderframework.h
+++ b/tests/xglrenderframework.h
@@ -58,6 +58,7 @@
     void InitViewport(float width, float height);
     void InitViewport();
     void InitRenderTarget();
+    void InitRenderTarget(uint32_t targets);
     void InitFramework();
     void ShutdownFramework();
     void InitState();
@@ -78,7 +79,6 @@
     XGL_DYNAMIC_VP_STATE_OBJECT             m_stateViewport;
     XGL_DYNAMIC_DS_STATE_OBJECT             m_stateDepthStencil;
     vector<XglImage*>                       m_renderTargets;
-    uint32_t                                m_renderTargetCount;
     float                                   m_width, m_height;
     XGL_FORMAT                              m_render_target_fmt;
     XGL_COLOR_ATTACHMENT_BIND_INFO          m_colorBindings[8];
@@ -135,7 +135,6 @@
 protected:
     XglDevice                      *m_device;
     vector<XglImage*>               m_renderTargets;
-    uint32_t                        m_renderTargetCount;
 
 };
 
diff --git a/tests/xgltestframework.cpp b/tests/xgltestframework.cpp
index 01084fa..ee22771 100644
--- a/tests/xgltestframework.cpp
+++ b/tests/xgltestframework.cpp
@@ -400,9 +400,9 @@
 static xgl_testing::Environment *environment;
 
 TestFrameworkXglPresent::TestFrameworkXglPresent() :
-m_device(environment->default_device()),
-m_queue(*m_device.graphics_queues()[0]),
-m_cmdbuf(m_device, xgl_testing::CmdBuffer::create_info(m_device.graphics_queue_node_index_))
+   m_device(environment->default_device()),
+   m_queue(*m_device.graphics_queues()[0]),
+   m_cmdbuf(m_device, xgl_testing::CmdBuffer::create_info(m_device.graphics_queue_node_index_))
 {
     m_quit = false;
     m_pause = false;
