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

Differential Revision: D2995
This commit is contained in:
Germano
2018-01-11 15:58:20 -02:00
parent 5ef2be5f59
commit 6c4bc79134
6 changed files with 66 additions and 8 deletions

View File

@@ -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");
}

View File

@@ -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),

View File

@@ -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];

View File

@@ -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;

View File

@@ -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));

View File

@@ -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;