[Bf-blender-cvs] [475685fe632] devirtualizer: progress

Jacques Lucke noreply at git.blender.org
Sun Apr 10 16:00:25 CEST 2022


Commit: 475685fe63284ff7312651af218a0184e5cddab8
Author: Jacques Lucke
Date:   Sun Apr 10 13:21:54 2022 +0200
Branches: devirtualizer
https://developer.blender.org/rB475685fe63284ff7312651af218a0184e5cddab8

progress

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

M	source/blender/blenlib/BLI_virtual_array_devirtualize.hh

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

diff --git a/source/blender/blenlib/BLI_virtual_array_devirtualize.hh b/source/blender/blenlib/BLI_virtual_array_devirtualize.hh
index 2eec4a4121f..26dd99b029a 100644
--- a/source/blender/blenlib/BLI_virtual_array_devirtualize.hh
+++ b/source/blender/blenlib/BLI_virtual_array_devirtualize.hh
@@ -11,10 +11,12 @@ namespace blender {
 struct SingleInputTagBase {
 };
 template<typename T> struct SingleInputTag : public SingleInputTagBase {
+  using BaseType = T;
 };
 struct SingleOutputTagBase {
 };
 template<typename T> struct SingleOutputTag : public SingleOutputTagBase {
+  using BaseType = T;
 };
 
 template<typename T> struct ParamType {
@@ -28,6 +30,12 @@ template<typename T> struct ParamType<SingleOutputTag<T>> {
   using type = MutableSpan<T>;
 };
 
+enum class DevirtualizeMode {
+  None,
+  Span,
+  Single,
+};
+
 template<typename Fn, typename... Args> class ArrayDevirtualizer {
  private:
   using TagsTuple = std::tuple<Args...>;
@@ -71,14 +79,26 @@ template<typename Fn, typename... Args> class ArrayDevirtualizer {
 
   template<size_t... I> void execute_fallback_impl(std::index_sequence<I...> /* indices */)
   {
-    fn_(mask_, mask_, this->get_execute_param<I>()...);
+    fn_(mask_, mask_, this->get_execute_param<I, DevirtualizeMode::None>()...);
   }
 
-  template<size_t I> auto get_execute_param()
+  template<size_t I, DevirtualizeMode mode> auto get_execute_param()
   {
     using ParamTag = std::tuple_element_t<I, TagsTuple>;
     if constexpr (std::is_base_of_v<SingleInputTagBase, ParamTag>) {
-      return *std::get<I>(params_);
+      using T = typename ParamTag::BaseType;
+      static_assert(
+          ELEM(mode, DevirtualizeMode::None, DevirtualizeMode::Single, DevirtualizeMode::Span));
+      const VArray<T> *varray = std::get<I>(params_);
+      if constexpr (mode == DevirtualizeMode::None) {
+        return *varray;
+      }
+      else if constexpr (mode == DevirtualizeMode::Single) {
+        return SingleAsSpan(*varray);
+      }
+      else if constexpr (mode == DevirtualizeMode::Span) {
+        return varray->get_internal_span();
+      }
     }
     else if constexpr (std::is_base_of_v<SingleOutputTagBase, ParamTag>) {
       return std::get<I>(params_)->data();



More information about the Bf-blender-cvs mailing list