tests:Add CreatePipeline that doesn't bind cmdbuffer
diff --git a/tests/xglrenderframework.cpp b/tests/xglrenderframework.cpp
index c54dd87..c5f477a 100644
--- a/tests/xglrenderframework.cpp
+++ b/tests/xglrenderframework.cpp
@@ -927,6 +927,43 @@
     m_cb_state.attachment[binding] = *att;
 }
 
+void XglPipelineObj::CreateXGLPipeline(XglDescriptorSetObj *descriptorSet)
+{
+    XGL_RESULT err;
+    XGL_VOID* head_ptr = &m_db_state;
+    XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
+
+    XGL_PIPELINE_SHADER_STAGE_CREATE_INFO* shaderCreateInfo;
+
+    for (int i=0; i<m_shaderObjs.size(); i++)
+    {
+        shaderCreateInfo = m_shaderObjs[i]->GetStageCreateInfo(descriptorSet);
+        shaderCreateInfo->pNext = head_ptr;
+        head_ptr = shaderCreateInfo;
+    }
+
+    if (m_vi_state.attributeCount && m_vi_state.bindingCount)
+    {
+        m_vi_state.sType = XGL_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_CREATE_INFO;
+        m_vi_state.pNext = head_ptr;
+        head_ptr = &m_vi_state;
+    }
+
+    info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
+    info.pNext = head_ptr;
+    info.flags = 0;
+
+    err = xglCreateGraphicsPipeline(m_device->device(), &info, &m_pipeline);
+    assert(!err);
+
+    err = m_device->AllocAndBindGpuMemory(m_pipeline, "Pipeline", &m_pipe_mem);
+    assert(!err);
+}
+XGL_PIPELINE XglPipelineObj::GetPipelineHandle()
+{
+    return m_pipeline;
+}
+
 void XglPipelineObj::BindPipelineCommandBuffer(XGL_CMD_BUFFER m_cmdBuffer, XglDescriptorSetObj *descriptorSet)
 {
     XGL_RESULT err;