|
|
Donner 0.5.1
Embeddable browser-grade SVG2 engine
|
Geode rendering backend — GPU-native via WebGPU + the Slug algorithm. More...
#include "donner/svg/renderer/RendererGeode.h"
Public Member Functions | |
| RendererGeode (bool verbose=false) | |
| Construct the renderer. | |
| RendererGeode (std::shared_ptr< geode::GeodeDevice > device, bool verbose=false) | |
| Construct the renderer with an externally-owned GeodeDevice. | |
| RendererGeode (const RendererGeode &)=delete | |
| RendererGeode & | operator= (const RendererGeode &)=delete |
| RendererGeode (RendererGeode &&) noexcept | |
| Move constructor. | |
| RendererGeode & | operator= (RendererGeode &&) noexcept |
| Move assignment operator. | |
| void | setTargetTexture (wgpu::Texture texture) |
| Set a host-owned texture as the render target for subsequent frames. | |
| void | clearTargetTexture () |
| Clear a previously set target texture, reverting to internal offscreen targets allocated per-frame by beginFrame(). | |
| void | draw (SVGDocument &document) override |
| Renders the given SVG document. | |
| int | width () const override |
| Returns the rendered width in device pixels. | |
| int | height () const override |
| Returns the rendered height in device pixels. | |
| void | beginFrame (const RenderViewport &viewport) override |
| Begins a render pass with the given viewport. | |
| void | endFrame () override |
| Completes the current render pass, flushing any pending work. | |
| void | setTransform (const Transform2d &transform) override |
| Sets the absolute transform on the renderer, replacing the current matrix. | |
| void | pushTransform (const Transform2d &transform) override |
| Pushes a transform onto the renderer stack, composing with the current transform. | |
| void | popTransform () override |
| Pops the most recent transform from the renderer stack. | |
| void | pushClip (const ResolvedClip &clip) override |
| Pushes a clip path/mask onto the renderer stack. | |
| void | popClip () override |
| Pops the most recent clip from the renderer stack. | |
| void | pushIsolatedLayer (double opacity, MixBlendMode blendMode) override |
| Pushes an isolated compositing layer with the given opacity and blend mode. | |
| void | popIsolatedLayer () override |
| Pops the most recent isolated layer, compositing it with the given opacity. | |
| void | pushFilterLayer (const components::FilterGraph &filterGraph, const std::optional< Box2d > &filterRegion) override |
| Pushes a filter layer that applies the given filter graph to all content drawn within it. | |
| void | popFilterLayer () override |
| Pops the most recent filter layer. | |
| void | pushMask (const std::optional< Box2d > &maskBounds) override |
| Begins mask rendering. | |
| void | transitionMaskToContent () override |
| Transitions from rendering mask content to rendering masked content. | |
| void | popMask () override |
| Pops the mask layer stack, compositing the masked content. | |
| void | beginPatternTile (const Box2d &tileRect, const Transform2d &targetFromPattern) override |
| Begins recording content into a pattern tile. | |
| void | endPatternTile (bool forStroke) override |
| Ends pattern tile recording and sets the resulting tiled shader as the current fill or stroke paint. | |
| void | setPaint (const PaintParams &paint) override |
| Sets the active paint parameters used by subsequent draw calls. | |
| void | drawPath (const PathShape &path, const StrokeParams &stroke) override |
| Draws an arbitrary path using the current paint state. | |
| void | drawRect (const Box2d &rect, const StrokeParams &stroke) override |
| Convenience helper for drawing axis-aligned rectangles. | |
| void | drawEllipse (const Box2d &bounds, const StrokeParams &stroke) override |
| Convenience helper for drawing ellipses bounded by the provided box. | |
| void | drawImage (const ImageResource &image, const ImageParams ¶ms) override |
| Draws an image resource into the given target rectangle. | |
| void | drawText (Registry ®istry, const components::ComputedTextComponent &text, const TextParams ¶ms) override |
| Draws pre-shaped text with the provided paint parameters. | |
| std::unique_ptr< RendererInterface > | createOffscreenInstance () const override |
| Creates an independent offscreen renderer instance of the same type as this one. | |
| RendererBitmap | takeSnapshot () const override |
| Captures a CPU-readable snapshot of the current frame buffer for testing or downstream consumers. | |
| void | enableTimestamps (bool enabled) |
| Enable or disable GPU timestamp capture. | |
| FrameTimings | lastFrameTimings () const |
| Returns per-frame instrumentation for the most recently completed beginFrame→endFrame window. | |
Geode rendering backend — GPU-native via WebGPU + the Slug algorithm.
RendererGeode implements RendererInterface by translating draw calls into the lower-level donner::geode::GeoEncoder API.
| Mode | Constructor | Device ownership |
|---|---|---|
| Headless | RendererGeode(verbose) | Geode creates + owns device |
| Shared | RendererGeode(shared_ptr<GeodeDevice>) | Caller shares ownership |
In all modes, Geode creates its own offscreen render target each frame unless a host-owned target is set via setTargetTexture().
Host applications that already own a WebGPU device can:
If GeodeDevice::CreateHeadless() fails (no GPU available), all draw operations become no-ops and takeSnapshot() returns an empty bitmap.
|
explicit |
Construct the renderer.
Creates a headless GeodeDevice immediately; if device creation fails, the renderer enters a "no-op" state and all subsequent draw calls do nothing.
| verbose | If true, emit warnings to stderr for unsupported features the first time they are encountered. |
|
explicit |
Construct the renderer with an externally-owned GeodeDevice.
The caller retains shared ownership of the device; it must outlive every frame rendered through this renderer. This overload avoids creating a new WebGPU instance/adapter/device per renderer, which is important in test fixtures that construct thousands of short-lived renderers — Mesa llvmpipe (and some Intel ANV configurations) accumulate driver state across device creations and eventually deadlock.
| device | Shared device. Must not be null. |
| verbose | If true, emit warnings for unsupported features. |
|
overridevirtual |
Begins a render pass with the given viewport.
Implementations may allocate or reset backend-specific frame resources here.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Begins recording content into a pattern tile.
Content drawn between beginPatternTile and endPatternTile is captured as a repeating pattern.
| tileRect | The tile rectangle in pattern coordinate space. |
| targetFromPattern | Transform from pattern tile space to target element space. |
Implements donner::svg::RendererInterface.
|
nodiscardoverridevirtual |
Creates an independent offscreen renderer instance of the same type as this one.
Used for rendering sub-documents into intermediate pixmaps when a backend needs an isolated offscreen pass (e.g., for feImage with SVG content). Returns nullptr if offscreen rendering is not supported.
Reimplemented from donner::svg::RendererInterface.
|
overridevirtual |
Renders the given SVG document.
Implementations prepare the document, traverse the render tree, and emit drawing commands.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Convenience helper for drawing ellipses bounded by the provided box.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Draws an image resource into the given target rectangle.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Draws an arbitrary path using the current paint state.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Convenience helper for drawing axis-aligned rectangles.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Draws pre-shaped text with the provided paint parameters.
Implements donner::svg::RendererInterface.
| void donner::svg::RendererGeode::enableTimestamps | ( | bool | enabled | ) |
Enable or disable GPU timestamp capture.
No-op today; reserved for future work (design doc 0030, "Future Work"). When wired up, this will drive the renderPassNs / totalGpuNs fields of lastFrameTimings(). Counters (the primary regression signal) are always on regardless of this flag.
|
overridevirtual |
Completes the current render pass, flushing any pending work.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Ends pattern tile recording and sets the resulting tiled shader as the current fill or stroke paint.
| forStroke | If true, set the pattern as the stroke paint; otherwise as the fill paint. |
Implements donner::svg::RendererInterface.
|
nodiscardoverridevirtual |
Returns the rendered height in device pixels.
Implements donner::svg::RendererInterface.
|
nodiscard |
Returns per-frame instrumentation for the most recently completed beginFrame→endFrame window.
Valid after the first endFrame(); before then all fields are zero.
|
overridevirtual |
Pops the most recent clip from the renderer stack.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Pops the most recent filter layer.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Pops the most recent isolated layer, compositing it with the given opacity.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Pops the mask layer stack, compositing the masked content.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Pops the most recent transform from the renderer stack.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Pushes a clip path/mask onto the renderer stack.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Pushes a filter layer that applies the given filter graph to all content drawn within it.
| filterGraph | The filter graph describing primitives and their connections. |
| filterRegion | The filter region bounds in local coordinates, used to clip the filter output. If nullopt, the filter operates on the full surface. |
Implements donner::svg::RendererInterface.
|
overridevirtual |
Pushes an isolated compositing layer with the given opacity and blend mode.
Content drawn between pushIsolatedLayer and popIsolatedLayer is composited as a group at the specified opacity using the specified blend mode.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Begins mask rendering.
The driver renders the mask content between pushMask and transitionMaskToContent, then renders the actual content between transitionMaskToContent and popMask.
| maskBounds | Optional clip rect for the mask region. |
Implements donner::svg::RendererInterface.
|
overridevirtual |
Pushes a transform onto the renderer stack, composing with the current transform.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Sets the active paint parameters used by subsequent draw calls.
Implements donner::svg::RendererInterface.
| void donner::svg::RendererGeode::setTargetTexture | ( | wgpu::Texture | texture | ) |
Set a host-owned texture as the render target for subsequent frames.
When a target texture is set, beginFrame() renders into it instead of allocating an internal offscreen target. The texture must:
If the texture also has CopySrc usage, takeSnapshot() can read it back. If it lacks CopySrc, takeSnapshot() returns an empty bitmap.
The host retains ownership of the texture; it must remain valid from beginFrame() through endFrame(). Call clearTargetTexture() to revert to internal offscreen targets.
| texture | Host-owned render target texture. Must not be null. |
|
overridevirtual |
Sets the absolute transform on the renderer, replacing the current matrix.
Unlike pushTransform, this does not interact with the save/restore stack.
Implements donner::svg::RendererInterface.
|
nodiscardoverridevirtual |
Captures a CPU-readable snapshot of the current frame buffer for testing or downstream consumers.
The snapshot must remain valid after the render pass completes.
Implements donner::svg::RendererInterface.
|
overridevirtual |
Transitions from rendering mask content to rendering masked content.
Must be called between pushMask and popMask.
Implements donner::svg::RendererInterface.
|
nodiscardoverridevirtual |
Returns the rendered width in device pixels.
Implements donner::svg::RendererInterface.