Commit Graph

110 Commits

Author SHA1 Message Date
Patrick Walton 3ad1c25796 Implement the even-odd fill rule 2020-02-17 14:44:48 -08:00
Patrick Walton 677c607a8c Get clips working for canvas 2020-02-16 13:45:15 -08:00
Patrick Walton a8019a1a1a Fix mask positioning on OpenGL 2020-02-15 18:00:25 -08:00
Patrick Walton 631e16ce9b Fix flipped Y axis in mask texture positioning 2020-02-15 14:08:22 -08:00
Patrick Walton 0883f54e2d Add a separate mask blit step, in preparation for supporting clips.
We can elide this in the future if there are no clips, but it isn't a huge
performance regression right now, so let's just unconditionally do it.
2020-02-14 21:56:43 -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 a66ed4c073 Specify tile texture coordinates as an affine transform.
Part of the groundwork for gradients.
2020-02-05 13:59:32 -08: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 222fa89b23 Use a 3D transform in the tile vertex shaders.
This opens the door to caching tiles at different zoom levels (issue #191).
2019-06-25 11:32:39 -07:00
Patrick Walton d86ff9011a Update the postprocessing shader and vertex array for the Metal changes.
Closes #201.
2019-06-21 18:04:18 -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 9f9233c153 Add Metal shaders, cross-compiled from the GLSL via SPIR-V.
The Metal shaders are checked into the repository for convenience, but they
should not be directly edited. Instead, edit the corresponding GLSL shader in
the top-level `shaders/` directory, and rerun `make` in there.
2019-06-05 18:29:25 -07:00
Patrick Walton ade3b5fbb9 Remove Pathfinder 2 shaders 2019-02-08 14:44:25 -08:00
Patrick Walton bc3f6b6ae5 New tiling mostly working 2018-12-02 12:44:02 -08:00
Patrick Walton 79e69c6916 WIP Newton's method for stencil AAA 2018-12-01 11:48:22 -08:00
Manish Goregaokar 8ed4e96ff9 Various review cleanups 2018-04-02 19:10:19 -07:00
Manish Goregaokar 2b0b699fa0 Turn off lighting for VR 2018-04-02 19:10:11 -07:00
Manish Goregaokar 7e115826a1 Remove dependence on frag_depth 2018-04-02 19:10:04 -07:00
Patrick Walton 6e13fb171c Use a lookup table to do area calculations instead of Loop-Blinn-style
distance-to-edge for stencil analytic antialiasing.

This improves the rendering quality of stencil AAA significantly.

Additionally, this adds an approximation of Core Graphics' (macOS')
defringing filter.

Closes #73.
2018-03-19 14:35:36 -07:00
Patrick Walton db6986ca1f Take the orientation of a path into account when computing normals 2018-03-07 11:21:08 -08:00
Patrick Walton aa3ecf28a5 Quantize to subpixel boundaries.
This doesn't break meshes the way the previous "discard if too thin"
code did. It fixes several issues observed on Wikipedia when using
Pathfinder in Firefox.

Closes #72.
2018-03-06 19:20:19 -08:00
Patrick Walton b60275e5ea Convert cubic curves to quadratic ones in fonts 2018-03-06 13:10:29 -08:00
Patrick Walton 5d3c1f6d59 Abstract away `FontKey` so WebRender can more easily use this; switch
from angle measurement to scale-dependent hull height
2018-03-05 11:27:18 -08:00
Patrick Walton 48aceb6291 Fix zoomed-in rotation for text by taking extended path transforms into
account in the MCAA shader.
2018-02-21 17:00:37 -08:00
Patrick Walton 4e1a9a9bad Add a new varying to the stencil AAA fragment shader for simplicity.
The new `vXDist` values *can* be deduced simply from the `vUV` values
and first-order derivatives thereof, and therefore they're technically
redundant. However, calculating them in this way increases the
complexity and ALU load in the fragment shader. It's simpler to just
compute the additional values in the vertex shader and use
interpolation.
2018-02-21 16:27:49 -08:00
Patrick Walton a84b7c7cbd Replace ECAA with "Stencil AAA", a distance-based antialiasing
technique similar to the new MCAA.

This new technique simplifies the code significantly by unifying lines,
curves, and transformed curves. Blog posts forthcoming.
2018-02-17 10:45:25 -08:00
Patrick Walton 5879d9778d Replace the MCAA shader with an extended Loop-Blinn approach and an
approximation of area based on approximate first-order line distance.

