Skip to content

Commit 7b99bc6

Browse files
committed
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).
1 parent fb126d0 commit 7b99bc6

File tree

1 file changed

+20
-8
lines changed

1 file changed

+20
-8
lines changed

renderdoc/driver/gl/wrappers/gl_uniform_funcs.cpp

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,17 @@ bool WrappedOpenGL::Serialise_glProgramUniformVector(GLuint program, GLint locat
7676

7777
union
7878
{
79-
float f[4];
80-
int32_t i[4];
81-
uint32_t u[4];
82-
double d[4];
79+
byte *alloc;
80+
float *f;
81+
int32_t *i;
82+
uint32_t *u;
83+
double *d;
8384
} v;
85+
86+
v.alloc = new byte[totalSize];
87+
8488
// Copy the pointer first to guarantee alignment, which is needed on ARM.
85-
memcpy(v.d, value, RDCMIN(totalSize, sizeof(v.d)));
89+
memcpy(v.d, value, totalSize);
8690

8791
if(m_State <= EXECUTING)
8892
{
@@ -171,6 +175,8 @@ bool WrappedOpenGL::Serialise_glProgramUniformVector(GLuint program, GLint locat
171175
}
172176
}
173177

178+
delete[] v.alloc;
179+
174180
return true;
175181
}
176182

@@ -237,10 +243,14 @@ bool WrappedOpenGL::Serialise_glProgramUniformMatrix(GLuint program, GLint locat
237243

238244
union
239245
{
240-
float f[4 * 4];
241-
double d[4 * 4];
246+
byte *alloc;
247+
float *f;
248+
double *d;
242249
} v;
243-
memcpy(v.d, value, RDCMIN(totalSize, sizeof(v.d)));
250+
251+
v.alloc = new byte[totalSize];
252+
253+
memcpy(v.d, value, totalSize);
244254

245255
if(m_State <= EXECUTING)
246256
{
@@ -320,6 +330,8 @@ bool WrappedOpenGL::Serialise_glProgramUniformMatrix(GLuint program, GLint locat
320330
m_pSerialiser->DebugPrint("}\n");
321331
}
322332

333+
delete[] v.alloc;
334+
323335
return true;
324336
}
325337

0 commit comments

Comments
 (0)