[Bf-blender-cvs] [3988d00f1a4] temp-gpu-compute-shader-hair: Batch hair when using compute shaders.

Jeroen Bakker noreply at git.blender.org
Fri May 7 16:18:23 CEST 2021


Commit: 3988d00f1a4dfce9901eda09221756519653d6f8
Author: Jeroen Bakker
Date:   Fri May 7 16:12:28 2021 +0200
Branches: temp-gpu-compute-shader-hair
https://developer.blender.org/rB3988d00f1a4dfce9901eda09221756519653d6f8

Batch hair when using compute shaders.

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

M	source/blender/draw/intern/draw_hair.c
M	source/blender/draw/intern/shaders/common_hair_lib.glsl
M	source/blender/draw/intern/shaders/common_hair_refine_comp.glsl

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

diff --git a/source/blender/draw/intern/draw_hair.c b/source/blender/draw/intern/draw_hair.c
index c839dbed715..31d316ca5d9 100644
--- a/source/blender/draw/intern/draw_hair.c
+++ b/source/blender/draw/intern/draw_hair.c
@@ -162,13 +162,24 @@ static void drw_hair_particle_cache_shgrp_attach_resources(DRWShadingGroup *shgr
 
 static void drw_hair_particle_cache_update_compute(ParticleHairCache *cache, const int subdiv)
 {
-  const int final_points_len = cache->final[subdiv].strands_res * cache->strands_len;
+  const int strands_len = cache->strands_len;
+  const int final_points_len = cache->final[subdiv].strands_res * strands_len;
   if (final_points_len > 0) {
     GPUShader *shader = hair_refine_shader_get(PART_REFINE_CATMULL_ROM);
     DRWShadingGroup *shgrp = DRW_shgroup_create(shader, g_tf_pass);
     drw_hair_particle_cache_shgrp_attach_resources(shgrp, cache, subdiv);
     DRW_shgroup_vertex_buffer(shgrp, "hairPointOutputBuffer", cache->final[subdiv].proc_buf);
-    DRW_shgroup_call_compute(shgrp, cache->strands_len, cache->final[subdiv].strands_res, 1);
+
+    /* TODO(jbakker): get from GPU module. */
+    const int max_strands_per_call = 32768;
+    int strands_start = 0;
+    while (strands_start < strands_len) {
+      int batch_strands_len = MIN2(strands_len - strands_start, max_strands_per_call);
+      DRWShadingGroup *subgroup = DRW_shgroup_create_sub(shgrp);
+      DRW_shgroup_uniform_int_copy(subgroup, "hairStrandOffset", strands_start);
+      DRW_shgroup_call_compute(subgroup, batch_strands_len, cache->final[subdiv].strands_res, 1);
+      strands_start += batch_strands_len;
+    }
   }
 }
 
diff --git a/source/blender/draw/intern/shaders/common_hair_lib.glsl b/source/blender/draw/intern/shaders/common_hair_lib.glsl
index a765e5e87cc..02c335ddae2 100644
--- a/source/blender/draw/intern/shaders/common_hair_lib.glsl
+++ b/source/blender/draw/intern/shaders/common_hair_lib.glsl
@@ -28,6 +28,9 @@ uniform bool hairCloseTip = true;
 
 uniform vec4 hairDupliMatrix[4];
 
+/* Strand batch offset when used in compute shaders. */
+uniform int hairStrandOffset = 0;
+
 /* -- Per control points -- */
 uniform samplerBuffer hairPointBuffer; /* RGBA32F */
 #define point_position xyz
@@ -70,7 +73,7 @@ float hair_get_local_time()
 
 int hair_get_id()
 {
-  return int(gl_GlobalInvocationID.x);
+  return int(gl_GlobalInvocationID.x) + hairStrandOffset;
 }
 #endif
 
diff --git a/source/blender/draw/intern/shaders/common_hair_refine_comp.glsl b/source/blender/draw/intern/shaders/common_hair_refine_comp.glsl
index 4dca2bb09dc..6b73c638778 100644
--- a/source/blender/draw/intern/shaders/common_hair_refine_comp.glsl
+++ b/source/blender/draw/intern/shaders/common_hair_refine_comp.glsl
@@ -18,6 +18,6 @@ void main(void)
   vec4 weights = hair_get_weights_cardinal(interp_time);
   vec4 result = hair_interp_data(data0, data1, data2, data3, weights);
 
-  int index = int(gl_GlobalInvocationID.x) * hairStrandsRes + int(gl_GlobalInvocationID.y);
+  int index = hair_get_id() * hairStrandsRes + int(gl_GlobalInvocationID.y);
   Positions[index] = result;
 }



More information about the Bf-blender-cvs mailing list