[Bf-blender-cvs] [fb5a57ab972] blender2.8: Fix part of T53497: Eevee stuttering on macOS for the first few seconds of usage.

Brecht Van Lommel noreply at git.blender.org
Wed Apr 4 11:34:46 CEST 2018


Commit: fb5a57ab97279728b6a44641ea72d340058057db
Author: Brecht Van Lommel
Date:   Wed Apr 4 11:13:13 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBfb5a57ab97279728b6a44641ea72d340058057db

Fix part of T53497: Eevee stuttering on macOS for the first few seconds of usage.

The problem was that textures were assigned to different slots on different draw
calls, which caused shader specialization/patching by the driver. So the shader
would be compiled over and over until all possible assignments were used.

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

M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_manager_exec.c

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

diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c
index b09e45e90f7..23e339bcd8f 100644
--- a/source/blender/draw/intern/draw_manager_data.c
+++ b/source/blender/draw/intern/draw_manager_data.c
@@ -82,7 +82,24 @@ static void drw_shgroup_uniform_create_ex(DRWShadingGroup *shgroup, int loc,
 	uni->length = length;
 	uni->arraysize = arraysize;
 
-	BLI_LINKS_PREPEND(shgroup->uniforms, uni);
+	/* Insert into list sorted by location so that slots are consistenly assigned
+	 * for different draw calls, to avoid shader specialization/patching by the driver. */
+	DRWUniform *next = shgroup->uniforms;
+	DRWUniform *prev = NULL;
+
+	while (next && loc > next->location) {
+		prev = next;
+		next = next->next;
+	}
+
+	if (prev) {
+		prev->next = uni;
+	}
+	else {
+		shgroup->uniforms = uni;
+	}
+
+	uni->next = next;
 }
 
 static void drw_shgroup_builtin_uniform(
diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c
index 58cd6ce44c6..e69a1026815 100644
--- a/source/blender/draw/intern/draw_manager_exec.c
+++ b/source/blender/draw/intern/draw_manager_exec.c
@@ -861,6 +861,10 @@ static void release_texture_slots(bool with_persist)
 				DST.RST.bound_tex_slots[i] = BIND_NONE;
 		}
 	}
+
+	/* Reset so that slots are consistenly assigned for different shader
+	 * draw calls, to avoid shader specialization/patching by the driver. */
+	DST.RST.bind_tex_inc = 0;
 }
 
 static void release_ubo_slots(bool with_persist)
@@ -874,6 +878,10 @@ static void release_ubo_slots(bool with_persist)
 				DST.RST.bound_ubo_slots[i] = BIND_NONE;
 		}
 	}
+
+	/* Reset so that slots are consistenly assigned for different shader
+	 * draw calls, to avoid shader specialization/patching by the driver. */
+	DST.RST.bind_ubo_inc = 0;
 }
 
 static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)



More information about the Bf-blender-cvs mailing list