This enables support for full affine transforms in MCAA. It also greatly
simplifies the shader and reduces the amount of work that the GPU needs
to do for fragment shading.

Experimental testing has shown the area approximation to be accurate to
about 4%.
2018-02-02 18:28:41 -08:00
Patrick Walton 5bd68dec65 Port Pathfinder to use Lyon for Bézier curve math.
This removes a whole lot of code from `pathfinder_path_utils`. Hopefully
the remaining code can go upstream.

These changes regress quality of stroke widths for cubic curves, because
they move fill-to-stroke conversion before cubic-to-quadratic
conversion. To fix that, we will need to recursively subdivide when
doing fill-to-stroke conversion.
2018-01-29 12:47:47 -08:00
Patrick Walton 6a640eca74 Simplify the B-quad vertex position VBO to have a uniform format, and
enable early Z for SVG.

Additionally, this switches the B-quad patches for XCAA to be convex
hulls instead of bounding boxes, reducing fragment shader load.

This is a large speedup for the Ghostscript tiger demo: 5x or more.

Closes #33.
2018-01-11 19:25:02 -08:00
Patrick Walton d821991c01 Clean up `common.inc.glsl` a bit 2018-01-05 12:18:50 -08:00
Patrick Walton f3841ef402 Document more shader parameters 2018-01-04 18:07:14 -08:00
Patrick Walton 67d29803b5 Document most uniforms in shaders 2018-01-04 17:32:20 -08:00
Patrick Walton c5187deedd Use the monochrome MCAA mode for the Material Design icons SVG demo.
This avoids ugly pixel snapping.
2018-01-03 20:53:25 -08:00
Patrick Walton 11913a20f1 Merge MCAA monochrome and multicolor shaders.
Not only is this a lot simpler, it's faster too!
2018-01-03 15:22:28 -08:00
Patrick Walton 017a2e2f8c Provide brief documentation of each shader 2017-12-30 20:32:51 -05:00
Patrick Walton a81c69c34e Document the blit shaders 2017-12-28 11:46:44 -05:00
Patrick Walton 9515451e7a Remove render tasks entirely. 2017-12-28 11:44:46 -05:00
Patrick Walton 097e909d07 In multicolor XCAA, cap the slope to a reasonable amount to prevent line segments from shooting way up or down 2017-12-19 13:47:57 -08:00
Patrick Walton ddd1c89294 Use one side for the X position in the multicolor MCAA vertex shader to avoid cracks 2017-12-19 10:54:30 -08:00
Patrick Walton cfe72f486e Use a single-pass pixel-snapping MCAA algorithm instead of a multipass
ECAA algorithm for multicolor SVG.

This is much faster than both Skia and the previous XCAA algorithm
while maintaining slightly higher quality than the latter.

There are a couple of known issues:

* Vertical inflection points of hairlines with very steep slopes can
  become very light or even drop out occasionally. I suspect this is due
  to floating point error.

* Rarely, single columns of pixels can disappear from a mesh. Cause TBD.

