From d9eb6a5b206b0a2f67022b7bae32fb8e46badb95 Mon Sep 17 00:00:00 2001 From: marxin <mliska@suse.cz> Date: Fri, 18 Jan 2019 22:58:42 +0100 Subject: 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. --- drivers/gles3/rasterizer_scene_gles3.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'drivers/gles3/rasterizer_scene_gles3.h') 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]; }; -- cgit v1.2.3