blob: 6884cd1f28dd784afbc62e131c81de7056fc9e04 [file] [log] [blame]
// 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 "lib/escher/impl/image_cache.h"
#include "lib/escher/impl/vulkan_utils.h"
#include "lib/escher/resources/resource_recycler.h"
#include "lib/escher/util/image_utils.h"
#include "lib/escher/vk/gpu_allocator.h"
namespace escher {
namespace impl {
ImageCache::ImageCache(EscherWeakPtr escher, GpuAllocator* allocator)
: ResourceManager(escher), allocator_(allocator) {
FXL_DCHECK(allocator_);
}
ImageCache::~ImageCache() {}
ImagePtr ImageCache::NewImage(const ImageInfo& info, GpuMemPtr* out_ptr) {
if (out_ptr) {
FXL_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) {
FXL_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