Fix T64499: edit mode display glitch on Intel HD 4x00 and Windows 7/8
authorBrecht Van Lommel <brechtvanlommel@gmail.com>
Tue, 21 May 2019 21:59:57 +0000 (23:59 +0200)
committerBrecht Van Lommel <brechtvanlommel@gmail.com>
Wed, 22 May 2019 06:32:39 +0000 (08:32 +0200)
There may well be more vertex shaders that need this, but I couldn't find them
in my testing.

Differential Revision: https://developer.blender.org/D4921

source/blender/draw/modes/shaders/common_view_lib.glsl
source/blender/draw/modes/shaders/edit_curve_overlay_handle_vert.glsl
source/blender/draw/modes/shaders/edit_curve_overlay_loosevert_vert.glsl
source/blender/draw/modes/shaders/edit_curve_overlay_normals_vert.glsl
source/blender/draw/modes/shaders/edit_lattice_overlay_loosevert_vert.glsl
source/blender/draw/modes/shaders/edit_mesh_overlay_facefill_vert.glsl
source/blender/draw/modes/shaders/edit_mesh_overlay_mesh_analysis_vert.glsl
source/blender/draw/modes/shaders/edit_mesh_overlay_vert.glsl
source/blender/draw/modes/shaders/edit_normals_vert.glsl

index 79ac351..9802b91 100644 (file)
@@ -48,3 +48,11 @@ uniform mat4 ModelMatrixInverse;
 #define point_world_to_ndc(p) (ViewProjectionMatrix * vec4(p, 1.0))
 #define point_world_to_object(p) ((ModelMatrixInverse * vec4(p, 1.0)).xyz)
 #define point_world_to_view(p) ((ViewMatrix * vec4(p, 1.0)).xyz)
+
+/* Due to some shader compiler bug, we somewhat need to access gl_VertexID
+ * to make vertex shaders work. even if it's actually dead code. */
+#ifdef GPU_INTEL
+#  define GPU_INTEL_VERTEX_SHADER_WORKAROUND gl_Position.x = float(gl_VertexID);
+#else
+#  define GPU_INTEL_VERTEX_SHADER_WORKAROUND
+#endif
index 2f3d37a..590c290 100644 (file)
@@ -7,6 +7,8 @@ flat out int vertFlag;
 
 void main()
 {
+  GPU_INTEL_VERTEX_SHADER_WORKAROUND
+
   vec3 world_pos = point_object_to_world(pos);
   gl_Position = point_world_to_ndc(world_pos);
   vertFlag = data;
index b1b707b..6eec43d 100644 (file)
@@ -9,6 +9,8 @@ out vec4 finalColor;
 
 void main()
 {
+  GPU_INTEL_VERTEX_SHADER_WORKAROUND
+
   if ((data & VERT_SELECTED) != 0) {
     if ((data & VERT_ACTIVE) != 0) {
       finalColor = colorEditMeshActive;
index ef60ddb..e1d5319 100644 (file)
@@ -9,6 +9,8 @@ in float rad;
 
 void main()
 {
+  GPU_INTEL_VERTEX_SHADER_WORKAROUND
+
   vec3 final_pos = pos;
 
   float flip = (gl_InstanceID != 0) ? -1.0 : 1.0;
index f7df6bb..ac6b353 100644 (file)
@@ -22,6 +22,8 @@ vec2 proj(vec4 pos)
 
 void main()
 {
+  GPU_INTEL_VERTEX_SHADER_WORKAROUND
+
   clipCase = 0;
 
   vec3 world_pos = point_object_to_world(pos);
index a20c112..df37c6f 100644 (file)
@@ -8,6 +8,8 @@ flat out vec4 faceColor;
 
 void main()
 {
+  GPU_INTEL_VERTEX_SHADER_WORKAROUND
+
   vec3 world_pos = point_object_to_world(pos);
   gl_Position = point_world_to_ndc(world_pos);
 
index 968a63c..7065ce3 100644 (file)
@@ -12,6 +12,8 @@ out vec4 weightColor;
 
 void main()
 {
+  GPU_INTEL_VERTEX_SHADER_WORKAROUND
+
   vec3 world_pos = point_object_to_world(pos);
   gl_Position = point_world_to_ndc(world_pos);
   weightColor = vec4(weight_color.rgb, 1.0);
index 9aa6568..fabc317 100644 (file)
@@ -20,6 +20,8 @@ out int selectOveride;
 
 void main()
 {
+  GPU_INTEL_VERTEX_SHADER_WORKAROUND
+
   vec3 world_pos = point_object_to_world(pos);
 
 #if !defined(FACE)
index 9bf0fb7..384d139 100644 (file)
@@ -21,6 +21,8 @@ flat out vec4 v2;
 
 void main()
 {
+  GPU_INTEL_VERTEX_SHADER_WORKAROUND
+
   vec3 n = normalize(normal_object_to_world(nor));
 
   vec3 world_pos = point_object_to_world(pos);