@zephyr3d/device 0.2.4 → 0.2.6

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.
Files changed (44) hide show
  1. package/dist/base_types.js +19 -79
  2. package/dist/base_types.js.map +1 -1
  3. package/dist/builder/ast.js +142 -162
  4. package/dist/builder/ast.js.map +1 -1
  5. package/dist/builder/base.js +29 -27
  6. package/dist/builder/base.js.map +1 -1
  7. package/dist/builder/builtinfunc.js +61 -7
  8. package/dist/builder/builtinfunc.js.map +1 -1
  9. package/dist/builder/constructors.js +3 -1
  10. package/dist/builder/constructors.js.map +1 -1
  11. package/dist/builder/errors.js +11 -11
  12. package/dist/builder/errors.js.map +1 -1
  13. package/dist/builder/misc.js +10 -0
  14. package/dist/builder/misc.js.map +1 -0
  15. package/dist/builder/programbuilder.js +62 -58
  16. package/dist/builder/programbuilder.js.map +1 -1
  17. package/dist/builder/reflection.js +1 -1
  18. package/dist/builder/reflection.js.map +1 -1
  19. package/dist/builder/types.js +76 -75
  20. package/dist/builder/types.js.map +1 -1
  21. package/dist/device.js +220 -80
  22. package/dist/device.js.map +1 -1
  23. package/dist/gpuobject.js +84 -25
  24. package/dist/gpuobject.js.map +1 -1
  25. package/dist/helpers/drawtext.js +30 -25
  26. package/dist/helpers/drawtext.js.map +1 -1
  27. package/dist/helpers/font.js +1 -0
  28. package/dist/helpers/font.js.map +1 -1
  29. package/dist/helpers/glyphmanager.js +33 -15
  30. package/dist/helpers/glyphmanager.js.map +1 -1
  31. package/dist/helpers/textureatlas.js +10 -8
  32. package/dist/helpers/textureatlas.js.map +1 -1
  33. package/dist/index.d.ts +465 -394
  34. package/dist/index.js +6 -5
  35. package/dist/index.js.map +1 -1
  36. package/dist/pool.js +69 -31
  37. package/dist/pool.js.map +1 -1
  38. package/dist/timer.js +3 -2
  39. package/dist/timer.js.map +1 -1
  40. package/dist/uniformdata.js +3 -3
  41. package/dist/uniformdata.js.map +1 -1
  42. package/dist/vertexdata.js +29 -3
  43. package/dist/vertexdata.js.map +1 -1
  44. package/package.json +80 -65
package/dist/index.js CHANGED
@@ -1,8 +1,11 @@
1
- export { DeviceGPUObjectAddedEvent, DeviceGPUObjectRemovedEvent, DeviceGPUObjectRenameEvent, DeviceLostEvent, DeviceResizeEvent, DeviceRestoreEvent, ShaderType, encodePixel, encodePixelToArray, getTextureFormatBlockHeight, getTextureFormatBlockSize, getTextureFormatBlockWidth, hasAlphaChannel, hasBlueChannel, hasDepthChannel, hasGreenChannel, hasRedChannel, hasStencilChannel, isCompressedTextureFormat, isFloatTextureFormat, isIntegerTextureFormat, isSRGBTextureFormat, isSignedTextureFormat, linearTextureFormatToSRGB } from './base_types.js';
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 { PBShaderExp, Proxiable, getCurrentProgramBuilder, makeConstructor, setCurrentProgramBuilder } from './builder/base.js';
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){
@@ -54,16 +61,17 @@
54
61
  let texture = null;
55
62
  const list = this._freeTextures[hash];
56
63
  if (!list) {
57
- texture = this._device.createTexture2D(format, width, height, mipmapping ? {} : {
58
- samplerOptions: {
59
- mipFilter: 'none'
60
- }
64
+ texture = this._device.createTexture2D(format, width, height, {
65
+ mipmapping
61
66
  });
67
+ if (!texture) {
68
+ throw new Error(`Create 2D texture failed: ${format}-${width}x${height}`);
69
+ }
62
70
  this._memCost += texture.memCost;
63
71
  } else {
64
72
  texture = list.pop();
65
73
  if (list.length === 0) {
66
- this._freeTextures[hash] = undefined;
74
+ delete this._freeTextures[hash];
67
75
  }
68
76
  }
69
77
  this._allocatedTextures.set(texture, {
@@ -90,16 +98,17 @@
90
98
  let texture = null;
91
99
  const list = this._freeTextures[hash];
92
100
  if (!list) {
93
- texture = this._device.createTexture2DArray(format, width, height, numLayers, mipmapping ? {} : {
94
- samplerOptions: {
95
- mipFilter: 'none'
96
- }
101
+ texture = this._device.createTexture2DArray(format, width, height, numLayers, {
102
+ mipmapping
97
103
  });
104
+ if (!texture) {
105
+ throw new Error(`Create 2DArray texture failed: ${format}-${width}x${height}x${numLayers}`);
106
+ }
98
107
  this._memCost += texture.memCost;
99
108
  } else {
100
109
  texture = list.pop();
101
110
  if (list.length === 0) {
102
- this._freeTextures[hash] = undefined;
111
+ delete this._freeTextures[hash];
103
112
  }
104
113
  }
105
114
  this._allocatedTextures.set(texture, {
@@ -124,16 +133,17 @@
124
133
  let texture = null;
125
134
  const list = this._freeTextures[hash];
126
135
  if (!list) {
127
- texture = this._device.createCubeTexture(format, size, mipmapping ? {} : {
128
- samplerOptions: {
129
- mipFilter: 'none'
130
- }
136
+ texture = this._device.createCubeTexture(format, size, {
137
+ mipmapping
131
138
  });
139
+ if (!texture) {
140
+ throw new Error(`Create Cube texture failed: ${format}-${size}`);
141
+ }
132
142
  this._memCost += texture.memCost;
133
143
  } else {
134
144
  texture = list.pop();
135
145
  if (list.length === 0) {
136
- this._freeTextures[hash] = undefined;
146
+ delete this._freeTextures[hash];
137
147
  }
138
148
  }
139
149
  this._allocatedTextures.set(texture, {
@@ -174,7 +184,7 @@
174
184
  this.releaseTexture(colorAttachments[i]);
175
185
  }
176
186
  }
177
- if (typeof depthTexOrFormat === 'string') {
187
+ if (!!depthAttachment && typeof depthTexOrFormat === 'string') {
178
188
  this.releaseTexture(depthAttachment);
179
189
  }
180
190
  return fb;
@@ -214,11 +224,11 @@
214
224
  } else {
215
225
  fb = list.pop();
216
226
  if (list.length === 0) {
217
- this._freeFramebuffers[hash] = undefined;
227
+ delete this._freeFramebuffers[hash];
218
228
  }
219
229
  }
220
230
  // Mark referenced textures
221
- const info = this._allocatedTextures.get(depthAttachment);
231
+ const info = depthAttachment ? this._allocatedTextures.get(depthAttachment) : null;
222
232
  if (info) {
223
233
  info.refcount++;
224
234
  }
@@ -228,7 +238,10 @@
228
238
  info.refcount++;
229
239
  }
230
240
  }
231
- this._allocatedFramebuffers.set(fb, hash);
241
+ this._allocatedFramebuffers.set(fb, {
242
+ hash,
243
+ refcount: 1
244
+ });
232
245
  if (autoRelease) {
233
246
  this._autoReleaseFramebuffers.add(fb);
234
247
  }
@@ -252,6 +265,17 @@
252
265
  }
253
266
  }
254
267
  /**
268
+ * Increment reference counter for given texture
269
+ * @param texture - The texture to retain
270
+ */ retainTexture(texture) {
271
+ const info = this._allocatedTextures.get(texture);
272
+ if (!info) {
273
+ console.error(`ObjectPool.retainTexture(): texture is not allocated from pool`);
274
+ } else {
275
+ info.refcount++;
276
+ }
277
+ }
278
+ /**
255
279
  * Dispose a framebuffer that is allocated from the object pool.
256
280
  * @param fb - The framebuffer to dispose.
257
281
  */ disposeFrameBuffer(fb) {
@@ -267,22 +291,36 @@
267
291
  * Release a framebuffer back to the object pool.
268
292
  * @param fb - The framebuffer to release.
269
293
  */ releaseFrameBuffer(fb) {
270
- const hash = this._allocatedFramebuffers.get(fb);
271
- if (!hash) {
294
+ const info = this._allocatedFramebuffers.get(fb);
295
+ if (!info) {
272
296
  console.error(`ObjectPool.releaseFrameBuffer(): framebuffer is not allocated from pool`);
273
297
  } else {
274
- this.internalDisposeFrameBuffer(fb);
275
- const list = this._freeFramebuffers[hash];
276
- if (list) {
277
- list.push(fb);
278
- } else {
279
- this._freeFramebuffers[hash] = [
280
- fb
281
- ];
298
+ info.refcount--;
299
+ if (info.refcount <= 0) {
300
+ this.internalDisposeFrameBuffer(fb);
301
+ const list = this._freeFramebuffers[info.hash];
302
+ if (list) {
303
+ list.push(fb);
304
+ } else {
305
+ this._freeFramebuffers[info.hash] = [
306
+ fb
307
+ ];
308
+ }
282
309
  }
283
310
  }
284
311
  }
285
312
  /**
313
+ * Increment reference counter for given framebuffer
314
+ * @param fb - The framebuffer to retain
315
+ */ retainFrameBuffer(fb) {
316
+ const info = this._allocatedFramebuffers.get(fb);
317
+ if (!info) {
318
+ console.error(`ObjectPool.retainFrameBuffer(): framebuffer is not allocated from pool`);
319
+ } else {
320
+ info.refcount++;
321
+ }
322
+ }
323
+ /**
286
324
  * Purge the object pool by disposing all free framebuffers and textures.
287
325
  */ purge() {
288
326
  for(const k in this._freeFramebuffers){
@@ -325,7 +363,7 @@
325
363
  const info = this._allocatedTextures.get(texture);
326
364
  if (info) {
327
365
  info.refcount--;
328
- if (info.refcount === 0) {
366
+ if (info.refcount <= 0) {
329
367
  this._allocatedTextures.delete(texture);
330
368
  this._autoReleaseTextures.delete(texture);
331
369
  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 { Nullable, 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() {\r\n return this._id;\r\n }\r\n autoRelease() {\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 ) {\r\n const hash = `2d:${format}:${width}:${height}:${mipmapping ? 1 : 0}`;\r\n let texture: Nullable<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 if (!texture) {\r\n throw new Error(`Create 2D texture failed: ${format}-${width}x${height}`);\r\n }\r\n this._memCost += texture.memCost;\r\n } else {\r\n texture = list.pop()!;\r\n if (list.length === 0) {\r\n delete this._freeTextures[hash];\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 ) {\r\n const hash = `2darray:${format}:${width}:${height}:${numLayers}:${mipmapping ? 1 : 0}`;\r\n let texture: Nullable<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 if (!texture) {\r\n throw new Error(`Create 2DArray texture failed: ${format}-${width}x${height}x${numLayers}`);\r\n }\r\n this._memCost += texture.memCost;\r\n } else {\r\n texture = list.pop()!;\r\n if (list.length === 0) {\r\n delete this._freeTextures[hash];\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(autoRelease: boolean, format: TextureFormat, size: number, mipmapping = false) {\r\n const hash = `cube:${format}:${size}:${mipmapping ? 1 : 0}`;\r\n let texture: Nullable<BaseTexture> = null;\r\n const list = this._freeTextures[hash];\r\n if (!list) {\r\n texture = this._device.createCubeTexture(format, size, { mipmapping });\r\n if (!texture) {\r\n throw new Error(`Create Cube texture failed: ${format}-${size}`);\r\n }\r\n this._memCost += texture.memCost;\r\n } else {\r\n texture = list.pop()!;\r\n if (list.length === 0) {\r\n delete this._freeTextures[hash];\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: Nullable<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 ) {\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 (!!depthAttachment && 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: Nullable<BaseTexture> = null,\r\n sampleCount = 1,\r\n ignoreDepthStencil = true,\r\n attachmentMipLevel = 0,\r\n attachmentCubeface = 0,\r\n attachmentLayer = 0\r\n ) {\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: Nullable<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 delete this._freeFramebuffers[hash];\r\n }\r\n }\r\n // Mark referenced textures\r\n const info = depthAttachment ? this._allocatedTextures.get(depthAttachment) : null;\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) {\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) {\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) {\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) {\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) {\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) {\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() {\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) {\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) {\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","Error","memCost","pop","length","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 CHANGED
@@ -11,7 +11,8 @@
11
11
  /** @internal */ _ended;
12
12
  constructor(){
13
13
  this._cpuTimer = window.performance || window.Date;
14
- this._cpuTime = null;
14
+ this._cpuStart = 0;
15
+ this._cpuTime = 0;
15
16
  this._ended = false;
16
17
  }
17
18
  now() {
@@ -19,7 +20,7 @@
19
20
  }
20
21
  begin() {
21
22
  this._cpuStart = this.now();
22
- this._cpuTime = null;
23
+ this._cpuTime = 0;
23
24
  this._ended = false;
24
25
  }
25
26
  end() {
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._cpuStart = 0;\r\n this._cpuTime = 0;\r\n this._ended = false;\r\n }\r\n now() {\r\n return this._cpuTimer.now();\r\n }\r\n begin() {\r\n this._cpuStart = this.now();\r\n this._cpuTime = 0;\r\n this._ended = false;\r\n }\r\n end() {\r\n this._cpuTime = this.now() - this._cpuStart;\r\n this._ended = true;\r\n }\r\n ended() {\r\n return this._ended;\r\n }\r\n elapsed() {\r\n return this._cpuTime;\r\n }\r\n}\r\n"],"names":["CPUTimer","_cpuTimer","window","performance","Date","_cpuStart","_cpuTime","_ended","now","begin","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,SAAS,GAAG,CAAA;QACjB,IAAI,CAACC,QAAQ,GAAG,CAAA;QAChB,IAAI,CAACC,MAAM,GAAG,KAAA;AAChB;IACAC,GAAM,GAAA;AACJ,QAAA,OAAO,IAAI,CAACP,SAAS,CAACO,GAAG,EAAA;AAC3B;IACAC,KAAQ,GAAA;AACN,QAAA,IAAI,CAACJ,SAAS,GAAG,IAAI,CAACG,GAAG,EAAA;QACzB,IAAI,CAACF,QAAQ,GAAG,CAAA;QAChB,IAAI,CAACC,MAAM,GAAG,KAAA;AAChB;IACAG,GAAM,GAAA;QACJ,IAAI,CAACJ,QAAQ,GAAG,IAAI,CAACE,GAAG,EAAA,GAAK,IAAI,CAACH,SAAS;QAC3C,IAAI,CAACE,MAAM,GAAG,IAAA;AAChB;IACAI,KAAQ,GAAA;QACN,OAAO,IAAI,CAACJ,MAAM;AACpB;IACAK,OAAU,GAAA;QACR,OAAO,IAAI,CAACN,QAAQ;AACtB;AACF;;;;"}
@@ -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 & ~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
  }
@@ -22,7 +22,7 @@ import { PBPrimitiveType } from './builder/types.js';
22
22
  this._uniformMap = {};
23
23
  this._uniformPositions = {};
24
24
  this._cache = buffer instanceof ArrayBuffer ? buffer : null;
25
- this._buffer = buffer instanceof ArrayBuffer ? null : buffer;
25
+ this._buffer = buffer instanceof ArrayBuffer || !buffer ? null : buffer;
26
26
  this.init(layout, 0, '');
27
27
  }
28
28
  /** The buffer size in bytes */ get byteLength() {
@@ -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
  }
@@ -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 { Nullable, 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: Nullable<ArrayBuffer>;\r\n /** @internal */\r\n protected _buffer: Nullable<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?: Nullable<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 || !buffer ? null : buffer;\r\n this.init(layout, 0, '');\r\n }\r\n /** The buffer size in bytes */\r\n get byteLength() {\r\n return this._size;\r\n }\r\n /** Get the data cache buffer */\r\n get buffer() {\r\n return this._cache;\r\n }\r\n /** Get all the uniform datas */\r\n get uniforms() {\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) {\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) {\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) {\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: Nullable<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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"}
@@ -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
  /**
@@ -57,7 +64,7 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
57
64
  * Gets the index buffer
58
65
  * @returns The index buffer
59
66
  */ getIndexBuffer() {
60
- return this._indexBuffer || null;
67
+ return this._indexBuffer;
61
68
  }
62
69
  /**
63
70
  * Sets a vertex buffer
@@ -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 || !(buffer.usage & GPUResourceUsageFlags.BF_VERTEX)) {
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
  /**
@@ -105,10 +118,22 @@ import { MAX_VERTEX_ATTRIBUTES, getVertexAttribByName, GPUResourceUsageFlags, ge
105
118
  * @returns The index buffer that was set
106
119
  */ setIndexBuffer(buffer) {
107
120
  if (buffer !== this._indexBuffer) {
108
- this._indexBuffer = buffer || null;
121
+ this._indexBuffer = buffer;
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;
@@ -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\nimport type { Nullable } from '@zephyr3d/base';\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: Nullable<VertexBufferInfo>[];\r\n /** @internal */\r\n private _indexBuffer: Nullable<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() {\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() {\r\n return this._vertexBuffers;\r\n }\r\n /** Index buffer */\r\n get 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() {\r\n return this._drawOffset;\r\n }\r\n setDrawOffset(offset: number) {\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) {\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) {\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() {\r\n return this._indexBuffer;\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) {\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) {\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: Nullable<IndexBuffer>) {\r\n if (buffer !== this._indexBuffer) {\r\n this._indexBuffer = buffer;\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 ) {\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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"}