tests: Add another class to help implementing tests
diff --git a/tests/xglrenderframework.h b/tests/xglrenderframework.h
new file mode 100644
index 0000000..127d582
--- /dev/null
+++ b/tests/xglrenderframework.h
@@ -0,0 +1,116 @@
+/*
+ * XGL Tests
+ *
+ * Copyright (C) 2014 LunarG, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *   Courtney Goeltzenleuchter <courtney@lunarg.com>
+ */
+
+#ifndef XGLRENDERFRAMEWORK_H
+#define XGLRENDERFRAMEWORK_H
+
+#include "xgltestframework.h"
+
+class XglRenderFramework : public XglTestFramework
+{
+public:
+    XglRenderFramework();
+    ~XglRenderFramework();
+
+    void CreateQueryPool(XGL_QUERY_TYPE type, XGL_UINT slots,
+                         XGL_QUERY_POOL *pPool, XGL_GPU_MEMORY *pMem);
+    void DestroyQueryPool(XGL_QUERY_POOL pool, XGL_GPU_MEMORY mem);
+
+    XGL_DEVICE device() {return m_device->device();}
+    void CreateShader(XGL_PIPELINE_SHADER_STAGE stage, const char *shader_code, XGL_SHADER *pshader);
+    void InitPipeline();
+    void InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
+    void InitConstantBuffer( int constantCount, int constantSize, const void* data );
+    void InitViewport(float width, float height);
+    void InitRenderTarget();
+    void InitFramework();
+    void CreateDefaultPipeline(XGL_PIPELINE* pipeline, XGL_SHADER* vs, XGL_SHADER* ps);
+    void GenerateClearAndPrepareBufferCmds(XglImage *renderTarget);
+    void GenerateBindRenderTargetCmd(XglImage *renderTarget);
+    void GenerateBindStateAndPipelineCmds(XGL_PIPELINE* pipeline);
+
+protected:
+    XGL_APPLICATION_INFO            app_info;
+    XGL_PHYSICAL_GPU                objs[MAX_GPUS];
+    XGL_UINT                        gpu_count;
+    XGL_GPU_MEMORY                  m_descriptor_set_mem;
+    XGL_GPU_MEMORY                  m_pipe_mem;
+    XglDevice                      *m_device;
+    XGL_CMD_BUFFER                  m_cmdBuffer;
+    XGL_UINT32                      m_numVertices;
+    XGL_MEMORY_VIEW_ATTACH_INFO     m_vtxBufferView;
+    XGL_MEMORY_VIEW_ATTACH_INFO     m_constantBufferView;
+    XGL_GPU_MEMORY                  m_vtxBufferMem;
+    XGL_GPU_MEMORY                  m_constantBufferMem;
+    XGL_UINT32                      m_numMemRefs;
+    XGL_MEMORY_REF                  m_memRefs[5];
+    XGL_RASTER_STATE_OBJECT         m_stateRaster;
+    XGL_COLOR_BLEND_STATE_OBJECT    m_colorBlend;
+    XGL_VIEWPORT_STATE_OBJECT       m_stateViewport;
+    XGL_DEPTH_STENCIL_STATE_OBJECT  m_stateDepthStencil;
+    XGL_MSAA_STATE_OBJECT           m_stateMsaa;
+    XGL_DESCRIPTOR_SET              m_rsrcDescSet;
+    XglImage                       *m_renderTarget;
+    XGL_FLOAT                       m_width, m_height;
+    XGL_FORMAT                      m_render_target_fmt;
+
+    /*
+     * SetUp and TearDown are called by the Google Test framework
+     * to initialize a test framework based on this class.
+     */
+    virtual void SetUp() {
+        XGL_RESULT err;
+
+        this->app_info.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
+        this->app_info.pNext = NULL;
+        this->app_info.pAppName = (const XGL_CHAR *) "base";
+        this->app_info.appVersion = 1;
+        this->app_info.pEngineName = (const XGL_CHAR *) "unittest";
+        this->app_info.engineVersion = 1;
+        this->app_info.apiVersion = XGL_MAKE_VERSION(0, 22, 0);
+
+        memset(&m_vtxBufferView, 0, sizeof(m_vtxBufferView));
+        m_vtxBufferView.sType = XGL_STRUCTURE_TYPE_MEMORY_VIEW_ATTACH_INFO;
+
+        memset(&m_constantBufferView, 0, sizeof(m_constantBufferView));
+        m_constantBufferView.sType = XGL_STRUCTURE_TYPE_MEMORY_VIEW_ATTACH_INFO;
+
+        err = xglInitAndEnumerateGpus(&app_info, NULL,
+                                      MAX_GPUS, &this->gpu_count, objs);
+        ASSERT_XGL_SUCCESS(err);
+        ASSERT_GE(1, this->gpu_count) << "No GPU available";
+
+        m_device = new XglDevice(0, objs[0]);
+        m_device->get_device_queue();
+    }
+
+    virtual void TearDown() {
+        xglInitAndEnumerateGpus(&this->app_info, XGL_NULL_HANDLE, 0, &gpu_count, XGL_NULL_HANDLE);
+    }
+};
+
+#endif // XGLRENDERFRAMEWORK_H