diff options
author | marxin <mliska@suse.cz> | 2019-01-18 22:58:42 +0100 |
---|---|---|
committer | marxin <mliska@suse.cz> | 2019-01-19 10:25:01 +0100 |
commit | d9eb6a5b206b0a2f67022b7bae32fb8e46badb95 (patch) | |
tree | a7a983337cbf6fb6e0fa64afd9141eee20481716 /drivers/gles3/rasterizer_scene_gles3.h | |
parent | 7f9209781cea7148934a5e48c5c14167ce256cc8 (diff) | |
download | redot-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.h | 13 |
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]; }; |