summaryrefslogtreecommitdiffstats
path: root/drivers/gles3/rasterizer_scene_gles3.h
diff options
context:
space:
mode:
authormarxin <mliska@suse.cz>2019-01-18 22:58:42 +0100
committermarxin <mliska@suse.cz>2019-01-19 10:25:01 +0100
commitd9eb6a5b206b0a2f67022b7bae32fb8e46badb95 (patch)
treea7a983337cbf6fb6e0fa64afd9141eee20481716 /drivers/gles3/rasterizer_scene_gles3.h
parent7f9209781cea7148934a5e48c5c14167ce256cc8 (diff)
downloadredot-engine-d9eb6a5b206b0a2f67022b7bae32fb8e46badb95.tar.gz
Fix #19633 by proper store to &ubo_data.shadow_matrix[1234].
It is not valid in C++ to store into shadow_matrix1[16] with shadow_matrix1[16 * j] (for j > 0). Even though there's a valid space in a struct after shadow_matrix1. Knowing that GCC performs aggressive optimizations that eventually lead to a wrong code. Code has been changed into union where one can either use shadow_matrix[4 * 16], or individual shadow_matrix1, shadow_matrix2, etc. GCC pragma is not needed any longer.
Diffstat (limited to 'drivers/gles3/rasterizer_scene_gles3.h')
-rw-r--r--drivers/gles3/rasterizer_scene_gles3.h13
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h
index 9772b5dd23..325617745a 100644
--- a/drivers/gles3/rasterizer_scene_gles3.h
+++ b/drivers/gles3/rasterizer_scene_gles3.h
@@ -569,10 +569,15 @@ public:
float light_params[4]; //spot attenuation, spot angle, specular, shadow enabled
float light_clamp[4];
float light_shadow_color_contact[4];
- float shadow_matrix1[16]; //up to here for spot and omni, rest is for directional
- float shadow_matrix2[16];
- float shadow_matrix3[16];
- float shadow_matrix4[16];
+ union {
+ struct {
+ float matrix1[16]; //up to here for spot and omni, rest is for directional
+ float matrix2[16];
+ float matrix3[16];
+ float matrix4[16];
+ };
+ float matrix[4 * 16];
+ } shadow;
float shadow_split_offsets[4];
};