[Bf-blender-cvs] [bbd192f3516] temp-gpu-compute-shader-hair: Use max work group count from GPU module.

Jeroen Bakker noreply at git.blender.org
Tue May 11 14:11:36 CEST 2021


Commit: bbd192f35163b422caf06de7e1289356e31f1d58
Author: Jeroen Bakker
Date:   Tue May 11 13:26:16 2021 +0200
Branches: temp-gpu-compute-shader-hair
https://developer.blender.org/rBbbd192f35163b422caf06de7e1289356e31f1d58

Use max work group count from GPU module.

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

M	source/blender/draw/intern/draw_hair.c
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/intern/draw_hair.c b/source/blender/draw/intern/draw_hair.c
index 31d316ca5d9..258777b34fb 100644
--- a/source/blender/draw/intern/draw_hair.c
+++ b/source/blender/draw/intern/draw_hair.c
@@ -170,8 +170,7 @@ static void drw_hair_particle_cache_update_compute(ParticleHairCache *cache, con
     drw_hair_particle_cache_shgrp_attach_resources(shgrp, cache, subdiv);
     DRW_shgroup_vertex_buffer(shgrp, "hairPointOutputBuffer", cache->final[subdiv].proc_buf);
 
-    /* TODO(jbakker): get from GPU module. */
-    const int max_strands_per_call = 32768;
+    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);
diff --git a/source/blender/gpu/GPU_capabilities.h b/source/blender/gpu/GPU_capabilities.h
index 6cff826e490..7eeaeea78a2 100644
--- a/source/blender/gpu/GPU_capabilities.h
+++ b/source/blender/gpu/GPU_capabilities.h
@@ -37,6 +37,8 @@ int GPU_max_textures(void);
 int GPU_max_textures_vert(void);
 int GPU_max_textures_geom(void);
 int GPU_max_textures_frag(void);
+int GPU_max_work_group_count(int index);
+int GPU_max_work_group_size(int index);
 
 int GPU_texture_size_with_limit(int res, bool limit_gl_texture_size);
 
diff --git a/source/blender/gpu/intern/gpu_capabilities.cc b/source/blender/gpu/intern/gpu_capabilities.cc
index 284067df5ad..f6224805ef4 100644
--- a/source/blender/gpu/intern/gpu_capabilities.cc
+++ b/source/blender/gpu/intern/gpu_capabilities.cc
@@ -82,6 +82,16 @@ int GPU_max_textures(void)
   return GCaps.max_textures;
 }
 
+int GPU_max_work_group_count(int index)
+{
+  return GCaps.max_work_group_count[index];
+}
+
+int GPU_max_work_group_size(int index)
+{
+  return GCaps.max_work_group_size[index];
+}
+
 bool GPU_mip_render_workaround(void)
 {
   return GCaps.mip_render_workaround;
diff --git a/source/blender/gpu/intern/gpu_capabilities_private.hh b/source/blender/gpu/intern/gpu_capabilities_private.hh
index 0c2790d85c7..9840d7a42a6 100644
--- a/source/blender/gpu/intern/gpu_capabilities_private.hh
+++ b/source/blender/gpu/intern/gpu_capabilities_private.hh
@@ -41,6 +41,8 @@ struct GPUCapabilities {
   int max_textures_vert = 0;
   int max_textures_geom = 0;
   int max_textures_frag = 0;
+  int max_work_group_count[3] = {0, 0, 0};
+  int max_work_group_size[3] = {0, 0, 0};
   bool mem_stats_support = false;
   bool compute_shader_support = false;
   bool shader_storage_buffer_objects_support = false;
diff --git a/source/blender/gpu/opengl/gl_backend.cc b/source/blender/gpu/opengl/gl_backend.cc
index e0337f7f4ae..e0c2bf1d805 100644
--- a/source/blender/gpu/opengl/gl_backend.cc
+++ b/source/blender/gpu/opengl/gl_backend.cc
@@ -422,6 +422,14 @@ void GLBackend::capabilities_init()
   GCaps.mem_stats_support = GLEW_NVX_gpu_memory_info || GLEW_ATI_meminfo;
   GCaps.shader_image_load_store_support = GLEW_ARB_shader_image_load_store;
   GCaps.compute_shader_support = GLEW_ARB_compute_shader;
+  if (GCaps.compute_shader_support) {
+    glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 0, &GCaps.max_work_group_count[0]);
+    glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 1, &GCaps.max_work_group_count[1]);
+    glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_COUNT, 2, &GCaps.max_work_group_count[2]);
+    glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 0, &GCaps.max_work_group_size[0]);
+    glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 1, &GCaps.max_work_group_size[1]);
+    glGetIntegeri_v(GL_MAX_COMPUTE_WORK_GROUP_SIZE, 2, &GCaps.max_work_group_size[2]);
+  }
   GCaps.shader_storage_buffer_objects_support = GLEW_ARB_shader_storage_buffer_object;
   /* GL specific capabilities. */
   glGetIntegerv(GL_MAX_3D_TEXTURE_SIZE, &GLContext::max_texture_3d_size);



More information about the Bf-blender-cvs mailing list