[Bf-blender-cvs] [ef90d467008] blender2.8: Workbench: Shadow: Add geometry instancing extension.

Clément Foucault noreply at git.blender.org
Sun May 20 19:20:13 CEST 2018


Commit: ef90d467008bbb471021e376b8d36554543544a4
Author: Clément Foucault
Date:   Sat May 19 18:23:29 2018 +0200
Branches: blender2.8
https://developer.blender.org/rBef90d467008bbb471021e376b8d36554543544a4

Workbench: Shadow: Add geometry instancing extension.

This give a very slight perf boost. (2ms gain over 67ms total in my test)

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

M	source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl

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

diff --git a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
index baf11a2a716..bee49c41870 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_shadow_geom.glsl
@@ -1,5 +1,12 @@
+#extension GL_ARB_gpu_shader5 : enable
+
+#ifdef GL_ARB_gpu_shader5
+layout(lines_adjacency, invocations = 2) in;
+layout(triangle_strip, max_vertices = 4) out;
+#else
 layout(lines_adjacency) in;
 layout(triangle_strip, max_vertices = 8) out;
+#endif
 
 uniform mat4 ModelMatrixInverse;
 
@@ -15,6 +22,16 @@ in VertexData {
 
 #define len_sqr(a) dot(a, a)
 
+void extrude_edge(bool invert)
+{
+	ivec2 idx = (invert) ? ivec2(2, 1) : ivec2(1, 2);
+	gl_Position = vData[idx.x].frontPosition; EmitVertex();
+	gl_Position = vData[idx.y].frontPosition; EmitVertex();
+	gl_Position = vData[idx.x].backPosition; EmitVertex();
+	gl_Position = vData[idx.y].backPosition; EmitVertex();
+	EndPrimitive();
+}
+
 void main()
 {
 	/* TODO precompute light_direction */
@@ -61,18 +78,19 @@ void main()
 	ivec2 idx = ivec2(1, 2);
 	idx = (backface.x) ? idx.yx : idx.xy;
 
-	gl_Position = vData[idx.x].frontPosition; EmitVertex();
-	gl_Position = vData[idx.y].frontPosition; EmitVertex();
-	gl_Position = vData[idx.x].backPosition; EmitVertex();
-	gl_Position = vData[idx.y].backPosition; EmitVertex();
-	EndPrimitive();
-
+#ifdef GL_ARB_gpu_shader5
+	if (gl_InvocationID == 0) {
+		extrude_edge(backface.x);
+	}
+	else if (is_manifold) {
+		/* Increment/Decrement twice for manifold edges. */
+		extrude_edge(backface.x);
+	}
+#else
+	extrude_edge(backface.x);
 	/* Increment/Decrement twice for manifold edges. */
 	if (is_manifold) {
-		gl_Position = vData[idx.x].frontPosition; EmitVertex();
-		gl_Position = vData[idx.y].frontPosition; EmitVertex();
-		gl_Position = vData[idx.x].backPosition; EmitVertex();
-		gl_Position = vData[idx.y].backPosition; EmitVertex();
-		EndPrimitive();
+		extrude_edge(backface.x);
 	}
+#endif
 }



More information about the Bf-blender-cvs mailing list