Get ECAA working in the benchmark

This commit is contained in:
Patrick Walton 2017-09-26 13:32:22 -07:00
parent 1c138cc543
commit 6b0c215148
4 changed files with 68 additions and 15 deletions

View File

@ -19,7 +19,7 @@
<option value="none" selected>None</option>
<option value="ssaa-2">2&times;SSAA</option>
<option value="ssaa-4">4&times;SSAA</option>
<option value="ecaa">ECAA (BROKEN)</option>
<option value="ecaa">ECAA</option>
</select>
</div>
</div>

View File

@ -280,7 +280,7 @@ class BenchmarkTestView extends MonochromePathfinderView {
private _pixelsPerEm: number = 32.0;
readonly bgColor: glmatrix.vec4 = glmatrix.vec4.clone([1.0, 1.0, 1.0, 1.0]);
readonly bgColor: glmatrix.vec4 = glmatrix.vec4.clone([1.0, 1.0, 1.0, 0.0]);
readonly fgColor: glmatrix.vec4 = glmatrix.vec4.clone([0.0, 0.0, 0.0, 1.0]);
protected directCurveProgramName: keyof ShaderMap<void> = 'directCurve';

View File

@ -402,7 +402,10 @@ export abstract class ECAAStrategy extends AntialiasingStrategy {
view.gl.enable(view.gl.SCISSOR_TEST);
this.setResolveDepthState(view);
view.gl.disable(view.gl.BLEND);
view.drawBuffersExt.drawBuffersWEBGL([view.drawBuffersExt.COLOR_ATTACHMENT0_WEBGL]);
if (view.destFramebuffer != null)
view.drawBuffersExt.drawBuffersWEBGL([view.drawBuffersExt.COLOR_ATTACHMENT0_WEBGL]);
else
view.drawBuffersExt.drawBuffersWEBGL([view.gl.BACK]);
// Clear out the resolve buffer, if necessary.
this.clearForResolve(view);
@ -428,7 +431,9 @@ export abstract class ECAAStrategy extends AntialiasingStrategy {
view.gl.disable(view.gl.DEPTH_TEST);
}
protected setResolveDepthState(view: MonochromePathfinderView): void {}
protected setResolveDepthState(view: MonochromePathfinderView): void {
view.gl.disable(view.gl.DEPTH_TEST);
}
protected supersampledUsedSize(view: MonochromePathfinderView): glmatrix.vec2 {
const usedSize = glmatrix.vec2.create();

View File

@ -84,12 +84,23 @@ export class TextFrame<Glyph extends PathfinderGlyph> {
const bVertexPathIDs = new Uint16Array(meshes.bVertexPathIDs);
const bVertexLoopBlinnData = new Uint32Array(meshes.bVertexLoopBlinnData);
const edgeUpperCurveIndices = new Uint32Array(meshes.edgeUpperCurveIndices);
const edgeLowerCurveIndices = new Uint32Array(meshes.edgeLowerCurveIndices);
for (let indexIndex = 3; indexIndex < edgeUpperCurveIndices.length; indexIndex += 4)
edgeUpperCurveIndices[indexIndex] = 0;
for (let indexIndex = 3; indexIndex < edgeLowerCurveIndices.length; indexIndex += 4)
edgeLowerCurveIndices[indexIndex] = 0;
const expandedBQuads: number[] = [];
const expandedBVertexPositions: number[] = [];
const expandedBVertexPathIDs: number[] = [];
const expandedBVertexLoopBlinnData: number[] = [];
const expandedCoverInteriorIndices: number[] = [];
const expandedCoverCurveIndices: number[] = [];
const expandedEdgeUpperCurveIndices: number[] = [];
const expandedEdgeUpperLineIndices: number[] = [];
const expandedEdgeLowerCurveIndices: number[] = [];
const expandedEdgeLowerLineIndices: number[] = [];
let textGlyphIndex = 0;
for (const textRun of this.runs) {
@ -125,6 +136,29 @@ export class TextFrame<Glyph extends PathfinderGlyph> {
firstBVertexIndex,
bVertexIndex);
copyIndices(expandedEdgeUpperLineIndices,
new Uint32Array(meshes.edgeUpperLineIndices),
firstExpandedBVertexIndex,
firstBVertexIndex,
bVertexIndex);
copyIndices(expandedEdgeUpperCurveIndices,
new Uint32Array(edgeUpperCurveIndices),
firstExpandedBVertexIndex,
firstBVertexIndex,
bVertexIndex,
indexIndex => indexIndex % 4 < 3);
copyIndices(expandedEdgeLowerLineIndices,
new Uint32Array(meshes.edgeLowerLineIndices),
firstExpandedBVertexIndex,
firstBVertexIndex,
bVertexIndex);
copyIndices(expandedEdgeLowerCurveIndices,
new Uint32Array(edgeLowerCurveIndices),
firstExpandedBVertexIndex,
firstBVertexIndex,
bVertexIndex,
indexIndex => indexIndex % 4 < 3);
// Copy over B-quads.
let firstBQuadIndex =
_.findIndex(bQuads, bQuad => bVertexPathIDs[bQuad[0]] == uniqueGlyphIndex + 1);
@ -159,10 +193,14 @@ export class TextFrame<Glyph extends PathfinderGlyph> {
ArrayBuffer,
coverCurveIndices: new Uint32Array(expandedCoverCurveIndices).buffer as
ArrayBuffer,
edgeUpperCurveIndices: new ArrayBuffer(0),
edgeUpperLineIndices: new ArrayBuffer(0),
edgeLowerCurveIndices: new ArrayBuffer(0),
edgeLowerLineIndices: new ArrayBuffer(0),
edgeUpperCurveIndices: new Uint32Array(expandedEdgeUpperCurveIndices).buffer as
ArrayBuffer,
edgeUpperLineIndices: new Uint32Array(expandedEdgeUpperLineIndices).buffer as
ArrayBuffer,
edgeLowerCurveIndices: new Uint32Array(expandedEdgeLowerCurveIndices).buffer as
ArrayBuffer,
edgeLowerLineIndices: new Uint32Array(expandedEdgeLowerLineIndices).buffer as
ArrayBuffer,
})
}
}
@ -423,18 +461,28 @@ function copyIndices(destIndices: number[],
srcIndices: Uint32Array,
firstExpandedIndex: number,
firstIndex: number,
lastIndex: number) {
lastIndex: number,
validateIndex?: (indexIndex: number) => boolean) {
if (firstIndex === lastIndex)
return;
// FIXME(pcwalton): Use binary search instead of linear search.
const indexDelta = firstExpandedIndex - firstIndex;
let indexIndex = _.findIndex(srcIndices,
srcIndex => srcIndex >= firstIndex && srcIndex < lastIndex);
let indexIndex = _.findIndex(srcIndices, srcIndex => {
return srcIndex >= firstIndex && srcIndex < lastIndex;
});
if (indexIndex < 0)
return;
const indexDelta = firstExpandedIndex - firstIndex;
while (indexIndex < srcIndices.length) {
const index = srcIndices[indexIndex];
if (index < firstIndex || index >= lastIndex)
break;
destIndices.push(index + indexDelta);
if (validateIndex == null || validateIndex(indexIndex)) {
if (index < firstIndex || index >= lastIndex)
break;
destIndices.push(index + indexDelta);
} else {
destIndices.push(index);
}
indexIndex++;
}
}