[Bf-blender-cvs] [2c607ec2f6b] master: Revert "DrawManager: Use Compute Shader to Update Hair."

Jeroen Bakker noreply at git.blender.org
Wed May 26 20:33:45 CEST 2021


Commit: 2c607ec2f6b9df98da5150ca49e4405385dd4e27
Author: Jeroen Bakker
Date:   Wed May 26 20:32:05 2021 +0200
Branches: master
https://developer.blender.org/rB2c607ec2f6b9df98da5150ca49e4405385dd4e27

Revert "DrawManager: Use Compute Shader to Update Hair."

This reverts commit 8f9599d17e80254928d2d72081a4c7e0dee64038.

Mac seems to have an error with this change.
```
                 ERROR: /Users/blender/git/blender-vdev/blender.git/source/blender/draw/intern/draw_hair.c:115:44: error: use of undeclared identifier 'shader_src'
                 ERROR: /Users/blender/git/blender-vdev/blender.git/source/blender/draw/intern/draw_hair.c:123:13: error: use of undeclared identifier 'shader_src'
                 ERROR: make[2]: *** [source/blender/draw/CMakeFiles/bf_draw.dir/intern/draw_hair.c.o] Error 1
                 ERROR: make[1]: *** [source/blender/draw/CMakeFiles/bf_draw.dir/all] Error 2
                 ERROR: make: *** [all] Error 2

```

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

M	source/blender/draw/CMakeLists.txt
M	source/blender/draw/intern/DRW_render.h
M	source/blender/draw/intern/draw_cache_impl_hair.c
M	source/blender/draw/intern/draw_hair.c
M	source/blender/draw/intern/draw_manager.h
M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/draw/intern/draw_manager_exec.c
M	source/blender/draw/intern/shaders/common_hair_lib.glsl
D	source/blender/draw/intern/shaders/common_hair_refine_comp.glsl
M	source/blender/draw/intern/shaders/common_hair_refine_vert.glsl
M	source/blender/gpu/GPU_capabilities.h
M	source/blender/gpu/intern/gpu_capabilities.cc
M	source/blender/gpu/intern/gpu_capabilities_private.hh
M	source/blender/gpu/opengl/gl_backend.cc

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

diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 95c0f5d300c..045adf4b380 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -321,7 +321,6 @@ data_to_c_simple(intern/shaders/common_globals_lib.glsl SRC)
 data_to_c_simple(intern/shaders/common_pointcloud_lib.glsl SRC)
 data_to_c_simple(intern/shaders/common_hair_lib.glsl SRC)
 data_to_c_simple(intern/shaders/common_hair_refine_vert.glsl SRC)
-data_to_c_simple(intern/shaders/common_hair_refine_comp.glsl SRC)
 data_to_c_simple(intern/shaders/common_math_lib.glsl SRC)
 data_to_c_simple(intern/shaders/common_math_geom_lib.glsl SRC)
 data_to_c_simple(intern/shaders/common_view_lib.glsl SRC)
