[Bf-blender-cvs] [1bc006f0f5d] temp-viewport-compositor-compiler: Viewport Compositor: Separate texture pool into its own file

Omar Emara noreply at git.blender.org
Fri Apr 8 18:20:27 CEST 2022


Commit: 1bc006f0f5decc9f55c168fd0a912bbcb12f190b
Author: Omar Emara
Date:   Fri Apr 8 14:56:29 2022 +0200
Branches: temp-viewport-compositor-compiler
https://developer.blender.org/rB1bc006f0f5decc9f55c168fd0a912bbcb12f190b

Viewport Compositor: Separate texture pool into its own file

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

M	source/blender/viewport_compositor/CMakeLists.txt
M	source/blender/viewport_compositor/VPC_compositor_execute.hh
A	source/blender/viewport_compositor/VPC_texture_pool.hh
M	source/blender/viewport_compositor/intern/compositor_execute.cc
A	source/blender/viewport_compositor/intern/texture_pool.cc

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

diff --git a/source/blender/viewport_compositor/CMakeLists.txt b/source/blender/viewport_compositor/CMakeLists.txt
index 46ae1293208..c2f7f6f6e60 100644
--- a/source/blender/viewport_compositor/CMakeLists.txt
+++ b/source/blender/viewport_compositor/CMakeLists.txt
@@ -18,10 +18,12 @@ set(INC
 set(SRC
   intern/compositor_execute.cc
   intern/scheduler.cc
+  intern/texture_pool.cc
   intern/utils.cc
 
   VPC_compositor_execute.hh
   VPC_scheduler.hh
+  VPC_texture_pool.hh
   VPC_utils.hh
 )
 
diff --git a/source/blender/viewport_compositor/VPC_compositor_execute.hh b/source/blender/viewport_compositor/VPC_compositor_execute.hh
index 20806548e71..7b204cd9c9e 100644
--- a/source/blender/viewport_compositor/VPC_compositor_execute.hh
+++ b/source/blender/viewport_compositor/VPC_compositor_execute.hh
@@ -22,66 +22,10 @@
 #include "NOD_derived_node_tree.hh"
 
 #include "VPC_scheduler.hh"
+#include "VPC_texture_pool.hh"
 
 namespace blender::viewport_compositor {
 
-/* --------------------------------------------------------------------
- * Texture Pool.
- */
-
-/* A key structure used to identify a texture specification in a texture pool. Defines a hash and
- * an equality operator for use in a hash map. */
-class TexturePoolKey {
- public:
-  int2 size;
-  eGPUTextureFormat format;
-
-  TexturePoolKey(int2 size, eGPUTextureFormat format);
-  TexturePoolKey(const GPUTexture *texture);
-
-  uint64_t hash() const;
-};
-
-/* A pool of textures that can be allocated and reused transparently throughout the evaluation of
- * the compositor. This texture pool only pools textures throughout a single evaluation of the
- * compositor and will reset after evaluation without freeing any textures. Cross-evaluation
- * pooling and freeing of unused textures is the responsibility of the back-end texture pool used
- * by the allocate_texture method. In the case of the viewport compositor engine, this would be the
- * global DRWTexturePool of the draw manager. */
-class TexturePool {
- private:
-  /* The set of textures in the pool that are available to acquire for each distinct texture
-   * specification. */
-  Map<TexturePoolKey, Vector<GPUTexture *>> textures_;
-
- public:
-  /* Check if there is an available texture with the given specification in the pool, if such
-   * texture exists, return it, otherwise, return a newly allocated texture. Expect the texture to
-   * be uncleared and contains garbage data. */
-  GPUTexture *acquire(int2 size, eGPUTextureFormat format);
-
-  /* Shorthand for acquire with GPU_RGBA16F format. */
-  GPUTexture *acquire_color(int2 size);
-
-  /* Shorthand for acquire with GPU_RGBA16F format. Identical to acquire_color because vector
-   * textures are and should internally be stored in RGBA textures. */
-  GPUTexture *acquire_vector(int2 size);
-
-  /* Shorthand for acquire with GPU_R16F format. */
-  GPUTexture *acquire_float(int2 size);
-
-  /* Put the texture back into the pool, potentially to be acquired later by another user. Expects
-   * the texture to be one that was acquired using the same texture pool. */
-  void release(GPUTexture *texture);
-
- private:
-  /* Returns a newly allocated texture with the given specification. This method should be
-   * implemented by the compositor engine and should use a global texture pool that is persistent
-   * across evaluations and capable of freeing unused textures. In the case of the viewport
-   * compositor engine, this would be the global DRWTexturePool of the draw manager. */
-  virtual GPUTexture *allocate_texture(int2 size, eGPUTextureFormat format) = 0;
-};
-
 /* --------------------------------------------------------------------
  * Context.
  */
diff --git a/source/blender/viewport_compositor/VPC_texture_pool.hh b/source/blender/viewport_compositor/VPC_texture_pool.hh
new file mode 100644
index 00000000000..3bf5bf2ed09
--- /dev/null
+++ b/source/blender/viewport_compositor/VPC_texture_pool.hh
@@ -0,0 +1,69 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2022 Blender Foundation. All rights reserved. */
+
+#pragma once
+
+#include <cstdint>
+
+#include "BLI_map.hh"
+#include "BLI_math_vec_types.hh"
+#include "BLI_vector.hh"
+
+#include "GPU_texture.h"
+
+namespace blender::viewport_compositor {
+
+/* A key structure used to identify a texture specification in a texture pool. Defines a hash and
+ * an equality operator for use in a hash map. */
+class TexturePoolKey {
+ public:
+  int2 size;
+  eGPUTextureFormat format;
+
+  TexturePoolKey(int2 size, eGPUTextureFormat format);
+  TexturePoolKey(const GPUTexture *texture);
+
+  uint64_t hash() const;
+};
+
+/* A pool of textures that can be used to allocate textures and reused transparently throughout the
+ * evaluation of the compositor. This texture pool only pools textures throughout a single
+ * evaluation of the compositor and will reset after the evaluation without freeing any textures.
+ * Cross-evaluation pooling and freeing of unused textures is the responsibility of the back-end
+ * texture pool used by the allocate_texture method. In the case of the viewport compositor engine,
+ * this would be the global DRWTexturePool of the draw manager. */
+class TexturePool {
+ private:
+  /* The set of textures in the pool that are available to acquire for each distinct texture
+   * specification. */
+  Map<TexturePoolKey, Vector<GPUTexture *>> textures_;
+
+ public:
+  /* Check if there is an available texture with the given specification in the pool, if such
+   * texture exists, return it, otherwise, return a newly allocated texture. Expect the texture to
+   * be uncleared and contains garbage data. */
+  GPUTexture *acquire(int2 size, eGPUTextureFormat format);
+
+  /* Shorthand for acquire with GPU_RGBA16F format. */
+  GPUTexture *acquire_color(int2 size);
+
+  /* Shorthand for acquire with GPU_RGBA16F format. Identical to acquire_color because vector
+   * textures are and should internally be stored in RGBA textures. */
+  GPUTexture *acquire_vector(int2 size);
+
+  /* Shorthand for acquire with GPU_R16F format. */
+  GPUTexture *acquire_float(int2 size);
+
+  /* Put the texture back into the pool, potentially to be acquired later by another user. Expects
+   * the texture to be one that was acquired using the same texture pool. */
+  void release(GPUTexture *texture);
+
+ private:
+  /* Returns a newly allocated texture with the given specification. This method should be
+   * implemented by the compositor engine and should use a global texture pool that is persistent
+   * across evaluations and capable of freeing unused textures. In the case of the viewport
+   * compositor engine, this would be the global DRWTexturePool of the draw manager. */
+  virtual GPUTexture *allocate_texture(int2 size, eGPUTextureFormat format) = 0;
+};
+
+}  // namespace blender::viewport_compositor
diff --git a/source/blender/viewport_compositor/intern/compositor_execute.cc b/source/blender/viewport_compositor/intern/compositor_execute.cc
index 10f4bb8db15..dfab0d0b956 100644
--- a/source/blender/viewport_compositor/intern/compositor_execute.cc
+++ b/source/blender/viewport_compositor/intern/compositor_execute.cc
@@ -39,65 +39,11 @@
 
 #include "VPC_compositor_execute.hh"
 #include "VPC_scheduler.hh"
+#include "VPC_texture_pool.hh"
 #include "VPC_utils.hh"
 
 namespace blender::viewport_compositor {
 
-/* --------------------------------------------------------------------
- * Texture Pool.
- */
-
-TexturePoolKey::TexturePoolKey(int2 size, eGPUTextureFormat format) : size(size), format(format)
-{
-}
-
-TexturePoolKey::TexturePoolKey(const GPUTexture *texture)
-{
-  size = int2{GPU_texture_width(texture), GPU_texture_height(texture)};
-  format = GPU_texture_format(texture);
-}
-
-uint64_t TexturePoolKey::hash() const
-{
-  return get_default_hash_3(size.x, size.y, format);
-}
-
-bool operator==(const TexturePoolKey &a, const TexturePoolKey &b)
-{
-  return a.size == b.size && a.format == b.format;
-}
-
-GPUTexture *TexturePool::acquire(int2 size, eGPUTextureFormat format)
-{
-  const TexturePoolKey key = TexturePoolKey(size, format);
-  Vector<GPUTexture *> &available_textures = textures_.lookup_or_add_default(key);
-  if (available_textures.is_empty()) {
-    return allocate_texture(size, format);
-  }
-  return available_textures.pop_last();
-}
-
-GPUTexture *TexturePool::acquire_color(int2 size)
-{
-  return acquire(size, GPU_RGBA16F);
-}
-
-/* Vectors are and should be stored in RGBA textures. */
-GPUTexture *TexturePool::acquire_vector(int2 size)
-{
-  return acquire(size, GPU_RGBA16F);
-}
-
-GPUTexture *TexturePool::acquire_float(int2 size)
-{
-  return acquire(size, GPU_R16F);
-}
-
-void TexturePool::release(GPUTexture *texture)
-{
-  textures_.lookup(TexturePoolKey(texture)).append(texture);
-}
-
 /* --------------------------------------------------------------------
  * Context.
  */
diff --git a/source/blender/viewport_compositor/intern/texture_pool.cc b/source/blender/viewport_compositor/intern/texture_pool.cc
new file mode 100644
index 00000000000..aad0f177516
--- /dev/null
+++ b/source/blender/viewport_compositor/intern/texture_pool.cc
@@ -0,0 +1,72 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2022 Blender Foundation. All rights reserved. */
+
+#include <cstdint>
+
+#include "BLI_hash.hh"
+#include "BLI_map.hh"
+#include "BLI_math_vec_types.hh"
+#include "BLI_vector.hh"
+
+#include "GPU_texture.h"
+
+#include "VPC_texture_pool.hh"
+
+namespace blender::viewport_compositor {
+
+TexturePoolKey::TexturePoolKey(int2 size, eGPUTextureFormat format) : size(size), format(format)
+{
+}
+
+TexturePoolKey::TexturePoolKey(const GPUTexture *texture)
+{
+  size = int2(GPU_texture_width(texture), GPU_texture_height(texture));
+  format = GPU_texture_format(texture);
+}
+
+uint64_t TexturePoolKey::hash() const
+{
+  return get_default_hash_3(size.x, size.y, format);
+}
+
+bool operator==(const TexturePoolKey &a, const TexturePoolKey &b)
+{
+  return a.size == b.size && a.format == b.format;
+}
+
+GPUTexture *TexturePool::acquire(int2 size, eGPUTextureFormat format)
+{
+  /* Check if there is an available texture with the required specification, and one exists, return
+   * it. */
+  const TexturePoolKey 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list