[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