Skip to content

Same-name image replacement not visible with synchronous GeoJSONSource #4326

Description

@louwers

Description from @grab-liyanjin

When GeoJsonSource is created with synchronousUpdate = true, replacing a style image under the same ID (same size) never propagated new pixels to the GPU, causing the symbol icon to remain frozen on its initial appearance.

Root cause – two update paths were both short-circuited in the same frame:

  1. DynamicTextureAtlas::uploadIconsAndPatterns derives a cache key (uniqueId) from the image ID hash and pixel dimensions. On every tile re-layout after a same-size replacement the existing atlas slot is reused and isUploadNeeded() returns false, so the new pixel data is never bulk-uploaded.

  2. populateImagePatches is the intended fallback: it compares iconPositions[id].version against ImageManager::updatedImageVersions[id] and sub-region-uploads only when they differ. However, with synchronousUpdate = true the tile re-layout is triggered within the same render-orchestrator frame as ImageManager::updateImage(). The tile therefore receives versionMap[id] = N (the just-incremented value) during onImagesAvailable, stores that as iconPositions[id].version, and populateImagePatches finds N == N – nothing to do.

Previous PR #4193 (we want to solve it in a different way)

cc @alexcristici

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No fields configured for Bug.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions