Remove render tasks entirely.

This commit is contained in:
Patrick Walton 2017-12-28 11:44:46 -05:00
parent 473cb38fb3
commit 9515451e7a
7 changed files with 2 additions and 172 deletions

View File

@ -1,59 +0,0 @@
// pathfinder/client/src/render-task.ts
//
// Copyright © 2017 The Pathfinder Project Developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
import {Renderer} from "./renderer";
import {Range} from "./utils";
export type RenderTaskType = 'color' | 'clip';
export class RenderTask {
type: RenderTaskType;
instanceIndices: Range;
compositingOperation: CompositingOperation | null;
constructor(type: RenderTaskType,
instanceIndices: Range,
compositingOperation?: CompositingOperation) {
this.type = type;
this.instanceIndices = instanceIndices;
this.compositingOperation = compositingOperation != null ? compositingOperation : null;
}
}
export type CompositingOperation = AlphaMaskCompositingOperation;
export class AlphaMaskCompositingOperation {
alphaFramebufferIndex: number;
constructor(alphaFramebufferIndex: number) {
this.alphaFramebufferIndex = alphaFramebufferIndex;
}
composite(renderer: Renderer, sourceTextureIndex: number, textures: WebGLTexture[]): void {
const renderContext = renderer.renderContext;
const gl = renderContext.gl;
const program = renderContext.shaderPrograms.compositeAlphaMask;
gl.useProgram(program.program);
renderContext.initQuadVAO(program.attributes);
// Composite to the current framebuffer.
gl.activeTexture(gl.TEXTURE0);
gl.bindTexture(gl.TEXTURE_2D, textures[sourceTextureIndex]);
gl.uniform1i(program.uniforms.uSource, 0);
gl.activeTexture(gl.TEXTURE1);
gl.bindTexture(gl.TEXTURE_2D, textures[this.alphaFramebufferIndex]);
gl.uniform1i(program.uniforms.uMask, 1);
renderer.setTransformAndTexScaleUniformsForDest(program.uniforms);
gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, renderContext.quadElementsBuffer);
gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_BYTE, 0);
}
}

View File

@ -18,7 +18,6 @@ import {AAOptions} from './app-controller';
import PathfinderBufferTexture from "./buffer-texture";
import {UniformMap} from './gl-utils';
import {PathfinderMeshBuffers, PathfinderMeshData} from "./meshes";
import {CompositingOperation, RenderTaskType} from './render-task';
import {ShaderMap} from './shader-loader';
import {FLOAT32_SIZE, Range, UINT16_SIZE, UINT32_SIZE, unwrapNull, unwrapUndef} from './utils';
import {RenderContext, Timings} from "./view";
@ -338,10 +337,6 @@ export abstract class Renderer {
gl.uniform2f(uniforms.uEmboldenAmount, emboldenAmount[0], emboldenAmount[1]);
}
renderTaskTypeForObject(objectIndex: number): RenderTaskType {
return 'color';
}
meshIndexForObject(objectIndex: number): number {
return objectIndex;
}

View File

@ -14,7 +14,6 @@ import {expectNotNull, PathfinderError, unwrapNull} from './utils';
export interface ShaderMap<T> {
blitLinear: T;
blitGamma: T;
compositeAlphaMask: T;
demo3DDistantGlyph: T;
demo3DMonument: T;
directCurve: T;
@ -43,7 +42,6 @@ const COMMON_SHADER_URL: string = '/glsl/gles2/common.inc.glsl';
export const SHADER_NAMES: Array<keyof ShaderMap<void>> = [
'blitLinear',
'blitGamma',
'compositeAlphaMask',
'directCurve',
'directInterior',
'direct3DCurve',
@ -71,10 +69,6 @@ const SHADER_URLS: ShaderMap<ShaderProgramURLs> = {
fragment: "/glsl/gles2/blit-linear.fs.glsl",
vertex: "/glsl/gles2/blit.vs.glsl",
},
compositeAlphaMask: {
fragment: "/glsl/gles2/composite-alpha-mask.fs.glsl",
vertex: "/glsl/gles2/composite-alpha-mask.vs.glsl",
},
demo3DDistantGlyph: {
fragment: "/glsl/gles2/demo-3d-distant-glyph.fs.glsl",
vertex: "/glsl/gles2/demo-3d-distant-glyph.vs.glsl",

View File

@ -14,7 +14,6 @@ import * as _ from 'lodash';
import 'path-data-polyfill.js';
import {parseServerTiming, PathfinderMeshData} from "./meshes";
import {AlphaMaskCompositingOperation, RenderTask, RenderTaskType} from './render-task';
import {lerp, panic, Range, unwrapNull, unwrapUndef} from "./utils";
export const BUILTIN_SVG_URI: string = "/svg/demo";
@ -92,7 +91,6 @@ interface ClipPathIDTable {
}
export class SVGLoader {
renderTasks: RenderTask[];
pathInstances: SVGPath[];
scale: number;
pathBounds: glmatrix.vec4[];
@ -106,7 +104,6 @@ export class SVGLoader {
constructor() {
this.scale = 1.0;
this.renderTasks = [];
this.pathInstances = [];
this.pathBounds = [];
this.svgBounds = glmatrix.vec4.create();
@ -148,12 +145,9 @@ export class SVGLoader {
this.svg.appendChild(kid);
// Scan for geometry elements.
this.renderTasks.length = 0;
this.pathInstances.length = 0;
this.clipPathIDs = {};
this.pushNewRenderTask('color');
this.scanElement(this.svg);
this.popTopRenderTaskIfEmpty();
this.paths = [];
@ -214,22 +208,8 @@ export class SVGLoader {
}
private scanElement(element: Element): void {
const currentRenderTask = unwrapUndef(_.last(this.renderTasks));
const style = window.getComputedStyle(element);
let hasClip = style.clipPath != null && style.clipPath !== 'none';
if (hasClip) {
const matches = /^url\("#([^"]+)"\)$/.exec(unwrapNull(style.clipPath));
if (matches == null ||
matches[1] == null ||
!this.clipPathIDs.hasOwnProperty(matches[1])) {
hasClip = false;
} else {
currentRenderTask.compositingOperation =
new AlphaMaskCompositingOperation(this.clipPathIDs[matches[1]]);
}
}
if (element instanceof SVGPathElement) {
if (colorFromStyle(style.fill) != null)
this.addPathInstance(new SVGFill(element));
@ -237,37 +217,14 @@ export class SVGLoader {
this.addPathInstance(new SVGStroke(element));
}
if (element instanceof SVGClipPathElement) {
this.pushNewRenderTask('clip');
this.clipPathIDs[element.id] = this.renderTasks.length - 1;
}
for (const kid of element.childNodes) {
if (kid instanceof Element)
this.scanElement(kid);
}
if (element instanceof SVGClipPathElement || hasClip)
this.pushNewRenderTask('color');
}
private addPathInstance(pathInstance: SVGPath): void {
const currentRenderTask = unwrapUndef(_.last(this.renderTasks));
this.pathInstances.push(pathInstance);
currentRenderTask.instanceIndices.end = Math.max(currentRenderTask.instanceIndices.end,
this.pathInstances.length + 1);
}
private popTopRenderTaskIfEmpty(): void {
const lastRenderTask = _.last(this.renderTasks);
if (lastRenderTask != null && lastRenderTask.instanceIndices.isEmpty)
this.renderTasks.pop();
}
private pushNewRenderTask(taskType: RenderTaskType): void {
this.popTopRenderTaskIfEmpty();
const emptyRange = new Range(this.pathInstances.length + 1, this.pathInstances.length + 1);
this.renderTasks.push(new RenderTask(taskType, emptyRange));
}
}

View File

@ -15,7 +15,6 @@ import {SubpixelAAType} from './aa-strategy';
import {OrthographicCamera} from "./camera";
import {UniformMap} from './gl-utils';
import {PathfinderMeshData} from './meshes';
import {CompositingOperation, RenderTaskType} from './render-task';
import {PathTransformBuffers, Renderer} from "./renderer";
import {ShaderMap} from './shader-loader';
import SSAAStrategy from './ssaa-strategy';
@ -71,7 +70,7 @@ export abstract class SVGRenderer extends Renderer {
}
protected get objectCount(): number {
return this.loader.renderTasks.length;
return 1;
}
protected abstract get loader(): SVGLoader;
@ -109,20 +108,12 @@ export abstract class SVGRenderer extends Renderer {
this.camera.zoomToFit();
}
renderTaskTypeForObject(objectIndex: number): RenderTaskType {
return this.loader.renderTasks[objectIndex].type;
}
compositingOperationForObject(objectIndex: number): CompositingOperation | null {
return this.loader.renderTasks[objectIndex].compositingOperation;
}
meshIndexForObject(objectIndex: number): number {
return 0;
}
pathRangeForObject(objectIndex: number): Range {
return this.loader.renderTasks[objectIndex].instanceIndices;
return new Range(1, this.loader.pathInstances.length + 1);
}
protected get usedSizeFactor(): glmatrix.vec2 {

View File

@ -1,22 +0,0 @@
// pathfinder/shaders/gles2/composite-alpha-mask.fs.glsl
//
// Copyright (c) 2017 The Pathfinder Project Developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
precision mediump float;
uniform sampler2D uSource;
uniform sampler2D uMask;
varying vec2 vTexCoord;
void main() {
vec4 color = texture2D(uSource, vTexCoord);
float alpha = texture2D(uMask, vTexCoord).a;
gl_FragColor = vec4(color.rgb, color.a * alpha);
}

View File

@ -1,26 +0,0 @@
// pathfinder/shaders/gles2/composite-alpha-mask.vs.glsl
//
// Copyright (c) 2017 The Pathfinder Project Developers.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.
precision mediump float;
/// A 3D transform to apply to the scene.
uniform mat4 uTransform;
/// The 2D vertex position.
attribute vec2 aPosition;
/// The texture coordinate.
attribute vec2 aTexCoord;
varying vec2 vTexCoord;
void main() {
gl_Position = uTransform * vec4(aPosition, 0.0, 1.0);
vTexCoord = aTexCoord;
}