// Copyright 2018 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 "gtest/gtest.h"
#include "lib/escher/test/fake_gpu_allocator.h"
#include "lib/escher/util/image_utils.h"
#include "lib/fxl/logging.h"

namespace escher {
namespace impl {
namespace {

TEST(ImageCache, SmokeTest) {
  test::FakeGpuAllocator allocator;
  ImageCache cache(EscherWeakPtr(), &allocator);

  static const vk::Format kFormat = vk::Format::eR8G8B8A8Unorm;
  static const vk::ImageUsageFlags kUsage =
      vk::ImageUsageFlagBits::eTransferSrc |
      vk::ImageUsageFlagBits::eTransferDst;

  static const int kWidth = 16;
  static const int kHeight = 16;
  static const size_t kMemorySize =
      kWidth * kHeight * image_utils::BytesPerPixel(kFormat);

  ImageInfo info;
  info.format = kFormat;
  info.width = kWidth;
  info.height = kHeight;
  info.usage = kUsage;

  EXPECT_EQ(0u, allocator.GetTotalBytesAllocated());

  // TODO(ES-7): ImageCache holds onto every image allocated. So we only need to
  // test for the high memory watermark.
  auto image0 = cache.NewImage(info);
  EXPECT_EQ(kMemorySize, allocator.GetTotalBytesAllocated());
  image0 = nullptr;
  EXPECT_EQ(kMemorySize, allocator.GetTotalBytesAllocated());
  image0 = cache.NewImage(info);
  EXPECT_EQ(kMemorySize, allocator.GetTotalBytesAllocated());
  auto image1 = cache.NewImage(info);
  EXPECT_EQ(2 * kMemorySize, allocator.GetTotalBytesAllocated());

  // Release all images.
  image0 = nullptr;
  image1 = nullptr;

  static const int kBigWidth = 1024;
  static const int kBigHeight = 1024;
  static const size_t kBigMemorySize =
      kBigWidth * kBigHeight * image_utils::BytesPerPixel(kFormat);

  ImageInfo big_info;
  big_info.format = kFormat;
  big_info.width = kBigWidth;
  big_info.height = kBigHeight;
  big_info.usage = kUsage;

  // Allocating an image with different parameters results in a new allocation.
  // All old memory is still allocated.
  auto big_image0 = cache.NewImage(big_info);
  EXPECT_EQ(kBigMemorySize + 2 * kMemorySize,
            allocator.GetTotalBytesAllocated());

  // Requesting the old image info results in memory being reused.
  image0 = cache.NewImage(info);
  EXPECT_EQ(kBigMemorySize + 2 * kMemorySize,
            allocator.GetTotalBytesAllocated());
  image1 = cache.NewImage(info);
  EXPECT_EQ(kBigMemorySize + 2 * kMemorySize,
            allocator.GetTotalBytesAllocated());
}

}  // namespace
}  // namespace impl
}  // namespace escher
