feat: add retained underlay render cache poc
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
This commit is contained in:
89
test/renderer/retained_underlay_cache.test.cpp
Normal file
89
test/renderer/retained_underlay_cache.test.cpp
Normal file
@@ -0,0 +1,89 @@
|
||||
#include <mbgl/renderer/retained_underlay_cache.hpp>
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include <vector>
|
||||
|
||||
using namespace mbgl;
|
||||
|
||||
namespace {
|
||||
RetainedUnderlayKey key(Size size = {640, 480}, int32_t boundary = 4) {
|
||||
RetainedUnderlayKey result{size, boundary, {}};
|
||||
result.cameraMatrix[0] = 1.0;
|
||||
result.cameraMatrix[5] = 1.0;
|
||||
result.cameraMatrix[10] = 1.0;
|
||||
result.cameraMatrix[15] = 1.0;
|
||||
return result;
|
||||
}
|
||||
} // namespace
|
||||
|
||||
TEST(RetainedDynamicBoundary, SelectsFirstCandidate) {
|
||||
RetainedDynamicBoundaryTracker none;
|
||||
none.consider(0, false);
|
||||
none.consider(3, false);
|
||||
EXPECT_FALSE(none.value());
|
||||
|
||||
RetainedDynamicBoundaryTracker particleOnly;
|
||||
particleOnly.consider(5, true);
|
||||
EXPECT_EQ(particleOnly.value(), 5);
|
||||
|
||||
RetainedDynamicBoundaryTracker weatherAndParticle;
|
||||
weatherAndParticle.consider(7, true);
|
||||
weatherAndParticle.consider(2, true);
|
||||
EXPECT_EQ(weatherAndParticle.value(), 2);
|
||||
|
||||
RetainedDynamicBoundaryTracker particleAndWeather;
|
||||
particleAndWeather.consider(2, true);
|
||||
particleAndWeather.consider(7, true);
|
||||
EXPECT_EQ(particleAndWeather.value(), 2);
|
||||
}
|
||||
|
||||
TEST(RetainedLayerGroupRange, PreservesForwardReverseOriginalOrdinals) {
|
||||
const std::vector<int32_t> indices{0, 1, 3, 5, 8};
|
||||
std::vector<size_t> beforeForward;
|
||||
std::vector<size_t> fromForward;
|
||||
std::vector<size_t> beforeReverse;
|
||||
std::vector<size_t> fromReverse;
|
||||
for (size_t ordinal = 0; ordinal < indices.size(); ++ordinal) {
|
||||
if (retainedLayerGroupInRange(indices[ordinal], 5, RetainedLayerGroupRange::Before))
|
||||
beforeForward.push_back(ordinal);
|
||||
else
|
||||
fromForward.push_back(ordinal);
|
||||
}
|
||||
for (size_t ordinal = indices.size(); ordinal-- > 0;) {
|
||||
if (retainedLayerGroupInRange(indices[ordinal], 5, RetainedLayerGroupRange::Before))
|
||||
beforeReverse.push_back(ordinal);
|
||||
else
|
||||
fromReverse.push_back(ordinal);
|
||||
}
|
||||
EXPECT_EQ(beforeForward, (std::vector<size_t>{0, 1, 2}));
|
||||
EXPECT_EQ(fromForward, (std::vector<size_t>{3, 4}));
|
||||
EXPECT_EQ(beforeReverse, (std::vector<size_t>{2, 1, 0}));
|
||||
EXPECT_EQ(fromReverse, (std::vector<size_t>{4, 3}));
|
||||
}
|
||||
|
||||
TEST(RetainedUnderlayCache, BuildReuseAndInvalidation) {
|
||||
RetainedUnderlayCache cache;
|
||||
EXPECT_EQ(cache.evaluate(std::nullopt, false), RetainedUnderlayDecision::Disabled);
|
||||
EXPECT_EQ(cache.evaluate(key(), true), RetainedUnderlayDecision::Build);
|
||||
cache.markBuildSucceeded();
|
||||
EXPECT_EQ(cache.evaluate(key(), true), RetainedUnderlayDecision::Reuse);
|
||||
|
||||
EXPECT_EQ(cache.evaluate(key({800, 600}), true), RetainedUnderlayDecision::Build);
|
||||
EXPECT_EQ(cache.getLastInvalidationReason(), "viewport");
|
||||
cache.markBuildSucceeded();
|
||||
EXPECT_EQ(cache.evaluate(key({800, 600}, 6), true), RetainedUnderlayDecision::Build);
|
||||
EXPECT_EQ(cache.getLastInvalidationReason(), "camera-or-boundary");
|
||||
}
|
||||
|
||||
TEST(RetainedUnderlayCache, UnsupportedAndResourceFailureFallBackSafely) {
|
||||
RetainedUnderlayCache cache;
|
||||
EXPECT_EQ(cache.evaluate(key(), false, "3d"), RetainedUnderlayDecision::Fallback);
|
||||
EXPECT_EQ(cache.getLastInvalidationReason(), "3d");
|
||||
EXPECT_FALSE(cache.isValid());
|
||||
|
||||
EXPECT_EQ(cache.evaluate(key(), true), RetainedUnderlayDecision::Build);
|
||||
cache.markBuildFailed("resource-or-compositor");
|
||||
EXPECT_FALSE(cache.isValid());
|
||||
EXPECT_EQ(cache.getFallbackCount(), 2u);
|
||||
}
|
||||
Reference in New Issue
Block a user