Commit: 7bf65e8e1109232251b64bb9a2773ea9d43f3ef8 Author: Omar Emara Date: Fri Feb 4 18:59:58 2022 +0200 Branches: temp-viewport-compositor-compiler https://developer.blender.org/rB7bf65e8e1109232251b64bb9a2773ea9d43f3ef8
Viewport Compositor: Add texture pool allocator This patch adds a texture pool allocator to the viewport compositor. Pooling textures makes allocation easier, more transparent, and more efficient. =================================================================== M source/blender/draw/engines/compositor/compositor_engine.cc =================================================================== diff --git a/source/blender/draw/engines/compositor/compositor_engine.cc b/source/blender/draw/engines/compositor/compositor_engine.cc index 4892204c84b..340f9310f08 100644 --- a/source/blender/draw/engines/compositor/compositor_engine.cc +++ b/source/blender/draw/engines/compositor/compositor_engine.cc @@ -24,7 +24,9 @@ #include "DRW_render.h" +#include "BLI_hash.hh" #include "BLI_map.hh" +#include "BLI_set.hh" #include "BLI_string_ref.hh" #include "BLI_utildefines.h" #include "BLI_vector.hh" @@ -47,6 +49,72 @@ namespace blender::compositor { using nodes::CompositorContext; using namespace nodes::derived_node_tree_types; +/* A key structure used to identify a texture in a texture pool. Defines a hash and an equality + * operator for use in a hash map. */ +class TexturePoolKey { + public: + int width; + int height; + eGPUTextureFormat format; + + TexturePoolKey(int width, int height, eGPUTextureFormat format) + : width(width), height(height), format(format) + { + } + + TexturePoolKey(const GPUTexture *texture) + { + width = GPU_texture_width(texture); + height = GPU_texture_height(texture); + format = GPU_texture_format(texture); + } + + uint64_t hash() const + { + return get_default_hash_3(width, height, format); + } +}; + +inline bool operator==(const TexturePoolKey &a, const TexturePoolKey &b) +{ + return a.width == b.width && a.height == b.height && a.format == b.format; +} + +/* A pool of textures that can be reused transparently throughout the evaluation of the node tree. + * Uses the DRW texture pool as a base for allocation. The acquired textures are uncleared and are + * expected to contain garbage data. */ +class TexturePool { + private: + /* The set of textures in the pool that are currently in use. */ + Set<GPUTexture *> in_use_textures_; + /* The set of textures in the pool that are available to acquire. */ + Map<TexturePoolKey, GPUTexture *> available_textures_; + + public: + /* Check if there is an available texture with the given specification in the pool, if such + * texture exists, return it, otherwise, get a new texture from the DRW texture pool. */ + GPUTexture *acquire(int width, int height, eGPUTextureFormat format) + { + const TexturePoolKey key = TexturePoolKey(width, height, format); + std::optional<GPUTexture *> available_texture = available_textures_.pop_try(key); + if (available_texture) { + return *available_texture; + } + DrawEngineType *owner = (DrawEngineType *)this; + GPUTexture *new_texture = DRW_texture_pool_query_2d(width, height, format, owner); + in_use_textures_.add_new(new_texture); + return new_texture; + } + + /* Move the texture from the in-use textures set to the available textures set, potentially to be + * acquired later by another user. */ + void release(GPUTexture *texture) + { + in_use_textures_.remove_contained(texture); + available_textures_.add_new(TexturePoolKey(texture), texture); + } +}; + class DRWCompositorContext : public CompositorContext { private: /* The node currently being executed. */ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs