[Bf-blender-cvs] [2a272ed145f] temp-gpu-compute-shader-hair: Use GPU calls for hair.

Jeroen Bakker noreply at git.blender.org
Wed Apr 28 13:18:50 CEST 2021


Commit: 2a272ed145f75db823f97e5a40c60585d5312361
Author: Jeroen Bakker
Date:   Mon Apr 26 13:35:20 2021 +0200
Branches: temp-gpu-compute-shader-hair
https://developer.blender.org/rB2a272ed145f75db823f97e5a40c60585d5312361

Use GPU calls for hair.

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

M	source/blender/draw/intern/draw_hair.c
M	source/blender/draw/intern/shaders/common_hair_refine_vert.glsl

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

diff --git a/source/blender/draw/intern/draw_hair.c b/source/blender/draw/intern/draw_hair.c
index b08a2c09f60..1f75a760be3 100644
--- a/source/blender/draw/intern/draw_hair.c
+++ b/source/blender/draw/intern/draw_hair.c
@@ -37,7 +37,9 @@
 
 #include "GPU_batch.h"
 #include "GPU_capabilities.h"
+#include "GPU_compute.h"
 #include "GPU_shader.h"
+#include "GPU_texture.h"
 #include "GPU_vertex_buffer.h"
 
 #include "draw_hair_private.h"
@@ -95,7 +97,7 @@ static GPUShader *hair_refine_shader_get(ParticleRefineShader sh)
   const bool do_compute = drw_hair_use_compute_shaders();
   if (do_compute) {
     g_refine_shaders[sh] = GPU_shader_create_compute(datatoc_common_hair_refine_vert_glsl,
-                                                     datatoc_common_hair_lib_glsl,
+                                                     NULL /* datatoc_common_hair_lib_glsl*/,
                                                      "#define HAIR_PHASE_SUBDIV\n",
                                                      __func__);
     return g_refine_shaders[sh];
@@ -161,12 +163,24 @@ static void drw_hair_particle_cache_update_compute(ParticleHairCache *cache, con
   const int final_points_len = cache->final[subdiv].strands_res * cache->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_uniform_image(shgrp, "hairPointOutputBuffer", cache->final[subdiv].proc_tex);
-    DRW_shgroup_call_compute(shgrp, cache->strands_len, cache->final[subdiv].strands_res, 1);
+    GPU_shader_bind(shader);
+    // GPU_texture_bind(cache->point_tex, GPU_shader_get_uniform(shader, "hairPointBuffer"));
+    // GPU_texture_bind(cache->strand_tex, GPU_shader_get_uniform(shader, "hairStrandBuffer"));
+    // GPU_texture_bind(cache->strand_seg_tex, GPU_shader_get_uniform(shader,
+    // "hairStrandSegBuffer")); GPU_shader_uniform_1i(shader, "hairStrandsRes",
+    // cache->final[subdiv].strands_res);
+    GPU_texture_image_bind(cache->final[subdiv].proc_tex,
+                           GPU_shader_get_uniform(shader, "hairPointOutputBuffer"));
+    GPU_compute_dispatch(shader, final_points_len, 1, 1);
+    GPU_memory_barrier(GPU_BARRIER_TEXTURE_FETCH);
+    float *data = GPU_texture_read(cache->final[subdiv].proc_tex, GPU_DATA_FLOAT, 0);
+    for (int index = 0; index < final_points_len; index++) {
+      printf("%f, %f, %f, %f\n",
+             data[index * 4],
+             data[index * 4 + 1],
+             data[index * 4 + 2],
+             data[index * 4 + 3]);
+    }
   }
 }
 
@@ -425,6 +439,7 @@ void DRW_hair_update(void)
   DRW_draw_pass(g_tf_pass);
   if (drw_hair_use_compute_shaders()) {
     GPU_memory_barrier(GPU_BARRIER_VERTEX_ATTRIB_ARRAY);
+    GPU_memory_barrier(GPU_BARRIER_TEXTURE_FETCH);
   }
 #endif
   TIMEIT_END(DRW_hair_update);
