Skip to content

Use dirty-region tracking for partial framebuffer refreshes (G9, B17) #6

@Ashex

Description

@Ashex

Context

The framebuffer layer has skeets_framebuffer_mark_dirty() and skeets_framebuffer_flush() infrastructure in src/platform/framebuffer.h/cpp, but the main rendering loop in src/kobo/main.cpp never uses it. Instead, it does explicit refresh_region() calls for stat lines and full-screen refreshes for everything else.

Feed/thread stat updates already use localized partial GC16 refreshes (render_feed_stats_only / render_thread_stats_only), but view-level redraws (scroll, view switch, image load) still trigger full-screen flashing refreshes.

Sub-tasks

  • Transition view rendering to use skeets_framebuffer_mark_dirty() during draw operations
  • Call skeets_framebuffer_flush() at end of each render pass instead of explicit refresh calls
  • Replace full-screen GC16 refreshes on scroll with partial DU refreshes of the changed region
  • Replace full-screen refresh on async image load with partial GC16 refresh of the image region only
  • Ensure view-switch transitions still get a full GC16 clear (for clean state between views)

Impact

Reducing unnecessary full-screen e-ink flashing will significantly improve the reading experience — less flickering during scroll, image loads, and interaction toggles.

References

  • Dirty region infrastructure: src/platform/framebuffer.h/cpp
  • Current refresh calls: src/kobo/main.cpp
  • KOReader waveform reference: uses REAGL for partial updates, DU for fast scroll, GC16 for full

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions