fix: scope retained underlay placement fallback
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled

This commit is contained in:
tei
2026-09-22 10:19:59 +09:00
parent e7d109246a
commit 1d1a7915e0
4 changed files with 36 additions and 16 deletions

View File

@@ -16,6 +16,9 @@ fun obtainTestBuildType(): String {
}
}
val stripValidationNativeDebugSymbols =
providers.gradleProperty("maplibre.validation.stripNativeDebugSymbols").orNull == "true"
android {
ndkVersion = Versions.ndkVersion
@@ -51,7 +54,9 @@ android {
packaging {
jniLibs {
keepDebugSymbols += "**/*.so"
if (!stripValidationNativeDebugSymbols) {
keepDebugSymbols += "**/*.so"
}
}
}

View File

@@ -856,8 +856,18 @@ bool RenderOrchestrator::hasTransitions(TimePoint timePoint) const {
return false;
}
bool RenderOrchestrator::retainedUnderlayUsesPlacement(int32_t boundary) const {
const auto staticLayerCount = std::min<std::size_t>(
boundary > 0 ? static_cast<std::size_t>(boundary) : 0, orderedLayers.size());
for (std::size_t index = 0; index < staticLayerCount; ++index) {
if (orderedLayers[index].get().needsPlacement()) return true;
}
return false;
}
bool RenderOrchestrator::retainedUnderlayIsStable(TimePoint timePoint, int32_t boundary) const {
if (renderLight.hasTransition() || placementController.hasTransitions(timePoint)) return false;
if (renderLight.hasTransition()) return false;
if (retainedUnderlayUsesPlacement(boundary) && placementController.hasTransitions(timePoint)) return false;
const auto staticLayerCount = std::min<std::size_t>(
boundary > 0 ? static_cast<std::size_t>(boundary) : 0, orderedLayers.size());

View File

@@ -109,6 +109,7 @@ public:
bool removeLayerGroup(const LayerGroupBasePtr&);
size_t numLayerGroups() const noexcept;
std::optional<int32_t> getRetainedDynamicBoundary() const noexcept { return retainedDynamicBoundary; }
bool retainedUnderlayUsesPlacement(int32_t boundary) const;
bool retainedUnderlayIsStable(TimePoint, int32_t boundary) const;
void updateLayerIndex(LayerGroupBasePtr, int32_t newIndex);

View File

@@ -58,7 +58,7 @@ RendererObserver& nullObserver() {
#ifndef NDEBUG
constexpr uint64_t RetainedCounterLogIntervalFrames = 120;
void logRetainedRendererCounters() {
void logRetainedRendererCounters(const RetainedUnderlayCache& cache) {
const auto snapshot = particle::rendererDebugCounterSnapshot();
if (snapshot.fullRendererFrame == 0 ||
snapshot.fullRendererFrame % RetainedCounterLogIntervalFrames != 0) {
@@ -72,6 +72,7 @@ void logRetainedRendererCounters() {
<< " reuse=" << snapshot.retainedUnderlayReuse
<< " fallback=" << snapshot.retainedUnderlayFallback
<< " invalidation=" << snapshot.retainedUnderlayInvalidation
<< " reason=" << cache.getLastInvalidationReason()
<< " staticDraw=" << snapshot.retainedUnderlayStaticGroupDraw
<< " dynamicDraw=" << snapshot.retainedDynamicGroupDraw
<< " particleAdvance=" << snapshot.particleSimulationAdvance;
@@ -310,25 +311,28 @@ void Renderer::Impl::render(const RenderTree& renderTree, const std::shared_ptr<
}
}
}
const bool retainedStaticUsesPlacement =
retainedBoundary && orchestrator.retainedUnderlayUsesPlacement(*retainedBoundary);
const bool retainedStaticStable =
retainedBoundary && orchestrator.retainedUnderlayIsStable(renderTreeParameters.timePoint, *retainedBoundary);
const bool retainedPlacementStable =
!retainedStaticUsesPlacement ||
(!renderTreeParameters.placementChanged && renderTreeParameters.symbolFadeChange == 0.0f);
const bool retainedSupported = retainedBoundary && retainedStaticGroupCount > 0 &&
renderTreeParameters.loaded && !renderTreeParameters.has3D &&
renderTreeParameters.debugOptions == MapDebugOptions::NoDebug &&
orchestrator.retainedUnderlayIsStable(renderTreeParameters.timePoint,
*retainedBoundary) &&
!renderTreeParameters.placementChanged &&
renderTreeParameters.symbolFadeChange == 0.0f &&
retainedStaticStable && retainedPlacementStable &&
!legacyBelowBoundary;
const char* retainedFallbackReason = !retainedBoundary ? "no-boundary"
const char* retainedFallbackReason = !retainedBoundary ? "no-boundary"
: retainedStaticGroupCount == 0 ? "empty-static-prefix"
: !renderTreeParameters.loaded ? "style-not-loaded"
: renderTreeParameters.has3D ? "3d"
: !renderTreeParameters.loaded ? "style-not-loaded"
: renderTreeParameters.has3D ? "3d"
: renderTreeParameters.debugOptions != MapDebugOptions::NoDebug
? "debug-options"
: !orchestrator.retainedUnderlayIsStable(renderTreeParameters.timePoint,
*retainedBoundary) ||
renderTreeParameters.placementChanged ||
renderTreeParameters.symbolFadeChange != 0.0f
? "static-transition-or-placement"
: !retainedStaticStable
? "static-transition"
: !retainedPlacementStable
? "static-placement"
: legacyBelowBoundary ? "legacy-ordering"
: nullptr;
auto retainedDecision = retainedUnderlayCache->evaluate(retainedKey,
@@ -619,7 +623,7 @@ void Renderer::Impl::render(const RenderTree& renderTree, const std::shared_ptr<
}
#ifndef NDEBUG
logRetainedRendererCounters();
logRetainedRendererCounters(*retainedUnderlayCache);
#endif
frameCount += 1;