Remove one direct rendering pass from the multicolor XCAA path
This commit is contained in:
parent
d65bfb7fb2
commit
579528ebdc
|
@ -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';
|
||||
}
|
||||
|
||||
|
|
|
@ -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';
|
||||
|
||||
|
|
|
@ -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';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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';
|
||||
}
|
||||
|
||||
|
|
|
@ -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';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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.
|
||||
//
|
|
@ -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;
|
|
@ -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.
|
||||
//
|
Loading…
Reference in New Issue