| // Copyright 2016 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. |
| |
| #include "src/ui/lib/escher/impl/image_cache.h" |
| |
| #include "src/ui/lib/escher/impl/vulkan_utils.h" |
| #include "src/ui/lib/escher/resources/resource_recycler.h" |
| #include "src/ui/lib/escher/util/image_utils.h" |
| #include "src/ui/lib/escher/vk/gpu_allocator.h" |
| |
| namespace escher { |
| namespace impl { |
| |
| ImageCache::ImageCache(EscherWeakPtr escher, GpuAllocator* allocator) |
| : ResourceManager(escher), allocator_(allocator) { |
| FX_DCHECK(allocator_); |
| } |
| |
| ImageCache::~ImageCache() {} |
| |
| ImagePtr ImageCache::NewImage(const ImageInfo& info, GpuMemPtr* out_ptr) { |
| if (out_ptr) { |
| FX_DCHECK(false) << "ImageCache does not support dedicated allocations, " |
| "creating a non-cached image"; |
| return allocator_->AllocateImage(escher()->resource_recycler(), info, out_ptr); |
| } |
| |
| if (ImagePtr result = FindImage(info)) { |
| return result; |
| } |
| |
| return allocator_->AllocateImage(this, info); |
| } |
| |
| ImagePtr ImageCache::FindImage(const ImageInfo& info) { |
| auto& queue = unused_images_[info]; |
| if (queue.empty()) { |
| return ImagePtr(); |
| } else { |
| ImagePtr result(queue.front().release()); |
| queue.pop(); |
| return result; |
| } |
| } |
| |
| void ImageCache::OnReceiveOwnable(std::unique_ptr<Resource> resource) { |
| FX_DCHECK(resource->IsKindOf<Image>()); |
| std::unique_ptr<Image> image(static_cast<Image*>(resource.release())); |
| auto& queue = unused_images_[image->info()]; |
| queue.push(std::move(image)); |
| } |
| |
| } // namespace impl |
| } // namespace escher |