Fix T51576: Blender crash when change to edit mode with some Intel GPUs
Differential Revision: D2995
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
@@ -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),
|
||||
|
||||
@@ -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];
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user