| Skia Update |
| |
| Skia : Access |
| - https://skia.org |
| - https://skia.googlesource.com/skia |
| |
| Skia : Overview |
| - portable graphics engine |
| - 2D transformations + perspective |
| - primitives: text, geometry, images |
| - effects: shaders, filters, antialiasing, blending |
| |
| Skia : Porting |
| - C++ and some SIMD assembly |
| - Fonts : CoreText, FreeType, GDI, DirectWrite |
| - Threads : wrappers for native apis |
| - Memory : wrappers for [new, malloc, discardable] |
| |
| Skia : Backends |
| - Surface |
| -- raster : ARGB, RGB16, A8 in software |
| -- gpu : transcribe to OpenGL |
| - Document |
| -- transcribe to PDF or XPS |
| - Record and Playback |
| -- Picture |
| -- Pipe |
| |
| Skia : Clients |
| - Blink : under the GraphicsContext hood |
| - Chrome : ui/gfx and compositor |
| - Android : framework |
| - third parties : e.g. Mozilla |
| |
| Skia In Blink |
| |
| Skia In Blink : Fonts |
| - SkTypeface and SkFontMgr : platform agnostic |
| - Runtime switch between GDI and DirectWrite |
| - SkTextBlob to encapsulate runs of text |
| - Push LCD decision-making out of Blink |
| |
| Skia In Blink : Record-Time-Rasterization |
| - What? : direct rendering during “Paint” pass |
| -- Image scaling, filters |
| -- SVG patterns, masks |
| - Problematic in modern Blink |
| -- CTM not always known/knowable |
| -- Rendering backend not always known (gpu or cpu) |
| -- Rasterization takes (too much) time |
| |
| Skia In Blink : RTR response |
| - SkImageFilter w/ CPU and GPU implementations |
| - Bitmap scaling : bilerp, mipmaps, fancy |
| - SkPicture for caching SVG |
| - SkPicture + saveLayer() for masks |
| -- PathOps for resolving complex paths |
| - SkPictureShader for device-independent patterns |
| |
| Skia In Blink : Recording |
| - GraphicsContext (now) backed by SkPicture |
| -- draw commands are recorded for later playback |
| -- all parameters must be copied or (safely) ref'd |
| -- may record more than is currently visible |
| - Resulting picture may be replayed multiple times |
| -- from different thread(s) |
| |
| Skia In Blink : Recording response |
| - New implementation |
| - Optimized for recording speed |
| -- shallow copies whenever possible |
| -- rearchitect all Skia effects to be immutable |
| - Reentrant-safe for playback in multiple threads |
| -- also affected effect subclasses |
| |
| Skia In Blink : Playback |
| - Separate pass for optimizations (optional) |
| -- peep-holes rewrites |
| -- compute bounding-box hierarchy for faster tiling |
| -- can be done outside of Blink thread |
| - GPU optimizations |
| -- layer "hoisting" |
| -- distance fields : fonts and concave paths |
| |
| Skia In Blink : multi-picture-draw |
| - mpd(canvas[], picture[], matrix[], paint[]) |
| - Requires independent canvas objects |
| -- all other parameters can be shared |
| -- draw order is unspecified |
| - Examples |
| -- 1 picture drawing to multiple tiles (canvases) |
| -- multiple pictures each drawing to its own layer |
| |
| Skia In Blink : MPD optimizations* |
| - GPU |
| -- "layer hoisting" to reduce rendertarget switching |
| -- layer atlasing (also applies to imagefilters) |
| -- pre-uploading of textures |
| -- atlas yuv (from jpeg) to convert on gpu |
| - CPU |
| -- parallel execution using thread pool |
| -- pre-decoding of images based on visibility |
| |
| Skia : Roadmap |
| |
| Skia : Roadmap - performance |
| - GPU |
| -- extended OpenGL features (e.g. geometry shaders) |
| -- reordering for increased batching |
| -- support for new low-level OpenGL APIs |
| - CPU |
| -- SIMD applied to floats |
| -- smarter culling in pictures |
| |
| Skia : Roadmap - API |
| - Cross process support |
| - Direct support for sRGB |
| - Robust file format |
| - Support PDF viewing |
| - Stable C ABI |
| -- bindings for JS, Go, Python, Lua |
| |
| Demo |