[Bf-blender-cvs] [693dffb7b7c] tmp-worbench-rewrite2-optimizations: Use smaller ObjectBounds

Miguel Pozo noreply at git.blender.org
Fri Jan 20 20:24:16 CET 2023


Commit: 693dffb7b7c1039c2165b83b1b81fa39256d6ef8
Author: Miguel Pozo
Date:   Fri Jan 20 18:01:18 2023 +0100
Branches: tmp-worbench-rewrite2-optimizations
https://developer.blender.org/rB693dffb7b7c1039c2165b83b1b81fa39256d6ef8

Use smaller ObjectBounds

Only store center and size. Skip resource finalize computation.

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

M	source/blender/draw/engines/workbench/workbench_private.hh
M	source/blender/draw/engines/workbench/workbench_shadow.cc
M	source/blender/draw/intern/draw_manager.cc
M	source/blender/draw/intern/draw_resource.hh
M	source/blender/draw/intern/draw_shader_shared.h
M	source/blender/draw/intern/draw_view.cc
M	source/blender/draw/intern/draw_view.hh
M	source/blender/draw/intern/shaders/draw_resource_finalize_comp.glsl
M	source/blender/draw/intern/shaders/draw_view_info.hh
M	source/blender/draw/intern/shaders/draw_visibility_comp.glsl

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

diff --git a/source/blender/draw/engines/workbench/workbench_private.hh b/source/blender/draw/engines/workbench/workbench_private.hh
index 086553ca5c1..2022fb69945 100644
--- a/source/blender/draw/engines/workbench/workbench_private.hh
+++ b/source/blender/draw/engines/workbench/workbench_private.hh
@@ -269,7 +269,10 @@ class ShadowPass {
     ShadowView();
 
    protected:
-    virtual void compute_visibility(ObjectBoundsBuf &bounds, uint resource_len, bool debug_freeze);
+    virtual void compute_visibility(ObjectMatricesBuf &matrices,
+                                    ObjectBoundsBuf &bounds,
+                                    uint resource_len,
+                                    bool debug_freeze);
     virtual VisibilityBuf &get_visibility_buffer();
   } view_ = {};
 
diff --git a/source/blender/draw/engines/workbench/workbench_shadow.cc b/source/blender/draw/engines/workbench/workbench_shadow.cc
index 22c7b663220..909edd63667 100644
--- a/source/blender/draw/engines/workbench/workbench_shadow.cc
+++ b/source/blender/draw/engines/workbench/workbench_shadow.cc
@@ -201,7 +201,8 @@ void ShadowPass::ShadowView::set_mode(ShadowPass::PassType type)
   current_pass_type_ = type;
 }
 
