diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2022-10-12 10:49:59 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2022-10-12 10:49:59 +0300 |
commit | 81c4833a0dcdbfa4c999e91e05c44a57a65f54c4 (patch) | |
tree | 094deca9aa83ef1e6bd056b42bf2782444227d46 | |
parent | 5a10182a7087d93ab3fa79c4b6e50d55957ab6b3 (diff) |
Experiment with 1M instances fast generationtmp-workbench-perf-experiment
-rw-r--r-- | source/blender/draw/engines/workbench/workbench_engine.cc | 20 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager.hh | 2 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_manager_exec.c | 10 | ||||
-rw-r--r-- | source/blender/draw/intern/draw_resource.hh | 2 |
4 files changed, 24 insertions, 10 deletions
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc index b9fd98b6a6b..0039a918d82 100644 --- a/source/blender/draw/engines/workbench/workbench_engine.cc +++ b/source/blender/draw/engines/workbench/workbench_engine.cc @@ -5,6 +5,8 @@ #include "ED_view3d.h" #include "GPU_capabilities.h" +#include "BLI_rand.hh" + #include "workbench_private.hh" namespace blender::workbench { @@ -231,10 +233,11 @@ class Instance { } } else { - ResourceHandle handle = manager.resource_handle(ob_ref); + float4x4 model_matrix(ob_ref.object->obmat); - Material &mat = resources.material_buf.get_or_resize(handle.resource_index()); + // ResourceHandle handle = manager.resource_handle(ob_ref); + Material mat; if (material_subtype == eMaterialSubType::OBJECT) { mat = Material(*ob_ref.object); } @@ -250,7 +253,18 @@ class Instance { GPUBatch *batch = geometry_get(ob_ref); if (batch) { - pipeline_get(ob_ref).draw(batch, handle); + blender::RandomNumberGenerator rng(23423); + for (size_t y = 0; y < 1000; y++) { + for (size_t x = 0; x < 1000; x++) { + model_matrix[3][0] = x * 0.001f; + model_matrix[3][1] = y * 0.001f; + ResourceHandle handle = manager.resource_handle(model_matrix); + + resources.material_buf.get_or_resize(handle.resource_index()) = mat; + + pipeline_get(ob_ref).draw(batch, handle); + } + } } } } diff --git a/source/blender/draw/intern/draw_manager.hh b/source/blender/draw/intern/draw_manager.hh index fbd3d28d3f4..36bd895cfd7 100644 --- a/source/blender/draw/intern/draw_manager.hh +++ b/source/blender/draw/intern/draw_manager.hh @@ -180,7 +180,7 @@ inline ResourceHandle Manager::resource_handle(const ObjectRef ref) return ResourceHandle(resource_len_++, (ref.object->transflag & OB_NEG_SCALE) != 0); } -inline ResourceHandle Manager::resource_handle(const float4x4 &model_matrix) +BLI_NOINLINE inline ResourceHandle Manager::resource_handle(const float4x4 &model_matrix) { matrix_buf.get_or_resize(resource_len_).sync(model_matrix); bounds_buf.get_or_resize(resource_len_).sync(); diff --git a/source/blender/draw/intern/draw_manager_exec.c b/source/blender/draw/intern/draw_manager_exec.c index 0e39cc1d3b9..785fbc23733 100644 --- a/source/blender/draw/intern/draw_manager_exec.c +++ b/source/blender/draw/intern/draw_manager_exec.c @@ -480,8 +480,8 @@ static void draw_compute_culling(DRWView *view) cull->mask = 0; } else { - bool culled = !draw_culling_sphere_test( - &view->frustum_bsphere, view->frustum_planes, &cull->bsphere); + bool culled = false; //! draw_culling_sphere_test( + //&view->frustum_bsphere, view->frustum_planes, &cull->bsphere); #ifdef DRW_DEBUG_CULLING if (G.debug_value != 0) { @@ -496,9 +496,9 @@ static void draw_compute_culling(DRWView *view) } #endif - if (view->visibility_fn) { - culled = !view->visibility_fn(!culled, cull->user_data); - } + // if (view->visibility_fn) { + // culled = !view->visibility_fn(!culled, cull->user_data); + // } SET_FLAG_FROM_TEST(cull->mask, culled, view->culling_mask); } diff --git a/source/blender/draw/intern/draw_resource.hh b/source/blender/draw/intern/draw_resource.hh index 2df38e32ed2..23257335a66 100644 --- a/source/blender/draw/intern/draw_resource.hh +++ b/source/blender/draw/intern/draw_resource.hh @@ -38,7 +38,7 @@ inline void ObjectMatrices::sync(const Object &object) inline void ObjectMatrices::sync(const float4x4 &model_matrix) { model = model_matrix; - model_inverse = model_matrix.inverted(); + // model_inverse = model_matrix.inverted(); } inline std::ostream &operator<<(std::ostream &stream, const ObjectMatrices &matrices) |