Besides these bugs, this technique can be cleaned up and probably made
faster, but it's a sizable improvement as is.
2017-12-18 17:37:14 -08:00
Tristan Hume dd934211af Fixes #51 by introducing a variable for an early return boolean.
This works around a bug in the macOS Nvidia shader compiler
in 2014 rMBPs.
2017-12-05 21:09:58 -05:00
Patrick Walton ac95b04061 Fix accidental `x`/`y` swap in the ECAA multi edge mask curve shader 2017-12-04 11:55:47 -08:00
Patrick Walton 9b59ce2443 Fix rotation artefacts by rendering curves in two passes, clipping at X
inflection points as necessary.
2017-12-03 16:59:35 -08:00
Patrick Walton 801c25305f Pack left and right normal angles into one vec2 in `computeECAAQuadPosition` 2017-12-02 13:21:13 -08:00
Patrick Walton 7e0d003a95 Refactor the XCAA vertex shaders themselves, now that the common XCAA
infrastructure has been refactored
2017-12-02 13:14:01 -08:00
Patrick Walton dc5e3a0093 Refactor the XCAA shaders some more 2017-12-02 13:05:11 -08:00
Patrick Walton 86660572bd Upgrade ST-transforms to affine transforms where possible, and add
incomplete rotation support to the text demo
2017-11-29 17:06:52 -08:00
Patrick Walton 58260beb8c Only run the ECAA mask shader on edge pixels 2017-11-28 17:05:59 -08:00
Patrick Walton 6942bb51ca Add support for full 3D transforms, including rotation, to SVG in XCAA mode. 2017-11-28 16:15:06 -08:00
Patrick Walton 0e9144286e Fix the calculation of `dP` in the XCAA multicolor edge mask. 2017-11-27 15:43:47 -08:00
Patrick Walton 6e70b983c3 Remove incorrect commented-out shader code 2017-11-21 15:54:18 -08:00
Patrick Walton 7bd3a48110 Don't clip curves to the left and right sides of the pixel column twice 2017-11-21 15:51:27 -08:00
Patrick Walton 86df78f939 Flesh out the integration test more 2017-11-17 17:06:59 -08:00
Patrick Walton 8c1b3e9cb5 Optimize and better document the exact antialiasing calculation 2017-11-14 18:02:26 -08:00
Patrick Walton bc99fdf02b Enable early Z in the XCAA multicolor direct interior pass 2017-11-11 14:45:28 -08:00
Patrick Walton 575d4c2366 Fix regression involving NaN when doing curve clipping 2017-11-11 09:38:06 -08:00
Patrick Walton 37cdc9bc5c Optimize the signed area calculation 2017-11-10 23:09:54 -08:00
Patrick Walton 1f5dbe33e8 Apply optimizations to the multi-edge mask shader too 2017-11-10 22:09:29 -08:00
Patrick Walton fc2ac12fc0 Optimize the XCAA fragment shaders a bit 2017-11-10 19:25:47 -08:00
Patrick Walton 75474b19e6 Add the normal angle to the shaders used in the 3D demo 2017-11-10 15:03:43 -08:00
Patrick Walton 3bcd05a5ed Update the XCAA multi direct shaders to support normals.
Fixes XCAA in the SVG demo.
2017-11-09 16:42:53 -08:00
Patrick Walton 8e7eb6ca60 Support stem darkening in SSAA mode.
The normals are incorrect right now in some cases, but it looks OK-ish.
2017-11-09 16:20:15 -08:00
Patrick Walton e5b76726d9 Use the LUT to gamma correct text, and fix stem darkening math 2017-11-07 17:24:19 -08:00
Patrick Walton 8a1e3bc8b2 Add some basic Phong shading to the monument 2017-11-03 18:49:25 -07:00
Patrick Walton 4cbc2a8800 Add partial support for clip paths in the SVG demo.
At the moment, this only works when antialiasing is off.
2017-11-03 14:14:29 -07:00
Patrick Walton 579528ebdc Remove one direct rendering pass from the multicolor XCAA path 2017-10-31 12:41:38 -07:00
Patrick Walton 2604151521 Replace the multicolor (SVG) XCAA with a multipass compositing algorithm 2017-10-30 15:28:35 -07:00
Patrick Walton e4b531f3a0 Do some work on shader documentation 2017-10-26 20:30:47 -07:00
Patrick Walton 0506365cc7 Fix blending in the text demo.
As a nice added cleanup, this commit standardizes on the red channel for
all monochrome textures.
2017-10-26 20:15:51 -07:00
Patrick Walton 9d93cebca6 Stop using multiple render targets.
We don't need them anymore, so let's lower our hardware requirements!
2017-10-20 22:04:53 -07:00
Patrick Walton 048c261f6c Add a working experimental implementation of XCAA for SVG.
This has known performance problems and artefacts due to working at
sample level only, but it's a decent first cut.
2017-10-20 19:41:18 -07:00
Patrick Walton 70201bb29c Draw distant glyphs as prerendered images in the 3D demo.
This has known performance problems, but it's a good first cut.
2017-10-18 16:19:19 -07:00
Patrick Walton 314185684c Implement stem darkening and split ECAA into ECAA and MCAA.
We now implement stem darkening (also known as font dilation) like
macOS and FreeType under certain configurations. This pushes out font
outlines along their normals slightly in order to make small text easier
to read. This is especially important when performing gamma correction,
as otherwise text can end up too light.

Because the stem darkening is implemented in the vertex shader, it can
easily break the mesh. Therefore, I needed to implement a new rendering
mode that does not use the mesh. It's a variant of ECAA, and for
clarity's sake I've renamed the related antialiasing methods:

* MCAA stands for "mesh coverage antialiasing" and is the new name for
what was called "ECAA" prior to this patch.