-void ShadowPass::ShadowView::compute_visibility(ObjectBoundsBuf &bounds,
+void ShadowPass::ShadowView::compute_visibility(ObjectMatricesBuf &matrices,
+                                                ObjectBoundsBuf &bounds,
                                                 uint resource_len,
                                                 bool debug_freeze)
 {
@@ -231,6 +232,8 @@ void ShadowPass::ShadowView::compute_visibility(ObjectBoundsBuf &bounds,
     GPU_storagebuf_clear(visibility_buf_, GPU_R32UI, GPU_DATA_UINT, &data);
   }
 
+  /* TODO(Miguel Pozo): Disabled in the optimization branch */
+  do_visibility_ = false;
   if (do_visibility_) {
     /* TODO(Miguel Pozo): Use regular culling for the caps pass */
 
@@ -249,6 +252,7 @@ void ShadowPass::ShadowView::compute_visibility(ObjectBoundsBuf &bounds,
     GPU_shader_uniform_3fv(shader, "shadow_direction", light_direction_);
     GPU_uniformbuf_bind(extruded_frustum_,
                         GPU_shader_get_uniform_block(shader, "extruded_frustum"));
+    GPU_storagebuf_bind(matrices, GPU_shader_get_ssbo(shader, "matrix_buf"));
     GPU_storagebuf_bind(bounds, GPU_shader_get_ssbo(shader, "bounds_buf"));
     if (current_pass_type_ == ShadowPass::FORCED_FAIL) {
       GPU_storagebuf_bind(visibility_buf_, GPU_shader_get_ssbo(shader, "visibility_buf"));
diff --git a/source/blender/draw/intern/draw_manager.cc b/source/blender/draw/intern/draw_manager.cc
index d1a60c1af1f..540e1900424 100644
--- a/source/blender/draw/intern/draw_manager.cc
+++ b/source/blender/draw/intern/draw_manager.cc
@@ -166,7 +166,7 @@ void Manager::submit(PassMain &pass, View &view)
   bool freeze_culling = (U.experimental.use_viewport_debug && DST.draw_ctx.v3d &&
                          (DST.draw_ctx.v3d->debug_flag & V3D_DEBUG_FREEZE_CULLING) != 0);
 
-  view.compute_visibility(bounds_buf, resource_len_, freeze_culling);
+  view.compute_visibility(matrix_buf, bounds_buf, resource_len_, freeze_culling);
 
   command::RecordingState state;
   state.inverted_view = view.is_inverted();
diff --git a/source/blender/draw/intern/draw_resource.hh b/source/blender/draw/intern/draw_resource.hh
index edc023c5703..09744d6403c 100644
--- a/source/blender/draw/intern/draw_resource.hh
+++ b/source/blender/draw/intern/draw_resource.hh
@@ -147,56 +147,54 @@ inline std::ostream &operator<<(std::ostream &stream, const ObjectInfos &infos)
 
 inline void ObjectBounds::sync()
 {
-  bounding_sphere.w = -1.0f; /* Disable test. */
+  test_enabled = false;
 }
 
 inline void ObjectBounds::sync(Object &ob)
 {
-  BoundBox _bbox;
-  const BoundBox *bbox = &_bbox;
+  float3 min, max;
+  INIT_MINMAX(min, max);
 
   if (ob.type == OB_MESH) {
     /* Optimization: Retrieve the mesh cached min max directly.
      * Avoids allocating a BoundBox on every sample for each DupliObject instance.
      * TODO(Miguel Pozo): Remove once T92963 or T96968 are done */
-    float3 min, max;
     BKE_mesh_wrapper_minmax(static_cast<Mesh *>(ob.data), min, max);
-    BKE_boundbox_init_from_minmax(&_bbox, min, max);
   }
   else {
-    bbox = BKE_object_boundbox_get(&ob);
+    const BoundBox *bbox = BKE_object_boundbox_get(&ob);
     if (bbox == nullptr) {
-      bounding_sphere.w = -1.0f; /* Disable test. */
+      test_enabled = false;
       return;
     }
+
+    for (const float3 &corner : bbox->vec) {
+      minmax_v3v3_v3(min, max, corner);
+    }
   }
 
-  *reinterpret_cast<float3 *>(&bounding_corners[0]) = bbox->vec[0];
-  *reinterpret_cast<float3 *>(&bounding_corners[1]) = bbox->vec[4];
-  *reinterpret_cast<float3 *>(&bounding_corners[2]) = bbox->vec[3];
-  *reinterpret_cast<float3 *>(&bounding_corners[3]) = bbox->vec[1];
-  bounding_sphere.w = 0.0f; /* Enable test. */
+  size = (max - min) / 2.0f;
+  center = min + size;
+  test_enabled = true;
+}
+
+inline void ObjectBounds::sync(const float3 &center, const float3 &size)
+{
+  this->center = center;
+  this->size = size;
+  test_enabled = true;
 }
 
 inline std::ostream &operator<<(std::ostream &stream, const ObjectBounds &bounds)
 {
   stream << "ObjectBounds(";
-  if (bounds.bounding_sphere.w == -1.0f) {
+  if (!bounds.test_enabled) {
     stream << "skipped)" << std::endl;
     return stream;
   }
   stream << std::endl;
-  stream << ".bounding_corners[0]"
-         << *reinterpret_cast<const float3 *>(&bounds.bounding_corners[0]) << std::endl;
-  stream << ".bounding_corners[1]"
-         << *reinterpret_cast<const float3 *>(&bounds.bounding_corners[1]) << std::endl;
-  stream << ".bounding_corners[2]"
-         << *reinterpret_cast<const float3 *>(&bounds.bounding_corners[2]) << std::endl;
-  stream << ".bounding_corners[3]"
-         << *reinterpret_cast<const float3 *>(&bounds.bounding_corners[3]) << std::endl;
-  stream << ".sphere=(pos=" << float3(bounds.bounding_sphere)
-         << ", rad=" << bounds.bounding_sphere.w << std::endl;
-  stream << ")" << std::endl;
+  stream << ".center" << bounds.center << std::endl;
+  stream << ".size" << bounds.size << std::endl;
   return stream;
 }
 
diff --git a/source/blender/draw/intern/draw_shader_shared.h b/source/blender/draw/intern/draw_shader_shared.h
index 23ded2ea5e9..d8ee2381054 100644
--- a/source/blender/draw/intern/draw_shader_shared.h
+++ b/source/blender/draw/intern/draw_shader_shared.h
@@ -175,15 +175,11 @@ struct ObjectInfos {
 BLI_STATIC_ASSERT_ALIGN(ObjectInfos, 16)
 
 struct ObjectBounds {
-  /**
-   * Uploaded as vertex (0, 4, 3, 1) of the bbox in local space, matching XYZ axis order.
-   * Then processed by GPU and stored as (0, 4-0, 3-0, 1-0) in world space for faster culling.
-   */
-  float4 bounding_corners[4];
-  /** Bounding sphere derived from the bounding corner. Computed on GPU. */
-  float4 bounding_sphere;
-  /** Radius of the inscribed sphere derived from the bounding corner. Computed on GPU. */
-#define _inner_sphere_radius bounding_corners[3].w
+  float3 center;
+  bool test_enabled;
+  /* TODO(Miguel Pozo): This is actually half size */
+  float3 size;
+  uint _pad;
 
 #if !defined(GPU_SHADER) && defined(__cplusplus)
   void sync();
diff --git a/source/blender/draw/intern/draw_view.cc b/source/blender/draw/intern/draw_view.cc
index 85f31844311..2ff030bdd08 100644
--- a/source/blender/draw/intern/draw_view.cc
+++ b/source/blender/draw/intern/draw_view.cc
@@ -227,7 +227,10 @@ void View::bind()
   GPU_uniformbuf_bind(culling_, DRW_VIEW_CULLING_UBO_SLOT);
 }
 
-void View::compute_visibility(ObjectBoundsBuf &bounds, uint resource_len, bool debug_freeze)
+void View::compute_visibility(ObjectMatricesBuf &matrices,
+                              ObjectBoundsBuf &bounds,
+                              uint resource_len,
+                              bool debug_freeze)
 {
   if (debug_freeze && frozen_ == false) {
     data_freeze_[0] = static_cast<ViewMatrices>(data_[0]);
@@ -264,6 +267,7 @@ void View::compute_visibility(ObjectBoundsBuf &bounds, uint resource_len, bool d
     GPU_shader_uniform_1i(shader, "resource_len", resource_len);
     GPU_shader_uniform_1i(shader, "view_len", view_len_);
     GPU_shader_uniform_1i(shader, "visibility_word_per_draw", word_per_draw);
+    GPU_storagebuf_bind(matrices, GPU_shader_get_ssbo(shader, "matrix_buf"));
     GPU_storagebuf_bind(bounds, GPU_shader_get_ssbo(shader, "bounds_buf"));
     GPU_storagebuf_bind(visibility_buf_, GPU_shader_get_ssbo(shader, "visibility_buf"));
     GPU_uniformbuf_bind(frozen_ ? data_freeze_ : data_, DRW_VIEW_UBO_SLOT);
diff --git a/source/blender/draw/intern/draw_view.hh b/source/blender/draw/intern/draw_view.hh
index 5bf2bf1a568..e47a6980b20 100644
--- a/source/blender/draw/intern/draw_view.hh
+++ b/source/blender/draw/intern/draw_view.hh
@@ -26,6 +26,7 @@ namespace blender::draw {
 class Manager;
 
 /* TODO: de-duplicate. */
+using ObjectMatricesBuf = StorageArrayBuffer<ObjectMatrices, 128>;
 using ObjectBoundsBuf = StorageArrayBuffer<ObjectBounds, 128>;
 using VisibilityBuf = StorageArrayBuffer<uint, 4, true>;
 
@@ -135,7 +136,10 @@ class View {
  protected:
   /** Called from draw manager. */
   void bind();
-  virtual void compute_visibility(ObjectBoundsBuf &bounds, uint resource_len, bool debug_freeze);
+  virtual void compute_visibility(ObjectMatricesBuf &matrices,
+                                  ObjectBoundsBuf &bounds,
+                                  uint resource_len,
+                                  bool debug_freeze);
   virtual VisibilityBuf &get_visibility_buffer();
 
   void update_viewport_size();
diff --git a/source/blender/draw/intern/shaders/draw_resource_finalize_comp.glsl b/source/blender/draw/intern/shaders/draw_resource_finalize_comp.glsl
index 511d4e49651..c410544826c 100644
--- a/source/blender/draw/intern/shaders/draw_resource_finalize_comp.glsl
+++ b/source/blender/draw/intern/shaders/draw_resource_finalize_comp.glsl
@@ -14,6 +14,8 @@ void main()
 
   mat4 model_mat = matrix_buf[resource_id].model;
   ObjectInfos infos = infos_buf[resource_id];
+
+#if 0
   ObjectBounds bounds = bounds_buf[resource_id];
 
   if (bounds.bounding_sphere.w != -1.

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list