tests: Start on adding layer validation tests

Conflicts:
	tests/xglrenderframework.cpp
	tests/xglrenderframework.h
diff --git a/tests/layer_validation_tests.cpp b/tests/layer_validation_tests.cpp
new file mode 100644
index 0000000..bb34375
--- /dev/null
+++ b/tests/layer_validation_tests.cpp
@@ -0,0 +1,159 @@
+
+#include <xgl.h>
+#include <xglDbg.h>
+#include "gtest-1.7.0/include/gtest/gtest.h"
+#include "xglrenderframework.h"
+
+void XGLAPI myDbgFunc(
+    XGL_DBG_MSG_TYPE     msgType,
+    XGL_VALIDATION_LEVEL validationLevel,
+    XGL_BASE_OBJECT      srcObject,
+    size_t               location,
+    int32_t              msgCode,
+    const char*          pMsg,
+    void*                pUserData);
+
+class ErrorMonitor {
+public:
+    ErrorMonitor(XGL_INSTANCE inst)
+    {
+        xglDbgRegisterMsgCallback(inst, myDbgFunc, this);
+        m_msgType = XGL_DBG_MSG_UNKNOWN;
+    }
+    void ClearState()
+    {
+        m_msgType = XGL_DBG_MSG_UNKNOWN;
+        m_msgString.clear();
+    }
+    XGL_DBG_MSG_TYPE GetState(std::string *msgString)
+    {
+        *msgString = m_msgString;
+        return m_msgType;
+    }
+    void SetState(XGL_DBG_MSG_TYPE msgType, const char *msgString)
+    {
+        m_msgType = msgType;
+        m_msgString = *msgString;
+    }
+
+private:
+    XGL_DBG_MSG_TYPE        m_msgType;
+    std::string             m_msgString;
+
+};
+void XGLAPI myDbgFunc(
+    XGL_DBG_MSG_TYPE     msgType,
+    XGL_VALIDATION_LEVEL validationLevel,
+    XGL_BASE_OBJECT      srcObject,
+    size_t               location,
+    int32_t              msgCode,
+    const char*          pMsg,
+    void*                pUserData)
+{
+    ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
+    errMonitor->SetState(msgType, pMsg);
+}
+class XglLayerTest : public XglRenderFramework
+{
+public:
+    XGL_RESULT BeginCommandBuffer(XglCommandBufferObj &cmdBuffer);
+    XGL_RESULT EndCommandBuffer(XglCommandBufferObj &cmdBuffer);
+
+protected:
+        XglMemoryRefManager         m_memoryRefManager;
+        ErrorMonitor                *m_errorMonitor;
+
+    virtual void SetUp() {
+
+        this->app_info.sType = XGL_STRUCTURE_TYPE_APPLICATION_INFO;
+        this->app_info.pNext = NULL;
+        this->app_info.pAppName = "layer_tests";
+        this->app_info.appVersion = 1;
+        this->app_info.pEngineName = "unittest";
+        this->app_info.engineVersion = 1;
+        this->app_info.apiVersion = XGL_API_VERSION;
+
+        InitFramework();
+        m_errorMonitor = new ErrorMonitor(inst);
+    }
+
+    virtual void TearDown() {
+        // Clean up resources before we reset
+        delete m_errorMonitor;
+        ShutdownFramework();
+    }
+};
+XGL_RESULT XglLayerTest::BeginCommandBuffer(XglCommandBufferObj &cmdBuffer)
+{
+    XGL_RESULT result;
+
+    result = cmdBuffer.BeginCommandBuffer();
+
+    /*
+     * For render test all drawing happens in a single render pass
+     * on a single command buffer.
+     */
+    if (XGL_SUCCESS == result) {
+        cmdBuffer.BeginRenderPass(renderPass(), framebuffer());
+    }
+
+    return result;
+}
+
+XGL_RESULT XglLayerTest::EndCommandBuffer(XglCommandBufferObj &cmdBuffer)
+{
+    XGL_RESULT result;
+
+    cmdBuffer.EndRenderPass(renderPass());
+
+    result = cmdBuffer.EndCommandBuffer();
+
+    return result;
+}
+
+TEST_F(XglLayerTest, UseSignaledFence)
+{
+    xgl_testing::Fence testFence;
+    XGL_DBG_MSG_TYPE msgType;
+    std::string msgString;
+    const XGL_FENCE_CREATE_INFO fenceInfo = {
+        .sType = XGL_STRUCTURE_TYPE_FENCE_CREATE_INFO,
+        .pNext = NULL,
+        .flags = XGL_FENCE_CREATE_SIGNALED_BIT,
+    };
+
+    // Register error callback to catch errors and record parameters
+
+    // Verifiy that the appropriate layer is loaded
+
+    ASSERT_NO_FATAL_FAILURE(InitState());
+    ASSERT_NO_FATAL_FAILURE(InitViewport());
+    ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
+
+    XglCommandBufferObj cmdBuffer(m_device);
+    cmdBuffer.AddRenderTarget(m_renderTargets[0]);
+
+    cmdBuffer.begin();
+    cmdBuffer.ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
+    cmdBuffer.end();
+
+    testFence.init(*m_device, fenceInfo);
+    m_errorMonitor->ClearState();
+    cmdBuffer.QueueCommandBuffer();
+    msgType = m_errorMonitor->GetState(&msgString);
+
+}
+
+int main(int argc, char **argv) {
+    int result;
+
+    ::testing::InitGoogleTest(&argc, argv);
+    XglTestFramework::InitArgs(&argc, argv);
+
+    ::testing::AddGlobalTestEnvironment(new TestEnvironment);
+
+    result = RUN_ALL_TESTS();
+
+    XglTestFramework::Finish();
+    return result;
+}