tests: Add pipeline init to render test.
diff --git a/tests/render_tests.cpp b/tests/render_tests.cpp
index 349117f..dfc0034 100644
--- a/tests/render_tests.cpp
+++ b/tests/render_tests.cpp
@@ -62,6 +62,7 @@
 #include "gtest-1.7.0/include/gtest/gtest.h"
 
 #include "xgldevice.h"
+#include "shader_il.h"
 
 class XglRenderTest : public ::testing::Test {
 public:
@@ -72,6 +73,8 @@
                          XGL_IMAGE_VIEW* pView);
     void DestroyImageView(XGL_IMAGE_VIEW imageView);
     XGL_DEVICE device() {return m_device->device();}
+    void CreateShader(XGL_SHADER *pshader);
+    void InitPipeline();
 
 protected:
     XGL_APPLICATION_INFO app_info;
@@ -80,6 +83,7 @@
     XGL_IMAGE m_image;
     XGL_GPU_MEMORY m_image_mem;
     XglDevice *m_device;
+    XGL_CMD_BUFFER m_cmdBuffer;
 
     virtual void SetUp() {
         XGL_RESULT err;
@@ -99,6 +103,13 @@
 
         m_device = new XglDevice(0, objs[0]);
         m_device->get_device_queue();
+
+        XGL_CMD_BUFFER_CREATE_INFO info = {};
+
+        info.sType = XGL_STRUCTURE_TYPE_CMD_BUFFER_CREATE_INFO;
+        info.queueType = XGL_QUEUE_TYPE_GRAPHICS;
+        err = xglCreateCommandBuffer(device(), &info, &m_cmdBuffer);
+        ASSERT_XGL_SUCCESS(err) << "xglCreateCommandBuffer failed";
     }
 
     virtual void TearDown() {
@@ -240,51 +251,131 @@
     ASSERT_XGL_SUCCESS(xglDestroyObject(imageView));
 }
 
