tests: Add matrix library (libglm-dev) and test

Update draw with uniform to take the uniform (matrix) as a
parameter and can now rotate the test triangle.
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 86d7427..11ccb50 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -2,6 +2,9 @@
 
 find_package (OpenGL REQUIRED)
 find_package (GLUT REQUIRED)
+if(NOT EXISTS /usr/include/glm/glm.hpp)
+    message(FATAL_ERROR "Necessary libglm-dev headers cannot be found: sudo apt-get install libglm-dev")
+endif()
 
 SET(COMMON
     common.c
diff --git a/tests/render_tests.cpp b/tests/render_tests.cpp
index 2152bef..81703bf 100644
--- a/tests/render_tests.cpp
+++ b/tests/render_tests.cpp
@@ -67,6 +67,10 @@
 #include "xglimage.h"
 #include "icd-bil.h"
 
+#define GLM_FORCE_RADIANS
+#include "glm/glm.hpp"
+#include <glm/gtc/matrix_transform.hpp>
+
 #include "xglrenderframework.h"
 
 #undef ASSERT_NO_FATAL_FAILURE
@@ -137,7 +141,7 @@
     void DrawTriangleTest(const char *vertShaderText, const char *fragShaderText);
     void DrawTriangleTwoUniformsFS(const char *vertShaderText, const char *fragShaderText);
     void DrawTriangleWithVertexFetch(const char *vertShaderText, const char *fragShaderText);
-    void DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText);
+    void DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText, const glm::mat4 matrix);
 
     void CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
     void CreatePipelineVSUniform(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps);
@@ -615,11 +619,13 @@
 }
 
 
-void XglRenderTest::DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText)
+void XglRenderTest::DrawTriangleVSUniform(const char *vertShaderText, const char *fragShaderText,
+                                          const glm::mat4 matrix)
 {
     XGL_PIPELINE pipeline;
     XGL_SHADER vs, ps;
     XGL_RESULT err;
+    glm::mat4 MVP;
 
     ASSERT_NO_FATAL_FAILURE(InitState());
     ASSERT_NO_FATAL_FAILURE(InitViewport());
@@ -640,13 +646,10 @@
 
     ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
 
-    const int constantCount = 16;
-    const float constants[constantCount] = { 0.0, -1.0, 0.0, 0.0,
-                                             1.0, 0.0, 0.0, 0.0,
-                                             0.0, 0.0, 1.0, 0.0,
-                                             0.0, 0.0, 0.0, 1.0 };
+    const int matrixSize = 16;
+    MVP = matrix;
 
-    InitConstantBuffer(constantCount, sizeof(constants[0]), (const void*) constants);
+    InitConstantBuffer(matrixSize, sizeof(MVP[0]), (const void*) &MVP[0][0]);
 
     // Create descriptor set for a uniform resource
     const int slotCount = 1;
@@ -709,7 +712,6 @@
     xglDeviceWaitIdle(m_device->device());
 
     RecordImage(m_renderTarget);
-
 }
 
 void XglRenderTest::CreatePipelineWithVertexFetch(XGL_PIPELINE* pipeline, XGL_SHADER vs, XGL_SHADER ps)
@@ -1203,7 +1205,12 @@
             "   gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);\n"
             "}\n";
 
-    DrawTriangleVSUniform(vertShaderText, fragShaderText);
+    // Create identity matrix
+    glm::mat4 Model      = glm::mat4(1.0f);
+    DrawTriangleVSUniform(vertShaderText, fragShaderText, Model);
+
+    Model = glm::rotate(Model, glm::radians(45.0f), glm::vec3(0.0f, 0.0f, 1.0f));
+    DrawTriangleVSUniform(vertShaderText, fragShaderText, Model);
 }
 
 int main(int argc, char **argv) {
diff --git a/tests/xglrenderframework.cpp b/tests/xglrenderframework.cpp
index 547b580..d86adb7 100644
--- a/tests/xglrenderframework.cpp
+++ b/tests/xglrenderframework.cpp
@@ -179,6 +179,24 @@
     this->m_constantBufferView.format.numericFormat = XGL_NUM_FMT_FLOAT;
 }
 
+/*
+ * Update existing constant value with new data of exactly
+ * the same size.
+ */
+void XglRenderFramework::UpdateConstantBuffer(const void* data)
+{
+    XGL_RESULT err = XGL_SUCCESS;
+    XGL_UINT8 *pData;
+
+    err = xglMapMemory(m_constantBufferMem, 0, (XGL_VOID **) &pData);
+    ASSERT_XGL_SUCCESS(err);
+
+    memcpy(pData + this->m_constantBufferView.offset, data, this->m_constantBufferView.range);
+
+    err = xglUnmapMemory(m_constantBufferMem);
+    ASSERT_XGL_SUCCESS(err);
+}
+
 void XglRenderFramework::CreateQueryPool(XGL_QUERY_TYPE type, XGL_UINT slots,
                                          XGL_QUERY_POOL *pPool, XGL_GPU_MEMORY *pMem)
 {
diff --git a/tests/xglrenderframework.h b/tests/xglrenderframework.h
index 995a538..06f8a3d 100644
--- a/tests/xglrenderframework.h
+++ b/tests/xglrenderframework.h
@@ -45,6 +45,7 @@
     void InitPipeline();
     void InitMesh( XGL_UINT32 numVertices, XGL_GPU_SIZE vbStride, const void* vertices );
     void InitConstantBuffer( int constantCount, int constantSize, const void* data );
+    void UpdateConstantBuffer(const void* data);
     void InitViewport(float width, float height);
     void InitViewport();
     void InitRenderTarget();