|
|
Donner SVG 0.8.0-pre
SVG editor and embeddable C++20 engine.
|
Reusable helpers for uploading pixel data to a GPU texture and drawing it as a textured quad through GeodeImagePipeline. More...
#include "donner/svg/renderer/geode/GeodeTextureEncoder.h"
Classes | |
| struct | UniformAllocation |
| Borrowed uniform-buffer range for one blit uniform upload. The buffer field is a raw non-owning handle: the provider keeps it alive (see UniformScratch's contract below); holders must not retain the allocation beyond the current frame. More... | |
| class | UniformScratch |
| Interface for callers that pool blit uniform uploads into a per-frame scratch arena instead of creating one uniform buffer per blit. More... | |
| struct | QuadParams |
| Parameters for a single textured-quad draw call. More... | |
Public Types | |
| enum class | Filter : uint8_t { Linear , Nearest , Pixelated } |
| Filtering mode for drawTexturedQuad. More... | |
Static Public Member Functions | |
| static gpu::Texture | uploadRgba8Texture (const GeodeGpuContext &context, const uint8_t *rgbaPixels, uint32_t width, uint32_t height) |
| Upload a tightly packed RGBA8 pixel buffer to a freshly created sampled texture. | |
| static void | drawTexturedQuad (const GeodeGpuContext &context, const GeodeImagePipeline &pipeline, gpu::RenderPassEncoder &pass, const gpu::Texture &texture, const float mvp[16], uint32_t targetWidth, uint32_t targetHeight, const QuadParams ¶ms, GeodeTransientResources &resourceArena, UniformScratch *scratch=nullptr) |
| Record a textured-quad draw call into an already-open render pass. | |
Static Public Attributes | |
| static constexpr uint64_t | kUniformOffsetAlignment = 256u |
| Uniform-buffer binding offset alignment shared by the blit path and any UniformScratch implementation. 256 is the WebGPU default minUniformBufferOffsetAlignment; implementations that ever query a device limit instead must keep this constant in sync or blits fail binding validation on devices with a larger limit. | |
Reusable helpers for uploading pixel data to a GPU texture and drawing it as a textured quad through GeodeImagePipeline.
This is the piece drawImage and pattern tile rendering share. Both paths need:
Pattern rendering calls uploadRgba8Texture to move a rendered pattern tile into a sampled texture and then drawTexturedQuad to stamp that tile across the target region (with srcRect chosen to implement the patternContentUnits / patternUnits mapping).
The class is pure helpers - no mutable state. It's a class rather than free functions only to keep namespacing sensible.
| struct donner::geode::GeodeTextureEncoder::UniformAllocation |
Borrowed uniform-buffer range for one blit uniform upload. The buffer field is a raw non-owning handle: the provider keeps it alive (see UniformScratch's contract below); holders must not retain the allocation beyond the current frame.
| Class Members | ||
|---|---|---|
| BufferRef | buffer | |
| uint64_t | offset = 0 | |
| uint64_t | size = 0 | |
| struct donner::geode::GeodeTextureEncoder::QuadParams |
Parameters for a single textured-quad draw call.
destRect is in target-pixel space; the caller must bake the current model-view transform into targetFromLocal if the rect is authored in a different coordinate system. This keeps drawTexturedQuad agnostic about where the MVP lives in the larger renderer's state stack.
| Class Members | ||
|---|---|---|
| bool | applyMaskBounds = false | When true, output pixels outside maskBounds are discarded. Used to honour the <mask> element's x/y/width/height. |
| uint32_t | blendMode = 0 | SVG mix-blend-mode selector. 0 = plain source-over; 1..=16 map to the enumeration in donner::svg::MixBlendMode (Normal..Luminosity). When non-zero, dstSnapshotTexture must hold the parent render target's frozen content for the fragment shader to read as the backdrop. |
| const TextureView * | clipMaskView = nullptr | Path-clip mask view. When set, the image shader samples it in target-pixel space and gates the source content before any blend/mask compositing. Borrowed. |
| Box2d | destRect | Destination rectangle (in target-pixel space after applying targetFromLocal). |
| const Texture * | dstSnapshotTexture = nullptr | Frozen snapshot of the parent render target - see RendererGeode::popIsolatedLayer which copies the prior parent content into a separate texture before opening the blend blit pass. Ignored unless blendMode != 0. Borrowed. |
| Filter | filter = Filter::Linear | Sampling filter mode. |
| Box2d | maskBounds | Mask bounds in target-pixel space. Ignored unless applyMaskBounds is true. |
| uint32_t | maskMode = 0 | Mask coverage selector: 0 disables masking, 1 uses luminance, and 2 uses alpha. |
| const Texture * | maskTexture = nullptr | <mask> compositing input. Ignored unless maskMode is nonzero. Borrowed. |
| double | opacity = 1.0 | Overall opacity multiplier in [0, 1]. Combined with the sampled alpha inside the fragment shader. |
| double | pixelatedScaleX = 1.0 | Device-pixel scale per source texel for CSS pixelated sampling. |
| double | pixelatedScaleY = 1.0 |
|
| bool | sourceIsPremultiplied = false | Set when the source texture already stores premultiplied-alpha pixels. drawImage premultiplies ImageResource pixels before upload, and offscreen render targets blitted during popIsolatedLayer / pattern compositing are already premultiplied. Both paths set this flag to avoid a second premultiplication that darkens the RGB channel. Straight-alpha callers leave the default false so the shader premultiplies on output. |
| Box2d | srcRect = Box2d({0.0, 0.0}, {1.0, 1.0}) | Source UV rectangle in [0,1] × [0,1]. Default = entire texture. |
|
strong |
Filtering mode for drawTexturedQuad.
|
static |
Record a textured-quad draw call into an already-open render pass.
The caller must:
Allocates a bind group per call (retained in resourceArena until the caller finishes the enclosing command encoder). The uniform upload either goes into scratch when provided (one buffer create on arena growth instead of one per blit) or into a fresh per-blit buffer on the legacy path.
| resourceArena | Scoped owner for GPU handles created by the draw. |
| scratch | Optional pooled uniform scratch (see UniformScratch). |
|
static |
Upload a tightly packed RGBA8 pixel buffer to a freshly created sampled texture.
Alpha interpretation is carried by the draw parameters.
Texture writes carry a 256-byte row pitch. This function handles the case where the source buffer's row stride (width * 4) is not 256-aligned by copying rows into a padded staging buffer before the upload.
Returns an empty texture if width, height, or rgbaPixels are invalid.
| context | The recording context providing the GPU runtime device. |
| rgbaPixels | RGBA8 pixels in row-major order. Must contain at least width * height * 4 bytes. |
| width | Image width in pixels. Must be > 0. |
| height | Image height in pixels. Must be > 0. |