[Bf-blender-cvs] [6c4bc791343] blender2.8: Fix T51576: Blender crash when change to edit mode with some Intel GPUs

Germano noreply at git.blender.org
Thu Jan 11 18:58:29 CET 2018


Commit: 6c4bc791343793172ec8ce731bb18e2f54343ac1
Author: Germano
Date:   Thu Jan 11 15:58:20 2018 -0200
Branches: blender2.8
https://developer.blender.org/rB6c4bc791343793172ec8ce731bb18e2f54343ac1

Fix T51576: Blender crash when change to edit mode with some Intel GPUs

Differential Revision: D2995

===================================================================

M	source/blender/draw/modes/edit_mesh_mode.c
M	source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_frag.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
M	source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl

===================================================================

diff --git a/source/blender/draw/modes/edit_mesh_mode.c b/source/blender/draw/modes/edit_mesh_mode.c
index 1a8c03e3933..303e76ebf1e 100644
--- a/source/blender/draw/modes/edit_mesh_mode.c
+++ b/source/blender/draw/modes/edit_mesh_mode.c
@@ -158,6 +158,7 @@ static void EDIT_MESH_engine_init(void *vedata)
 		        datatoc_edit_mesh_overlay_frag_glsl,
 		        datatoc_common_globals_lib_glsl,
 		        "#define EDGE_FIX\n"
+		        "#define INTEL_FIX\n"
 		        "#define ANTI_ALIASING\n"
 		        "#define VERTEX_FACING");
 	}
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_frag.glsl
index 049333c8e4f..23b794d9b8b 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_frag.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_frag.glsl
@@ -10,7 +10,7 @@ flat in int faceActive;
 
 out vec4 FragColor;
 