-TEST_F(XglRenderTest, DrawTriangleTest) {
-    XGL_FORMAT fmt;
-    XGL_IMAGE_VIEW imageView;
+void XglRenderTest::CreateShader(XGL_SHADER *pshader)
+{
+    void *code;
+    uint32_t codeSize;
+    struct bil_header *pBIL;
     XGL_RESULT err;
 
-    fmt.channelFormat = XGL_CH_FMT_R8G8B8A8;
-    fmt.numericFormat = XGL_NUM_FMT_UINT;
+    codeSize = sizeof(struct bil_header) + 100;
+    code = malloc(codeSize);
+    ASSERT_TRUE(NULL != code) << "malloc failed!";
 
-    CreateImage(512, 256);
+    memset(code, 0, codeSize);
 
-    //    typedef struct _XGL_IMAGE_VIEW_CREATE_INFO
-    //    {
-    //        XGL_STRUCTURE_TYPE                      sType;                  // Must be XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO
-    //        const XGL_VOID*                         pNext;                  // Pointer to next structure
-    //        XGL_IMAGE                               image;
-    //        XGL_IMAGE_VIEW_TYPE                     viewType;
-    //        XGL_FORMAT                              format;
-    //        XGL_CHANNEL_MAPPING                     channels;
-    //        XGL_IMAGE_SUBRESOURCE_RANGE             subresourceRange;
-    //        XGL_FLOAT                               minLod;
-    //    } XGL_IMAGE_VIEW_CREATE_INFO;
-    XGL_IMAGE_VIEW_CREATE_INFO viewInfo = {};
-    viewInfo.sType = XGL_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
-    viewInfo.viewType = XGL_IMAGE_VIEW_2D;
-    viewInfo.format = fmt;
+    // Indicate that this is BIL data.
+    pBIL = (struct bil_header *) code;
+    pBIL->bil_magic = BILMagicNumber;
+    pBIL->bil_version = BILVersion;
 
-    viewInfo.channels.r = XGL_CHANNEL_SWIZZLE_R;
-    viewInfo.channels.g = XGL_CHANNEL_SWIZZLE_G;
-    viewInfo.channels.b = XGL_CHANNEL_SWIZZLE_B;
-    viewInfo.channels.a = XGL_CHANNEL_SWIZZLE_A;
+    XGL_SHADER_CREATE_INFO createInfo;
+    XGL_SHADER shader;
 
-    viewInfo.subresourceRange.baseArraySlice = 0;
-    viewInfo.subresourceRange.arraySize = 1;
-    viewInfo.subresourceRange.baseMipLevel = 0;
-    viewInfo.subresourceRange.mipLevels = 1;
-    viewInfo.subresourceRange.aspect = XGL_IMAGE_ASPECT_COLOR;
+    createInfo.sType = XGL_STRUCTURE_TYPE_SHADER_CREATE_INFO;
+    createInfo.pNext = NULL;
+    createInfo.pCode = code;
+    createInfo.codeSize = codeSize;
+    createInfo.flags = 0;
+    err = xglCreateShader(device(), &createInfo, &shader);
+    ASSERT_XGL_SUCCESS(err);
 
-    //    XGL_RESULT XGLAPI xglCreateImageView(
-    //        XGL_DEVICE                                  device,
-    //        const XGL_IMAGE_VIEW_CREATE_INFO*           pCreateInfo,
-    //        XGL_IMAGE_VIEW*                             pView);
+    ASSERT_XGL_SUCCESS(xglDestroyObject(shader));
+    *pshader = shader;
+}
 
-    CreateImageView(&viewInfo, &imageView);
+TEST_F(XglRenderTest, DrawTriangleTest) {
+    XGL_RESULT err;
+    XGL_GRAPHICS_PIPELINE_CREATE_INFO info = {};
+    XGL_SHADER vs, ps;
+    XGL_PIPELINE_SHADER_STAGE_CREATE_INFO vs_stage;
+    XGL_PIPELINE_SHADER_STAGE_CREATE_INFO ps_stage;
+    XGL_PIPELINE pipeline;
 
-    DestroyImageView(imageView);
+    /*
+     * Define descriptor slots for vertex shader.
+     */
+    XGL_DESCRIPTOR_SLOT_INFO ds_vs = {
+        XGL_SLOT_SHADER_RESOURCE,    // XGL_DESCRIPTOR_SET_SLOT_TYPE
+        1                            // shaderEntityIndex
+    };
+
+    CreateShader(&vs);
+
+    vs_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+    vs_stage.pNext = XGL_NULL_HANDLE;
+    vs_stage.shader.stage = XGL_SHADER_STAGE_VERTEX;
+    vs_stage.shader.shader = vs;
+    vs_stage.shader.descriptorSetMapping[0].descriptorCount = 1;
+    vs_stage.shader.descriptorSetMapping[0].pDescriptorInfo = &ds_vs;
+    vs_stage.shader.linkConstBufferCount = 0;
+    vs_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
+    vs_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_SHADER_RESOURCE;
+    vs_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
+
+    CreateShader(&ps);
+
+    ps_stage.sType = XGL_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
+    ps_stage.pNext = &vs_stage;
+    ps_stage.shader.stage = XGL_SHADER_STAGE_FRAGMENT;
+    ps_stage.shader.shader = ps;
+    ps_stage.shader.descriptorSetMapping[0].descriptorCount = 1;
+    // TODO: Do we need a descriptor set mapping for fragment?
+    ps_stage.shader.descriptorSetMapping[0].pDescriptorInfo = &ds_vs;
+    ps_stage.shader.linkConstBufferCount = 0;
+    ps_stage.shader.pLinkConstBufferInfo = XGL_NULL_HANDLE;
+    ps_stage.shader.dynamicMemoryViewMapping.slotObjectType = XGL_SLOT_SHADER_RESOURCE;
+    ps_stage.shader.dynamicMemoryViewMapping.shaderEntityIndex = 0;
+
+    XGL_PIPELINE_IA_STATE_CREATE_INFO ia_state = {
+        XGL_STRUCTURE_TYPE_PIPELINE_IA_STATE_CREATE_INFO,  // sType
+        &ps_stage,                                         // pNext
+        XGL_TOPOLOGY_TRIANGLE_LIST,                        // XGL_PRIMITIVE_TOPOLOGY
+        XGL_FALSE,                                         // disableVertexReuse
+        XGL_PROVOKING_VERTEX_LAST,                         // XGL_PROVOKING_VERTEX_CONVENTION
+        XGL_FALSE,                                         // primitiveRestartEnable
+        0                                                  // primitiveRestartIndex
+    };
+
+    XGL_PIPELINE_RS_STATE_CREATE_INFO rs_state = {
+        XGL_STRUCTURE_TYPE_PIPELINE_RS_STATE_CREATE_INFO,
+        &ia_state,
+        XGL_FALSE,                                          // depthClipEnable
+        XGL_FALSE,                                          // rasterizerDiscardEnable
+        1.0                                                 // pointSize
+    };
+
+    XGL_PIPELINE_CB_STATE cb_state = {
+        XGL_STRUCTURE_TYPE_PIPELINE_CB_STATE_CREATE_INFO,
+        &rs_state,
+        XGL_FALSE,                                          // alphaToCoverageEnable
+        XGL_FALSE,                                          // dualSourceBlendEnable
+        XGL_LOGIC_OP_COPY,                                  // XGL_LOGIC_OP
+        {                                                   // XGL_PIPELINE_CB_ATTACHMENT_STATE
+            {
+                XGL_FALSE,                                  // blendEnable
+                {XGL_CH_FMT_R8G8B8A8, XGL_NUM_FMT_UINT},    // XGL_FORMAT
+                0xF                                         // channelWriteMask
+            }
+        }
+    };
+
+    // TODO: Should take depth buffer format from queried formats
+    XGL_PIPELINE_DB_STATE_CREATE_INFO db_state = {
+        XGL_STRUCTURE_TYPE_PIPELINE_DB_STATE_CREATE_INFO,
+        &cb_state,
+        {XGL_CH_FMT_R32, XGL_NUM_FMT_DS}                    // XGL_FORMAT
+    };
+
+    info.sType = XGL_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
+    info.pNext = &db_state;
+    info.flags = 0;
+    err = xglCreateGraphicsPipeline(device(), &info, &pipeline);
+    ASSERT_XGL_SUCCESS(err);
+
+    ASSERT_XGL_SUCCESS(xglDestroyObject(pipeline));
+    ASSERT_XGL_SUCCESS(xglDestroyObject(ps));
+    ASSERT_XGL_SUCCESS(xglDestroyObject(vs));
 }
 
 int main(int argc, char **argv) {