diff --git a/source/blender/draw/intern/shaders/common_hair_refine_vert.glsl b/source/blender/draw/intern/shaders/common_hair_refine_vert.glsl
index 28e3432c704..8b29b1a09b9 100644
--- a/source/blender/draw/intern/shaders/common_hair_refine_vert.glsl
+++ b/source/blender/draw/intern/shaders/common_hair_refine_vert.glsl
@@ -3,24 +3,26 @@
  * To be compiled with common_hair_lib.glsl.
  * Shader can be used as a vertex or a compute shader.
  */
-#ifdef GPU_VERTEX_SHADER
+
+#if 0
+#  ifdef GPU_VERTEX_SHADER
 out vec4 finalColor;
-#endif
+#  endif
 
-#ifdef GPU_COMPUTE_SHADER
+#  ifdef GPU_COMPUTE_SHADER
 layout(local_size_x = 1, local_size_y = 1) in;
 layout(rgba32f, binding = 0) uniform image1D hairPointOutputBuffer;
-#endif
+#  endif
 
 vec4 get_weights_cardinal(float t)
 {
   float t2 = t * t;
   float t3 = t2 * t;
-#if defined(CARDINAL)
+#  if defined(CARDINAL)
   float fc = 0.71;
-#else /* defined(CATMULL_ROM) */
+#  else /* defined(CATMULL_ROM) */
   float fc = 0.5;
-#endif
+#  endif
 
   vec4 weights;
   /* GLSL Optimized version of key_curve_position_weights() */
@@ -53,11 +55,11 @@ vec4 interp_data(vec4 v0, vec4 v1, vec4 v2, vec4 v3, vec4 w)
   return v0 * w.x + v1 * w.y + v2 * w.z + v3 * w.w;
 }
 
-#ifdef TF_WORKAROUND
+#  ifdef TF_WORKAROUND
 uniform int targetWidth;
 uniform int targetHeight;
 uniform int idOffset;
-#endif
+#  endif
 
 void main(void)
 {
@@ -68,10 +70,10 @@ void main(void)
   vec4 weights = get_weights_cardinal(interp_time);
   vec4 result = interp_data(data0, data1, data2, data3, weights);
 
-#ifdef GPU_VERTEX_SHADER
+#  ifdef GPU_VERTEX_SHADER
   finalColor = result;
 
-#  ifdef TF_WORKAROUND
+#    ifdef TF_WORKAROUND
   int id = gl_VertexID - idOffset;
   gl_Position.x = ((float(id % targetWidth) + 0.5) / float(targetWidth)) * 2.0 - 1.0;
   gl_Position.y = ((float(id / targetWidth) + 0.5) / float(targetHeight)) * 2.0 - 1.0;
@@ -79,11 +81,24 @@ void main(void)
   gl_Position.w = 1.0;
 
   gl_PointSize = 1.0;
+#    endif
 #  endif
-#endif
 
-#ifdef GPU_COMPUTE_SHADER
-  int index = int(gl_GlobalInvocationID.x) * hairStrandsRes;
+#  ifdef GPU_COMPUTE_SHADER
+  int index = int(gl_GlobalInvocationID.x) * hairStrandsRes + int(gl_GlobalInvocationID.y);
   imageStore(hairPointOutputBuffer, index, result);
-#endif
+#  endif
 }
+#else
+
+layout(local_size_x = 1, local_size_y = 1) in;
+layout(rgba32f, binding = 0) uniform image1D hairPointOutputBuffer;
+
+void main(void)
+{
+  vec4 result = vec4(0.0, 0.2, 0.4, 1.0);
+  int index = int(gl_GlobalInvocationID.x);
+  imageStore(hairPointOutputBuffer, index, result);
+}
+
+#endif
\ No newline at end of file



More information about the Bf-blender-cvs mailing list