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();