Commit Graph

259 Commits

Author SHA1 Message Date
Michael Pfaff 5e41738e4c Improve C API
I ran `cargo fmt` on the project, which in hindsight was a poor choice.
I'm not correcting it right now.
2024-08-09 03:17:33 -04:00
Michael Pfaff ca750dda7b Try to optimize 2024-06-22 16:58:25 -04:00
floppyhammer 6f66a7f0e9 Don't use hardcoded bin workgroup size 2022-03-29 11:14:31 +08:00
5225225 1df5537940 Fix links in docs, fix/ignore some doctests 2022-02-08 20:49:40 +00:00
Sebastian 9909e44f23
fix #428
This avoids an edgecase where presumably some floating point rounding error results in predicting a `to_tile_coords` that isn't actually stepped on, causing the loop to loop forever.
2021-10-24 22:58:11 +03:00
Patrick Walton 441051a8ac Remove the cap on the number of iterations when tiling.
This could trigger spuriously for very long lines outside the view box. It
still indicates potential performance problem, but we shouldn't crash at least.

Closes #416.
2020-07-28 12:56:40 -07:00
Patrick Walton 41ad372253 Clip line segments before tiling them.
This reduces pathological behavior from very large off-screen segments.

Part of #416.
2020-07-28 12:56:05 -07:00
Patrick Walton 31abe4bb52 Initialize resized mask textures to rgba(0, 0, 0, 0), not rgba(0, 0, 0, 1).
Partially addresses #405.
2020-07-27 17:07:13 -07:00
Patrick Walton 444cae2b72 Add 1px of texture border around non-repeating image patterns.
Closes #401.
2020-07-27 13:44:59 -07:00
Sebastian K dd0ac124d8 Add ColorMatrix filter 2020-07-23 12:46:59 -07:00
Patrick Walton c24fdf318d Document `pathfinder_content` more 2020-07-15 17:58:44 -07:00
Patrick Walton 94174b81c9 Fix warnings 2020-07-15 13:12:55 -07:00
Patrick Walton bb89f52d39 Cache images from frame to frame.
Images are cached for one frame; if they are not used the next frame, they're
freed.
2020-07-15 12:36:52 -07:00
Patrick Walton e2e3ec7e21 Document the `pathfinder_content::outline` module 2020-07-14 12:08:00 -07:00
Patrick Walton 26bf6cce4e Document the remainder of the `pathfinder_renderer` API 2020-07-13 19:24:32 -07:00
Patrick Walton 3d9b5509ba Add API docs for the renderer and associated types 2020-07-13 16:18:23 -07:00
Patrick Walton 2b69ff778f Implement gradient wrap/spread modes in SVG.
Closes #386.
2020-07-13 12:36:45 -07:00
Patrick Walton a49714e0ba Flesh out the `web_canvas` crate a bit more 2020-07-06 11:01:38 -07:00
Patrick Walton e54e0e4760 Start a new `web_canvas` crate, for usage in the browser as a `<canvas>` replacement 2020-07-04 09:33:49 -07:00
Patrick Walton 5f8fcbeac2 Fix WebGL, and add a simple example of WebGL usage 2020-07-02 19:49:09 -07:00
Patrick Walton 13ae83d6c5 Combine the Z-buffer and fill indirect draw params buffers to reduce the number
of SSBO bindings.

Apparently Mesa RadeonSI drivers have a limit of 8 SSBOs.

Closes #373.
2020-07-02 11:57:45 -07:00
Patrick Walton 37c3c62762 Implement nested SVG clip paths in the D3D11 backend.
Partially addresses #372.
2020-07-01 18:26:24 -07:00
Patrick Walton 42289eec6e Fix Metal memory management and the `canvas_metal_minimal`, `canvas_nanovg`,
and `macos_app` examples.

`winit` does not create an autorelease pool, so the Metal backend had not taken
the presence of one into account. Now the Metal backend creates and flushes
autorelease pools as necessary.

