Donner SVG 0.8.0-pre
SVG editor and embeddable C⁠+⁠+⁠20 engine.
Loading...
Searching...
No Matches
donner::geode::GeodeTextureEncoder Class Reference

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 &params, 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.

Detailed Description

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:

  1. Get an RGBA8 pixel buffer to the GPU as a sampled texture.
  2. Draw it into an open render pass at a specific destination rectangle, honoring the current transform and an opacity factor.

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.


Class Documentation

◆ donner::geode::GeodeTextureEncoder::UniformAllocation

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

◆ donner::geode::GeodeTextureEncoder::QuadParams

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
See also
pixelatedScaleX
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.

Member Enumeration Documentation

◆ Filter

enum class donner::geode::GeodeTextureEncoder::Filter : uint8_t
strong

Filtering mode for drawTexturedQuad.

Enumerator
Linear 

Bilinear filtering. Default for SVG image-rendering: auto.

Nearest 

Nearest-neighbor filtering for crisp-edges and explicit pattern sampling.

Pixelated 

Integer nearest-neighbor scaling followed by smooth scaling.

Member Function Documentation

◆ drawTexturedQuad()

void donner::geode::GeodeTextureEncoder::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 & params,
GeodeTransientResources & resourceArena,
UniformScratch * scratch = nullptr )
static

Record a textured-quad draw call into an already-open render pass.

The caller must:

  • Have already called pass.setPipeline(pipeline.pipeline()) OR be OK with the draw switching the pipeline (we call SetPipeline internally to keep this helper self-contained).
  • Provide an MVP matrix built the same way as GeoEncoder::Impl::buildMvp (target-pixel → clip space, composed with the model-view transform).

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.

Parameters
resourceArenaScoped owner for GPU handles created by the draw.
scratchOptional pooled uniform scratch (see UniformScratch).

◆ uploadRgba8Texture()

gpu::Texture donner::geode::GeodeTextureEncoder::uploadRgba8Texture ( const GeodeGpuContext & context,
const uint8_t * rgbaPixels,
uint32_t width,
uint32_t height )
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.

Parameters
contextThe recording context providing the GPU runtime device.
rgbaPixelsRGBA8 pixels in row-major order. Must contain at least width * height * 4 bytes.
widthImage width in pixels. Must be > 0.
heightImage height in pixels. Must be > 0.

The documentation for this class was generated from the following file: