| // Copyright 2017 The Fuchsia Authors. All rights reserved. | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #ifndef SRC_UI_LIB_ESCHER_VK_IMAGE_FACTORY_H_ | 
 | #define SRC_UI_LIB_ESCHER_VK_IMAGE_FACTORY_H_ | 
 |  | 
 | #include "src/ui/lib/escher/resources/resource_manager.h" | 
 | #include "src/ui/lib/escher/vk/gpu_allocator.h" | 
 | #include "src/ui/lib/escher/vk/image.h" | 
 |  | 
 | namespace escher { | 
 |  | 
 | // ImageFactory allows clients to obtain new Images with the desired | 
 | // properties. Subclasses are free to implement custom caching/recycling | 
 | // behaviors. All images obtained from an ImageFactory must be released before | 
 | // the ImageFactory is destroyed. | 
 | class ImageFactory { | 
 |  public: | 
 |   virtual ~ImageFactory() = default; | 
 |  | 
 |   // Creates an Image, backed by a block of memory. If |out_ptr| is non-null, | 
 |   // the image will be bound to a dedicated piece of memory (i.e., | 
 |   // VkMemoryDedicatedRequirements.requiresDedicatedAllocation | 
 |   // == true). That memory must be accessable through the GpuMem returned in | 
 |   // |out_ptr|. | 
 |   virtual ImagePtr NewImage(const ImageInfo& info, GpuMemPtr* out_ptr = nullptr) = 0; | 
 | }; | 
 |  | 
 | // This default implementation allocates memory and creates a new | 
 | // Image using the provided allocator and manager. The intent is for this class | 
 | // to adapt existing GpuAllocators to the ImageFactory interface (i.e. | 
 | // equivalent to a partial bind). Classes that wish to implement their own | 
 | // caching logic should subclass ImageFactory directly, instead of injecting | 
 | // tricky subclasses of GpuAllocator and ResourceManager into this object. | 
 | class ImageFactoryAdapter final : public ImageFactory { | 
 |  public: | 
 |   ImageFactoryAdapter(GpuAllocator* allocator, ResourceManager* manager) | 
 |       : allocator_(allocator->GetWeakPtr()), manager_(manager) {} | 
 |  | 
 |   ImagePtr NewImage(const ImageInfo& info, GpuMemPtr* out_ptr = nullptr) final { | 
 |     FX_DCHECK(allocator_); | 
 |     return allocator_->AllocateImage(manager_, info, out_ptr); | 
 |   } | 
 |  | 
 |  private: | 
 |   const GpuAllocatorWeakPtr allocator_; | 
 |   ResourceManager* const manager_; | 
 | }; | 
 |  | 
 | }  // namespace escher | 
 |  | 
 | #endif  // SRC_UI_LIB_ESCHER_VK_IMAGE_FACTORY_H_ |