Commit Graph

562 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
Sebastian cb4eb597c3
update pdf stuff (#552) 2024-02-14 16:32:57 +00:00
bors-servo c8ae2aa61e
Auto merge of #494 - doggo-ninja:extremely-minor-fixes, r=jdm
Extremely minor fixes

Only doing this to remedy a very minor annoyance of mine. These are not major (or even very helpful) changes by any measure.

- Removes an unneeded `use` statement
- Fixes a [deprecated](https://doc.rust-lang.org/nightly/edition-guide/rust-2021/panic-macro-consistency.html) use of `panic!`
2022-03-27 23:16:50 -04:00
Felix Mattick cea5218dc7
Extremely minor fixes
Only doing this to remedy a very minor annoyance of mine. These are not major (or even very helpful) changes by any measure.

- Removes an unneeded `use` statement
- Fixes a [deprecated](https://doc.rust-lang.org/nightly/edition-guide/rust-2021/panic-macro-consistency.html) use of `panic!`
2022-02-05 17:33:00 -06:00
Sebastian K 3ade212b3f update pdf_render 2022-01-24 20:10:14 +03:00
Patrick Walton 94174b81c9 Fix warnings 2020-07-15 13:12:55 -07:00
Sebastian K dec6fa05f0 Merge branch 'master' of https://github.com/servo/pathfinder into PR-pdf 2020-07-07 22:13:57 +03:00
Sebastian K fa47d5a181 initial PDF support 2020-07-06 22:34:42 +03:00
Patrick Walton a49714e0ba Flesh out the `web_canvas` crate a bit more 2020-07-06 11:01:38 -07:00
Sebastian K 8d866bc9c8 initial PDF support 2020-07-04 17:01:21 +03: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 3e64e29fb2 Rename `BuiltSVG` to `SVGScene` 2020-06-24 17:35:43 -07:00
Patrick Walton 423a91ea1a Update the demo for the D3D11 backend 2020-06-23 13:15:59 -07:00
Veedrac faea46b9f6 Fix non-integer HiDPI support in demo 2020-05-11 13:14:54 +01:00
Patrick Walton 41c0c5f071 Upgrade to the latest master surfman 2020-05-08 12:47:58 -07:00
Patrick Walton e4edb23360
Merge pull request #322 from pcwalton/surfman-x11
Switch to using surfman in X11 mode.
2020-05-08 12:45:32 -07:00
Patrick Walton 90fb36f199 Switch to using surfman in X11 mode.
Partially addresses #310.
2020-05-08 12:22:46 -07: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 520817e909 Add OpenGL 4.3 support to the GL backend, enabling compute shader on
non-Metal platforms
2020-05-07 16:33:03 -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 da2f65ddf4 Fix `surfman` reference in `Cargo.toml` 2020-04-30 15:04:49 -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 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 eb2b622615 Remove `draw_render_target()` in favor of the standard tile-based rendering
path
2020-04-03 13:05:53 -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 93f5fbc6d2 Add convenience constructors: `vec2f`, `vec2i`, `Vector2F::zero()`,
`Vector2I::zero()`
2020-03-31 11:29:21 -07:00
Patrick Walton 9723fa441b Update `image`, `glutin`, and `jni` crates.
From #277.
2020-03-27 15:49:26 -07: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
Adam Nemecek 3d39c5e9b7 trimmed whitespace 2020-02-27 08:13:14 -08:00
Patrick Walton 67d12adb6c Replace layers with render targets, which can be used as patterns.
This allows us to efficiently handle a lot of workloads that require multiple
HTML canvases, without CPU readback. For example, you can render paths to a
render target, then turn that render target into a repeating pattern that you
fill other paths with. Or you can render paths to a render target and then
composite that render target as a whole with a blend mode.

This introduces a new `DrawRenderTarget` render command that blits a render
target without any paths involved. This is basically just a hack that works
around the fact that our tiled renderer doesn't yet support effects that widen
the ink region (i.e. blurs). It can be removed once we have that support.
2020-02-21 22:14:18 -08:00
Patrick Walton 16a2de88df Rename "postprocessing" to "effects" and start initial work on composite ops 2020-02-20 14:22:07 -08:00
Patrick Walton d9e994e46d Transition the existing postprocessing system to a layers system.
This is preparatory work for composite ops and blurs.

Closes #261.
2020-02-20 11:21:45 -08:00
Patrick Walton 31becb1570 Flatten objects' tiles ourselves instead of having Rayon do it.
A prerequisite for clips.
2020-02-14 21:20:19 -08:00
Patrick Walton 5a21557a6d Implement basic linear gradients.
This is not a very efficient implementation yet, but it seems to work.
2020-02-10 16:01:05 -08:00
Patrick Walton 740597d886
Merge pull request #254 from arturoc/remove-log-restriction
Remove log restriction
2020-02-06 08:38:08 -08:00
Emmanuel Gil Peyrot 6ce416e77c Bump all outdated dependencies
I’m pleasantly surprised that none of these required any (visible) code
change, but tests pass so let’s go with that. :)
2020-02-06 09:39:50 +01:00
Patrick Walton b269723254 Switch to per-pixel texture lookup for paints.
This is a prerequisite for supporting gradients and images.
2020-02-04 21:50:13 -08:00
Patrick Walton 2db43797c3 Split colors out into their own crate.
A lot of downstream consumers of `pathfinder_gpu` want to use colors without
the path stuff.
2020-01-31 09:17:04 +01:00
Arturo Castro 3be6d70577 remove log restrictions from renderer, demo/common and gl crates 2020-01-28 15:24:21 +01:00
Patrick Walton ce3b40cd5c Make timer queries and framebuffer readback async 2020-01-07 13:03:15 -08:00
Sebastian K e38e2d800f update usvg to 0.8 2019-12-28 11:46:31 +03:00
Patrick Walton 0662f6433f Allow any texture format to be uploaded; fix Metal compilation on newer rustcs 2019-12-20 11:48:51 -08:00
Patrick Walton 521ab3b5ba Add a 3D vector type 2019-12-07 11:52:35 -08:00
Patrick Walton 437eda96da Overload `*` between transforms and points 2019-07-12 11:55:01 -07:00
Patrick Walton 2c984de1ea Add convenience translation, rotation, and scaling methods to `Transform2D` 2019-07-12 11:34:48 -07:00
Patrick Walton 1eb28a5539 Fix incorrect definition of 2D transform multiplication 2019-07-12 11:26:09 -07:00
Patrick Walton 96758dfc17 Add `rotate` and `scale` methods to `Transform4F` 2019-07-11 15:57:45 -07:00
Patrick Walton 3f91206d57 Add a `translate` method to 3D transforms 2019-07-11 15:44:01 -07:00
Patrick Walton bcac119324 Rename `Transform2DF` to `Transform2F` and `Transform3DF` to `Transform4F` 2019-07-11 14:59:10 -07:00
Patrick Walton 55825cbc6a Switch scale and translation constructors for `Transform3DF` over to use vectors 2019-07-11 14:58:45 -07:00
Patrick Walton eb0a61679d Use operator overloading for 3D matrix multiplication 2019-07-11 13:59:39 -07:00
Patrick Walton 4cdded74b4 Fix SVG export in the demo; update `Cargo.lock` 2019-06-25 11:32:26 -07:00
Patrick Walton 431dcf3d2e Rename `pathfinder_geometry::basic` to simply `pathfinder_geometry`, and move
the remaining code in that crate to a new crate, `pathfinder_content`

The old hierarchy was confusing.
2019-06-21 10:06:19 -07:00
Patrick Walton 010bc66073 Upgrade `resvg` to 0.7 2019-06-20 17:13:15 -07:00
Patrick Walton 71623eaab3 Make Metal dependencies in the demo Mac-only 2019-06-20 12:34:55 -07:00
Patrick Walton 487577a11b Add Metal support.
This commit substantially reworks the `pathfinder_gpu` API to better support
modern APIs like Metal. It should open the door to `gfx-rs`, `wgpu`, Vulkan,
and D3D12 backends relatively straightforwardly.

A new example, `canvas_metal_minimal`, has been added.

Note that the new Metal shaders require a patched version of `spirv-cross` to
build properly. An upstream patch is forthcoming.
2019-06-20 11:47:22 -07:00
Patrick Walton 5c5fe00b27 Fix build problem 2019-06-17 13:16:03 -07:00
Alan Jeffrey a507e1955e Set the scene transform by linear iterpolation of the eye transforms 2019-06-07 12:02:30 -05:00
Alan Jeffrey 005e7d3835 Set the scene transform to be one of the eye transforms 2019-06-07 10:15:34 -05:00
Alan Jeffrey 3c91c1cc97 Better error handling of magicleap demo args 2019-06-07 10:15:34 -05:00
Alan Jeffrey d877ca1d3a Fix the magicleap app to work in LuminOS 0.96 2019-06-06 12:36:32 -05:00
Alan Jeffrey 9c641f6ce3 Renamed Point2D to Vector2 2019-06-03 17:58:34 -05:00
Alan Jeffrey c71a20805f Removed some unused imports 2019-06-03 17:52:18 -05:00
Alan Jeffrey 848234ef61 Updated magicleap demo for new pathfinder API 2019-06-03 17:52:18 -05:00
Alan Jeffrey a2c8d71a3f Rayon's thread builder API requires ownership 2019-06-03 17:52:18 -05:00
Alan Jeffrey f5b5843c31 Make demo camera Mode public 2019-06-03 17:52:18 -05:00
Alan Jeffrey 635d3bc1f3 Call make_current(eye) when rendering for each eye. 2019-06-03 17:52:18 -05:00
Patrick Walton a1b0df0a42 Rename `Point2DF` to `Vector2F`, `Point3DF` to `Vector4F`, and `LineSegmentF`
to `LineSegment2F`.

Straw poll on Twitter suggested that these names were preferred.
2019-06-03 12:39:29 -07:00
Patrick Walton e1bcc11ace Change the `F32` and `I32` suffixes to `F` and `I` to match the C API.
They're shorter and less noisy.
2019-05-29 19:17:16 -07:00
Patrick Walton acf666b701 Stop using triangle fans for DX12/Vulkan compatibility.
Closes #165.
2019-05-29 16:04:33 -07:00
Patrick Walton 7a02b78b3d Explicitly specify color texture coordinates for alpha and solid tiles.
This is groundwork for gradients and images.

This commit also refactors the interface for vertex attributes to use named
parameters (via structs), for clarity.
2019-05-14 15:11:04 -07:00
Patrick Walton 89ca998fa8 Add a convenience method for creating a scene proxy with an empty scene.
This makes animation rendering loops a bit easier for users.
2019-05-13 18:29:57 -07:00
Patrick Walton c09ef3ae7c Fix SVG and demo compilation errors 2019-05-13 18:19:10 -07:00
Patrick Walton b557cdf20f Add an "actual size" button in the demo 2019-05-08 11:05:31 -07:00
Patrick Walton 7b8c44575e Turn the zoom buttons into a segmented control 2019-05-08 10:50:55 -07:00
Patrick Walton 940605fbb5 Generalize `draw_image_switch` to multiple segments 2019-05-08 10:38:12 -07:00
Patrick Walton 0d25fd0eab Generalize "switch" to "segmented control" in the UI 2019-05-08 10:27:32 -07:00
Patrick Walton 54672f2089 Add "save as SVG" support to the demo.
This is intended to help diagnose rendering problems, by allowing export to a
format that can be minimized and in which issues can be reproduced.
2019-05-07 14:37:46 -07:00
Patrick Walton b198c06968 Properly account for concurrency in the performance measurement 2019-05-07 13:43:37 -07:00
Patrick Walton 15f63df844 Rename `DebugUI` to `DebugUIPresenter` and `UI` to `UIPresenter` 2019-05-06 15:36:39 -07:00
Patrick Walton 78908c5e3c Factor the demo UI into model and presenter 2019-05-06 15:25:58 -07:00
Patrick Walton 9de7d95d33 Start a simple HTML canvas-like API, and add a minimal example to show how to
use it.
2019-05-03 14:15:38 -07:00
Patrick Walton 4a4011d303 Refactor the demo some more.
Move rendering code into its own module and split up `finish_drawing_frame()`.
2019-05-02 18:24:38 -07:00
Patrick Walton 29b137c81d Move the demo camera code into its own module 2019-05-02 17:47:09 -07:00
Patrick Walton 5e64876579 Simplify gridlines in the demo shader 2019-05-02 14:12:13 -07:00
Patrick Walton 66b5142334 Stop trying to use jemalloc on Windows.
Closes #138.
2019-05-02 11:12:33 -07:00
Patrick Walton 5c5e4e9313 Factor the scene thread out of the demo and into the renderer proper.
This simplifies Pathfinder's API considerably. Now users get off-main-thread
scene building "for free".
2019-05-01 17:12:25 -07:00
Patrick Walton a96ee73da6 Introduce an Executor abstraction to enable alternatives to Rayon 2019-04-30 15:17:07 -07:00
Patrick Walton 60b951409c Run `rustfmt` on the demos 2019-04-29 16:52:37 -07:00
Patrick Walton 8606cd013e Replace commented out printlns with proper debug statements 2019-04-29 16:43:24 -07:00
Patrick Walton d06746f28d Remove barrel distortion.
It was a toy implementation and isn't the approach I want to go with.
2019-04-29 16:05:42 -07:00
Patrick Walton b85dc2f001 Add basic pinch zoom support on Android 2019-04-26 22:29:38 -07:00
Patrick Walton 6c31e1bc01 In VR mode, render one eye and then reproject to both eyes instead of rendering
twice.

This reduces both CPU and GPU time a lot in exchange for a small loss in
quality.
2019-04-26 17:22:54 -07:00
Alan Jeffrey 3d81bf170f Updated to latest pf3 API 2019-04-22 11:57:24 -05:00
Alan Jeffrey c549bdec7a Explicitly set the linker flavor for the magicleap demo 2019-04-22 11:54:42 -05:00
Patrick Walton 58d55c5eaa Allow rendering to non-default framebuffers 2019-04-18 19:05:01 -07:00
Patrick Walton 62a3fefca4 Reenable the tile and fill counts in the debug display 2019-04-18 15:09:37 -07:00
Patrick Walton c688d04412 Remove the scene assembly thread, and pipeline only fills instead of alpha
tiles.

Removing a thread should make it easier to manually assign threads to CPUs, as
is necessary on devices with poor schedulers like Magic Leap 1.
2019-04-18 13:50:26 -07:00