Skip to content

web: render highlights in a separate overlay tile layer#10609

Merged
maliberty merged 4 commits into
The-OpenROAD-Project:masterfrom
The-OpenROAD-Project-staging:overlay-tile-layer
Jun 8, 2026
Merged

web: render highlights in a separate overlay tile layer#10609
maliberty merged 4 commits into
The-OpenROAD-Project:masterfrom
The-OpenROAD-Project-staging:overlay-tile-layer

Conversation

@maliberty

Copy link
Copy Markdown
Member

Summary

  • Move selection, hover, timing, DRC, route-guide, and flight-line rendering out of base tiles into a dedicated transparent overlay tile layer
  • When highlights change, only ~64 overlay tiles are re-requested instead of ~800+ base geometry tiles across all metal layers
  • Base tiles stay cached and are only re-rendered on structural changes (visibility toggles, design reload, focus nets)

Changes

Backend:

  • generateOverlayTile() renders only overlay shapes on a transparent background
  • New "overlay_tile" request type registered in TileHandler
  • handleTile() no longer passes highlight data to base tiles
  • drawColoredHighlight() draws all colored rects when current_layer is empty (overlay mode)

Frontend:

  • createOverlayTileLayer() factory in websocket-tile-layer.js
  • Overlay layer created above base layers, below heatmap
  • refreshOverlay() / scheduleRefreshOverlay() for highlight-only updates
  • Widgets (inspector, timing, DRC, clock-tree, schematic) call refreshOverlay() instead of redrawAllLayers() for highlight changes

Move selection, hover, timing, DRC, route-guide, and flight-line
rendering out of base tiles into a dedicated transparent overlay tile
layer.  When highlights change, only the overlay tiles are re-requested
instead of every base geometry tile across all metal layers.

Backend: add generateOverlayTile() that renders only overlay shapes on a
transparent background, register "overlay_tile" request type, and stop
passing highlight data to base tile requests.

Frontend: add createOverlayTileLayer() factory, create the overlay layer
above base layers but below the heatmap, and split redraw paths so
highlight-only changes call refreshOverlay() instead of redrawAllLayers().

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
@maliberty maliberty self-assigned this Jun 8, 2026
@github-actions github-actions Bot added the size/M label Jun 8, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces a lightweight overlay tile layer to render highlight and overlay shapes (such as selection, hover, timing, DRC, and route guides) on a transparent background. This optimization prevents base geometry tiles from being re-rendered when highlights change, significantly improving performance. The review feedback highlights critical issues regarding potential race conditions and memory leaks in the tile layer request handling, a missing default fallback for the refreshOverlay parameter in the inspector panel, and a layer visibility bug where colored highlights are rendered even when their parent layers are hidden.

Comment thread src/web/src/websocket-tile-layer.js Outdated
Comment thread src/web/src/websocket-tile-layer.js Outdated
Comment thread src/web/src/websocket-tile-layer.js
Comment thread src/web/src/inspector.js
Comment thread src/web/src/tile_generator.cpp
Route guides now respect layer visibility using the same
has_visible_layers + set semantics as pin markers: absent field means
"draw all", empty array means "all hidden".

Skip overlay layer creation in static reports where there is no
WebSocket server to handle overlay_tile requests.

Pass scheduleRefreshOverlay (debounced) to widgets instead of the
direct refreshOverlay, so rapid highlight updates within the same
frame coalesce into a single overlay tile refresh.

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
@openroad-ci openroad-ci force-pushed the overlay-tile-layer branch from 112dcf1 to 5fcd567 Compare June 8, 2026 03:24
Add requestId guards in createOverlayTileLayer's createTile and
refreshTiles handlers so late-arriving responses from superseded
requests don't create leaked blob URLs. Clear _websocketRequestId
in _removeTile after canceling for the same reason.

Default refreshOverlay to redrawAllLayers in createInspectorPanel
to match the fallback pattern used by other widgets.

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
@maliberty maliberty marked this pull request as ready for review June 8, 2026 05:18
@maliberty maliberty requested a review from a team as a code owner June 8, 2026 05:18
@maliberty maliberty requested a review from gadfort June 8, 2026 05:18
@maliberty maliberty enabled auto-merge June 8, 2026 05:28
# Conflicts:
#	src/web/src/inspector.js

Signed-off-by: Matt Liberty <mliberty@precisioninno.com>
@maliberty maliberty merged commit 5993f6e into The-OpenROAD-Project:master Jun 8, 2026
16 checks passed
@maliberty maliberty deleted the overlay-tile-layer branch June 8, 2026 15:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants