Remove one direct rendering pass from the multicolor XCAA path

This commit is contained in:
Patrick Walton 2017-10-31 12:41:38 -07:00
parent d65bfb7fb2
commit 579528ebdc
12 changed files with 61 additions and 61 deletions

View File

@ -520,11 +520,11 @@ class ThreeDRenderer extends Renderer {
this.renderContext.appController.newTimingsReceived(newTimings);
}
protected directCurveProgramNameForPass(pass: number): keyof ShaderMap<void> {
protected directCurveProgramName(): keyof ShaderMap<void> {
return 'direct3DCurve';
}
protected directInteriorProgramNameForPass(pass: number): keyof ShaderMap<void> {
protected directInteriorProgramName(): keyof ShaderMap<void> {
return 'direct3DInterior';
}

View File

@ -15,7 +15,7 @@ import {DemoView} from './view';
export type AntialiasingStrategyName = 'none' | 'ssaa' | 'xcaa';
export type DirectRenderingMode = 'none' | 'color' | 'two-pass';
export type DirectRenderingMode = 'none' | 'color' | 'color-depth';
export type SubpixelAAType = 'none' | 'medium';

View File

@ -438,11 +438,11 @@ class BenchmarkRenderer extends Renderer {
return pathTransforms;
}
protected directCurveProgramNameForPass(pass: number): keyof ShaderMap<void> {
protected directCurveProgramName(): keyof ShaderMap<void> {
return 'directCurve';
}
protected directInteriorProgramNameForPass(pass: number): keyof ShaderMap<void> {
protected directInteriorProgramName(): keyof ShaderMap<void> {
return 'directInterior';
}
}

View File

@ -126,7 +126,7 @@ export abstract class Renderer {
// Perform direct rendering (Loop-Blinn).
if (antialiasingStrategy.directRenderingMode !== 'none')
this.renderDirect(0);
this.renderDirect();
// End the timer, and start a new one.
if (this.timerQueryPollInterval == null) {
@ -137,9 +137,6 @@ export abstract class Renderer {
antialiasingStrategy.resolve(this);
if (antialiasingStrategy.directRenderingMode === 'two-pass')
this.renderDirect(1);
// Draw the glyphs with the resolved atlas to the default framebuffer.
this.compositeIfNecessary();
@ -264,8 +261,8 @@ export abstract class Renderer {
protected abstract pathColorsForObject(objectIndex: number): Uint8Array;
protected abstract pathTransformsForObject(objectIndex: number): Float32Array;
protected abstract directCurveProgramNameForPass(pass: number): keyof ShaderMap<void>;
protected abstract directInteriorProgramNameForPass(pass: number): keyof ShaderMap<void>;
protected abstract directCurveProgramName(): keyof ShaderMap<void>;
protected abstract directInteriorProgramName(): keyof ShaderMap<void>;
protected drawSceneryIfNecessary(): void {}
@ -283,7 +280,7 @@ export abstract class Renderer {
gl.depthMask(true);
gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
break;
case 'two-pass':
case 'color-depth':
gl.clear(gl.COLOR_BUFFER_BIT);
break;
case 'none':
@ -304,7 +301,7 @@ export abstract class Renderer {
/// Called whenever new GPU timing statistics are available.
protected newTimingsReceived(): void {}
private renderDirect(pass: number): void {
private renderDirect(): void {
const renderContext = this.renderContext;
const gl = renderContext.gl;
@ -325,14 +322,14 @@ export abstract class Renderer {
gl.disable(gl.BLEND);
// Set up the implicit cover interior VAO.
const directInteriorProgramName = this.directInteriorProgramNameForPass(pass);
const directInteriorProgramName = this.directInteriorProgramName();
const directInteriorProgram = renderContext.shaderPrograms[directInteriorProgramName];
if (this.implicitCoverInteriorVAO == null) {
this.implicitCoverInteriorVAO = renderContext.vertexArrayObjectExt
.createVertexArrayOES();
}
renderContext.vertexArrayObjectExt.bindVertexArrayOES(this.implicitCoverInteriorVAO);
this.initImplicitCoverInteriorVAO(pass, objectIndex, instanceRange);
this.initImplicitCoverInteriorVAO(objectIndex, instanceRange);
// Draw direct interior parts.
this.setTransformUniform(directInteriorProgram.uniforms, objectIndex);
@ -341,7 +338,7 @@ export abstract class Renderer {
this.setPathColorsUniform(objectIndex, directInteriorProgram.uniforms, 0);
this.pathTransformBufferTextures[objectIndex]
.bind(gl, directInteriorProgram.uniforms, 1);
if (renderingMode === 'two-pass') {
if (renderingMode === 'color-depth') {
const strategy = antialiasingStrategy as MCAAMulticolorStrategy;
strategy.bindEdgeDepthTexture(gl, directInteriorProgram.uniforms, 2);
}
@ -357,22 +354,27 @@ export abstract class Renderer {
}
// Set up direct curve state.
gl.depthMask(false);
gl.enable(gl.BLEND);
gl.blendEquation(gl.FUNC_ADD);
gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE);
if (renderingMode === 'color-depth') {
gl.depthMask(true);
gl.disable(gl.BLEND);
} else {
gl.depthMask(false);
gl.enable(gl.BLEND);
gl.blendEquation(gl.FUNC_ADD);
gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE);
}
// Set up the direct curve VAO.
//
// TODO(pcwalton): Cache these.
const directCurveProgramName = this.directCurveProgramNameForPass(pass);
const directCurveProgramName = this.directCurveProgramName();
const directCurveProgram = renderContext.shaderPrograms[directCurveProgramName];
if (this.implicitCoverCurveVAO == null) {
this.implicitCoverCurveVAO = renderContext.vertexArrayObjectExt
.createVertexArrayOES();
}
renderContext.vertexArrayObjectExt.bindVertexArrayOES(this.implicitCoverCurveVAO);
this.initImplicitCoverCurveVAO(pass, objectIndex, instanceRange);
this.initImplicitCoverCurveVAO(objectIndex, instanceRange);
// Draw direct curve parts.
this.setTransformUniform(directCurveProgram.uniforms, objectIndex);
@ -380,7 +382,7 @@ export abstract class Renderer {
this.setHintsUniform(directCurveProgram.uniforms);
this.setPathColorsUniform(objectIndex, directCurveProgram.uniforms, 0);
this.pathTransformBufferTextures[objectIndex].bind(gl, directCurveProgram.uniforms, 1);
if (renderingMode === 'two-pass') {
if (renderingMode === 'color-depth') {
const strategy = antialiasingStrategy as MCAAMulticolorStrategy;
strategy.bindEdgeDepthTexture(gl, directCurveProgram.uniforms, 2);
}
@ -439,13 +441,12 @@ export abstract class Renderer {
}, TIME_INTERVAL_DELAY);
}
private initImplicitCoverCurveVAO(pass: number, objectIndex: number, instanceRange: Range):
void {
private initImplicitCoverCurveVAO(objectIndex: number, instanceRange: Range): void {
const renderContext = this.renderContext;
const gl = renderContext.gl;
const meshes = this.meshes[objectIndex];
const directCurveProgramName = this.directCurveProgramNameForPass(pass);
const directCurveProgramName = this.directCurveProgramName();
const directCurveProgram = renderContext.shaderPrograms[directCurveProgramName];
gl.useProgram(directCurveProgram.program);
gl.bindBuffer(gl.ARRAY_BUFFER, meshes.bVertexPositions);
@ -486,15 +487,12 @@ export abstract class Renderer {
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, meshes.coverCurveIndices);
}
private initImplicitCoverInteriorVAO(pass: number,
objectIndex: number,
instanceRange: Range):
void {
private initImplicitCoverInteriorVAO(objectIndex: number, instanceRange: Range): void {
const renderContext = this.renderContext;
const gl = renderContext.gl;
const meshes = this.meshes[objectIndex];
const directInteriorProgramName = this.directInteriorProgramNameForPass(pass);
const directInteriorProgramName = this.directInteriorProgramName();
const directInteriorProgram = renderContext.shaderPrograms[directInteriorProgramName];
gl.useProgram(directInteriorProgram.program);
gl.bindBuffer(gl.ARRAY_BUFFER, meshes.bVertexPositions);

View File

@ -27,8 +27,8 @@ export interface ShaderMap<T> {
ssaaSubpixelResolve: T;
xcaaMonoResolve: T;
xcaaMonoSubpixelResolve: T;
xcaaMultiBGDirectCurve: T;
xcaaMultiBGDirectInterior: T;
xcaaMultiDirectCurve: T;
xcaaMultiDirectInterior: T;
xcaaMultiEdgeMaskCurve: T;
xcaaMultiEdgeMaskLine: T;
xcaaMultiResolve: T;
@ -55,8 +55,8 @@ export const SHADER_NAMES: Array<keyof ShaderMap<void>> = [
'ecaaCurve',
'xcaaMonoResolve',
'xcaaMonoSubpixelResolve',
'xcaaMultiBGDirectCurve',
'xcaaMultiBGDirectInterior',
'xcaaMultiDirectCurve',
'xcaaMultiDirectInterior',
'xcaaMultiEdgeMaskCurve',
'xcaaMultiEdgeMaskLine',
'xcaaMultiResolve',
@ -125,13 +125,13 @@ const SHADER_URLS: ShaderMap<ShaderProgramURLs> = {
fragment: "/glsl/gles2/xcaa-mono-subpixel-resolve.fs.glsl",
vertex: "/glsl/gles2/xcaa-mono-subpixel-resolve.vs.glsl",
},
xcaaMultiBGDirectCurve: {
fragment: "/glsl/gles2/xcaa-multi-bg-direct-curve.fs.glsl",
vertex: "/glsl/gles2/xcaa-multi-bg-direct-curve.vs.glsl",
xcaaMultiDirectCurve: {
fragment: "/glsl/gles2/xcaa-multi-direct-curve.fs.glsl",
vertex: "/glsl/gles2/xcaa-multi-direct-curve.vs.glsl",
},
xcaaMultiBGDirectInterior: {
fragment: "/glsl/gles2/xcaa-multi-bg-direct-interior.fs.glsl",
vertex: "/glsl/gles2/xcaa-multi-bg-direct-interior.vs.glsl",
xcaaMultiDirectInterior: {
fragment: "/glsl/gles2/xcaa-multi-direct-interior.fs.glsl",
vertex: "/glsl/gles2/xcaa-multi-direct-interior.vs.glsl",
},
xcaaMultiEdgeMaskCurve: {
fragment: "/glsl/gles2/xcaa-multi-edge-mask-curve.fs.glsl",

View File

@ -181,15 +181,15 @@ class SVGDemoRenderer extends Renderer {
return transform;
}
protected directCurveProgramNameForPass(pass: number): keyof ShaderMap<void> {
if (this.antialiasingStrategy instanceof XCAAStrategy && pass === 0)
return 'xcaaMultiBGDirectCurve';
protected directCurveProgramName(): keyof ShaderMap<void> {
if (this.antialiasingStrategy instanceof XCAAStrategy)
return 'xcaaMultiDirectCurve';
return 'directCurve';
}
protected directInteriorProgramNameForPass(pass: number): keyof ShaderMap<void> {
if (this.antialiasingStrategy instanceof XCAAStrategy && pass === 0)
return 'xcaaMultiBGDirectInterior';
protected directInteriorProgramName(): keyof ShaderMap<void> {
if (this.antialiasingStrategy instanceof XCAAStrategy)
return 'xcaaMultiDirectInterior';
return 'directInterior';
}

View File

@ -265,11 +265,11 @@ export abstract class TextRenderer extends Renderer {
this.renderContext.useHinting);
}
protected directCurveProgramNameForPass(pass: number): keyof ShaderMap<void> {
protected directCurveProgramName(): keyof ShaderMap<void> {
return 'directCurve';
}
protected directInteriorProgramNameForPass(pass: number): keyof ShaderMap<void> {
protected directInteriorProgramName(): keyof ShaderMap<void> {
return 'directInterior';
}
}

View File

@ -1081,7 +1081,7 @@ export class MCAAMulticolorStrategy extends MCAAStrategy {
const gl = renderContext.gl;
gl.depthMask(true);
gl.depthFunc(gl.GREATER);
gl.depthFunc(gl.GEQUAL);
gl.enable(gl.DEPTH_TEST);
gl.blendEquation(gl.FUNC_ADD);
@ -1106,7 +1106,7 @@ export class MCAAMulticolorStrategy extends MCAAStrategy {
}
get directRenderingMode(): DirectRenderingMode {
return 'two-pass';
return 'color-depth';
}
protected get directDepthTexture(): WebGLTexture | null {

View File

@ -1,4 +1,4 @@
// pathfinder/shaders/gles2/xcaa-multi-bg-direct-curve.fs.glsl
// pathfinder/shaders/gles2/xcaa-multi-direct-curve.fs.glsl
//
// Copyright (c) 2017 The Pathfinder Project Developers.
//
@ -24,11 +24,13 @@ void main() {
float depth = gl_FragCoord.z;
vec2 texCoord = floor(center) / vec2(uFramebufferSize);
// TODO(pcwalton): Remove this if possible?
if (depth >= texture2D(uEdgeDepth, texCoord).r)
// TODO(pcwalton): Get back early Z somehow?
if (depth == texture2D(uEdgeDepth, texCoord).r)
discard;
float side = vTexCoord.x * vTexCoord.x - vTexCoord.y;
float alpha = float(sign(side) == sign(vSign));
gl_FragColor = vec4(vColor.rgb, vColor.a * alpha);
if (sign(side) != sign(vSign))
discard;
gl_FragColor = vColor;
}

View File

@ -1,4 +1,4 @@
// pathfinder/shaders/gles2/xcaa-multi-bg-direct-curve.vs.glsl
// pathfinder/shaders/gles2/xcaa-multi-direct-curve.vs.glsl
//
// Copyright (c) 2017 The Pathfinder Project Developers.
//

View File

@ -1,4 +1,4 @@
// pathfinder/shaders/gles2/xcaa-multi-bg-direct-interior.fs.glsl
// pathfinder/shaders/gles2/xcaa-multi-direct-interior.fs.glsl
//
// Copyright (c) 2017 The Pathfinder Project Developers.
//
@ -20,8 +20,8 @@ void main() {
float depth = gl_FragCoord.z;
vec2 texCoord = floor(center) / vec2(uFramebufferSize);
// TODO(pcwalton): Remove this if possible?
if (depth >= texture2D(uEdgeDepth, texCoord).r)
// TODO(pcwalton): Get back early Z somehow?
if (depth == texture2D(uEdgeDepth, texCoord).r)
discard;
gl_FragColor = vColor;

View File

@ -1,4 +1,4 @@
// pathfinder/shaders/gles2/xcaa-multi-bg-direct-interior.vs.glsl
// pathfinder/shaders/gles2/xcaa-multi-direct-interior.vs.glsl
//
// Copyright (c) 2017 The Pathfinder Project Developers.
//