blob: fc402f87fa9f5f4e1d8ca88151207b0c5dac4fb3 [file] [log] [blame]
// Copyright 2013 The Flutter 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 <memory>
#include "flutter/testing/testing.h"
#include "impeller/core/allocator.h"
#include "impeller/core/texture_descriptor.h"
#include "impeller/entity/render_target_cache.h"
#include "impeller/renderer/testing/mocks.h"
namespace impeller {
namespace testing {
class TestAllocator : public Allocator {
public:
TestAllocator() = default;
~TestAllocator() = default;
ISize GetMaxTextureSizeSupported() const override {
return ISize(1024, 1024);
};
std::shared_ptr<DeviceBuffer> OnCreateBuffer(
const DeviceBufferDescriptor& desc) override {
if (should_fail) {
return nullptr;
}
return std::make_shared<MockDeviceBuffer>(desc);
};
virtual std::shared_ptr<Texture> OnCreateTexture(
const TextureDescriptor& desc) override {
if (should_fail) {
return nullptr;
}
return std::make_shared<MockTexture>(desc);
};
bool should_fail = false;
};
TEST(RenderTargetCacheTest, CachesUsedTexturesAcrossFrames) {
auto allocator = std::make_shared<TestAllocator>();
auto render_target_cache = RenderTargetCache(allocator);
auto desc = TextureDescriptor{
.format = PixelFormat::kR8G8B8A8UNormInt,
.size = ISize(100, 100),
.usage = static_cast<TextureUsageMask>(TextureUsage::kRenderTarget)};
render_target_cache.Start();
// Create two textures of the same exact size/shape. Both should be marked
// as used this frame, so the cached data set will contain two.
render_target_cache.CreateTexture(desc);
render_target_cache.CreateTexture(desc);
ASSERT_EQ(render_target_cache.CachedTextureCount(), 2u);
render_target_cache.End();
render_target_cache.Start();
// Next frame, only create one texture. The set will still contain two,
// but one will be removed at the end of the frame.
render_target_cache.CreateTexture(desc);
ASSERT_EQ(render_target_cache.CachedTextureCount(), 2u);
render_target_cache.End();
ASSERT_EQ(render_target_cache.CachedTextureCount(), 1u);
}
TEST(RenderTargetCacheTest, DoesNotPersistFailedAllocations) {
auto allocator = std::make_shared<TestAllocator>();
auto render_target_cache = RenderTargetCache(allocator);
auto desc = TextureDescriptor{
.format = PixelFormat::kR8G8B8A8UNormInt,
.size = ISize(100, 100),
.usage = static_cast<TextureUsageMask>(TextureUsage::kRenderTarget)};
render_target_cache.Start();
allocator->should_fail = true;
ASSERT_EQ(render_target_cache.CreateTexture(desc), nullptr);
ASSERT_EQ(render_target_cache.CachedTextureCount(), 0u);
}
} // namespace testing
} // namespace impeller