@zephyr3d/device 0.2.3 → 0.2.5
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/README.md +1 -1
- package/dist/base_types.js +7 -66
- package/dist/base_types.js.map +1 -1
- package/dist/builder/ast.js +121 -118
- package/dist/builder/ast.js.map +1 -1
- package/dist/builder/base.js +29 -25
- package/dist/builder/base.js.map +1 -1
- package/dist/builder/builtinfunc.js +62 -19
- package/dist/builder/builtinfunc.js.map +1 -1
- package/dist/builder/constructors.js +1 -1
- package/dist/builder/constructors.js.map +1 -1
- package/dist/builder/errors.js +7 -7
- package/dist/builder/errors.js.map +1 -1
- package/dist/builder/misc.js +10 -0
- package/dist/builder/misc.js.map +1 -0
- package/dist/builder/programbuilder.js +65 -34
- package/dist/builder/programbuilder.js.map +1 -1
- package/dist/builder/reflection.js.map +1 -1
- package/dist/builder/types.js +74 -74
- package/dist/builder/types.js.map +1 -1
- package/dist/device.js +72 -43
- package/dist/device.js.map +1 -1
- package/dist/gpuobject.js +82 -24
- package/dist/gpuobject.js.map +1 -1
- package/dist/helpers/drawtext.js +1 -0
- package/dist/helpers/drawtext.js.map +1 -1
- package/dist/helpers/font.js +1 -0
- package/dist/helpers/font.js.map +1 -1
- package/dist/helpers/glyphmanager.js +7 -7
- package/dist/helpers/glyphmanager.js.map +1 -1
- package/dist/helpers/textureatlas.js +3 -5
- package/dist/helpers/textureatlas.js.map +1 -1
- package/dist/index.d.ts +267 -204
- package/dist/index.js +6 -5
- package/dist/index.js.map +1 -1
- package/dist/pool.js +102 -45
- package/dist/pool.js.map +1 -1
- package/dist/timer.js.map +1 -1
- package/dist/uniformdata.js +2 -2
- package/dist/uniformdata.js.map +1 -1
- package/dist/vertexdata.js +27 -1
- package/dist/vertexdata.js.map +1 -1
- package/package.json +31 -19
package/dist/index.js
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { ShaderType, encodePixel, encodePixelToArray, getTextureFormatBlockHeight, getTextureFormatBlockSize, getTextureFormatBlockWidth, hasAlphaChannel, hasBlueChannel, hasDepthChannel, hasGreenChannel, hasRedChannel, hasStencilChannel, isCompressedTextureFormat, isFloatTextureFormat, isIntegerTextureFormat, isSRGBTextureFormat, isSignedTextureFormat, linearTextureFormatToSRGB } from './base_types.js';
|
|
2
2
|
export { VertexData } from './vertexdata.js';
|
|
3
|
-
export { GPUResourceUsageFlags, MAX_BINDING_GROUPS, MAX_TEXCOORD_INDEX_COUNT, MAX_VERTEX_ATTRIBUTES, VERTEX_ATTRIB_BLEND_INDICES, VERTEX_ATTRIB_BLEND_WEIGHT, VERTEX_ATTRIB_DIFFUSE, VERTEX_ATTRIB_NORMAL, VERTEX_ATTRIB_POSITION, VERTEX_ATTRIB_TANGENT, VERTEX_ATTRIB_TEXCOORD0, VERTEX_ATTRIB_TEXCOORD1, VERTEX_ATTRIB_TEXCOORD2, VERTEX_ATTRIB_TEXCOORD3, VERTEX_ATTRIB_TEXCOORD4, VERTEX_ATTRIB_TEXCOORD5, VERTEX_ATTRIB_TEXCOORD6, VERTEX_ATTRIB_TEXCOORD7, genDefaultName, getVertexAttribByName, getVertexAttribFormat, getVertexAttribName, getVertexBufferAttribType, getVertexBufferAttribTypeBySemantic, getVertexBufferLength, getVertexBufferStride, getVertexFormatComponentCount, getVertexFormatSize, makeVertexBufferType, semanticList, semanticToAttrib } from './gpuobject.js';
|
|
3
|
+
export { GPUResourceUsageFlags, MAX_BINDING_GROUPS, MAX_TEXCOORD_INDEX_COUNT, MAX_VERTEX_ATTRIBUTES, VERTEX_ATTRIB_BLEND_INDICES, VERTEX_ATTRIB_BLEND_WEIGHT, VERTEX_ATTRIB_DIFFUSE, VERTEX_ATTRIB_NORMAL, VERTEX_ATTRIB_POSITION, VERTEX_ATTRIB_TANGENT, VERTEX_ATTRIB_TEXCOORD0, VERTEX_ATTRIB_TEXCOORD1, VERTEX_ATTRIB_TEXCOORD2, VERTEX_ATTRIB_TEXCOORD3, VERTEX_ATTRIB_TEXCOORD4, VERTEX_ATTRIB_TEXCOORD5, VERTEX_ATTRIB_TEXCOORD6, VERTEX_ATTRIB_TEXCOORD7, genDefaultName, getVertexAttribByName, getVertexAttribFormat, getVertexAttribName, getVertexAttributeFormat, getVertexAttributeIndex, getVertexBufferAttribType, getVertexBufferAttribTypeBySemantic, getVertexBufferLength, getVertexBufferStride, getVertexFormatComponentCount, getVertexFormatSize, makeVertexBufferType, matchVertexBuffer, semanticList, semanticToAttrib } from './gpuobject.js';
|
|
4
4
|
export { BaseDevice } from './device.js';
|
|
5
|
-
export {
|
|
5
|
+
export { Pool } from './pool.js';
|
|
6
|
+
export { CPUTimer } from './timer.js';
|
|
7
|
+
export { StructuredBufferData } from './uniformdata.js';
|
|
8
|
+
export { PBShaderExp, Proxiable, makeConstructor } from './builder/base.js';
|
|
6
9
|
export { ASTAddressOf, ASTArrayIndex, ASTAssignment, ASTBinaryFunc, ASTBreak, ASTCallFunction, ASTCast, ASTContinue, ASTDeclareVar, ASTDiscard, ASTDoWhile, ASTExpression, ASTFunction, ASTFunctionParameter, ASTGlobalScope, ASTHash, ASTIf, ASTLValue, ASTLValueArray, ASTLValueDeclare, ASTLValueHash, ASTLValueScalar, ASTNakedScope, ASTPrimitive, ASTRange, ASTReferenceOf, ASTReturn, ASTScalar, ASTScope, ASTSelect, ASTShaderExpConstructor, ASTStructDefine, ASTTouch, ASTUnaryFunc, ASTWhile, DeclareType, ShaderAST, ShaderPrecisionType, builtinVariables, genSamplerName, getBuiltinInputStructInstanceName, getBuiltinInputStructName, getBuiltinOutputStructInstanceName, getBuiltinOutputStructName, getBuiltinParamName, getTextureSampleType } from './builder/ast.js';
|
|
7
10
|
export { PBBuiltinScope, PBDoWhileScope, PBForScope, PBFunctionScope, PBGlobalScope, PBIfScope, PBInputScope, PBInsideFunctionScope, PBLocalScope, PBNakedScope, PBOutputScope, PBScope, PBWhileScope, ProgramBuilder } from './builder/programbuilder.js';
|
|
8
11
|
export { PBAddressSpace, PBAnyTypeInfo, PBArrayTypeInfo, PBAtomicI32TypeInfo, PBAtomicU32TypeInfo, PBFunctionTypeInfo, PBPointerTypeInfo, PBPrimitiveType, PBPrimitiveTypeInfo, PBSamplerAccessMode, PBSamplerTypeInfo, PBStructTypeInfo, PBTextureType, PBTextureTypeInfo, PBTypeInfo, PBVoidTypeInfo, typeAny, typeAtomicI32, typeAtomicU32, typeBVec2, typeBVec3, typeBVec4, typeBool, typeF16, typeF16Vec2, typeF16Vec3, typeF16Vec4, typeF32, typeF32Vec2, typeF32Vec3, typeF32Vec4, typeFrexpResult, typeFrexpResultVec2, typeFrexpResultVec3, typeFrexpResultVec4, typeI16, typeI16Vec2, typeI16Vec2_Norm, typeI16Vec3, typeI16Vec3_Norm, typeI16Vec4, typeI16Vec4_Norm, typeI16_Norm, typeI32, typeI32Vec2, typeI32Vec2_Norm, typeI32Vec3, typeI32Vec3_Norm, typeI32Vec4, typeI32Vec4_Norm, typeI32_Norm, typeI8, typeI8Vec2, typeI8Vec2_Norm, typeI8Vec3, typeI8Vec3_Norm, typeI8Vec4, typeI8Vec4_Norm, typeI8_Norm, typeITex1D, typeITex2D, typeITex2DArray, typeITex3D, typeITexCube, typeITexCubeArray, typeITexMultisampled2D, typeMat2, typeMat2x3, typeMat2x4, typeMat3, typeMat3x2, typeMat3x4, typeMat4, typeMat4x2, typeMat4x3, typeSampler, typeSamplerComparison, typeTex1D, typeTex2D, typeTex2DArray, typeTex3D, typeTexCube, typeTexCubeArray, typeTexDepth2D, typeTexDepth2DArray, typeTexDepthCube, typeTexDepthCubeArray, typeTexDepthMultisampled2D, typeTexExternal, typeTexMultisampled2D, typeTexStorage1D_bgra8unorm, typeTexStorage1D_r32float, typeTexStorage1D_r32sint, typeTexStorage1D_r32uint, typeTexStorage1D_rg32float, typeTexStorage1D_rg32sint, typeTexStorage1D_rg32uint, typeTexStorage1D_rgba16float, typeTexStorage1D_rgba16sint, typeTexStorage1D_rgba16uint, typeTexStorage1D_rgba32float, typeTexStorage1D_rgba32sint, typeTexStorage1D_rgba32uint, typeTexStorage1D_rgba8sint, typeTexStorage1D_rgba8snorm, typeTexStorage1D_rgba8uint, typeTexStorage1D_rgba8unorm, typeTexStorage2DArray_bgra8unorm, typeTexStorage2DArray_r32float, typeTexStorage2DArray_r32sint, typeTexStorage2DArray_r32uint, typeTexStorage2DArray_rg32float, typeTexStorage2DArray_rg32sint, typeTexStorage2DArray_rg32uint, typeTexStorage2DArray_rgba16float, typeTexStorage2DArray_rgba16sint, typeTexStorage2DArray_rgba16uint, typeTexStorage2DArray_rgba32float, typeTexStorage2DArray_rgba32sint, typeTexStorage2DArray_rgba32uint, typeTexStorage2DArray_rgba8sint, typeTexStorage2DArray_rgba8snorm, typeTexStorage2DArray_rgba8uint, typeTexStorage2DArray_rgba8unorm, typeTexStorage2D_bgra8unorm, typeTexStorage2D_r32float, typeTexStorage2D_r32sint, typeTexStorage2D_r32uint, typeTexStorage2D_rg32float, typeTexStorage2D_rg32sint, typeTexStorage2D_rg32uint, typeTexStorage2D_rgba16float, typeTexStorage2D_rgba16sint, typeTexStorage2D_rgba16uint, typeTexStorage2D_rgba32float, typeTexStorage2D_rgba32sint, typeTexStorage2D_rgba32uint, typeTexStorage2D_rgba8sint, typeTexStorage2D_rgba8snorm, typeTexStorage2D_rgba8uint, typeTexStorage2D_rgba8unorm, typeTexStorage3D_bgra8unorm, typeTexStorage3D_r32float, typeTexStorage3D_r32sint, typeTexStorage3D_r32uint, typeTexStorage3D_rg32float, typeTexStorage3D_rg32sint, typeTexStorage3D_rg32uint, typeTexStorage3D_rgba16float, typeTexStorage3D_rgba16sint, typeTexStorage3D_rgba16uint, typeTexStorage3D_rgba32float, typeTexStorage3D_rgba32sint, typeTexStorage3D_rgba32uint, typeTexStorage3D_rgba8sint, typeTexStorage3D_rgba8snorm, typeTexStorage3D_rgba8uint, typeTexStorage3D_rgba8unorm, typeU16, typeU16Vec2, typeU16Vec2_Norm, typeU16Vec3, typeU16Vec3_Norm, typeU16Vec4, typeU16Vec4_Norm, typeU16_Norm, typeU32, typeU32Vec2, typeU32Vec2_Norm, typeU32Vec3, typeU32Vec3_Norm, typeU32Vec4, typeU32Vec4_Norm, typeU32_Norm, typeU8, typeU8Vec2, typeU8Vec2_Norm, typeU8Vec3, typeU8Vec3_Norm, typeU8Vec4, typeU8Vec4_Norm, typeU8_Norm, typeUTex1D, typeUTex2D, typeUTex2DArray, typeUTex3D, typeUTexCube, typeUTexCubeArray, typeUTexMultisampled2D, typeVoid } from './builder/types.js';
|
|
@@ -11,6 +14,4 @@ export { TextureAtlasManager } from './helpers/textureatlas.js';
|
|
|
11
14
|
export { Font, FontCanvas } from './helpers/font.js';
|
|
12
15
|
export { GlyphManager } from './helpers/glyphmanager.js';
|
|
13
16
|
export { DrawText } from './helpers/drawtext.js';
|
|
14
|
-
export { CPUTimer } from './timer.js';
|
|
15
|
-
export { StructuredBufferData } from './uniformdata.js';
|
|
16
17
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;"}
|
package/dist/pool.js
CHANGED
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
/** @internal */ _memCost;
|
|
6
6
|
/** @internal */ _memCostThreshold;
|
|
7
7
|
/** @internal */ _device;
|
|
8
|
+
/** @internal */ _id;
|
|
8
9
|
/** @internal */ _freeTextures = {};
|
|
9
10
|
/** @internal */ _allocatedTextures = new WeakMap();
|
|
10
11
|
/** @internal */ _autoReleaseTextures = new Set();
|
|
@@ -14,8 +15,9 @@
|
|
|
14
15
|
/**
|
|
15
16
|
* Creates an instance of Pool class
|
|
16
17
|
* @param device - Rendering device
|
|
17
|
-
*/ constructor(device, memCostThreshold = 1024 * 1024 * 1024){
|
|
18
|
+
*/ constructor(device, id, memCostThreshold = 1024 * 1024 * 1024){
|
|
18
19
|
this._device = device;
|
|
20
|
+
this._id = id;
|
|
19
21
|
this._memCost = 0;
|
|
20
22
|
this._memCostThreshold = memCostThreshold;
|
|
21
23
|
this._freeTextures = {};
|
|
@@ -26,6 +28,11 @@
|
|
|
26
28
|
this._autoReleaseFramebuffers = new Set();
|
|
27
29
|
this._memCost = 0;
|
|
28
30
|
}
|
|
31
|
+
/**
|
|
32
|
+
* Id for this pool
|
|
33
|
+
*/ get id() {
|
|
34
|
+
return this._id;
|
|
35
|
+
}
|
|
29
36
|
autoRelease() {
|
|
30
37
|
// auto release objects
|
|
31
38
|
for (const tex of this._autoReleaseTextures){
|
|
@@ -49,21 +56,19 @@
|
|
|
49
56
|
* @param height - The height of the texture.
|
|
50
57
|
* @param mipmapping - Whether this texture support mipmapping
|
|
51
58
|
* @returns The fetched Texture2D object.
|
|
52
|
-
*/ fetchTemporalTexture2D(autoRelease, format, width, height, mipmapping) {
|
|
59
|
+
*/ fetchTemporalTexture2D(autoRelease, format, width, height, mipmapping = false) {
|
|
53
60
|
const hash = `2d:${format}:${width}:${height}:${mipmapping ? 1 : 0}`;
|
|
54
61
|
let texture = null;
|
|
55
62
|
const list = this._freeTextures[hash];
|
|
56
63
|
if (!list) {
|
|
57
|
-
texture = this._device.createTexture2D(format, width, height,
|
|
58
|
-
|
|
59
|
-
mipFilter: 'none'
|
|
60
|
-
}
|
|
64
|
+
texture = this._device.createTexture2D(format, width, height, {
|
|
65
|
+
mipmapping
|
|
61
66
|
});
|
|
62
67
|
this._memCost += texture.memCost;
|
|
63
68
|
} else {
|
|
64
69
|
texture = list.pop();
|
|
65
70
|
if (list.length === 0) {
|
|
66
|
-
|
|
71
|
+
this._freeTextures[hash] = undefined;
|
|
67
72
|
}
|
|
68
73
|
}
|
|
69
74
|
this._allocatedTextures.set(texture, {
|
|
@@ -85,21 +90,19 @@
|
|
|
85
90
|
* @param numLayers - Layer count of the texture
|
|
86
91
|
* @param mipmapping - Whether this texture support mipmapping
|
|
87
92
|
* @returns The fetched Texture2DArray object.
|
|
88
|
-
*/ fetchTemporalTexture2DArray(autoRelease, format, width, height, numLayers, mipmapping) {
|
|
93
|
+
*/ fetchTemporalTexture2DArray(autoRelease, format, width, height, numLayers, mipmapping = false) {
|
|
89
94
|
const hash = `2darray:${format}:${width}:${height}:${numLayers}:${mipmapping ? 1 : 0}`;
|
|
90
95
|
let texture = null;
|
|
91
96
|
const list = this._freeTextures[hash];
|
|
92
97
|
if (!list) {
|
|
93
|
-
texture = this._device.createTexture2DArray(format, width, height, numLayers,
|
|
94
|
-
|
|
95
|
-
mipFilter: 'none'
|
|
96
|
-
}
|
|
98
|
+
texture = this._device.createTexture2DArray(format, width, height, numLayers, {
|
|
99
|
+
mipmapping
|
|
97
100
|
});
|
|
98
101
|
this._memCost += texture.memCost;
|
|
99
102
|
} else {
|
|
100
103
|
texture = list.pop();
|
|
101
104
|
if (list.length === 0) {
|
|
102
|
-
|
|
105
|
+
this._freeTextures[hash] = undefined;
|
|
103
106
|
}
|
|
104
107
|
}
|
|
105
108
|
this._allocatedTextures.set(texture, {
|
|
@@ -119,21 +122,19 @@
|
|
|
119
122
|
* @param size - size of the texture.
|
|
120
123
|
* @param mipmapping - Whether this texture support mipmapping
|
|
121
124
|
* @returns The fetched TextureCube object.
|
|
122
|
-
*/ fetchTemporalTextureCube(autoRelease, format, size, mipmapping) {
|
|
125
|
+
*/ fetchTemporalTextureCube(autoRelease, format, size, mipmapping = false) {
|
|
123
126
|
const hash = `cube:${format}:${size}:${mipmapping ? 1 : 0}`;
|
|
124
127
|
let texture = null;
|
|
125
128
|
const list = this._freeTextures[hash];
|
|
126
129
|
if (!list) {
|
|
127
|
-
texture = this._device.createCubeTexture(format, size,
|
|
128
|
-
|
|
129
|
-
mipFilter: 'none'
|
|
130
|
-
}
|
|
130
|
+
texture = this._device.createCubeTexture(format, size, {
|
|
131
|
+
mipmapping
|
|
131
132
|
});
|
|
132
133
|
this._memCost += texture.memCost;
|
|
133
134
|
} else {
|
|
134
135
|
texture = list.pop();
|
|
135
136
|
if (list.length === 0) {
|
|
136
|
-
|
|
137
|
+
this._freeTextures[hash] = undefined;
|
|
137
138
|
}
|
|
138
139
|
}
|
|
139
140
|
this._allocatedTextures.set(texture, {
|
|
@@ -146,16 +147,33 @@
|
|
|
146
147
|
}
|
|
147
148
|
return texture;
|
|
148
149
|
}
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
150
|
+
/**
|
|
151
|
+
* Creates a temporal framebuffer from the object pool.
|
|
152
|
+
* @param autoRelease - Whether the framebuffer should be automatically released at the next frame.
|
|
153
|
+
* @param width - Width of the framebuffer
|
|
154
|
+
* @param height - Height of the framebuffer
|
|
155
|
+
* @param colorAttachments - Array of color attachments or texture format of the framebuffer.
|
|
156
|
+
* @param depthAttachment - Depth attachment or texture format of the framebuffer.
|
|
157
|
+
* @param mipmapping - Whether mipmapping should be enabled when creating color attachment textures, default is false.
|
|
158
|
+
* @param sampleCount - The sample count for the framebuffer, default is 1.
|
|
159
|
+
* @param ignoreDepthStencil - Whether to ignore depth stencil when resolving msaa framebuffer, default is true.
|
|
160
|
+
* @param attachmentMipLevel - The mipmap level to which the color attachment will render, default is 0
|
|
161
|
+
* @param attachmentCubeface - The cubemap face to which the color attachment will render, default is 0
|
|
162
|
+
* @param attachmentLayer - The texture layer to which the color attachment will render, default is 0
|
|
163
|
+
* @returns The fetched FrameBuffer object.
|
|
164
|
+
*/ fetchTemporalFramebuffer(autoRelease, width, height, colorTexOrFormat, depthTexOrFormat = null, mipmapping = false, sampleCount = 1, ignoreDepthStencil = true, attachmentMipLevel = 0, attachmentCubeface = 0, attachmentLayer = 0) {
|
|
165
|
+
const colors = Array.isArray(colorTexOrFormat) ? colorTexOrFormat : colorTexOrFormat ? [
|
|
153
166
|
colorTexOrFormat
|
|
154
|
-
] :
|
|
167
|
+
] : [];
|
|
168
|
+
const colorAttachments = colors.map((val)=>{
|
|
169
|
+
return typeof val === 'string' ? this.fetchTemporalTexture2D(false, val, width, height, mipmapping) : val;
|
|
170
|
+
});
|
|
155
171
|
const depthAttachment = typeof depthTexOrFormat === 'string' ? this.fetchTemporalTexture2D(false, depthTexOrFormat, width, height, false) : depthTexOrFormat;
|
|
156
|
-
const fb = this.createTemporalFramebuffer(autoRelease, colorAttachments, depthAttachment, sampleCount, ignoreDepthStencil);
|
|
157
|
-
|
|
158
|
-
|
|
172
|
+
const fb = this.createTemporalFramebuffer(autoRelease, colorAttachments, depthAttachment, sampleCount, ignoreDepthStencil, attachmentMipLevel, attachmentCubeface, attachmentLayer);
|
|
173
|
+
for(let i = 0; i < colors.length; i++){
|
|
174
|
+
if (typeof colors[i] === 'string') {
|
|
175
|
+
this.releaseTexture(colorAttachments[i]);
|
|
176
|
+
}
|
|
159
177
|
}
|
|
160
178
|
if (typeof depthTexOrFormat === 'string') {
|
|
161
179
|
this.releaseTexture(depthAttachment);
|
|
@@ -167,14 +185,20 @@
|
|
|
167
185
|
* @param autoRelease - Whether the framebuffer should be automatically released at the next frame.
|
|
168
186
|
* @param colorAttachments - Array of color attachments for the framebuffer.
|
|
169
187
|
* @param depthAttachment - Depth attachment for the framebuffer.
|
|
170
|
-
* @param sampleCount - The sample count for the framebuffer.
|
|
171
|
-
* @param ignoreDepthStencil - Whether to ignore depth stencil.
|
|
188
|
+
* @param sampleCount - The sample count for the framebuffer, default is 1.
|
|
189
|
+
* @param ignoreDepthStencil - Whether to ignore depth stencil when resolving msaa framebuffer, default is true.
|
|
190
|
+
* @param attachmentMipLevel - The mipmap level to which the color attachment will render, default is 0.
|
|
191
|
+
* @param attachmentCubeface - The cubemap face to which the color attachment will render, default is 0.
|
|
192
|
+
* @param attachmentLayer - The texture layer to which the color attachment will render, default is 0.
|
|
172
193
|
* @returns The fetched FrameBuffer object.
|
|
173
|
-
*/ createTemporalFramebuffer(autoRelease, colorAttachments, depthAttachment, sampleCount, ignoreDepthStencil) {
|
|
194
|
+
*/ createTemporalFramebuffer(autoRelease, colorAttachments, depthAttachment = null, sampleCount = 1, ignoreDepthStencil = true, attachmentMipLevel = 0, attachmentCubeface = 0, attachmentLayer = 0) {
|
|
174
195
|
colorAttachments = colorAttachments ?? [];
|
|
175
196
|
let hash = `${depthAttachment?.uid ?? 0}:${sampleCount ?? 1}:${ignoreDepthStencil ? 1 : 0}`;
|
|
176
|
-
|
|
177
|
-
hash += `:${
|
|
197
|
+
if (colorAttachments.length > 0) {
|
|
198
|
+
hash += `:${attachmentMipLevel}:${attachmentCubeface}:${attachmentLayer}`;
|
|
199
|
+
for (const tex of colorAttachments){
|
|
200
|
+
hash += `:${tex.uid}`;
|
|
201
|
+
}
|
|
178
202
|
}
|
|
179
203
|
let fb = null;
|
|
180
204
|
const list = this._freeFramebuffers[hash];
|
|
@@ -183,10 +207,15 @@
|
|
|
183
207
|
ignoreDepthStencil,
|
|
184
208
|
sampleCount
|
|
185
209
|
});
|
|
210
|
+
for(let i = 0; i < fb.getColorAttachments().length; i++){
|
|
211
|
+
fb.setColorAttachmentMipLevel(i, attachmentMipLevel);
|
|
212
|
+
fb.setColorAttachmentCubeFace(i, attachmentCubeface);
|
|
213
|
+
fb.setColorAttachmentLayer(i, attachmentLayer);
|
|
214
|
+
}
|
|
186
215
|
} else {
|
|
187
216
|
fb = list.pop();
|
|
188
217
|
if (list.length === 0) {
|
|
189
|
-
|
|
218
|
+
this._freeFramebuffers[hash] = undefined;
|
|
190
219
|
}
|
|
191
220
|
}
|
|
192
221
|
// Mark referenced textures
|
|
@@ -200,7 +229,10 @@
|
|
|
200
229
|
info.refcount++;
|
|
201
230
|
}
|
|
202
231
|
}
|
|
203
|
-
this._allocatedFramebuffers.set(fb,
|
|
232
|
+
this._allocatedFramebuffers.set(fb, {
|
|
233
|
+
hash,
|
|
234
|
+
refcount: 1
|
|
235
|
+
});
|
|
204
236
|
if (autoRelease) {
|
|
205
237
|
this._autoReleaseFramebuffers.add(fb);
|
|
206
238
|
}
|
|
@@ -224,6 +256,17 @@
|
|
|
224
256
|
}
|
|
225
257
|
}
|
|
226
258
|
/**
|
|
259
|
+
* Increment reference counter for given texture
|
|
260
|
+
* @param texture - The texture to retain
|
|
261
|
+
*/ retainTexture(texture) {
|
|
262
|
+
const info = this._allocatedTextures.get(texture);
|
|
263
|
+
if (!info) {
|
|
264
|
+
console.error(`ObjectPool.retainTexture(): texture is not allocated from pool`);
|
|
265
|
+
} else {
|
|
266
|
+
info.refcount++;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
227
270
|
* Dispose a framebuffer that is allocated from the object pool.
|
|
228
271
|
* @param fb - The framebuffer to dispose.
|
|
229
272
|
*/ disposeFrameBuffer(fb) {
|
|
@@ -239,22 +282,36 @@
|
|
|
239
282
|
* Release a framebuffer back to the object pool.
|
|
240
283
|
* @param fb - The framebuffer to release.
|
|
241
284
|
*/ releaseFrameBuffer(fb) {
|
|
242
|
-
const
|
|
243
|
-
if (!
|
|
285
|
+
const info = this._allocatedFramebuffers.get(fb);
|
|
286
|
+
if (!info) {
|
|
244
287
|
console.error(`ObjectPool.releaseFrameBuffer(): framebuffer is not allocated from pool`);
|
|
245
288
|
} else {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
list.
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
289
|
+
info.refcount--;
|
|
290
|
+
if (info.refcount <= 0) {
|
|
291
|
+
this.internalDisposeFrameBuffer(fb);
|
|
292
|
+
const list = this._freeFramebuffers[info.hash];
|
|
293
|
+
if (list) {
|
|
294
|
+
list.push(fb);
|
|
295
|
+
} else {
|
|
296
|
+
this._freeFramebuffers[info.hash] = [
|
|
297
|
+
fb
|
|
298
|
+
];
|
|
299
|
+
}
|
|
254
300
|
}
|
|
255
301
|
}
|
|
256
302
|
}
|
|
257
303
|
/**
|
|
304
|
+
* Increment reference counter for given framebuffer
|
|
305
|
+
* @param fb - The framebuffer to retain
|
|
306
|
+
*/ retainFrameBuffer(fb) {
|
|
307
|
+
const info = this._allocatedFramebuffers.get(fb);
|
|
308
|
+
if (!info) {
|
|
309
|
+
console.error(`ObjectPool.retainFrameBuffer(): framebuffer is not allocated from pool`);
|
|
310
|
+
} else {
|
|
311
|
+
info.refcount++;
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
258
315
|
* Purge the object pool by disposing all free framebuffers and textures.
|
|
259
316
|
*/ purge() {
|
|
260
317
|
for(const k in this._freeFramebuffers){
|
|
@@ -297,7 +354,7 @@
|
|
|
297
354
|
const info = this._allocatedTextures.get(texture);
|
|
298
355
|
if (info) {
|
|
299
356
|
info.refcount--;
|
|
300
|
-
if (info.refcount
|
|
357
|
+
if (info.refcount <= 0) {
|
|
301
358
|
this._allocatedTextures.delete(texture);
|
|
302
359
|
this._autoReleaseTextures.delete(texture);
|
|
303
360
|
if (purge || info.dispose) {
|
package/dist/pool.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pool.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"pool.js","sources":["../src/pool.ts"],"sourcesContent":["import type { MaybeArray } from '@zephyr3d/base';\r\nimport type { AbstractDevice, TextureFormat } from './base_types';\r\nimport type { BaseTexture, FrameBuffer, Texture2D, Texture2DArray, TextureCube } from './gpuobject';\r\n\r\n/**\r\n * ObjectPool class is responsible for managing and reusing textures and framebuffers.\r\n * @public\r\n */\r\nexport class Pool {\r\n /** @internal */\r\n private _memCost: number;\r\n /** @internal */\r\n private readonly _memCostThreshold: number;\r\n /** @internal */\r\n private readonly _device: AbstractDevice;\r\n /** @internal */\r\n private readonly _id: string | symbol;\r\n /** @internal */\r\n private _freeTextures: Record<string, BaseTexture[]> = {};\r\n /** @internal */\r\n private readonly _allocatedTextures: WeakMap<\r\n BaseTexture,\r\n { hash: string; refcount: number; dispose: boolean }\r\n > = new WeakMap();\r\n /** @internal */\r\n private readonly _autoReleaseTextures: Set<BaseTexture> = new Set();\r\n /** @internal */\r\n private _freeFramebuffers: Record<string, FrameBuffer[]> = {};\r\n /** @internal */\r\n private readonly _allocatedFramebuffers: WeakMap<FrameBuffer, { hash: string; refcount: number }> =\r\n new WeakMap();\r\n /** @internal */\r\n private readonly _autoReleaseFramebuffers: Set<FrameBuffer> = new Set();\r\n /**\r\n * Creates an instance of Pool class\r\n * @param device - Rendering device\r\n */\r\n constructor(device: AbstractDevice, id: string | symbol, memCostThreshold = 1024 * 1024 * 1024) {\r\n this._device = device;\r\n this._id = id;\r\n this._memCost = 0;\r\n this._memCostThreshold = memCostThreshold;\r\n this._freeTextures = {};\r\n this._allocatedTextures = new WeakMap();\r\n this._autoReleaseTextures = new Set();\r\n this._freeFramebuffers = {};\r\n this._allocatedFramebuffers = new WeakMap();\r\n this._autoReleaseFramebuffers = new Set();\r\n this._memCost = 0;\r\n }\r\n /**\r\n * Id for this pool\r\n */\r\n get id(): string | symbol {\r\n return this._id;\r\n }\r\n autoRelease(): void {\r\n // auto release objects\r\n for (const tex of this._autoReleaseTextures) {\r\n this.releaseTexture(tex);\r\n }\r\n this._autoReleaseTextures.clear();\r\n for (const fb of this._autoReleaseFramebuffers) {\r\n this.releaseFrameBuffer(fb);\r\n }\r\n this._autoReleaseFramebuffers.clear();\r\n // Free up video memory if memory usage is greater than specific value\r\n if (this._memCost >= this._memCostThreshold) {\r\n this.purge();\r\n }\r\n }\r\n /**\r\n * Fetch a temporal 2D texture from the object pool.\r\n * @param autoRelease - Whether the texture should be automatically released at the next frame.\r\n * @param format - The format of the texture.\r\n * @param width - The width of the texture.\r\n * @param height - The height of the texture.\r\n * @param mipmapping - Whether this texture support mipmapping\r\n * @returns The fetched Texture2D object.\r\n */\r\n fetchTemporalTexture2D(\r\n autoRelease: boolean,\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n mipmapping = false\r\n ): Texture2D {\r\n const hash = `2d:${format}:${width}:${height}:${mipmapping ? 1 : 0}`;\r\n let texture: BaseTexture = null;\r\n const list = this._freeTextures[hash];\r\n if (!list) {\r\n texture = this._device.createTexture2D(format, width, height, { mipmapping });\r\n this._memCost += texture.memCost;\r\n } else {\r\n texture = list.pop();\r\n if (list.length === 0) {\r\n this._freeTextures[hash] = undefined;\r\n }\r\n }\r\n this._allocatedTextures.set(texture, { hash, refcount: 1, dispose: false });\r\n if (autoRelease) {\r\n this._autoReleaseTextures.add(texture);\r\n }\r\n return texture as Texture2D;\r\n }\r\n /**\r\n * Fetch a temporal 2D array texture from the object pool.\r\n * @param autoRelease - Whether the texture should be automatically released at the next frame.\r\n * @param format - Format of the texture.\r\n * @param width - Width of the texture.\r\n * @param height - Height of the texture.\r\n * @param numLayers - Layer count of the texture\r\n * @param mipmapping - Whether this texture support mipmapping\r\n * @returns The fetched Texture2DArray object.\r\n */\r\n fetchTemporalTexture2DArray(\r\n autoRelease: boolean,\r\n format: TextureFormat,\r\n width: number,\r\n height: number,\r\n numLayers: number,\r\n mipmapping = false\r\n ): Texture2DArray {\r\n const hash = `2darray:${format}:${width}:${height}:${numLayers}:${mipmapping ? 1 : 0}`;\r\n let texture: BaseTexture = null;\r\n const list = this._freeTextures[hash];\r\n if (!list) {\r\n texture = this._device.createTexture2DArray(format, width, height, numLayers, { mipmapping });\r\n this._memCost += texture.memCost;\r\n } else {\r\n texture = list.pop();\r\n if (list.length === 0) {\r\n this._freeTextures[hash] = undefined;\r\n }\r\n }\r\n this._allocatedTextures.set(texture, { hash, refcount: 1, dispose: false });\r\n if (autoRelease) {\r\n this._autoReleaseTextures.add(texture);\r\n }\r\n return texture as Texture2DArray;\r\n }\r\n /**\r\n * Fetch a temporal Cube texture from the object pool.\r\n * @param autoRelease - Whether the texture should be automatically released at the next frame.\r\n * @param format - Format of the texture.\r\n * @param size - size of the texture.\r\n * @param mipmapping - Whether this texture support mipmapping\r\n * @returns The fetched TextureCube object.\r\n */\r\n fetchTemporalTextureCube(\r\n autoRelease: boolean,\r\n format: TextureFormat,\r\n size: number,\r\n mipmapping = false\r\n ): TextureCube {\r\n const hash = `cube:${format}:${size}:${mipmapping ? 1 : 0}`;\r\n let texture: BaseTexture = null;\r\n const list = this._freeTextures[hash];\r\n if (!list) {\r\n texture = this._device.createCubeTexture(format, size, { mipmapping });\r\n this._memCost += texture.memCost;\r\n } else {\r\n texture = list.pop();\r\n if (list.length === 0) {\r\n this._freeTextures[hash] = undefined;\r\n }\r\n }\r\n this._allocatedTextures.set(texture, { hash, refcount: 1, dispose: false });\r\n if (autoRelease) {\r\n this._autoReleaseTextures.add(texture);\r\n }\r\n return texture as TextureCube;\r\n }\r\n /**\r\n * Creates a temporal framebuffer from the object pool.\r\n * @param autoRelease - Whether the framebuffer should be automatically released at the next frame.\r\n * @param width - Width of the framebuffer\r\n * @param height - Height of the framebuffer\r\n * @param colorAttachments - Array of color attachments or texture format of the framebuffer.\r\n * @param depthAttachment - Depth attachment or texture format of the framebuffer.\r\n * @param mipmapping - Whether mipmapping should be enabled when creating color attachment textures, default is false.\r\n * @param sampleCount - The sample count for the framebuffer, default is 1.\r\n * @param ignoreDepthStencil - Whether to ignore depth stencil when resolving msaa framebuffer, default is true.\r\n * @param attachmentMipLevel - The mipmap level to which the color attachment will render, default is 0\r\n * @param attachmentCubeface - The cubemap face to which the color attachment will render, default is 0\r\n * @param attachmentLayer - The texture layer to which the color attachment will render, default is 0\r\n * @returns The fetched FrameBuffer object.\r\n */\r\n fetchTemporalFramebuffer<T extends BaseTexture<unknown>>(\r\n autoRelease: boolean,\r\n width: number,\r\n height: number,\r\n colorTexOrFormat: MaybeArray<TextureFormat | T>,\r\n depthTexOrFormat: TextureFormat | T = null,\r\n mipmapping = false,\r\n sampleCount = 1,\r\n ignoreDepthStencil = true,\r\n attachmentMipLevel = 0,\r\n attachmentCubeface = 0,\r\n attachmentLayer = 0\r\n ): FrameBuffer {\r\n const colors = Array.isArray(colorTexOrFormat)\r\n ? colorTexOrFormat\r\n : colorTexOrFormat\r\n ? [colorTexOrFormat]\r\n : [];\r\n const colorAttachments = colors.map((val) => {\r\n return typeof val === 'string'\r\n ? this.fetchTemporalTexture2D(false, val, width, height, mipmapping)\r\n : val;\r\n });\r\n const depthAttachment =\r\n typeof depthTexOrFormat === 'string'\r\n ? this.fetchTemporalTexture2D(false, depthTexOrFormat, width, height, false)\r\n : depthTexOrFormat;\r\n const fb = this.createTemporalFramebuffer(\r\n autoRelease,\r\n colorAttachments,\r\n depthAttachment,\r\n sampleCount,\r\n ignoreDepthStencil,\r\n attachmentMipLevel,\r\n attachmentCubeface,\r\n attachmentLayer\r\n );\r\n for (let i = 0; i < colors.length; i++) {\r\n if (typeof colors[i] === 'string') {\r\n this.releaseTexture(colorAttachments[i]);\r\n }\r\n }\r\n if (typeof depthTexOrFormat === 'string') {\r\n this.releaseTexture(depthAttachment);\r\n }\r\n return fb;\r\n }\r\n /**\r\n * Creates a temporal framebuffer from the object pool.\r\n * @param autoRelease - Whether the framebuffer should be automatically released at the next frame.\r\n * @param colorAttachments - Array of color attachments for the framebuffer.\r\n * @param depthAttachment - Depth attachment for the framebuffer.\r\n * @param sampleCount - The sample count for the framebuffer, default is 1.\r\n * @param ignoreDepthStencil - Whether to ignore depth stencil when resolving msaa framebuffer, default is true.\r\n * @param attachmentMipLevel - The mipmap level to which the color attachment will render, default is 0.\r\n * @param attachmentCubeface - The cubemap face to which the color attachment will render, default is 0.\r\n * @param attachmentLayer - The texture layer to which the color attachment will render, default is 0.\r\n * @returns The fetched FrameBuffer object.\r\n */\r\n createTemporalFramebuffer(\r\n autoRelease: boolean,\r\n colorAttachments: BaseTexture[],\r\n depthAttachment: BaseTexture = null,\r\n sampleCount = 1,\r\n ignoreDepthStencil = true,\r\n attachmentMipLevel = 0,\r\n attachmentCubeface = 0,\r\n attachmentLayer = 0\r\n ): FrameBuffer {\r\n colorAttachments = colorAttachments ?? [];\r\n let hash = `${depthAttachment?.uid ?? 0}:${sampleCount ?? 1}:${ignoreDepthStencil ? 1 : 0}`;\r\n if (colorAttachments.length > 0) {\r\n hash += `:${attachmentMipLevel}:${attachmentCubeface}:${attachmentLayer}`;\r\n for (const tex of colorAttachments) {\r\n hash += `:${tex.uid}`;\r\n }\r\n }\r\n let fb: FrameBuffer = null;\r\n const list = this._freeFramebuffers[hash];\r\n if (!list) {\r\n fb = this._device.createFrameBuffer(colorAttachments, depthAttachment, {\r\n ignoreDepthStencil,\r\n sampleCount\r\n });\r\n for (let i = 0; i < fb.getColorAttachments().length; i++) {\r\n fb.setColorAttachmentMipLevel(i, attachmentMipLevel);\r\n fb.setColorAttachmentCubeFace(i, attachmentCubeface);\r\n fb.setColorAttachmentLayer(i, attachmentLayer);\r\n }\r\n } else {\r\n fb = list.pop();\r\n if (list.length === 0) {\r\n this._freeFramebuffers[hash] = undefined;\r\n }\r\n }\r\n // Mark referenced textures\r\n const info = this._allocatedTextures.get(depthAttachment);\r\n if (info) {\r\n info.refcount++;\r\n }\r\n for (const tex of colorAttachments) {\r\n const info = this._allocatedTextures.get(tex);\r\n if (info) {\r\n info.refcount++;\r\n }\r\n }\r\n this._allocatedFramebuffers.set(fb, { hash, refcount: 1 });\r\n if (autoRelease) {\r\n this._autoReleaseFramebuffers.add(fb);\r\n }\r\n return fb;\r\n }\r\n /**\r\n * Dispose a texture that is allocated from the object pool.\r\n * @param texture - The texture to dispose.\r\n */\r\n disposeTexture(texture: BaseTexture): void {\r\n this.safeReleaseTexture(texture, true);\r\n }\r\n /**\r\n * Release a texture back to the object pool.\r\n * @param texture - The texture to release.\r\n */\r\n releaseTexture(texture: BaseTexture): void {\r\n const info = this._allocatedTextures.get(texture);\r\n if (!info) {\r\n console.error(`ObjectPool.releaseTexture(): texture is not allocated from pool`);\r\n } else {\r\n this.safeReleaseTexture(texture);\r\n }\r\n }\r\n /**\r\n * Increment reference counter for given texture\r\n * @param texture - The texture to retain\r\n */\r\n retainTexture(texture: BaseTexture): void {\r\n const info = this._allocatedTextures.get(texture);\r\n if (!info) {\r\n console.error(`ObjectPool.retainTexture(): texture is not allocated from pool`);\r\n } else {\r\n info.refcount++;\r\n }\r\n }\r\n /**\r\n * Dispose a framebuffer that is allocated from the object pool.\r\n * @param fb - The framebuffer to dispose.\r\n */\r\n disposeFrameBuffer(fb: FrameBuffer): void {\r\n const hash = this._allocatedFramebuffers.get(fb);\r\n if (!hash) {\r\n console.error(`ObjectPool.disposeFrameBuffer(): framebuffer is not allocated from pool`);\r\n } else {\r\n this.internalDisposeFrameBuffer(fb);\r\n fb.dispose();\r\n }\r\n }\r\n /**\r\n * Release a framebuffer back to the object pool.\r\n * @param fb - The framebuffer to release.\r\n */\r\n releaseFrameBuffer(fb: FrameBuffer): void {\r\n const info = this._allocatedFramebuffers.get(fb);\r\n if (!info) {\r\n console.error(`ObjectPool.releaseFrameBuffer(): framebuffer is not allocated from pool`);\r\n } else {\r\n info.refcount--;\r\n if (info.refcount <= 0) {\r\n this.internalDisposeFrameBuffer(fb);\r\n const list = this._freeFramebuffers[info.hash];\r\n if (list) {\r\n list.push(fb);\r\n } else {\r\n this._freeFramebuffers[info.hash] = [fb];\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Increment reference counter for given framebuffer\r\n * @param fb - The framebuffer to retain\r\n */\r\n retainFrameBuffer(fb: FrameBuffer): void {\r\n const info = this._allocatedFramebuffers.get(fb);\r\n if (!info) {\r\n console.error(`ObjectPool.retainFrameBuffer(): framebuffer is not allocated from pool`);\r\n } else {\r\n info.refcount++;\r\n }\r\n }\r\n /**\r\n * Purge the object pool by disposing all free framebuffers and textures.\r\n */\r\n purge(): void {\r\n for (const k in this._freeFramebuffers) {\r\n const list = this._freeFramebuffers[k];\r\n if (list) {\r\n for (const fb of this._freeFramebuffers[k]) {\r\n this.internalDisposeFrameBuffer(fb);\r\n fb.dispose();\r\n }\r\n }\r\n }\r\n this._freeFramebuffers = {};\r\n for (const k in this._freeTextures) {\r\n const list = this._freeTextures[k];\r\n for (const tex of list) {\r\n this._memCost -= tex.memCost;\r\n tex.dispose();\r\n }\r\n }\r\n this._freeTextures = {};\r\n }\r\n /** @internal */\r\n private internalDisposeFrameBuffer(fb: FrameBuffer): void {\r\n if (fb) {\r\n // Release attachment textures\r\n const colorAttachments = fb.getColorAttachments();\r\n if (colorAttachments) {\r\n for (const tex of colorAttachments) {\r\n this.safeReleaseTexture(tex);\r\n }\r\n }\r\n const depthAttachment = fb.getDepthAttachment();\r\n if (depthAttachment) {\r\n this.safeReleaseTexture(depthAttachment);\r\n }\r\n this._allocatedFramebuffers.delete(fb);\r\n this._autoReleaseFramebuffers.delete(fb);\r\n }\r\n }\r\n /** @internal */\r\n private safeReleaseTexture(texture: BaseTexture, purge = false): void {\r\n const info = this._allocatedTextures.get(texture);\r\n if (info) {\r\n info.refcount--;\r\n if (info.refcount <= 0) {\r\n this._allocatedTextures.delete(texture);\r\n this._autoReleaseTextures.delete(texture);\r\n if (purge || info.dispose) {\r\n this._memCost -= texture.memCost;\r\n texture.dispose();\r\n } else {\r\n const list = this._freeTextures[info.hash];\r\n if (list) {\r\n list.push(texture);\r\n } else {\r\n this._freeTextures[info.hash] = [texture];\r\n }\r\n }\r\n } else if (purge) {\r\n info.dispose = true;\r\n }\r\n }\r\n }\r\n}\r\n"],"names":["Pool","_freeTextures","_allocatedTextures","WeakMap","_autoReleaseTextures","Set","_freeFramebuffers","_allocatedFramebuffers","_autoReleaseFramebuffers","device","id","memCostThreshold","_device","_id","_memCost","_memCostThreshold","autoRelease","tex","releaseTexture","clear","fb","releaseFrameBuffer","purge","fetchTemporalTexture2D","format","width","height","mipmapping","hash","texture","list","createTexture2D","memCost","pop","length","undefined","set","refcount","dispose","add","fetchTemporalTexture2DArray","numLayers","createTexture2DArray","fetchTemporalTextureCube","size","createCubeTexture","fetchTemporalFramebuffer","colorTexOrFormat","depthTexOrFormat","sampleCount","ignoreDepthStencil","attachmentMipLevel","attachmentCubeface","attachmentLayer","colors","Array","isArray","colorAttachments","map","val","depthAttachment","createTemporalFramebuffer","i","uid","createFrameBuffer","getColorAttachments","setColorAttachmentMipLevel","setColorAttachmentCubeFace","setColorAttachmentLayer","info","get","disposeTexture","safeReleaseTexture","console","error","retainTexture","disposeFrameBuffer","internalDisposeFrameBuffer","push","retainFrameBuffer","k","getDepthAttachment","delete"],"mappings":"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"}
|
package/dist/timer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timer.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"timer.js","sources":["../src/timer.ts"],"sourcesContent":["/**\r\n * Abstract timer interface\r\n * @public\r\n */\r\nexport interface ITimer {\r\n begin(): void;\r\n end(): void;\r\n ended(): boolean;\r\n elapsed(): number;\r\n}\r\n\r\n/**\r\n * CPU timer class\r\n * @public\r\n */\r\nexport class CPUTimer implements ITimer {\r\n /** @internal */\r\n private readonly _cpuTimer: Performance | DateConstructor;\r\n /** @internal */\r\n private _cpuStart: number;\r\n /** @internal */\r\n private _cpuTime: number;\r\n /** @internal */\r\n private _ended: boolean;\r\n constructor() {\r\n this._cpuTimer = window.performance || window.Date;\r\n this._cpuTime = null;\r\n this._ended = false;\r\n }\r\n now(): number {\r\n return this._cpuTimer.now();\r\n }\r\n begin(): void {\r\n this._cpuStart = this.now();\r\n this._cpuTime = null;\r\n this._ended = false;\r\n }\r\n end(): void {\r\n this._cpuTime = this.now() - this._cpuStart;\r\n this._ended = true;\r\n }\r\n ended(): boolean {\r\n return this._ended;\r\n }\r\n elapsed(): number {\r\n return this._cpuTime;\r\n }\r\n}\r\n"],"names":["CPUTimer","_cpuTimer","window","performance","Date","_cpuTime","_ended","now","begin","_cpuStart","end","ended","elapsed"],"mappings":"AAAA;;;;;;AAcC,IACM,MAAMA,QAAAA,CAAAA;qBAEX,SAA0D;qBAE1D,SAA0B;qBAE1B,QAAyB;qBAEzB,MAAwB;IACxB,WAAc,EAAA;AACZ,QAAA,IAAI,CAACC,SAAS,GAAGC,OAAOC,WAAW,IAAID,OAAOE,IAAI;QAClD,IAAI,CAACC,QAAQ,GAAG,IAAA;QAChB,IAAI,CAACC,MAAM,GAAG,KAAA;AAChB;IACAC,GAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAACN,SAAS,CAACM,GAAG,EAAA;AAC3B;IACAC,KAAc,GAAA;AACZ,QAAA,IAAI,CAACC,SAAS,GAAG,IAAI,CAACF,GAAG,EAAA;QACzB,IAAI,CAACF,QAAQ,GAAG,IAAA;QAChB,IAAI,CAACC,MAAM,GAAG,KAAA;AAChB;IACAI,GAAY,GAAA;QACV,IAAI,CAACL,QAAQ,GAAG,IAAI,CAACE,GAAG,EAAA,GAAK,IAAI,CAACE,SAAS;QAC3C,IAAI,CAACH,MAAM,GAAG,IAAA;AAChB;IACAK,KAAiB,GAAA;QACf,OAAO,IAAI,CAACL,MAAM;AACpB;IACAM,OAAkB,GAAA;QAChB,OAAO,IAAI,CAACP,QAAQ;AACtB;AACF;;;;"}
|
package/dist/uniformdata.js
CHANGED
|
@@ -14,7 +14,7 @@ import { PBPrimitiveType } from './builder/types.js';
|
|
|
14
14
|
* @param layout - Layout of the structure
|
|
15
15
|
* @param buffer - Buffer that holds the data
|
|
16
16
|
*/ constructor(layout, buffer){
|
|
17
|
-
this._size = layout.byteSize + 15 &
|
|
17
|
+
this._size = layout.byteSize + 15 & -16;
|
|
18
18
|
if (this._size <= 0) {
|
|
19
19
|
throw new Error(`UniformBuffer(): invalid uniform buffer byte size: ${this._size}`);
|
|
20
20
|
}
|
|
@@ -48,7 +48,7 @@ import { PBPrimitiveType } from './builder/types.js';
|
|
|
48
48
|
} else if (value?._v) {
|
|
49
49
|
view.set(value._v);
|
|
50
50
|
} else if (typeof value?.length === 'number') {
|
|
51
|
-
view.set(value);
|
|
51
|
+
view.set(value.length > view.length ? value.subarray(0, view.length) : value);
|
|
52
52
|
} else {
|
|
53
53
|
throw new Error('invalid uniform value');
|
|
54
54
|
}
|
package/dist/uniformdata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uniformdata.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"uniformdata.js","sources":["../src/uniformdata.ts"],"sourcesContent":["import { PBPrimitiveType } from './builder/types';\r\nimport type { TypedArray, TypedArrayConstructor } from '@zephyr3d/base';\r\nimport type { StructuredValue, UniformBufferLayout, StructuredBuffer } from './gpuobject';\r\n\r\n/**\r\n * Structured buffer data\r\n * @public\r\n */\r\nexport class StructuredBufferData {\r\n /** @internal */\r\n protected _cache: ArrayBuffer;\r\n /** @internal */\r\n protected _buffer: StructuredBuffer;\r\n /** @internal */\r\n protected _size: number;\r\n /** @internal */\r\n protected _uniformMap: Record<string, TypedArray>;\r\n /** @internal */\r\n protected _uniformPositions: Record<string, [number, number]>;\r\n /**\r\n * Creates a new structured buffer data\r\n * @param layout - Layout of the structure\r\n * @param buffer - Buffer that holds the data\r\n */\r\n constructor(layout: UniformBufferLayout, buffer?: StructuredBuffer | ArrayBuffer) {\r\n this._size = (layout.byteSize + 15) & ~15;\r\n if (this._size <= 0) {\r\n throw new Error(`UniformBuffer(): invalid uniform buffer byte size: ${this._size}`);\r\n }\r\n // this._cache = new ArrayBuffer(size);\r\n this._uniformMap = {};\r\n this._uniformPositions = {};\r\n this._cache = buffer instanceof ArrayBuffer ? buffer : null;\r\n this._buffer = buffer instanceof ArrayBuffer ? null : buffer;\r\n this.init(layout, 0, '');\r\n }\r\n /** The buffer size in bytes */\r\n get byteLength(): number {\r\n return this._size;\r\n }\r\n /** Get the data cache buffer */\r\n get buffer(): ArrayBuffer {\r\n return this._cache;\r\n }\r\n /** Get all the uniform datas */\r\n get uniforms(): Record<string, TypedArray> {\r\n return this._uniformMap;\r\n }\r\n /**\r\n * Sets the value of a structure member\r\n * @param name - Name of the member\r\n * @param value - Value to set\r\n */\r\n set(name: string, value: StructuredValue): void {\r\n if (value !== undefined) {\r\n const view = this._uniformMap[name];\r\n if (view) {\r\n if (this._cache) {\r\n if (typeof value === 'number') {\r\n view[0] = value;\r\n } else if ((value as any)?._v) {\r\n view.set((value as any)._v);\r\n } else if (typeof (value as any)?.length === 'number') {\r\n view.set(\r\n (value as TypedArray).length > view.length\r\n ? (value as TypedArray).subarray(0, view.length)\r\n : (value as TypedArray)\r\n );\r\n } else {\r\n throw new Error('invalid uniform value');\r\n }\r\n } else {\r\n const size = this._uniformPositions[name][1];\r\n if (typeof value === 'number') {\r\n view[0] = value;\r\n this._buffer.bufferSubData(this._uniformPositions[name][0], view);\r\n } else if (value['BYTES_PER_ELEMENT'] && size <= (value['byteLength'] as number)) {\r\n const arr = value as TypedArray;\r\n this._buffer.bufferSubData(\r\n this._uniformPositions[name][0],\r\n arr,\r\n 0,\r\n (size / arr.BYTES_PER_ELEMENT) >> 0\r\n );\r\n } else {\r\n throw new Error('invalid uniform value');\r\n }\r\n }\r\n } else {\r\n const proto = Object.getPrototypeOf(value);\r\n if (proto === Object.getPrototypeOf({})) {\r\n this.setStruct(name, value);\r\n } else {\r\n throw new Error('invalid uniform value');\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private setStruct(name: string, value: any): void {\r\n for (const k in value) {\r\n this.set(`${name}.${k}`, value[k]);\r\n }\r\n }\r\n /** @internal */\r\n private init(layout: UniformBufferLayout, offset: number, prefix: string): number {\r\n for (const entry of layout.entries) {\r\n if (entry.subLayout) {\r\n offset = this.init(entry.subLayout, offset, `${prefix}${entry.name}.`);\r\n } else {\r\n const name = `${prefix}${entry.name}`;\r\n if (this._uniformPositions[name]) {\r\n throw new Error(`UniformBuffer(): duplicate uniform name: ${name}`);\r\n }\r\n if (entry.offset < offset || entry.byteSize < 0) {\r\n throw new Error('UniformBuffer(): invalid layout');\r\n }\r\n this._uniformPositions[name] = [entry.offset, entry.byteSize];\r\n let viewCtor: TypedArrayConstructor = null;\r\n switch (entry.type) {\r\n case PBPrimitiveType.F32:\r\n viewCtor = Float32Array;\r\n break;\r\n case PBPrimitiveType.U32:\r\n case PBPrimitiveType.BOOL:\r\n viewCtor = Uint32Array;\r\n break;\r\n case PBPrimitiveType.I32:\r\n viewCtor = Int32Array;\r\n break;\r\n case PBPrimitiveType.U16:\r\n case PBPrimitiveType.U16_NORM:\r\n case PBPrimitiveType.F16:\r\n viewCtor = Uint16Array;\r\n break;\r\n case PBPrimitiveType.I16:\r\n case PBPrimitiveType.I16_NORM:\r\n viewCtor = Int16Array;\r\n break;\r\n case PBPrimitiveType.U8:\r\n case PBPrimitiveType.U8_NORM:\r\n viewCtor = Uint8Array;\r\n break;\r\n case PBPrimitiveType.I8:\r\n case PBPrimitiveType.I8_NORM:\r\n viewCtor = Int8Array;\r\n break;\r\n }\r\n if (!viewCtor) {\r\n throw new Error(`UniformBuffer(): invalid data type for uniform: ${name}`);\r\n }\r\n if (entry.byteSize % viewCtor.BYTES_PER_ELEMENT) {\r\n throw new Error(`UniformBuffer(): invalid byte size for uniform: ${name}`);\r\n }\r\n if (this._cache) {\r\n this._uniformMap[name] = new viewCtor(\r\n this._cache,\r\n entry.offset,\r\n entry.byteSize / viewCtor.BYTES_PER_ELEMENT\r\n );\r\n } else {\r\n this._uniformMap[name] = new viewCtor(1);\r\n }\r\n offset = entry.offset + entry.byteSize;\r\n }\r\n }\r\n return offset;\r\n }\r\n}\r\n"],"names":["StructuredBufferData","layout","buffer","_size","byteSize","Error","_uniformMap","_uniformPositions","_cache","ArrayBuffer","_buffer","init","byteLength","uniforms","set","name","value","undefined","view","_v","length","subarray","size","bufferSubData","arr","BYTES_PER_ELEMENT","proto","Object","getPrototypeOf","setStruct","k","offset","prefix","entry","entries","subLayout","viewCtor","type","PBPrimitiveType","F32","Float32Array","U32","BOOL","Uint32Array","I32","Int32Array","U16","U16_NORM","F16","Uint16Array","I16","I16_NORM","Int16Array","U8","U8_NORM","Uint8Array","I8","I8_NORM","Int8Array"],"mappings":"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"}
|
package/dist/vertexdata.js
CHANGED
|
@@ -7,6 +7,7 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
|
|
|
7
7
|
/** @internal */ _vertexBuffers;
|
|
8
8
|
/** @internal */ _indexBuffer;
|
|
9
9
|
/** @internal */ _drawOffset;
|
|
10
|
+
/** @internal */ _numVertices;
|
|
10
11
|
constructor(){
|
|
11
12
|
this._vertexBuffers = [];
|
|
12
13
|
for(let i = 0; i < MAX_VERTEX_ATTRIBUTES; i++){
|
|
@@ -14,6 +15,7 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
|
|
|
14
15
|
}
|
|
15
16
|
this._indexBuffer = null;
|
|
16
17
|
this._drawOffset = 0;
|
|
18
|
+
this._numVertices = 0;
|
|
17
19
|
}
|
|
18
20
|
/**
|
|
19
21
|
* Creates a new instance of VertexData by copying from this object
|
|
@@ -23,6 +25,7 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
|
|
|
23
25
|
newVertexData._vertexBuffers = this._vertexBuffers.slice();
|
|
24
26
|
newVertexData._indexBuffer = this._indexBuffer;
|
|
25
27
|
newVertexData._drawOffset = this._drawOffset;
|
|
28
|
+
newVertexData.calcNumVertices();
|
|
26
29
|
return newVertexData;
|
|
27
30
|
}
|
|
28
31
|
/** Vertex buffer information list */ get vertexBuffers() {
|
|
@@ -31,12 +34,16 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
|
|
|
31
34
|
/** Index buffer */ get indexBuffer() {
|
|
32
35
|
return this._indexBuffer;
|
|
33
36
|
}
|
|
37
|
+
/** Number of vertices */ get numVertices() {
|
|
38
|
+
return this._numVertices;
|
|
39
|
+
}
|
|
34
40
|
/** Draw offset */ getDrawOffset() {
|
|
35
41
|
return this._drawOffset;
|
|
36
42
|
}
|
|
37
43
|
setDrawOffset(offset) {
|
|
38
44
|
if (offset !== this._drawOffset) {
|
|
39
45
|
this._drawOffset = offset;
|
|
46
|
+
this.calcNumVertices();
|
|
40
47
|
}
|
|
41
48
|
}
|
|
42
49
|
/**
|
|
@@ -65,7 +72,10 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
|
|
|
65
72
|
* @param stepMode - Step mode of the buffer
|
|
66
73
|
* @returns The buffer that was set
|
|
67
74
|
*/ setVertexBuffer(buffer, stepMode) {
|
|
68
|
-
if (!buffer
|
|
75
|
+
if (!buffer) {
|
|
76
|
+
return null;
|
|
77
|
+
}
|
|
78
|
+
if (!(buffer.usage & GPUResourceUsageFlags.BF_VERTEX)) {
|
|
69
79
|
throw new Error('setVertexBuffer() failed: buffer is null or buffer has not Vertex usage flag');
|
|
70
80
|
}
|
|
71
81
|
stepMode = stepMode || 'vertex';
|
|
@@ -97,6 +107,9 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
|
|
|
97
107
|
removed = true;
|
|
98
108
|
}
|
|
99
109
|
}
|
|
110
|
+
if (removed) {
|
|
111
|
+
this.calcNumVertices();
|
|
112
|
+
}
|
|
100
113
|
return removed;
|
|
101
114
|
}
|
|
102
115
|
/**
|
|
@@ -109,6 +122,18 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
|
|
|
109
122
|
}
|
|
110
123
|
return buffer;
|
|
111
124
|
}
|
|
125
|
+
/** @internal */ calcNumVertices() {
|
|
126
|
+
this._numVertices = 0;
|
|
127
|
+
for(let i = 0; i < MAX_VERTEX_ATTRIBUTES; i++){
|
|
128
|
+
const info = this._vertexBuffers[i];
|
|
129
|
+
if (info && info.stepMode !== 'instance') {
|
|
130
|
+
const n = Math.floor(info.buffer.byteLength / info.stride);
|
|
131
|
+
if (n > this._numVertices) {
|
|
132
|
+
this._numVertices = n;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
112
137
|
/** @internal */ internalSetVertexBuffer(loc, buffer, offset, stepMode) {
|
|
113
138
|
if (loc < 0 || loc >= MAX_VERTEX_ATTRIBUTES) {
|
|
114
139
|
throw new Error(`setVertexBuffer() failed: location out of bounds: ${loc}`);
|
|
@@ -125,6 +150,7 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
|
|
|
125
150
|
drawOffset: 0,
|
|
126
151
|
stepMode: stepMode
|
|
127
152
|
};
|
|
153
|
+
this.calcNumVertices();
|
|
128
154
|
return buffer;
|
|
129
155
|
}
|
|
130
156
|
return null;
|
package/dist/vertexdata.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vertexdata.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"vertexdata.js","sources":["../src/vertexdata.ts"],"sourcesContent":["import type { StructuredBuffer, IndexBuffer, VertexStepMode, VertexSemantic } from './gpuobject';\r\nimport {\r\n GPUResourceUsageFlags,\r\n MAX_VERTEX_ATTRIBUTES,\r\n getVertexAttribByName,\r\n getVertexBufferStride,\r\n getVertexBufferAttribType\r\n} from './gpuobject';\r\nimport type { PBArrayTypeInfo, PBPrimitiveTypeInfo } from './builder/types';\r\n\r\n/**\r\n * Vertex buffer information\r\n * @public\r\n */\r\nexport type VertexBufferInfo = {\r\n buffer: StructuredBuffer;\r\n offset: number;\r\n stride: number;\r\n drawOffset: number;\r\n type: PBPrimitiveTypeInfo;\r\n stepMode: VertexStepMode;\r\n};\r\n\r\n/**\r\n * The vertex data class\r\n * @public\r\n */\r\nexport class VertexData {\r\n /** @internal */\r\n private _vertexBuffers: VertexBufferInfo[];\r\n /** @internal */\r\n private _indexBuffer: IndexBuffer;\r\n /** @internal */\r\n private _drawOffset: number;\r\n /** @internal */\r\n private _numVertices: number;\r\n constructor() {\r\n this._vertexBuffers = [];\r\n for (let i = 0; i < MAX_VERTEX_ATTRIBUTES; i++) {\r\n this._vertexBuffers.push(null);\r\n }\r\n this._indexBuffer = null;\r\n this._drawOffset = 0;\r\n this._numVertices = 0;\r\n }\r\n /**\r\n * Creates a new instance of VertexData by copying from this object\r\n * @returns New instance of VertexData\r\n */\r\n clone(): VertexData {\r\n const newVertexData = new VertexData();\r\n newVertexData._vertexBuffers = this._vertexBuffers.slice();\r\n newVertexData._indexBuffer = this._indexBuffer;\r\n newVertexData._drawOffset = this._drawOffset;\r\n newVertexData.calcNumVertices();\r\n return newVertexData;\r\n }\r\n /** Vertex buffer information list */\r\n get vertexBuffers(): VertexBufferInfo[] {\r\n return this._vertexBuffers;\r\n }\r\n /** Index buffer */\r\n get indexBuffer(): IndexBuffer {\r\n return this._indexBuffer;\r\n }\r\n /** Number of vertices */\r\n get numVertices() {\r\n return this._numVertices;\r\n }\r\n /** Draw offset */\r\n getDrawOffset(): number {\r\n return this._drawOffset;\r\n }\r\n setDrawOffset(offset: number): void {\r\n if (offset !== this._drawOffset) {\r\n this._drawOffset = offset;\r\n this.calcNumVertices();\r\n }\r\n }\r\n /**\r\n * Gets the vertex buffer by specific vertex semantic\r\n * @param semantic - The vertex semantic\r\n * @returns Vertex buffer of the given semantic\r\n */\r\n getVertexBuffer(semantic: VertexSemantic): StructuredBuffer {\r\n return this._vertexBuffers[getVertexAttribByName(semantic)]?.buffer ?? null;\r\n }\r\n /**\r\n * Gets the vertex buffer information by specific vertex semantic\r\n * @param semantic - The vertex semantic\r\n * @returns Vertex buffer information of the given semantic\r\n */\r\n getVertexBufferInfo(semantic: VertexSemantic): VertexBufferInfo {\r\n return this._vertexBuffers[getVertexAttribByName(semantic)] ?? null;\r\n }\r\n /**\r\n * Gets the index buffer\r\n * @returns The index buffer\r\n */\r\n getIndexBuffer(): IndexBuffer {\r\n return this._indexBuffer || null;\r\n }\r\n /**\r\n * Sets a vertex buffer\r\n * @param buffer - The vertex buffer object\r\n * @param stepMode - Step mode of the buffer\r\n * @returns The buffer that was set\r\n */\r\n setVertexBuffer(buffer: StructuredBuffer, stepMode?: VertexStepMode): StructuredBuffer {\r\n if (!buffer) {\r\n return null;\r\n }\r\n if (!(buffer.usage & GPUResourceUsageFlags.BF_VERTEX)) {\r\n throw new Error('setVertexBuffer() failed: buffer is null or buffer has not Vertex usage flag');\r\n }\r\n stepMode = stepMode || 'vertex';\r\n const vertexType = (buffer.structure.structMembers[0].type as PBArrayTypeInfo).elementType;\r\n if (vertexType.isStructType()) {\r\n let offset = 0;\r\n for (const attrib of vertexType.structMembers) {\r\n const loc = getVertexAttribByName(attrib.name as VertexSemantic);\r\n this.internalSetVertexBuffer(loc, buffer, offset, stepMode);\r\n offset += attrib.size;\r\n }\r\n } else {\r\n const loc = getVertexAttribByName(buffer.structure.structMembers[0].name as VertexSemantic);\r\n this.internalSetVertexBuffer(loc, buffer, 0, stepMode);\r\n }\r\n return buffer;\r\n }\r\n /**\r\n * Removes a vertex buffer\r\n * @param buffer - Vertex buffer to be removed\r\n * @returns true if the buffer was successfully removed, otherwise false\r\n */\r\n removeVertexBuffer(buffer: StructuredBuffer): boolean {\r\n let removed = false;\r\n for (let loc = 0; loc < this._vertexBuffers.length; loc++) {\r\n const info = this._vertexBuffers[loc];\r\n const remove = info?.buffer === buffer;\r\n if (remove) {\r\n this._vertexBuffers[loc] = null;\r\n removed = true;\r\n }\r\n }\r\n if (removed) {\r\n this.calcNumVertices();\r\n }\r\n return removed;\r\n }\r\n /**\r\n * Sets the index buffer\r\n * @param buffer - Index buffer to be set\r\n * @returns The index buffer that was set\r\n */\r\n setIndexBuffer(buffer: IndexBuffer): IndexBuffer {\r\n if (buffer !== this._indexBuffer) {\r\n this._indexBuffer = buffer || null;\r\n }\r\n return buffer;\r\n }\r\n /** @internal */\r\n private calcNumVertices() {\r\n this._numVertices = 0;\r\n for (let i = 0; i < MAX_VERTEX_ATTRIBUTES; i++) {\r\n const info = this._vertexBuffers[i];\r\n if (info && info.stepMode !== 'instance') {\r\n const n = Math.floor(info.buffer.byteLength / info.stride);\r\n if (n > this._numVertices) {\r\n this._numVertices = n;\r\n }\r\n }\r\n }\r\n }\r\n /** @internal */\r\n private internalSetVertexBuffer(\r\n loc: number,\r\n buffer: StructuredBuffer,\r\n offset?: number,\r\n stepMode?: VertexStepMode\r\n ): StructuredBuffer {\r\n if (loc < 0 || loc >= MAX_VERTEX_ATTRIBUTES) {\r\n throw new Error(`setVertexBuffer() failed: location out of bounds: ${loc}`);\r\n }\r\n offset = Number(offset) || 0;\r\n stepMode = stepMode || 'vertex';\r\n const old = this._vertexBuffers[loc];\r\n if (!old || old.buffer !== buffer || old.offset !== offset || old.stepMode !== stepMode) {\r\n this._vertexBuffers[loc] = {\r\n buffer: buffer,\r\n offset: offset,\r\n type: getVertexBufferAttribType(buffer.structure, loc),\r\n stride: getVertexBufferStride(buffer.structure),\r\n drawOffset: 0,\r\n stepMode: stepMode\r\n };\r\n this.calcNumVertices();\r\n return buffer;\r\n }\r\n return null;\r\n }\r\n}\r\n"],"names":["VertexData","_vertexBuffers","i","MAX_VERTEX_ATTRIBUTES","push","_indexBuffer","_drawOffset","_numVertices","clone","newVertexData","slice","calcNumVertices","vertexBuffers","indexBuffer","numVertices","getDrawOffset","setDrawOffset","offset","getVertexBuffer","semantic","getVertexAttribByName","buffer","getVertexBufferInfo","getIndexBuffer","setVertexBuffer","stepMode","usage","GPUResourceUsageFlags","BF_VERTEX","Error","vertexType","structure","structMembers","type","elementType","isStructType","attrib","loc","name","internalSetVertexBuffer","size","removeVertexBuffer","removed","length","info","remove","setIndexBuffer","n","Math","floor","byteLength","stride","Number","old","getVertexBufferAttribType","getVertexBufferStride","drawOffset"],"mappings":"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"}
|