* ECAA now stands for "edge coverage antialiasing". It does not use the
mesh but rather computes winding numbers from scratch for every pixel.
Surprisingly, despite being worse asymptotically, this usually ends up
being faster than MCAA at small font sizes, presumably because there are
fewer vertices to transform.

* XCAA, "exact coverage antialiasing" is a generic term that refers to
both ECAA and MCAA. References to ECAA have been changed to XCAA as
needed.
2017-10-15 13:28:49 -07:00
Patrick Walton 2a236319d4 Use regular VBOs instead of textures to store vertex positions for ECAA.
This improves performance at small font sizes a bit by reducing vertex
shading load.
2017-10-06 16:42:51 -07:00
Patrick Walton 6a7c013e61 Make the hints a uniform instead of a buffer texture.
Saves a good bit of memory traffic during vertex shading.
2017-10-05 19:14:52 -07:00
Patrick Walton 28837f72a6 Fetch and transform fewer vertices in the ECAA cover shader 2017-10-05 13:30:32 -07:00
Patrick Walton 22d0eb7b24 Fix file headers in shaders/ 2017-10-03 15:32:03 -07:00
Patrick Walton 99f6f2a104 Snap stems up to the nearest pixel when hinting 2017-09-29 18:02:33 -07:00
Patrick Walton 83cfb1d9d5 Make glyphs transparent.
Avoids cutting off the bottom of the "g" in the text demo.
2017-09-19 13:57:56 -07:00
Patrick Walton f68da75c75 Implement SSAA for the 3D demo.
This commit additionally refactors transforms to be resolution-independent as much as possible throughout all the demos.
2017-09-12 19:43:43 -07:00
Patrick Walton eb9c0ceb4d Implement "slight" hinting by rounding x-heights up to the nearest pixel 2017-09-09 13:12:51 -07:00
Patrick Walton 3ee066bdf0 Implement subpixel ECAA 2017-09-07 14:58:41 -07:00
Patrick Walton cedce49a1d Perform color defringing in the shader using the FreeType algorithm 2017-09-06 16:50:36 -07:00
Patrick Walton 82d2f076d7 Add basic subpixel AA support for SSAA.
No LCD filter is implemented yet, so the color fringing is currently fairly extreme.
2017-09-06 16:32:11 -07:00
Patrick Walton 4b7ac0182c Implement basic working 3D support 2017-09-05 19:47:19 -07:00
Patrick Walton a9dd33d479 Stub a shader for objects in the 3D demo 2017-09-03 19:24:28 -07:00
Patrick Walton 07d425dfb2 Split the ECAA shader into separate shaders for monochrome and multicolor 2017-08-24 12:08:58 -07:00
Patrick Walton ad565ffde7 Use early Z to avoid resolving blank areas for ECAA. ~50% speedup. 2017-08-24 11:43:38 -07:00
Patrick Walton 81a6f8f051 Enable early Z for edge detection and render only in the used area of the atlas 2017-08-23 19:18:24 -07:00
Patrick Walton 52afa359b4 Render a line of text using the atlas 2017-08-22 18:25:32 -07:00
Patrick Walton 7db61bfe8e Add a transform parameter to blit and switch framebuffer sizes to be `glmatrix.vec2` types 2017-08-19 16:52:14 -07:00
Patrick Walton 9b3f9d029c Fix flipped inequality in the shader causing AA artefacts 2017-08-19 11:37:06 -07:00
Patrick Walton 37c947c751 Get basic ECAA fully working 2017-08-18 20:23:45 -07:00
Patrick Walton 343c67aa33 Remove commented out debug code 2017-08-18 17:13:44 -07:00
Patrick Walton 653530be0b Add a curve shader for ECAA and refactor the line shader to minimize code duplication 2017-08-18 17:12:58 -07:00
Patrick Walton 3a9b29735a Get exact antialiasing mostly working for lines (no curves yet) 2017-08-18 15:17:23 -07:00
Patrick Walton a9eeec39fe Implement the line antialiasing shader, untested as of yet 2017-08-18 11:44:17 -07:00
Patrick Walton ccf5000e1c Get the cover step mostly working 2017-08-17 22:47:28 -07:00
Patrick Walton 9a7063a29b Render conservative coverage. Not working yet. 2017-08-17 20:09:18 -07:00
Patrick Walton ec78a632dc Split path IDs and Loop-Blinn data into separate VBOs 2017-08-17 12:47:50 -07:00