From 7b99bc6c6a6e0652c59c7179d9d28b759592ba9c Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 31 Jul 2017 10:41:51 +0100 Subject: [PATCH] Heap alloc enough space for uniforms, instead of only copying one elem * Uniform arrays would be truncated after the largest single element size (a 4-wide double vector). --- .../driver/gl/wrappers/gl_uniform_funcs.cpp | 28 +++++++++++++------ 1 file changed, 20 insertions(+), 8 deletions(-) diff --git a/renderdoc/driver/gl/wrappers/gl_uniform_funcs.cpp b/renderdoc/driver/gl/wrappers/gl_uniform_funcs.cpp index b1f56023f..0ffaac654 100644 --- a/renderdoc/driver/gl/wrappers/gl_uniform_funcs.cpp +++ b/renderdoc/driver/gl/wrappers/gl_uniform_funcs.cpp @@ -76,13 +76,17 @@ bool WrappedOpenGL::Serialise_glProgramUniformVector(GLuint program, GLint locat union { - float f[4]; - int32_t i[4]; - uint32_t u[4]; - double d[4]; + byte *alloc; + float *f; + int32_t *i; + uint32_t *u; + double *d; } v; + + v.alloc = new byte[totalSize]; + // Copy the pointer first to guarantee alignment, which is needed on ARM. - memcpy(v.d, value, RDCMIN(totalSize, sizeof(v.d))); + memcpy(v.d, value, totalSize); if(m_State <= EXECUTING) { @@ -171,6 +175,8 @@ bool WrappedOpenGL::Serialise_glProgramUniformVector(GLuint program, GLint locat } } + delete[] v.alloc; + return true; } @@ -237,10 +243,14 @@ bool WrappedOpenGL::Serialise_glProgramUniformMatrix(GLuint program, GLint locat union { - float f[4 * 4]; - double d[4 * 4]; + byte *alloc; + float *f; + double *d; } v; - memcpy(v.d, value, RDCMIN(totalSize, sizeof(v.d))); + + v.alloc = new byte[totalSize]; + + memcpy(v.d, value, totalSize); if(m_State <= EXECUTING) { @@ -320,6 +330,8 @@ bool WrappedOpenGL::Serialise_glProgramUniformMatrix(GLuint program, GLint locat m_pSerialiser->DebugPrint("}\n"); } + delete[] v.alloc; + return true; }