[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