blob: d299ab67c38cc88871a7396414437117f4430be0 [file] [log] [blame]
// Copyright 2020 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/renderer/sampler_cache.h"
#include <gtest/gtest.h>
#include "src/ui/lib/escher/renderer/render_queue_context.h"
#include "src/ui/lib/escher/test/common/gtest_escher.h"
namespace {
using namespace escher;
VK_TEST(SamplerCache, LazyCaching) {
auto escher = test::GetEscher()->GetWeakPtr();
SamplerCache cache(escher->resource_recycler()->GetWeakPtr());
auto s1 = cache.ObtainSampler(vk::Filter::eNearest, true);
auto s2 = cache.ObtainSampler(vk::Filter::eNearest, true);
EXPECT_EQ(s1, s2);
EXPECT_EQ(1U, cache.size());
auto s3 = cache.ObtainSampler(vk::Filter::eNearest, false);
auto s4 = cache.ObtainSampler(vk::Filter::eNearest, false);
EXPECT_EQ(s3, s4);
EXPECT_NE(s1, s3);
EXPECT_EQ(2U, cache.size());
auto s5 = cache.ObtainSampler(vk::Filter::eLinear, true);
auto s6 = cache.ObtainSampler(vk::Filter::eLinear, true);
EXPECT_EQ(s5, s6);
EXPECT_NE(s1, s5);
EXPECT_NE(s3, s5);
EXPECT_EQ(3U, cache.size());
auto s7 = cache.ObtainSampler(vk::Filter::eLinear, false);
auto s8 = cache.ObtainSampler(vk::Filter::eLinear, false);
EXPECT_EQ(s7, s8);
EXPECT_NE(s1, s7);
EXPECT_NE(s3, s7);
EXPECT_NE(s5, s7);
EXPECT_EQ(4U, cache.size());
auto yuv1 = cache.ObtainYuvSampler(vk::Format::eG8B8G8R8422Unorm, vk::Filter::eLinear, true);
auto yuv2 = cache.ObtainYuvSampler(vk::Format::eG8B8G8R8422Unorm, vk::Filter::eLinear, true);
EXPECT_EQ(yuv1, yuv2);
EXPECT_NE(yuv1, s1);
EXPECT_NE(yuv1, s3);
EXPECT_NE(yuv1, s4);
EXPECT_NE(yuv1, s5);
EXPECT_EQ(5U, cache.size());
// From now on don't bother with EXPECT_NE()... verifying the expected cache size is good enough.
cache.ObtainYuvSampler(vk::Format::eG8B8G8R8422Unorm, vk::Filter::eLinear, false);
EXPECT_EQ(6U, cache.size());
cache.ObtainYuvSampler(vk::Format::eG8B8G8R8422Unorm, vk::Filter::eNearest, true);
EXPECT_EQ(7U, cache.size());
cache.ObtainYuvSampler(vk::Format::eG8B8G8R8422Unorm, vk::Filter::eNearest, false);
EXPECT_EQ(8U, cache.size());
cache.ObtainYuvSampler(vk::Format::eG8B8R82Plane420Unorm, vk::Filter::eLinear, true);
EXPECT_EQ(9U, cache.size());
cache.ObtainYuvSampler(vk::Format::eG8B8R82Plane420Unorm, vk::Filter::eLinear, false);
EXPECT_EQ(10U, cache.size());
cache.ObtainYuvSampler(vk::Format::eG8B8R82Plane420Unorm, vk::Filter::eNearest, true);
EXPECT_EQ(11U, cache.size());
cache.ObtainYuvSampler(vk::Format::eG8B8R82Plane420Unorm, vk::Filter::eNearest, false);
EXPECT_EQ(12U, cache.size());
}
} // namespace