[OpenJDK 2D-Dev] RFR: 8076529: Marlin antialiasing renderer integration

Jim Graham james.graham at oracle.com
Mon Nov 23 21:31:29 UTC 2015


An updated webrev to fix the automated tests.  The only changes are to 
remove the package statements from the files in 
test/sun/java2d/marlin/*.java:

http://cr.openjdk.java.net/~flar/JDK-8076529/webrev.01/

The benchmark results were copied over from webrev.00 since there are no 
expected changes in behavior or performance...

			...jim

On 11/20/15 4:38 PM, Jim Graham wrote:
> Webrev: http://cr.openjdk.java.net/~flar/JDK-8076529/webrev.00/
> Bug: https://bugs.openjdk.java.net/browse/JDK-8076529
>
> This webrev contains the changes accumulated in the Graphics-Rasterizer
> project forest that add the Marlin AA renderer to the JDK and make it
> the default AA RenderingEngine for Java2D.
>
> The webrev also includes a link to an HTML output of J2DAnalyzer showing
> the relative performance on a few basic rendering tests for Ductus,
> Marlin, and Pisces.
>
> This change does not introduce any new API, but it does introduce a new
> debugging property to see which RenderingEngine is in use.
>
> Java2D already supported selecting a RenderingEngine on the fly using:
>      -Dsun.java2d.renderer=<classname>
> The default is now set to Marlin.
>
> You may now also see which RenderingEngine is in use by using (new with
> this patch):
>      -Dsun.java2d.renderer.verbose=true
>
> The default rendering engine used to be Pisces for OpenJDK and Ductus
> for Oracle's products, but the new default will be the new Marlin
> renderer for all builds.  Pisces is still built and included in OpenJDK
> builds and both Pisces and Ductus are still built and included in Oracle
> builds, but the user must select those RenderingEngine implementations
> on the command line to use them.  The alternate engines may be
> deprecated and removed over time.
>
> Marlin already outperforms Pisces in every category by a wide margin
> (except for a few basic tests where it has roughly the same performance
> to within a margin of error, and roughly the same as Ductus as well). In
> addition, Marlin just recently reached a level of performance comparable
> to Ductus in single-threaded benchmarks.  But, where Marlin shines is in
> multi-threaded performance where Ductus had nearly 0% scalability (and
> on some benchmarks would often take more than N times longer to render
> something with N threads) due to a required java-level synchronized
> access to the unprotected singleton native data structures.  Marlin's
> scalability is very high - in the 90% range.  In MT tests with N threads
> (N < #cores) Marlin can be about N times faster or more than Ductus
> which is a huge win for server-side use.
>
> In terms of accuracy, a quick test of comparing the AA renderers output
> to a simple Super-Scalar renderer (render an object at 2^N x 2^N scale
> and then use a series of N linear interpolation steps to cut the
> resolution back to normal size) using 8x8 oversampling shows that Marlin
> is, on average, about twice as accurate as Ductus, and close to 2.5 to 3
> times more accurate than Pisces.
>
> Here is the text summary from analyzing the J2DBench results included in
> the webrev above.  Note that Pisces is only 40-100% the performance of
> Ductus (at best it achieves parity), whereas Marlin is 92-220% the
> performance as Ductus (from near parity to over twice as fast):
>
> Summary:
>    Ductus Renderer on Mac:
>      Number of tests:  14
>      Overall average:  271435.684621936
>      Best spread:      0.25% variance
>      Worst spread:     0.81% variance
>      (Basis for results comparison)
>
>    Marlin Renderer on Mac:
>      Number of tests:  14
>      Overall average:  278609.9151360187
>      Best spread:      0.24% variance
>      Worst spread:     0.94% variance
>      Comparison to basis:
>        Best result:      219.63% of basis
>        Worst result:     91.71% of basis
>        Number of wins:   5
>        Number of ties:   5
>        Number of losses: 4
>
>    Pisces Renderer on Mac:
>      Number of tests:  14
>      Overall average:  264688.87069247436
>      Best spread:      0.12% variance
>      Worst spread:     9.28% variance
>      Comparison to basis:
>        Best result:      101.71% of basis
>        Worst result:     40.04% of basis
>        Number of wins:   0
>        Number of ties:   6
>        Number of losses: 8
>
> For multi-threaded performance, we are still modifying J2DBench to do MT
> testing, but meanwhile here are some sample results from a
> micro-mt-benchmark that I was using to measure Marlin's benefit over
> Ductus, all tests run on my quad-core retina MacBook Pro:
>
> RenderingEngine = sun.dc.DuctusRenderingEngine at 2ea524fc
> Results for 4 threads:
> Filling Big Circle took 20000.7ms for 17513 ops = 1.1420479872666018ms/op
> Stroking Big Circle took 20001.6ms for 12744 ops = 1.5694947735404898ms/op
> Filling Small Circle took 20000.0ms for 650166 ops =
> 0.030761436459304237ms/op
> Stroking Small Circle took 20000.2ms for 563230 ops =
> 0.03550988808657209ms/op
> Filling Small Even-Odd Polygon took 20003.7ms for 6368 ops =
> 3.1412907711997486ms/op
> Stroking Small Even-Odd Polygon took 20004.3ms for 4034 ops =
> 4.958922349529003ms/op
> Filling Big Even-Odd Polygon took 20046.0ms for 413 ops =
> 48.53754647457627ms/op
> Stroking Big Even-Odd Polygon took 20163.7ms for 167 ops =
> 120.74043964670658ms/op
>
> RenderingEngine = sun.java2d.marlin.MarlinRenderingEngine at 3550b8ec
> Results for 4 threads:
> Filling Big Circle took 20000.4ms for 93097 ops = 0.2148343392483109ms/op
> Stroking Big Circle took 20000.3ms for 74332 ops = 0.2690665217672066ms/op
> Filling Small Circle took 20000.0ms for 3999239 ops =
> 0.0050009547403893585ms/op
> Stroking Small Circle took 20000.0ms for 1692821 ops =
> 0.011814607555081133ms/op
> Filling Small Even-Odd Polygon took 20001.0ms for 31515 ops =
> 0.6346507143582422ms/op
> Stroking Small Even-Odd Polygon took 20001.6ms for 22152 ops =
> 0.9029244853737812ms/op
> Filling Big Even-Odd Polygon took 20018.6ms for 1472 ops =
> 13.599594945652175ms/op
> Stroking Big Even-Odd Polygon took 20049.7ms for 577 ops =
> 34.748233308492196ms/op
>
> RenderingEngine = sun.java2d.pisces.PiscesRenderingEngine at 2ea524fc
> Results for 4 threads:
> Filling Big Circle took 20000.7ms for 52844 ops = 0.37848658839224886ms/op
> Stroking Big Circle took 20001.1ms for 39741 ops = 0.5032854199944641ms/op
> Filling Small Circle took 20000.0ms for 1628357 ops =
> 0.012282338621076336ms/op
> Stroking Small Circle took 20000.1ms for 809256 ops =
> 0.024714137085174535ms/op
> Filling Small Even-Odd Polygon took 20002.6ms for 14754 ops =
> 1.3557410718449234ms/op
> Stroking Small Even-Odd Polygon took 20001.6ms for 9793 ops =
> 2.042433472582457ms/op
> Filling Big Even-Odd Polygon took 20033.2ms for 1140 ops =
> 17.572960124561405ms/op
> Stroking Big Even-Odd Polygon took 20054.6ms for 337 ops =
> 59.509273902077155ms/op
>
>              ...jim
>



More information about the 2d-dev mailing list