Closes #334.
Closes #376.
2020-06-29 12:48:49 -07:00
Patrick Walton e16f0a045e Turn off timer queries if the debug UI is off.
Closes #360.
2020-06-25 11:06:17 -07:00
Patrick Walton 13b2c91dde Update the scene proxy 2020-06-23 13:15:59 -07:00
Patrick Walton f92c631f97 Rework the tile builder for D3D11 2020-06-23 13:15:59 -07:00
Patrick Walton 17356311d6 Rework renderer options 2020-06-23 13:15:59 -07:00
Patrick Walton 7a996d330c Update `pathfinder_renderer::{paint, scene}` 2020-06-23 13:15:59 -07:00
Patrick Walton df15c855c4 Significantly rework the GPU renderer for the D3D11 backend 2020-06-23 13:15:59 -07:00
Patrick Walton 58a76f0f16 Update `gpu_data` 2020-06-23 13:15:59 -07:00
Patrick Walton 385272851a Remove the separate `z_buffer` module 2020-06-23 13:15:59 -07:00
Patrick Walton 23c171fb6f Refactor GPU a bit more 2020-06-23 13:15:59 -07:00
Patrick Walton 661da5e12b Refactor GPU performance measurement 2020-06-23 13:15:59 -07:00
Patrick Walton 61833168e5 Update the debug UI 2020-06-23 13:15:59 -07:00
Patrick Walton ff7c13c8fb Add a new compute-based D3D11 backend 2020-06-23 13:10:06 -07:00
Patrick Walton 754a44ae22 Rename the existing renderer to `d3d9` in preparation for the D3D11 branch 2020-06-23 13:10:05 -07:00
bors-servo 0f35009215
Auto merge of #342 - pcwalton:listener-lifetime, r=pcwalton
Don't restrict render command listeners to the static lifetime
2020-05-16 14:05:57 -04:00
Sebastian K 18d2b006ac Don't restrict render command listeners to the static lifetime 2020-05-16 10:47:06 -07:00
Patrick Walton 13f9fdc96c Use SIMD a bit more in the new tiling code. 2020-05-16 10:38:34 -07:00
Patrick Walton 6ed3237b10 Remove path rect clipping, since it's no longer required 2020-05-15 19:13:18 -07:00
Patrick Walton 37c993eee6 Remove monotonic conversion, since it's no longer required 2020-05-15 19:12:46 -07:00
Patrick Walton a67b4dd5b7 Replace the tiling algorithm with the one from "Random Access Vector Graphics".
This is a significant improvement in CPU time, as well as an overall
simplification.
2020-05-15 19:10:12 -07:00
Patrick Walton 8808bfda63
Merge pull request #337 from pcwalton/macos-radeon
Associate texture parameters in shaders with specific texture units, to work around a macOS Radeon driver bug.
2020-05-12 22:08:12 -07:00
Patrick Walton ef0c0e0679 Associate texture parameters in shaders with specific texture units, to work
around a macOS Radeon driver bug.

Also, ensure there is always a dummy texture bound to every parameter in the
OpenGL backend.

These together stop the macOS Radeon drivers from recompiling the shader on
every drawcall.

Possibly addresses #300.
2020-05-12 21:40:38 -07:00
Veedrac 6d8a89b8c5 Cleanup: remode redundant ops in tiles.rs 2020-05-11 21:47:39 +01:00
Veedrac 1c48e8900e Faster sorting strategy, remove SortedVector
point_queue is only sorted by y coordinate to coordinate
work to one strip at a time. This is more efficiently handled
by punting later work into a next_point_queue,
and never explicitly sorting the data.

active_edges is only sorted by x coordinate for the tile-by-tile
work in process_old_active_edges. It is much more efficient
to sort once inside that function.
2020-05-11 21:47:35 +01:00
Patrick Walton 2421de6616 Enable compute shader by default if the OpenGL version is high enough. 2020-05-08 12:16:31 -07:00
Patrick Walton 6299d2c36b Clear the canvas to the background color if no drawing command did so.
Closes #318.
2020-05-07 21:36:13 -07:00
Patrick Walton 478008dcf0 Use all four channels in the mask texture.
Each bundle of four pixels on a scanline is packed into the RGBA channels of
the mask texture. The area LUT is also expanded to be RGBA so that four pixels'
worth of areas can be looked up at once.

Nice improvement on `paris-30k` from MPVG.

Closes #262.
2020-05-05 13:11:37 -07:00
Patrick Walton f8405d81c0 Bump the number of fills per batch up 2020-05-04 20:01:08 -07:00
Patrick Walton 6407bf5871 Reduce the size of buffers 2020-05-04 20:01:08 -07:00
Patrick Walton d0842f2f4d Generalize the buffer allocator to support multiple size classes, and use it
for tile compositing too.
2020-05-04 15:48:47 -07:00
Patrick Walton ac83f79d94 Add a compute shader path, optimize GPU memory management, and switch from SDL
to `surfman`.

This is a large commit; explanations of each change follow.

This adds an optional compute shader path, off by default, for rendering fills
to alpha masks. It usually does not improve performance at present, but it
provides a good baseline for further optimizations. Later improvements will
likely aim to avoid writes to the mask texture entirely. Supporting
infrastructure for compute shader has been added to `pathfinder_gpu` for the
OpenGL and Metal backends.

The Metal backend has been optimized to avoid unneccessary buffer allocations
and reflection. As part of this, argument buffers have been removed, as the
current SPIRV-Cross compiler no longer requires them.

The GPU renderer has been improved to avoid stalls. Now, separate buffers are
allocated for each fill batch and for each frame. This can be extended in the
future to allow for separate buffers for tile draw operations as well.

SDL usage has been removed in favor of the native Rust `surfman` and `winit`.
Because `surfman` allows for selection of the integrated GPU on multi-GPU
system, it is chosen by default. The demo supports a new
`--high-performance-gpu` option to opt into the discrete GPU.
2020-04-30 13:33:29 -07:00
Patrick Walton 84bf4341c2 Micro-optimize line fill primitive generation to avoid calls to `floorf()` and
`ceilf()`
2020-04-23 18:35:17 -07:00
Patrick Walton 24deb36e9a Supply solid tiles with the appropriate filter.
Fixes `embrace.svg` in MPVG.
2020-04-22 12:53:35 -07:00
Patrick Walton 104869a6e9 Move the mask enable flag to the tile to reduce drawcall count 2020-04-22 11:04:16 -07:00
Patrick Walton cd09177ead Implement the infrastructure needed to support multiple clip paths.
This also lays the groundwork needed to reduce batch breaks between solid and
alpha tiles.
2020-04-21 18:25:20 -07:00
Patrick Walton 564533ff29 Switch from Rust MPSC channels to `crossbeam-channel`.
7x performance improvement in contour.svg from MPVG!
2020-04-21 09:57:47 -07:00
Patrick Walton 6c996981a3 Fix some transform issues and implement transformed radial gradients in SVG.
In particular, this fixes the usvg-to-Pathfinder transform conversion and the
definition of `Transform2F::row_major()`.

Makes `drops.svg` from the MPVG samples work.
2020-04-20 16:40:02 -07:00
Patrick Walton 5819b8dc60 Stop reallocating texture pages every frame 2020-04-17 11:50:46 -07:00
Patrick Walton 07ce2a2536 Add a scene field to render target IDs to reduce the chance of misuse 2020-04-16 16:54:52 -07:00
Patrick Walton afe1a64f68 Allow multiple tile pages.
Closes #151.
2020-04-15 20:13:37 -07:00
Patrick Walton cdbe2fbb6b Introduce the concept of a base color in order to handle canvas shadow alpha
correctly
2020-04-13 18:31:25 -07:00
Patrick Walton 47919db8f3 Fix frame time measurement in the GL backend, and add it to the NanoVG demo 2020-04-09 17:49:28 -07:00
Patrick Walton 895f73096e Switch back to instanced drawing for tiles.
Improves tile build time by something around 2x in the NanoVG demo.
2020-04-08 17:16:54 -07:00
Patrick Walton eb2b622615 Remove `draw_render_target()` in favor of the standard tile-based rendering
path
2020-04-03 13:05:53 -07:00
Patrick Walton cd37791d72 Implement the `drawImage()` method on canvas.
Closes #223.
2020-04-02 16:30:49 -07:00
Patrick Walton ba7fe4be39 Add the ability to merge scenes together, and expose it to the canvas API.
Closes #268.
2020-04-02 14:04:58 -07:00
Sebastian K 29c6a2e428 Transform paints by the render transform 2020-04-02 11:17:03 -07:00
Patrick Walton 794dd55038 Add some implicit conversions between scalars and vectors where appropriate 2020-04-01 17:20:32 -07:00
Patrick Walton 3d71703950 Stop copying images every frame on CPU.
We can avoid reuploading them to the GPU every frame as well, but this is a
bigger, and easier, win for now.
2020-04-01 13:01:08 -07:00
Patrick Walton bf2fd6569b Fix tests 2020-03-31 17:17:25 -07:00
Patrick Walton 32a56eab85 Stop leaking textures and framebuffers in the OpenGL backend.
Closes #264.

Possibly addresses #286.
2020-03-31 17:14:28 -07:00
Patrick Walton 2f6071c059 Make solid tiles not use mask 1.
Fixes random garbage appearing in the thumbnails in the NanoVG demo.
2020-03-31 14:16:04 -07:00
Patrick Walton 93f5fbc6d2 Add convenience constructors: `vec2f`, `vec2i`, `Vector2F::zero()`,
`Vector2I::zero()`
2020-03-31 11:29:21 -07:00
Patrick Walton a1f0ae097a Add thumbnail images to the NanoVG demo 2020-03-30 16:18:41 -07:00
Patrick Walton 7b53cc6731 Close all subpaths right before filling them.
Closes #269.
2020-03-27 14:50:02 -07:00
Patrick Walton 55df287fec Move radial gradients from the CPU to the GPU 2020-03-26 21:24:20 -07:00
Patrick Walton 0c93045f50 Replace the individual tile shaders with an ubershader 2020-03-25 21:59:51 -07:00
Patrick Walton 0f5de612f9
Merge pull request #281 from zimond/master
Use instant crate to build for wasm32 target
2020-03-09 17:17:09 -07:00
Patrick Walton 0b0c45a49a Collapse linear gradients down to a single 256x1 sliver instead of a 256x256
square
2020-03-05 16:58:26 -08:00
Patrick Walton 2548ab853a Unify solid tiles and render target tiles.
This commit also removes old shaders from the manifest.
2020-03-05 12:22:01 -08:00
Patrick Walton 9935c9fdff Don't distinguish between render targets and other images in the texture atlas
allocator
2020-03-04 19:41:24 -08:00
Patrick Walton a8f7438cd9 Remove transforms from paths.
Paints aren't scale-invariant when rendered into the texture atlas, so they
actually do need individual transforms.
2020-03-04 16:28:21 -08:00
Patrick Walton 27357a23d3 Separate the `AddPaintData` render command into different subcommands 2020-03-04 15:50:53 -08:00
Patrick Walton e50039f4c2 Create framebuffers for every texture page 2020-03-04 12:35:07 -08:00
Patrick Walton a3736859ba Rename "paint texture" to just "texture page" 2020-03-04 12:09:08 -08:00
乌戈 22f9c3bf6e Use instant crate to build for wasm32 target 2020-03-05 01:54:36 +08:00
Patrick Walton d0f4579864 Move `RenderTargetId` out of the `pattern` module 2020-03-03 15:50:48 -08:00
Patrick Walton 2beb2bb126 Apply path transforms to paints 2020-03-03 14:26:38 -08:00
Patrick Walton 12574101e5 Add a transform field to `DrawPath`.
This is currently applied to the outline and should eventually be applied to
paints as well.
2020-03-03 11:18:01 -08:00
Patrick Walton 468848086a Use the paint texture uniform belonging to the appropriate program 2020-03-03 10:56:32 -08:00
Patrick Walton f607b607b0 Composite render targets using tiles, taking the Z-buffer into account.
We can do more tile-based optimization, but this should be enough to ensure a
correct rendering.

This temporarily breaks subpixel AA, but it should be fixable by modifying
`blur.fs.glsl`.

Closes #271.
2020-03-02 20:10:10 -08:00
Patrick Walton 0f35d9c817 Add an embedded resource loader that places resources directly in the binary.
This is useful for WebGL and for downstream crates.io use.
2020-02-28 17:10:53 -08:00
Patrick Walton 40bb1b412c Implement radial gradients along a line, following Pixman. 2020-02-27 16:24:10 -08:00
Adam Nemecek 3d39c5e9b7 trimmed whitespace 2020-02-27 08:13:14 -08:00
Patrick Walton e913f83eee Remove obsolete TODOs 2020-02-27 04:03:08 -08:00
Patrick Walton 3a014d78eb Implement a blur filter for canvas shadows 2020-02-26 18:43:41 -08:00
Patrick Walton d1c7da8bd2 Implement pattern repeating and image smoothing control 2020-02-26 14:56:05 -08:00
Patrick Walton 77b3555828 Separate opacity out from paint.
This allows `globalAlpha` to work on render targets.
2020-02-26 12:43:07 -08:00