diff --git a/source/blender/draw/intern/DRW_render.h b/source/blender/draw/intern/DRW_render.h
index 5071658fd82..2545cfa65dc 100644
--- a/source/blender/draw/intern/DRW_render.h
+++ b/source/blender/draw/intern/DRW_render.h
@@ -438,10 +438,6 @@ void DRW_shgroup_call_range(
 void DRW_shgroup_call_instance_range(
     DRWShadingGroup *shgroup, Object *ob, struct GPUBatch *geom, uint i_sta, uint i_ct);
 
-void DRW_shgroup_call_compute(DRWShadingGroup *shgroup,
-                              int groups_x_len,
-                              int groups_y_len,
-                              int groups_z_len);
 void DRW_shgroup_call_procedural_points(DRWShadingGroup *sh, Object *ob, uint point_count);
 void DRW_shgroup_call_procedural_lines(DRWShadingGroup *sh, Object *ob, uint line_count);
 void DRW_shgroup_call_procedural_triangles(DRWShadingGroup *sh, Object *ob, uint tri_count);
@@ -579,9 +575,6 @@ void DRW_shgroup_uniform_vec4_array_copy(DRWShadingGroup *shgroup,
                                          const char *name,
                                          const float (*value)[4],
                                          int arraysize);
-void DRW_shgroup_vertex_buffer(DRWShadingGroup *shgroup,
-                               const char *name,
-                               struct GPUVertBuf *vertex_buffer);
 
 bool DRW_shgroup_is_empty(DRWShadingGroup *shgroup);
 
diff --git a/source/blender/draw/intern/draw_cache_impl_hair.c b/source/blender/draw/intern/draw_cache_impl_hair.c
index 6424b21666d..fd28ac00186 100644
--- a/source/blender/draw/intern/draw_cache_impl_hair.c
+++ b/source/blender/draw/intern/draw_cache_impl_hair.c
@@ -243,8 +243,7 @@ static void hair_batch_cache_ensure_procedural_final_points(ParticleHairCache *c
   GPUVertFormat format = {0};
   GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
 
-  cache->final[subdiv].proc_buf = GPU_vertbuf_create_with_format_ex(&format,
-                                                                    GPU_USAGE_DEVICE_ONLY);
+  cache->final[subdiv].proc_buf = GPU_vertbuf_create_with_format(&format);
 
   /* Create a destination buffer for the transform feedback. Sized appropriately */
   /* Those are points! not line segments. */
diff --git a/source/blender/draw/intern/draw_hair.c b/source/blender/draw/intern/draw_hair.c
index 258777b34fb..bca227a24e2 100644
--- a/source/blender/draw/intern/draw_hair.c
+++ b/source/blender/draw/intern/draw_hair.c
@@ -36,28 +36,15 @@
 #include "BKE_duplilist.h"
 
 #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"
 
 #ifndef __APPLE__
 #  define USE_TRANSFORM_FEEDBACK
-#  define USE_COMPUTE_SHADERS
 #endif
 
-BLI_INLINE bool drw_hair_use_compute_shaders(void)
-{
-#ifdef USE_COMPUTE_SHADERS
-  return GPU_compute_shader_support();
-#else
-  return false;
-#endif
-}
-
 typedef enum ParticleRefineShader {
   PART_REFINE_CATMULL_ROM = 0,
   PART_REFINE_MAX_SHADER,
@@ -84,7 +71,6 @@ static DRWPass *g_tf_pass; /* XXX can be a problem with multiple DRWManager in t
 
 extern char datatoc_common_hair_lib_glsl[];
 extern char datatoc_common_hair_refine_vert_glsl[];
-extern char datatoc_common_hair_refine_comp_glsl[];
 extern char datatoc_gpu_shader_3D_smooth_color_frag_glsl[];
 
 static GPUShader *hair_refine_shader_get(ParticleRefineShader sh)
@@ -93,26 +79,15 @@ static GPUShader *hair_refine_shader_get(ParticleRefineShader sh)
     return g_refine_shaders[sh];
   }
 
-#ifdef USE_COMPUTE_SHADERS
-  const bool do_compute = drw_hair_use_compute_shaders();
-  if (do_compute) {
-    g_refine_shaders[sh] = GPU_shader_create_compute(datatoc_common_hair_refine_comp_glsl,
-                                                     datatoc_common_hair_lib_glsl,
-                                                     "#define HAIR_PHASE_SUBDIV\n",
-                                                     __func__);
-    return g_refine_shaders[sh];
-  }
-#endif
+  char *vert_with_lib = BLI_string_joinN(datatoc_common_hair_lib_glsl,
+                                         datatoc_common_hair_refine_vert_glsl);
 
 #ifdef USE_TRANSFORM_FEEDBACK
-  char *shader_src = BLI_string_joinN(datatoc_common_hair_lib_glsl,
-                                      datatoc_common_hair_refine_vert_glsl);
   const char *var_names[1] = {"finalColor"};
   g_refine_shaders[sh] = DRW_shader_create_with_transform_feedback(
-      shader_src, NULL, "#define HAIR_PHASE_SUBDIV\n", GPU_SHADER_TFB_POINTS, var_names, 1);
-
+      vert_with_lib, NULL, "#define HAIR_PHASE_SUBDIV\n", GPU_SHADER_TFB_POINTS, var_names, 1);
 #else
-  g_refine_shaders[sh] = DRW_shader_create(shader_src,
+  g_refine_shaders[sh] = DRW_shader_create(vert_with_lib,
                                            NULL,
                                            datatoc_gpu_shader_3D_smooth_color_frag_glsl,
                                            "#define blender_srgb_to_framebuffer_space(a) a\n"
@@ -120,14 +95,14 @@ static GPUShader *hair_refine_shader_get(ParticleRefineShader sh)
                                            "#define TF_WORKAROUND\n");
 #endif
 
-  MEM_freeN(shader_src);
+  MEM_freeN(vert_with_lib);
 
   return g_refine_shaders[sh];
 }
 
 void DRW_hair_init(void)
 {
-#if defined(USE_TRANSFORM_FEEDBACK) || defined(USE_COMPUTE_SHADERS)
+#ifdef USE_TRANSFORM_FEEDBACK
   g_tf_pass = DRW_pass_create("Update Hair Pass", 0);
 #else
   g_tf_pass = DRW_pass_create("Update Hair Pass", DRW_STATE_WRITE_COLOR);
@@ -150,67 +125,6 @@ void DRW_hair_init(void)
   }
 }
 
-static void drw_hair_particle_cache_shgrp_attach_resources(DRWShadingGroup *shgrp,
-                                                           ParticleHairCache *cache,
-                                                           const int subdiv)
-{
-  DRW_shgroup_uniform_texture(shgrp, "hairPointBuffer", cache->point_tex);
-  DRW_shgroup_uniform_texture(shgrp, "hairStrandBuffer", cache->strand_tex);
-  DRW_shgroup_uniform_texture(shgrp, "hairStrandSegBuffer", cache->strand_seg_tex);
-  DRW_shgroup_uniform_int(shgrp, "hairStrandsRes", &cache->final[subdiv].strands_res, 1);
-}
-
-static void drw_hair_particle_cache_update_compute(ParticleHairCache *cache, const int subdiv)
-{
-  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);
-
-    const int max_strands_per_call = GPU_max_work_group_count(0);
-    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;
-    }
-  }
-}
-
-static void drw_hair_particle_cache_update_transform_feedback(ParticleHairCache *cache,
-                                                              const int subdiv)
-{
-  const int final_points_len = cache->final[subdiv].strands_res * cache->strands_len;
-  if (final_points_len > 0) {
-    GPUShader *tf_shader = hair_refine_shader_get(PART_REFINE_CATMULL_ROM);
-
-#ifdef USE_TRANSFORM_FEEDBACK
-    DRWShadingGroup *tf_shgrp = DRW_shgroup_transform_feedback_create(
-        tf_shader, g_tf_pass, cache->final[subdiv].proc_buf);
-#else
-    DRWShadingGroup *tf_shgrp = DRW_shgroup_create(tf_shader, g_tf_pass);
-
-    ParticleRefineCall *pr_call = MEM_mallocN(sizeof(*pr_call), __func__);
-    pr_call->next = g_tf_calls;
-    pr_call->vbo = cache->final[subdiv].proc_buf;
-    pr_call->shgrp = tf_shgrp;
-    pr_call->vert_len = final_points_len;
-    g_tf_calls = pr_call;
-    DRW_shgroup_uniform_int(tf_shgrp, "targetHeight", &g_tf_target_height, 1);
-    DRW_shgroup_uniform_int(tf_shgrp, "targetWidth", &g_tf_target_width, 1);
-    DRW_shgroup_uniform_int(tf_shgrp, "idOffset", &g_tf_id_offset, 1);
-#endif
-
-    drw_hair_particle_cache_shgrp_attach_resources(tf_shgrp, cache, subdiv);
-    DRW_shgroup_call_procedural_points(tf_shgrp, NULL, final_points_len);
-  }
-}
-
 static ParticleHairCache *drw_hair_particle_cache_get(
     Object *object, ParticleSystem *psys, ModifierData *md, int subdiv, int thickness_res)
 {
@@ -226,11 +140,32 @@ static ParticleHairCache *drw_hair_particle_cache_get(
   }
 
   if (update) {
-    if (drw_hair_use_compute_shaders()) {
-      drw_hair_particle_cache_update_compute(cache, subdiv);
-    }
-    else {
-      drw_hair_particle_cache_update_transform_feedback(cache, subdiv);
+    int final_points_len = cache->final[subdiv].strands_res * cache->strands_len;
+    if (final_points_len > 0) {
+      GPUShader *tf_shader = hair_refine_shader_get(PART_REFINE_CATMULL_ROM);
+
+#ifdef USE_TRANSFORM_FEEDBACK
+      DRWShadingGroup *tf_shgrp = DRW_shgroup_transform_feedback_create(
+          tf_shader, g_tf_pass, cache->final[subdiv].proc_buf);
+#else
+      DRWShadingGroup *tf_shgrp = DRW_shgroup_create(tf_shader, g_tf_

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list