-const mat4 stipple_matrix = mat4(
+const vec4 stipple_matrix[4] = vec4[4](
 	vec4(1.0, 0.0, 0.0, 0.0),
 	vec4(0.0, 0.0, 0.0, 0.0),
 	vec4(0.0, 0.0, 1.0, 0.0),
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
index ed7421c1b1d..74193fa72e4 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_frag.glsl
@@ -5,11 +5,17 @@
 /* This shader follows the principles of
  * http://developer.download.nvidia.com/SDK/10/direct3d/Source/SolidWireframe/Doc/SolidWireframe.pdf */
 
+/* This is not perfect. Only a subset of intel gpus are affected.
+ * This fix have some performance impact.
+ * TODO Refine the range to only affect GPUs. */
+#ifndef GPU_INTEL
+# undef INTEL_FIX
+#endif
+
 uniform float faceAlphaMod;
 
 flat in vec3 edgesCrease;
 flat in vec3 edgesBweight;
-flat in ivec3 flag;
 flat in vec4 faceColor;
 flat in int clipCase;
 #ifdef VERTEX_SELECTION
@@ -38,6 +44,17 @@ in float facing;
 
 noperspective in vec4 eData1;
 flat in vec4 eData2;
+/* Some intel gpu have problems with having the vertex position packed. */
+#ifdef INTEL_FIX
+flat in vec2 eData3;
+#endif
+
+/* Some intel Gpu seems to have memory alignement problems. So adding a padding int */
+#ifdef GPU_INTEL
+flat in ivec4 flag;
+#else
+flat in ivec3 flag;
+#endif
 
 out vec4 FragColor;
 
@@ -72,7 +89,7 @@ const ivec3 clipPointIdx[6] = ivec3[6](
 	ivec3(2, 1, 0)
 );
 
-const mat4 stipple_matrix = mat4(
+const vec4 stipple_matrix[4] = vec4[4](
 	vec4(1.0, 0.0, 0.0, 0.0),
 	vec4(0.0, 0.0, 0.0, 0.0),
 	vec4(0.0, 0.0, 1.0, 0.0),
@@ -115,7 +132,11 @@ void main()
 
 		p.x = distance(eData2.zw, gl_FragCoord.xy);
 		p.y = distance(eData2.xy, gl_FragCoord.xy);
+#ifdef INTEL_FIX
+		p.z = distance(eData3.xy, gl_FragCoord.xy);
+#else
 		p.z = distance(eData1.zw, gl_FragCoord.xy);
+#endif
 	}
 	else {
 		ivec3 eidxs = clipEdgeIdx[clipCase - 1];
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
index 7d71e1540d5..99ecdfdd486 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_edge.glsl
@@ -22,7 +22,6 @@ in float vFacing[];
  * and does not need interpolation */
 flat out vec3 edgesCrease;
 flat out vec3 edgesBweight;
-flat out ivec3 flag;
 flat out vec4 faceColor;
 flat out int clipCase;
 #ifdef VERTEX_SELECTION
@@ -32,6 +31,13 @@ out vec3 vertexColor;
 out float facing;
 #endif
 
+/* Some intel Gpu seems to have memory alignement problems. So adding a padding int */
+#ifdef GPU_INTEL
+flat out ivec4 flag;
+#else
+flat out ivec3 flag;
+#endif
+
 /* See fragment shader */
 noperspective out vec4 eData1;
 flat out vec4 eData2;
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
index f83402e3869..341fe88f40b 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_geom_tri.glsl
@@ -7,6 +7,13 @@
 
 layout(triangles) in;
 
+/* This is not perfect. Only a subset of intel gpus are affected.
+ * This fix have some performance impact.
+ * TODO Refine the range to only affect GPUs. */
+#ifndef GPU_INTEL
+# undef INTEL_FIX
+#endif
+
 #ifdef EDGE_FIX
 /* To fix the edge artifacts, we render
  * an outline strip around the screenspace
@@ -37,7 +44,6 @@ in float vFacing[];
  * and does not need interpolation */
 flat out vec3 edgesCrease;
 flat out vec3 edgesBweight;
-flat out ivec3 flag;
 flat out vec4 faceColor;
 flat out int clipCase;
 #ifdef VERTEX_SELECTION
@@ -50,7 +56,17 @@ out float facing;
 /* See fragment shader */
 noperspective out vec4 eData1;
 flat out vec4 eData2;
+/* Some intel gpu have problems with having the vertex position packed. */
+#ifdef INTEL_FIX
+flat out vec2 eData3;
+#endif
 
+/* Some intel Gpu seems to have memory alignement problems. So adding a padding int */
+#ifdef GPU_INTEL
+flat out ivec4 flag;
+#else
+flat out ivec3 flag;
+#endif
 
 #define VERTEX_ACTIVE   (1 << 0)
 #define VERTEX_SELECTED (1 << 1)
@@ -164,7 +180,12 @@ void main()
 	if (clipCase == 0) {
 
 		/* Packing screen positions and 2 distances */
+#ifdef INTEL_FIX
+		eData1 = vec4(0.0);
+		eData3 = pos[2];
+#else
 		eData1 = vec4(0.0, 0.0, pos[2]);
+#endif
 		eData2 = vec4(pos[1], pos[0]);
 
 		/* Only pass the first 2 distances */
@@ -244,8 +265,11 @@ void main()
 			int v = i % 3;
 
 			/* Position of the "hidden" third vertex */
+#ifdef INTEL_FIX
+			eData3 = pos[vbe];
+#else
 			eData1.zw = pos[vbe];
-
+#endif
 			doVertex(v, pPos[v]);
 			doVertex(v, pPos[v] + vec4(fixvec[v], Z_OFFSET, 0.0));
 
diff --git a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl b/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl
index 0a396a5325f..4726bb12528 100644
--- a/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl
+++ b/source/blender/draw/modes/shaders/edit_mesh_overlay_loosevert_vert.glsl
@@ -15,13 +15,19 @@ in ivec4 data;
  * and does not need interpolation */
 flat out vec3 edgesCrease;
 flat out vec3 edgesBweight;
-flat out ivec3 flag;
 flat out vec4 faceColor;
 flat out int clipCase;
 #ifdef VERTEX_SELECTION
 out vec3 vertexColor;
 #endif
 
+/* Some intel Gpu seems to have memory alignement problems. So adding a padding int */
+#ifdef GPU_INTEL
+flat out ivec4 flag;
+#else
+flat out ivec3 flag;
+#endif
+
 /* See fragment shader */
 noperspective out vec4 eData1;
 flat out vec4 eData2;
@@ -51,8 +57,8 @@ void main()
 	eData1 = eData2 = vec4(1e10);
 	eData2.zw = proj(pPos);
 
-	flag = ivec3(0);
 	flag[0] = (data.x << 8);
+	flag[1] = flag[2] = 0;
 
 	gl_PointSize = sizeEdgeFix;
 	gl_Position = pPos;



More information about the Bf-blender-cvs mailing list