@codexo/exojs 0.4.0 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +464 -163
- package/README.md +156 -141
- package/dist/esm/audio/AudioAnalyser.d.ts +0 -1
- package/dist/esm/audio/AudioAnalyser.js +0 -2
- package/dist/esm/audio/AudioAnalyser.js.map +1 -1
- package/dist/esm/core/Application.d.ts +4 -4
- package/dist/esm/core/Application.js +19 -19
- package/dist/esm/core/Application.js.map +1 -1
- package/dist/esm/core/Scene.d.ts +59 -24
- package/dist/esm/core/Scene.js +60 -18
- package/dist/esm/core/Scene.js.map +1 -1
- package/dist/esm/core/SceneManager.js +15 -9
- package/dist/esm/core/SceneManager.js.map +1 -1
- package/dist/esm/core/SceneNode.d.ts +45 -5
- package/dist/esm/core/SceneNode.js +136 -7
- package/dist/esm/core/SceneNode.js.map +1 -1
- package/dist/esm/index.js +3 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/math/index.d.ts +0 -1
- package/dist/esm/rendering/CallbackRenderPass.d.ts +3 -3
- package/dist/esm/rendering/CallbackRenderPass.js +2 -2
- package/dist/esm/rendering/CallbackRenderPass.js.map +1 -1
- package/dist/esm/rendering/Container.d.ts +10 -11
- package/dist/esm/rendering/Container.js +5 -5
- package/dist/esm/rendering/Container.js.map +1 -1
- package/dist/esm/rendering/Drawable.d.ts +2 -2
- package/dist/esm/rendering/Drawable.js +5 -5
- package/dist/esm/rendering/Drawable.js.map +1 -1
- package/dist/esm/rendering/{SceneRenderRuntime.d.ts → RenderBackend.d.ts} +21 -3
- package/dist/esm/rendering/RenderNode.d.ts +41 -5
- package/dist/esm/rendering/RenderNode.js +89 -24
- package/dist/esm/rendering/RenderNode.js.map +1 -1
- package/dist/esm/rendering/RenderPass.d.ts +2 -2
- package/dist/esm/rendering/RenderTargetPass.d.ts +3 -3
- package/dist/esm/rendering/RenderTargetPass.js +9 -9
- package/dist/esm/rendering/RenderTargetPass.js.map +1 -1
- package/dist/esm/rendering/Renderer.d.ts +3 -3
- package/dist/esm/rendering/RendererRegistry.d.ts +13 -7
- package/dist/esm/rendering/RendererRegistry.js +18 -10
- package/dist/esm/rendering/RendererRegistry.js.map +1 -1
- package/dist/esm/rendering/filters/BlurFilter.d.ts +2 -2
- package/dist/esm/rendering/filters/BlurFilter.js +5 -5
- package/dist/esm/rendering/filters/BlurFilter.js.map +1 -1
- package/dist/esm/rendering/filters/ColorFilter.d.ts +2 -2
- package/dist/esm/rendering/filters/ColorFilter.js +3 -3
- package/dist/esm/rendering/filters/ColorFilter.js.map +1 -1
- package/dist/esm/rendering/filters/Filter.d.ts +2 -2
- package/dist/esm/rendering/index.d.ts +6 -6
- package/dist/esm/rendering/primitives/Graphics.d.ts +3 -3
- package/dist/esm/rendering/primitives/Graphics.js.map +1 -1
- package/dist/esm/rendering/shader/Shader.d.ts +3 -3
- package/dist/esm/rendering/shader/Shader.js +10 -10
- package/dist/esm/rendering/text/Text.d.ts +2 -2
- package/dist/esm/rendering/text/Text.js +2 -2
- package/dist/esm/rendering/text/Text.js.map +1 -1
- package/dist/esm/rendering/texture/Sampler.d.ts +0 -3
- package/dist/esm/rendering/texture/Sampler.js +5 -7
- package/dist/esm/rendering/texture/Sampler.js.map +1 -1
- package/dist/esm/rendering/types.d.ts +4 -0
- package/dist/esm/rendering/types.js +4 -0
- package/dist/esm/rendering/types.js.map +1 -1
- package/dist/esm/rendering/video/Video.d.ts +2 -2
- package/dist/esm/rendering/video/Video.js +2 -2
- package/dist/esm/rendering/video/Video.js.map +1 -1
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.d.ts +2 -2
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js +35 -11
- package/dist/esm/rendering/webgl2/AbstractWebGl2BatchedRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.d.ts +13 -13
- package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js +20 -20
- package/dist/esm/rendering/webgl2/AbstractWebGl2Renderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/{WebGl2RenderManager.d.ts → WebGl2Backend.d.ts} +15 -12
- package/dist/esm/rendering/webgl2/{WebGl2RenderManager.js → WebGl2Backend.js} +60 -38
- package/dist/esm/rendering/webgl2/WebGl2Backend.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.d.ts +31 -0
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js +186 -0
- package/dist/esm/rendering/webgl2/WebGl2MaskCompositor.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.d.ts +38 -7
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js +281 -90
- package/dist/esm/rendering/webgl2/WebGl2ParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.d.ts +2 -2
- package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js +15 -10
- package/dist/esm/rendering/webgl2/WebGl2PrimitiveRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js +12 -0
- package/dist/esm/rendering/webgl2/WebGl2ShaderMappings.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.d.ts +2 -0
- package/dist/esm/rendering/webgl2/{WebGl2ShaderRuntime.js → WebGl2ShaderProgram.js} +58 -18
- package/dist/esm/rendering/webgl2/WebGl2ShaderProgram.js.map +1 -0
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.d.ts +26 -7
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js +260 -62
- package/dist/esm/rendering/webgl2/WebGl2SpriteRenderer.js.map +1 -1
- package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.d.ts +24 -1
- package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js +6 -2
- package/dist/esm/rendering/webgl2/WebGl2VertexArrayObject.js.map +1 -1
- package/dist/esm/rendering/webgl2/glsl/mask-compose.frag.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/mask-compose.frag.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/mask-compose.vert.js +4 -0
- package/dist/esm/rendering/webgl2/glsl/mask-compose.vert.js.map +1 -0
- package/dist/esm/rendering/webgl2/glsl/particle.vert.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/sprite.frag.js +1 -1
- package/dist/esm/rendering/webgl2/glsl/sprite.vert.js +1 -1
- package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.d.ts +9 -9
- package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js +18 -18
- package/dist/esm/rendering/webgpu/AbstractWebGpuRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/{WebGpuRenderManager.d.ts → WebGpuBackend.d.ts} +17 -14
- package/dist/esm/rendering/webgpu/{WebGpuRenderManager.js → WebGpuBackend.js} +74 -40
- package/dist/esm/rendering/webgpu/WebGpuBackend.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.d.ts +37 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js +279 -0
- package/dist/esm/rendering/webgpu/WebGpuMaskCompositor.js.map +1 -0
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.d.ts +2 -3
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js +65 -82
- package/dist/esm/rendering/webgpu/WebGpuParticleRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.d.ts +2 -3
- package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js +24 -25
- package/dist/esm/rendering/webgpu/WebGpuPrimitiveRenderer.js.map +1 -1
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.d.ts +28 -13
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js +410 -382
- package/dist/esm/rendering/webgpu/WebGpuSpriteRenderer.js.map +1 -1
- package/dist/esm/resources/Loader.js +5 -3
- package/dist/esm/resources/Loader.js.map +1 -1
- package/dist/exo.esm.js +2500 -1399
- package/dist/exo.esm.js.map +1 -1
- package/package.json +20 -11
- package/dist/esm/math/Transformable.d.ts +0 -47
- package/dist/esm/math/Transformable.js +0 -140
- package/dist/esm/math/Transformable.js.map +0 -1
- package/dist/esm/rendering/webgl2/WebGl2RenderManager.js.map +0 -1
- package/dist/esm/rendering/webgl2/WebGl2RendererRuntime.d.ts +0 -15
- package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.d.ts +0 -2
- package/dist/esm/rendering/webgl2/WebGl2ShaderRuntime.js.map +0 -1
- package/dist/esm/rendering/webgpu/WebGpuRenderManager.js.map +0 -1
- package/dist/esm/rendering/webgpu/WebGpuRendererRuntime.d.ts +0 -8
- package/dist/exo.esm.min.js +0 -2
- package/dist/exo.esm.min.js.map +0 -1
- package/dist/exo.global.js +0 -17328
- package/dist/exo.global.js.map +0 -1
- package/dist/exo.global.min.js +0 -2
- package/dist/exo.global.min.js.map +0 -1
|
@@ -9,20 +9,20 @@ import type { Shader } from '../shader/Shader';
|
|
|
9
9
|
import type { Texture } from '../texture/Texture';
|
|
10
10
|
import type { WebGl2VertexArrayObject } from '../webgl2/WebGl2VertexArrayObject';
|
|
11
11
|
import type { View } from '../View';
|
|
12
|
-
import type {
|
|
12
|
+
import type { RenderBackend } from '../RenderBackend';
|
|
13
13
|
import { RenderTarget } from '../RenderTarget';
|
|
14
14
|
import { RenderTexture } from '../texture/RenderTexture';
|
|
15
15
|
import type { Rectangle } from '@/math/Rectangle';
|
|
16
16
|
import type { RenderStats } from '../RenderStats';
|
|
17
|
-
interface
|
|
17
|
+
interface PixelClipBoundsState {
|
|
18
18
|
x: number;
|
|
19
19
|
y: number;
|
|
20
20
|
width: number;
|
|
21
21
|
height: number;
|
|
22
22
|
}
|
|
23
|
-
export declare class
|
|
23
|
+
export declare class WebGpuBackend implements RenderBackend {
|
|
24
24
|
readonly backendType = RenderBackendType.WebGpu;
|
|
25
|
-
readonly rendererRegistry: RendererRegistry<
|
|
25
|
+
readonly rendererRegistry: RendererRegistry<WebGpuBackend>;
|
|
26
26
|
private readonly _canvas;
|
|
27
27
|
private readonly _rootRenderTarget;
|
|
28
28
|
private readonly _clearColor;
|
|
@@ -30,10 +30,12 @@ export declare class WebGpuRenderManager implements WebGpuRendererRuntime {
|
|
|
30
30
|
private readonly _textureDestroyHandlers;
|
|
31
31
|
private readonly _renderTargetDestroyHandlers;
|
|
32
32
|
private readonly _temporaryRenderTextures;
|
|
33
|
-
private readonly
|
|
34
|
-
private readonly
|
|
35
|
-
private readonly
|
|
36
|
-
private readonly
|
|
33
|
+
private readonly _clipBoundsStack;
|
|
34
|
+
private readonly _clipPixelStack;
|
|
35
|
+
private readonly _clipPointA;
|
|
36
|
+
private readonly _clipPointB;
|
|
37
|
+
private readonly _maskCompositor;
|
|
38
|
+
private _maskCompositorConnected;
|
|
37
39
|
private _mipmapShaderModule;
|
|
38
40
|
private _mipmapBindGroupLayout;
|
|
39
41
|
private _mipmapPipelineLayout;
|
|
@@ -45,7 +47,6 @@ export declare class WebGpuRenderManager implements WebGpuRendererRuntime {
|
|
|
45
47
|
private _initializePromise;
|
|
46
48
|
private _renderTarget;
|
|
47
49
|
private _renderer;
|
|
48
|
-
private _blendMode;
|
|
49
50
|
private _texture;
|
|
50
51
|
private _clearRequested;
|
|
51
52
|
private _hasPresentedFrame;
|
|
@@ -68,9 +69,10 @@ export declare class WebGpuRenderManager implements WebGpuRendererRuntime {
|
|
|
68
69
|
setBlendMode(blendMode: BlendModes | null): this;
|
|
69
70
|
setVao(vao: WebGl2VertexArrayObject | null): this;
|
|
70
71
|
setRenderTarget(target: RenderTarget | null): this;
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
pushScissorRect(bounds: Rectangle): this;
|
|
73
|
+
composeWithAlphaMask(content: Texture | RenderTexture, mask: Texture | RenderTexture, x: number, y: number, width: number, height: number, blendMode: BlendModes): this;
|
|
74
|
+
popScissorRect(): this;
|
|
75
|
+
getScissorRect(): PixelClipBoundsState | null;
|
|
74
76
|
acquireRenderTexture(width: number, height: number): RenderTexture;
|
|
75
77
|
releaseRenderTexture(texture: RenderTexture): this;
|
|
76
78
|
setView(view: View | null): this;
|
|
@@ -88,6 +90,7 @@ export declare class WebGpuRenderManager implements WebGpuRendererRuntime {
|
|
|
88
90
|
private _setActiveRenderer;
|
|
89
91
|
private _flushActiveRenderer;
|
|
90
92
|
private _initialize;
|
|
93
|
+
private _prewarmRendererPipelines;
|
|
91
94
|
private _getGpuNavigator;
|
|
92
95
|
private _createInitializationError;
|
|
93
96
|
private _destroyManagedTextures;
|
|
@@ -97,8 +100,8 @@ export declare class WebGpuRenderManager implements WebGpuRendererRuntime {
|
|
|
97
100
|
private _evictTexture;
|
|
98
101
|
private _subscribeRenderTarget;
|
|
99
102
|
private _unsubscribeRenderTarget;
|
|
100
|
-
private
|
|
101
|
-
private
|
|
103
|
+
private _toClipPixels;
|
|
104
|
+
private _intersectClips;
|
|
102
105
|
private _createSampler;
|
|
103
106
|
private _getTextureUsage;
|
|
104
107
|
private _getAddressMode;
|
|
@@ -7,6 +7,7 @@ import { RenderTarget } from '../RenderTarget.js';
|
|
|
7
7
|
import { WebGpuPrimitiveRenderer } from './WebGpuPrimitiveRenderer.js';
|
|
8
8
|
import { WebGpuSpriteRenderer } from './WebGpuSpriteRenderer.js';
|
|
9
9
|
import { WebGpuParticleRenderer } from './WebGpuParticleRenderer.js';
|
|
10
|
+
import { WebGpuMaskCompositor } from './WebGpuMaskCompositor.js';
|
|
10
11
|
import { RenderTexture } from '../texture/RenderTexture.js';
|
|
11
12
|
import { Sprite } from '../sprite/Sprite.js';
|
|
12
13
|
import { DrawableShape } from '../primitives/DrawableShape.js';
|
|
@@ -15,7 +16,7 @@ import { Vector } from '../../math/Vector.js';
|
|
|
15
16
|
|
|
16
17
|
/// <reference types="@webgpu/types" />
|
|
17
18
|
const managedTextureFormat = 'rgba8unorm';
|
|
18
|
-
class
|
|
19
|
+
class WebGpuBackend {
|
|
19
20
|
backendType = RenderBackendType.WebGpu;
|
|
20
21
|
rendererRegistry = new RendererRegistry();
|
|
21
22
|
_canvas;
|
|
@@ -25,10 +26,12 @@ class WebGpuRenderManager {
|
|
|
25
26
|
_textureDestroyHandlers = new Map();
|
|
26
27
|
_renderTargetDestroyHandlers = new Map();
|
|
27
28
|
_temporaryRenderTextures = [];
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
_clipBoundsStack = [];
|
|
30
|
+
_clipPixelStack = [];
|
|
31
|
+
_clipPointA = new Vector();
|
|
32
|
+
_clipPointB = new Vector();
|
|
33
|
+
_maskCompositor = new WebGpuMaskCompositor();
|
|
34
|
+
_maskCompositorConnected = false;
|
|
32
35
|
_mipmapShaderModule = null;
|
|
33
36
|
_mipmapBindGroupLayout = null;
|
|
34
37
|
_mipmapPipelineLayout = null;
|
|
@@ -40,7 +43,6 @@ class WebGpuRenderManager {
|
|
|
40
43
|
_initializePromise = null;
|
|
41
44
|
_renderTarget;
|
|
42
45
|
_renderer = null;
|
|
43
|
-
_blendMode = null;
|
|
44
46
|
_texture = null;
|
|
45
47
|
_clearRequested = false;
|
|
46
48
|
_hasPresentedFrame = false;
|
|
@@ -137,7 +139,6 @@ class WebGpuRenderManager {
|
|
|
137
139
|
}
|
|
138
140
|
setBlendMode(blendMode) {
|
|
139
141
|
if (blendMode === null) {
|
|
140
|
-
this._blendMode = null;
|
|
141
142
|
return this;
|
|
142
143
|
}
|
|
143
144
|
if (blendMode !== BlendModes.Normal
|
|
@@ -147,7 +148,6 @@ class WebGpuRenderManager {
|
|
|
147
148
|
&& blendMode !== BlendModes.Screen) {
|
|
148
149
|
throw new Error(`WebGPU blend mode "${blendMode}" is not implemented yet.`);
|
|
149
150
|
}
|
|
150
|
-
this._blendMode = blendMode;
|
|
151
151
|
return this;
|
|
152
152
|
}
|
|
153
153
|
setVao(vao) {
|
|
@@ -174,39 +174,52 @@ class WebGpuRenderManager {
|
|
|
174
174
|
}
|
|
175
175
|
return this;
|
|
176
176
|
}
|
|
177
|
-
|
|
177
|
+
pushScissorRect(bounds) {
|
|
178
178
|
this._flushActiveRenderer();
|
|
179
|
-
this.
|
|
180
|
-
const
|
|
181
|
-
const
|
|
182
|
-
? this.
|
|
179
|
+
this._clipBoundsStack.push(bounds.clone());
|
|
180
|
+
const nextClip = this._toClipPixels(bounds);
|
|
181
|
+
const previousClip = this._clipPixelStack.length > 0
|
|
182
|
+
? this._clipPixelStack[this._clipPixelStack.length - 1]
|
|
183
183
|
: null;
|
|
184
|
-
const
|
|
185
|
-
this.
|
|
184
|
+
const resolvedClip = previousClip ? this._intersectClips(previousClip, nextClip) : nextClip;
|
|
185
|
+
this._clipPixelStack.push(resolvedClip);
|
|
186
186
|
return this;
|
|
187
187
|
}
|
|
188
|
-
|
|
189
|
-
if (
|
|
188
|
+
composeWithAlphaMask(content, mask, x, y, width, height, blendMode) {
|
|
189
|
+
if (width <= 0 || height <= 0) {
|
|
190
190
|
return this;
|
|
191
191
|
}
|
|
192
192
|
this._flushActiveRenderer();
|
|
193
|
-
|
|
194
|
-
if (
|
|
195
|
-
|
|
193
|
+
this._setActiveRenderer(null);
|
|
194
|
+
if (!this._maskCompositorConnected) {
|
|
195
|
+
this._maskCompositor.connect(this.device);
|
|
196
|
+
this._maskCompositorConnected = true;
|
|
196
197
|
}
|
|
197
|
-
this.
|
|
198
|
+
this._maskCompositor.compose(this, content, mask, x, y, width, height, blendMode);
|
|
199
|
+
return this;
|
|
200
|
+
}
|
|
201
|
+
popScissorRect() {
|
|
202
|
+
if (this._clipBoundsStack.length === 0) {
|
|
203
|
+
return this;
|
|
204
|
+
}
|
|
205
|
+
this._flushActiveRenderer();
|
|
206
|
+
const removedClip = this._clipBoundsStack.pop();
|
|
207
|
+
if (removedClip) {
|
|
208
|
+
removedClip.destroy();
|
|
209
|
+
}
|
|
210
|
+
this._clipPixelStack.pop();
|
|
198
211
|
return this;
|
|
199
212
|
}
|
|
200
213
|
getScissorRect() {
|
|
201
|
-
if (this.
|
|
214
|
+
if (this._clipPixelStack.length === 0) {
|
|
202
215
|
return null;
|
|
203
216
|
}
|
|
204
|
-
const
|
|
217
|
+
const clip = this._clipPixelStack[this._clipPixelStack.length - 1];
|
|
205
218
|
return {
|
|
206
|
-
x:
|
|
207
|
-
y:
|
|
208
|
-
width:
|
|
209
|
-
height:
|
|
219
|
+
x: clip.x,
|
|
220
|
+
y: clip.y,
|
|
221
|
+
width: clip.width,
|
|
222
|
+
height: clip.height,
|
|
210
223
|
};
|
|
211
224
|
}
|
|
212
225
|
acquireRenderTexture(width, height) {
|
|
@@ -269,13 +282,17 @@ class WebGpuRenderManager {
|
|
|
269
282
|
this.rendererRegistry.destroy();
|
|
270
283
|
this._destroyManagedTextures();
|
|
271
284
|
this._destroyTemporaryRenderTextures();
|
|
272
|
-
for (const
|
|
273
|
-
|
|
285
|
+
for (const clipBounds of this._clipBoundsStack) {
|
|
286
|
+
clipBounds.destroy();
|
|
287
|
+
}
|
|
288
|
+
this._clipBoundsStack.length = 0;
|
|
289
|
+
this._clipPixelStack.length = 0;
|
|
290
|
+
this._clipPointA.destroy();
|
|
291
|
+
this._clipPointB.destroy();
|
|
292
|
+
if (this._maskCompositorConnected) {
|
|
293
|
+
this._maskCompositor.disconnect();
|
|
294
|
+
this._maskCompositorConnected = false;
|
|
274
295
|
}
|
|
275
|
-
this._maskStack.length = 0;
|
|
276
|
-
this._maskPixelStack.length = 0;
|
|
277
|
-
this._maskPointA.destroy();
|
|
278
|
-
this._maskPointB.destroy();
|
|
279
296
|
for (const target of Array.from(this._renderTargetDestroyHandlers.keys())) {
|
|
280
297
|
this._unsubscribeRenderTarget(target);
|
|
281
298
|
}
|
|
@@ -417,12 +434,29 @@ class WebGpuRenderManager {
|
|
|
417
434
|
this._context = context;
|
|
418
435
|
this._device = device;
|
|
419
436
|
this._format = format;
|
|
420
|
-
this._blendMode = BlendModes.Normal;
|
|
421
437
|
this._hasPresentedFrame = false;
|
|
422
438
|
this.rendererRegistry.connect(this);
|
|
423
439
|
this.resize(this._canvas.width, this._canvas.height);
|
|
440
|
+
// Kick off async pipeline pre-warm for any renderer that supports
|
|
441
|
+
// it. Each renderer creates its full set of (blendMode × format)
|
|
442
|
+
// pipelines via createRenderPipelineAsync in parallel, so the first
|
|
443
|
+
// draw call of every blend mode does not have to block on synchronous
|
|
444
|
+
// pipeline creation. Renderers without a prewarmPipelines method
|
|
445
|
+
// continue to create pipelines lazily on first use.
|
|
446
|
+
const prewarmFormats = [format, managedTextureFormat];
|
|
447
|
+
await this._prewarmRendererPipelines(prewarmFormats);
|
|
424
448
|
return this;
|
|
425
449
|
}
|
|
450
|
+
async _prewarmRendererPipelines(formats) {
|
|
451
|
+
const promises = [];
|
|
452
|
+
for (const renderer of this.rendererRegistry.renderers()) {
|
|
453
|
+
const candidate = renderer;
|
|
454
|
+
if (typeof candidate.prewarmPipelines === 'function') {
|
|
455
|
+
promises.push(candidate.prewarmPipelines(formats));
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
await Promise.all(promises);
|
|
459
|
+
}
|
|
426
460
|
_getGpuNavigator() {
|
|
427
461
|
const gpuNavigator = navigator;
|
|
428
462
|
return gpuNavigator.gpu ? gpuNavigator : null;
|
|
@@ -555,9 +589,9 @@ class WebGpuRenderManager {
|
|
|
555
589
|
this._renderTargetDestroyHandlers.delete(target);
|
|
556
590
|
}
|
|
557
591
|
}
|
|
558
|
-
|
|
559
|
-
const topLeft = this._renderTarget.mapCoordsToPixel(this.
|
|
560
|
-
const bottomRight = this._renderTarget.mapCoordsToPixel(this.
|
|
592
|
+
_toClipPixels(bounds) {
|
|
593
|
+
const topLeft = this._renderTarget.mapCoordsToPixel(this._clipPointA.set(bounds.left, bounds.top));
|
|
594
|
+
const bottomRight = this._renderTarget.mapCoordsToPixel(this._clipPointB.set(bounds.right, bounds.bottom));
|
|
561
595
|
const minX = Math.min(topLeft.x, bottomRight.x);
|
|
562
596
|
const maxX = Math.max(topLeft.x, bottomRight.x);
|
|
563
597
|
const minY = Math.min(topLeft.y, bottomRight.y);
|
|
@@ -572,7 +606,7 @@ class WebGpuRenderManager {
|
|
|
572
606
|
const height = Math.max(0, bottom - y);
|
|
573
607
|
return { x, y, width, height };
|
|
574
608
|
}
|
|
575
|
-
|
|
609
|
+
_intersectClips(first, second) {
|
|
576
610
|
const left = Math.max(first.x, second.x);
|
|
577
611
|
const top = Math.max(first.y, second.y);
|
|
578
612
|
const right = Math.min(first.x + first.width, second.x + second.width);
|
|
@@ -773,5 +807,5 @@ fn fragmentMain(input: VertexOutput) -> @location(0) vec4<f32> {
|
|
|
773
807
|
}
|
|
774
808
|
}
|
|
775
809
|
|
|
776
|
-
export {
|
|
777
|
-
//# sourceMappingURL=
|
|
810
|
+
export { WebGpuBackend };
|
|
811
|
+
//# sourceMappingURL=WebGpuBackend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebGpuBackend.js","sources":["../../../../../src/rendering/webgpu/WebGpuBackend.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { BlendModes } from '@/rendering/types';
|
|
2
|
+
import type { Texture } from '@/rendering/texture/Texture';
|
|
3
|
+
import type { RenderTexture } from '@/rendering/texture/RenderTexture';
|
|
4
|
+
import type { WebGpuBackend } from './WebGpuBackend';
|
|
5
|
+
/**
|
|
6
|
+
* Single-quad two-texture compositor used by
|
|
7
|
+
* `WebGpuBackend.composeWithAlphaMask`. Renders the content texture
|
|
8
|
+
* onto the active render target with each output texel's alpha multiplied
|
|
9
|
+
* by the mask texture's alpha. Both textures are sampled with stretched-fit
|
|
10
|
+
* UVs over the destination rectangle.
|
|
11
|
+
*
|
|
12
|
+
* Pipelines are cached per (target format, blend mode). The compositor is
|
|
13
|
+
* not a {@link AbstractWebGpuRenderer} and never participates in renderer
|
|
14
|
+
* registry dispatch — the manager invokes it directly.
|
|
15
|
+
*/
|
|
16
|
+
export declare class WebGpuMaskCompositor {
|
|
17
|
+
private readonly _projectionData;
|
|
18
|
+
private readonly _vertexData;
|
|
19
|
+
private readonly _indexData;
|
|
20
|
+
private readonly _projectionMatrix;
|
|
21
|
+
private readonly _pipelines;
|
|
22
|
+
private _device;
|
|
23
|
+
private _shaderModule;
|
|
24
|
+
private _projectionBindGroupLayout;
|
|
25
|
+
private _textureBindGroupLayout;
|
|
26
|
+
private _pipelineLayout;
|
|
27
|
+
private _vertexBuffer;
|
|
28
|
+
private _indexBuffer;
|
|
29
|
+
private _projectionBuffer;
|
|
30
|
+
private _projectionBindGroup;
|
|
31
|
+
connect(device: GPUDevice): void;
|
|
32
|
+
disconnect(): void;
|
|
33
|
+
compose(manager: WebGpuBackend, content: Texture | RenderTexture, mask: Texture | RenderTexture, x: number, y: number, width: number, height: number, blendMode: BlendModes): void;
|
|
34
|
+
private _getOrCreatePipeline;
|
|
35
|
+
private _writeQuadVertices;
|
|
36
|
+
private _writeProjectionMatrix;
|
|
37
|
+
}
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
import { Matrix } from '../../math/Matrix.js';
|
|
2
|
+
import { getWebGpuBlendState } from './WebGpuBlendState.js';
|
|
3
|
+
|
|
4
|
+
/// <reference types="@webgpu/types" />
|
|
5
|
+
const compositorShaderSource = `
|
|
6
|
+
struct ProjectionUniforms {
|
|
7
|
+
matrix: mat4x4<f32>,
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
@group(0) @binding(0)
|
|
11
|
+
var<uniform> projection: ProjectionUniforms;
|
|
12
|
+
|
|
13
|
+
@group(1) @binding(0)
|
|
14
|
+
var contentTexture: texture_2d<f32>;
|
|
15
|
+
@group(1) @binding(1)
|
|
16
|
+
var contentSampler: sampler;
|
|
17
|
+
@group(1) @binding(2)
|
|
18
|
+
var maskTexture: texture_2d<f32>;
|
|
19
|
+
@group(1) @binding(3)
|
|
20
|
+
var maskSampler: sampler;
|
|
21
|
+
|
|
22
|
+
struct VertexInput {
|
|
23
|
+
@location(0) position: vec2<f32>,
|
|
24
|
+
@location(1) texcoord: vec2<f32>,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
struct VertexOutput {
|
|
28
|
+
@builtin(position) position: vec4<f32>,
|
|
29
|
+
@location(0) texcoord: vec2<f32>,
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
@vertex
|
|
33
|
+
fn vertexMain(input: VertexInput) -> VertexOutput {
|
|
34
|
+
var output: VertexOutput;
|
|
35
|
+
|
|
36
|
+
output.position = projection.matrix * vec4<f32>(input.position, 0.0, 1.0);
|
|
37
|
+
output.texcoord = input.texcoord;
|
|
38
|
+
|
|
39
|
+
return output;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
@fragment
|
|
43
|
+
fn fragmentMain(input: VertexOutput) -> @location(0) vec4<f32> {
|
|
44
|
+
let contentColor = textureSample(contentTexture, contentSampler, input.texcoord);
|
|
45
|
+
let maskAlpha = textureSample(maskTexture, maskSampler, input.texcoord).a;
|
|
46
|
+
|
|
47
|
+
return vec4<f32>(contentColor.rgb * maskAlpha, contentColor.a * maskAlpha);
|
|
48
|
+
}
|
|
49
|
+
`;
|
|
50
|
+
// 4 floats per vertex: position(x, y) + texcoord(u, v).
|
|
51
|
+
const vertexStrideBytes = 16;
|
|
52
|
+
// 16 floats per mat4x4 projection uniform.
|
|
53
|
+
const projectionUniformBytes = 64;
|
|
54
|
+
/**
|
|
55
|
+
* Single-quad two-texture compositor used by
|
|
56
|
+
* `WebGpuBackend.composeWithAlphaMask`. Renders the content texture
|
|
57
|
+
* onto the active render target with each output texel's alpha multiplied
|
|
58
|
+
* by the mask texture's alpha. Both textures are sampled with stretched-fit
|
|
59
|
+
* UVs over the destination rectangle.
|
|
60
|
+
*
|
|
61
|
+
* Pipelines are cached per (target format, blend mode). The compositor is
|
|
62
|
+
* not a {@link AbstractWebGpuRenderer} and never participates in renderer
|
|
63
|
+
* registry dispatch — the manager invokes it directly.
|
|
64
|
+
*/
|
|
65
|
+
class WebGpuMaskCompositor {
|
|
66
|
+
_projectionData = new Float32Array(16);
|
|
67
|
+
_vertexData = new Float32Array(16); // 4 verts * 4 floats
|
|
68
|
+
_indexData = new Uint16Array([0, 1, 2, 0, 2, 3]);
|
|
69
|
+
_projectionMatrix = new Matrix();
|
|
70
|
+
_pipelines = new Map();
|
|
71
|
+
_device = null;
|
|
72
|
+
_shaderModule = null;
|
|
73
|
+
_projectionBindGroupLayout = null;
|
|
74
|
+
_textureBindGroupLayout = null;
|
|
75
|
+
_pipelineLayout = null;
|
|
76
|
+
_vertexBuffer = null;
|
|
77
|
+
_indexBuffer = null;
|
|
78
|
+
_projectionBuffer = null;
|
|
79
|
+
_projectionBindGroup = null;
|
|
80
|
+
connect(device) {
|
|
81
|
+
if (this._device !== null) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
this._device = device;
|
|
85
|
+
this._shaderModule = device.createShaderModule({ code: compositorShaderSource });
|
|
86
|
+
this._projectionBindGroupLayout = device.createBindGroupLayout({
|
|
87
|
+
entries: [
|
|
88
|
+
{
|
|
89
|
+
binding: 0,
|
|
90
|
+
visibility: GPUShaderStage.VERTEX,
|
|
91
|
+
buffer: { type: 'uniform' },
|
|
92
|
+
},
|
|
93
|
+
],
|
|
94
|
+
});
|
|
95
|
+
this._textureBindGroupLayout = device.createBindGroupLayout({
|
|
96
|
+
entries: [
|
|
97
|
+
{ binding: 0, visibility: GPUShaderStage.FRAGMENT, texture: {} },
|
|
98
|
+
{ binding: 1, visibility: GPUShaderStage.FRAGMENT, sampler: {} },
|
|
99
|
+
{ binding: 2, visibility: GPUShaderStage.FRAGMENT, texture: {} },
|
|
100
|
+
{ binding: 3, visibility: GPUShaderStage.FRAGMENT, sampler: {} },
|
|
101
|
+
],
|
|
102
|
+
});
|
|
103
|
+
this._pipelineLayout = device.createPipelineLayout({
|
|
104
|
+
bindGroupLayouts: [this._projectionBindGroupLayout, this._textureBindGroupLayout],
|
|
105
|
+
});
|
|
106
|
+
this._vertexBuffer = device.createBuffer({
|
|
107
|
+
size: 4 * vertexStrideBytes,
|
|
108
|
+
usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,
|
|
109
|
+
});
|
|
110
|
+
this._indexBuffer = device.createBuffer({
|
|
111
|
+
size: 6 * Uint16Array.BYTES_PER_ELEMENT,
|
|
112
|
+
usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,
|
|
113
|
+
});
|
|
114
|
+
device.queue.writeBuffer(this._indexBuffer, 0, this._indexData);
|
|
115
|
+
this._projectionBuffer = device.createBuffer({
|
|
116
|
+
size: projectionUniformBytes,
|
|
117
|
+
usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,
|
|
118
|
+
});
|
|
119
|
+
this._projectionBindGroup = device.createBindGroup({
|
|
120
|
+
layout: this._projectionBindGroupLayout,
|
|
121
|
+
entries: [
|
|
122
|
+
{ binding: 0, resource: { buffer: this._projectionBuffer } },
|
|
123
|
+
],
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
disconnect() {
|
|
127
|
+
if (this._device === null) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
this._vertexBuffer?.destroy();
|
|
131
|
+
this._indexBuffer?.destroy();
|
|
132
|
+
this._projectionBuffer?.destroy();
|
|
133
|
+
this._vertexBuffer = null;
|
|
134
|
+
this._indexBuffer = null;
|
|
135
|
+
this._projectionBuffer = null;
|
|
136
|
+
this._projectionBindGroup = null;
|
|
137
|
+
this._pipelineLayout = null;
|
|
138
|
+
this._textureBindGroupLayout = null;
|
|
139
|
+
this._projectionBindGroupLayout = null;
|
|
140
|
+
this._shaderModule = null;
|
|
141
|
+
this._pipelines.clear();
|
|
142
|
+
this._device = null;
|
|
143
|
+
}
|
|
144
|
+
compose(manager, content, mask, x, y, width, height, blendMode) {
|
|
145
|
+
if (this._device === null) {
|
|
146
|
+
throw new Error('WebGpuMaskCompositor: not connected.');
|
|
147
|
+
}
|
|
148
|
+
if (width <= 0 || height <= 0) {
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const device = this._device;
|
|
152
|
+
this._writeQuadVertices(x, y, x + width, y + height);
|
|
153
|
+
device.queue.writeBuffer(this._vertexBuffer, 0, this._vertexData);
|
|
154
|
+
this._writeProjectionMatrix(manager.view.getTransform());
|
|
155
|
+
device.queue.writeBuffer(this._projectionBuffer, 0, this._projectionData);
|
|
156
|
+
const contentBinding = manager.getTextureBinding(content);
|
|
157
|
+
const maskBinding = manager.getTextureBinding(mask);
|
|
158
|
+
const textureBindGroup = device.createBindGroup({
|
|
159
|
+
layout: this._textureBindGroupLayout,
|
|
160
|
+
entries: [
|
|
161
|
+
{ binding: 0, resource: contentBinding.view },
|
|
162
|
+
{ binding: 1, resource: contentBinding.sampler },
|
|
163
|
+
{ binding: 2, resource: maskBinding.view },
|
|
164
|
+
{ binding: 3, resource: maskBinding.sampler },
|
|
165
|
+
],
|
|
166
|
+
});
|
|
167
|
+
const targetFormat = manager.renderTargetFormat;
|
|
168
|
+
const pipeline = this._getOrCreatePipeline(targetFormat, blendMode);
|
|
169
|
+
const encoder = device.createCommandEncoder();
|
|
170
|
+
const pass = encoder.beginRenderPass({
|
|
171
|
+
colorAttachments: [manager.createColorAttachment()],
|
|
172
|
+
});
|
|
173
|
+
manager.stats.renderPasses++;
|
|
174
|
+
const scissor = manager.getScissorRect();
|
|
175
|
+
if (scissor !== null) {
|
|
176
|
+
pass.setScissorRect(scissor.x, scissor.y, scissor.width, scissor.height);
|
|
177
|
+
}
|
|
178
|
+
pass.setPipeline(pipeline);
|
|
179
|
+
pass.setBindGroup(0, this._projectionBindGroup);
|
|
180
|
+
pass.setBindGroup(1, textureBindGroup);
|
|
181
|
+
pass.setVertexBuffer(0, this._vertexBuffer);
|
|
182
|
+
pass.setIndexBuffer(this._indexBuffer, 'uint16');
|
|
183
|
+
pass.drawIndexed(6);
|
|
184
|
+
manager.stats.batches++;
|
|
185
|
+
manager.stats.drawCalls++;
|
|
186
|
+
pass.end();
|
|
187
|
+
manager.submit(encoder.finish());
|
|
188
|
+
}
|
|
189
|
+
_getOrCreatePipeline(format, blendMode) {
|
|
190
|
+
const key = `${format}|${blendMode}`;
|
|
191
|
+
const cached = this._pipelines.get(key);
|
|
192
|
+
if (cached !== undefined) {
|
|
193
|
+
return cached;
|
|
194
|
+
}
|
|
195
|
+
const device = this._device;
|
|
196
|
+
const pipeline = device.createRenderPipeline({
|
|
197
|
+
layout: this._pipelineLayout,
|
|
198
|
+
vertex: {
|
|
199
|
+
module: this._shaderModule,
|
|
200
|
+
entryPoint: 'vertexMain',
|
|
201
|
+
buffers: [
|
|
202
|
+
{
|
|
203
|
+
arrayStride: vertexStrideBytes,
|
|
204
|
+
attributes: [
|
|
205
|
+
{ shaderLocation: 0, offset: 0, format: 'float32x2' },
|
|
206
|
+
{ shaderLocation: 1, offset: 8, format: 'float32x2' },
|
|
207
|
+
],
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
},
|
|
211
|
+
fragment: {
|
|
212
|
+
module: this._shaderModule,
|
|
213
|
+
entryPoint: 'fragmentMain',
|
|
214
|
+
targets: [
|
|
215
|
+
{
|
|
216
|
+
format,
|
|
217
|
+
blend: getWebGpuBlendState(blendMode),
|
|
218
|
+
},
|
|
219
|
+
],
|
|
220
|
+
},
|
|
221
|
+
primitive: { topology: 'triangle-list' },
|
|
222
|
+
});
|
|
223
|
+
this._pipelines.set(key, pipeline);
|
|
224
|
+
return pipeline;
|
|
225
|
+
}
|
|
226
|
+
_writeQuadVertices(left, top, right, bottom) {
|
|
227
|
+
const view = this._vertexData;
|
|
228
|
+
// Vertex 0: top-left (UV 0, 0)
|
|
229
|
+
view[0] = left;
|
|
230
|
+
view[1] = top;
|
|
231
|
+
view[2] = 0;
|
|
232
|
+
view[3] = 0;
|
|
233
|
+
// Vertex 1: top-right (UV 1, 0)
|
|
234
|
+
view[4] = right;
|
|
235
|
+
view[5] = top;
|
|
236
|
+
view[6] = 1;
|
|
237
|
+
view[7] = 0;
|
|
238
|
+
// Vertex 2: bottom-right (UV 1, 1)
|
|
239
|
+
view[8] = right;
|
|
240
|
+
view[9] = bottom;
|
|
241
|
+
view[10] = 1;
|
|
242
|
+
view[11] = 1;
|
|
243
|
+
// Vertex 3: bottom-left (UV 0, 1)
|
|
244
|
+
view[12] = left;
|
|
245
|
+
view[13] = bottom;
|
|
246
|
+
view[14] = 0;
|
|
247
|
+
view[15] = 1;
|
|
248
|
+
}
|
|
249
|
+
_writeProjectionMatrix(viewMatrix) {
|
|
250
|
+
// Pack the 3x3 affine view matrix into a 4x4 column-major mat4x4
|
|
251
|
+
// for WGSL, mirroring the layout used by WebGpuPrimitiveRenderer
|
|
252
|
+
// (see `_writeShapeVertices` in that file for the rationale).
|
|
253
|
+
const m = this._projectionMatrix.copy(viewMatrix);
|
|
254
|
+
const data = this._projectionData;
|
|
255
|
+
// col 0
|
|
256
|
+
data[0] = m.a;
|
|
257
|
+
data[1] = m.c;
|
|
258
|
+
data[2] = 0;
|
|
259
|
+
data[3] = 0;
|
|
260
|
+
// col 1
|
|
261
|
+
data[4] = m.b;
|
|
262
|
+
data[5] = m.d;
|
|
263
|
+
data[6] = 0;
|
|
264
|
+
data[7] = 0;
|
|
265
|
+
// col 2
|
|
266
|
+
data[8] = 0;
|
|
267
|
+
data[9] = 0;
|
|
268
|
+
data[10] = 1;
|
|
269
|
+
data[11] = 0;
|
|
270
|
+
// col 3
|
|
271
|
+
data[12] = m.x;
|
|
272
|
+
data[13] = m.y;
|
|
273
|
+
data[14] = 0;
|
|
274
|
+
data[15] = 1;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export { WebGpuMaskCompositor };
|
|
279
|
+
//# sourceMappingURL=WebGpuMaskCompositor.js.map
|