This commit is contained in:
Akko
2025-08-04 18:57:35 +02:00
parent 8cf6e78a79
commit 9495868c2e
5030 changed files with 518594 additions and 17609 deletions

View File

@@ -0,0 +1,34 @@
/// <reference types="@webgpu/types" />
import { ExtensionType } from '../../../../extensions/Extensions';
import type { Buffer } from '../../shared/buffer/Buffer';
import type { System } from '../../shared/system/System';
import type { GPU } from '../GpuDeviceSystem';
/**
* System plugin to the renderer to manage buffers.
* @memberof rendering
*/
export declare class GpuBufferSystem implements System {
/** @ignore */
static extension: {
readonly type: readonly [ExtensionType.WebGPUSystem];
readonly name: "buffer";
};
protected CONTEXT_UID: number;
private _gpuBuffers;
private readonly _managedBuffers;
private _gpu;
protected contextChange(gpu: GPU): void;
getGPUBuffer(buffer: Buffer): GPUBuffer;
updateBuffer(buffer: Buffer): GPUBuffer;
/** dispose all WebGL resources of all managed buffers */
destroyAll(): void;
createGPUBuffer(buffer: Buffer): GPUBuffer;
protected onBufferChange(buffer: Buffer): void;
/**
* Disposes buffer
* @param buffer - buffer with data
*/
protected onBufferDestroy(buffer: Buffer): void;
destroy(): void;
private _destroyBuffer;
}

View File

@@ -0,0 +1,94 @@
'use strict';
var Extensions = require('../../../../extensions/Extensions.js');
var fastCopy = require('../../shared/buffer/utils/fastCopy.js');
"use strict";
class GpuBufferSystem {
constructor() {
this._gpuBuffers = /* @__PURE__ */ Object.create(null);
this._managedBuffers = [];
}
contextChange(gpu) {
this._gpu = gpu;
}
getGPUBuffer(buffer) {
return this._gpuBuffers[buffer.uid] || this.createGPUBuffer(buffer);
}
updateBuffer(buffer) {
const gpuBuffer = this._gpuBuffers[buffer.uid] || this.createGPUBuffer(buffer);
const data = buffer.data;
if (buffer._updateID && data) {
buffer._updateID = 0;
this._gpu.device.queue.writeBuffer(
gpuBuffer,
0,
data.buffer,
0,
// round to the nearest 4 bytes
(buffer._updateSize || data.byteLength) + 3 & ~3
);
}
return gpuBuffer;
}
/** dispose all WebGL resources of all managed buffers */
destroyAll() {
for (const id in this._gpuBuffers) {
this._gpuBuffers[id].destroy();
}
this._gpuBuffers = {};
}
createGPUBuffer(buffer) {
if (!this._gpuBuffers[buffer.uid]) {
buffer.on("update", this.updateBuffer, this);
buffer.on("change", this.onBufferChange, this);
buffer.on("destroy", this.onBufferDestroy, this);
this._managedBuffers.push(buffer);
}
const gpuBuffer = this._gpu.device.createBuffer(buffer.descriptor);
buffer._updateID = 0;
if (buffer.data) {
fastCopy.fastCopy(buffer.data.buffer, gpuBuffer.getMappedRange());
gpuBuffer.unmap();
}
this._gpuBuffers[buffer.uid] = gpuBuffer;
return gpuBuffer;
}
onBufferChange(buffer) {
const gpuBuffer = this._gpuBuffers[buffer.uid];
gpuBuffer.destroy();
buffer._updateID = 0;
this._gpuBuffers[buffer.uid] = this.createGPUBuffer(buffer);
}
/**
* Disposes buffer
* @param buffer - buffer with data
*/
onBufferDestroy(buffer) {
this._managedBuffers.splice(this._managedBuffers.indexOf(buffer), 1);
this._destroyBuffer(buffer);
}
destroy() {
this._managedBuffers.forEach((buffer) => this._destroyBuffer(buffer));
this._managedBuffers = null;
this._gpuBuffers = null;
}
_destroyBuffer(buffer) {
const gpuBuffer = this._gpuBuffers[buffer.uid];
gpuBuffer.destroy();
buffer.off("update", this.updateBuffer, this);
buffer.off("change", this.onBufferChange, this);
buffer.off("destroy", this.onBufferDestroy, this);
this._gpuBuffers[buffer.uid] = null;
}
}
/** @ignore */
GpuBufferSystem.extension = {
type: [
Extensions.ExtensionType.WebGPUSystem
],
name: "buffer"
};
exports.GpuBufferSystem = GpuBufferSystem;
//# sourceMappingURL=GpuBufferSystem.js.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,92 @@
import { ExtensionType } from '../../../../extensions/Extensions.mjs';
import { fastCopy } from '../../shared/buffer/utils/fastCopy.mjs';
"use strict";
class GpuBufferSystem {
constructor() {
this._gpuBuffers = /* @__PURE__ */ Object.create(null);
this._managedBuffers = [];
}
contextChange(gpu) {
this._gpu = gpu;
}
getGPUBuffer(buffer) {
return this._gpuBuffers[buffer.uid] || this.createGPUBuffer(buffer);
}
updateBuffer(buffer) {
const gpuBuffer = this._gpuBuffers[buffer.uid] || this.createGPUBuffer(buffer);
const data = buffer.data;
if (buffer._updateID && data) {
buffer._updateID = 0;
this._gpu.device.queue.writeBuffer(
gpuBuffer,
0,
data.buffer,
0,
// round to the nearest 4 bytes
(buffer._updateSize || data.byteLength) + 3 & ~3
);
}
return gpuBuffer;
}
/** dispose all WebGL resources of all managed buffers */
destroyAll() {
for (const id in this._gpuBuffers) {
this._gpuBuffers[id].destroy();
}
this._gpuBuffers = {};
}
createGPUBuffer(buffer) {
if (!this._gpuBuffers[buffer.uid]) {
buffer.on("update", this.updateBuffer, this);
buffer.on("change", this.onBufferChange, this);
buffer.on("destroy", this.onBufferDestroy, this);
this._managedBuffers.push(buffer);
}
const gpuBuffer = this._gpu.device.createBuffer(buffer.descriptor);
buffer._updateID = 0;
if (buffer.data) {
fastCopy(buffer.data.buffer, gpuBuffer.getMappedRange());
gpuBuffer.unmap();
}
this._gpuBuffers[buffer.uid] = gpuBuffer;
return gpuBuffer;
}
onBufferChange(buffer) {
const gpuBuffer = this._gpuBuffers[buffer.uid];
gpuBuffer.destroy();
buffer._updateID = 0;
this._gpuBuffers[buffer.uid] = this.createGPUBuffer(buffer);
}
/**
* Disposes buffer
* @param buffer - buffer with data
*/
onBufferDestroy(buffer) {
this._managedBuffers.splice(this._managedBuffers.indexOf(buffer), 1);
this._destroyBuffer(buffer);
}
destroy() {
this._managedBuffers.forEach((buffer) => this._destroyBuffer(buffer));
this._managedBuffers = null;
this._gpuBuffers = null;
}
_destroyBuffer(buffer) {
const gpuBuffer = this._gpuBuffers[buffer.uid];
gpuBuffer.destroy();
buffer.off("update", this.updateBuffer, this);
buffer.off("change", this.onBufferChange, this);
buffer.off("destroy", this.onBufferDestroy, this);
this._gpuBuffers[buffer.uid] = null;
}
}
/** @ignore */
GpuBufferSystem.extension = {
type: [
ExtensionType.WebGPUSystem
],
name: "buffer"
};
export { GpuBufferSystem };
//# sourceMappingURL=GpuBufferSystem.mjs.map

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,3 @@
import { Buffer } from '../../shared/buffer/Buffer';
import type { WebGPURenderer } from '../WebGPURenderer';
export declare function GpuReadBuffer(buffer: Buffer, renderer: WebGPURenderer): void;

View File

@@ -0,0 +1,39 @@
'use strict';
var Buffer = require('../../shared/buffer/Buffer.js');
var _const = require('../../shared/buffer/const.js');
"use strict";
function GpuReadBuffer(buffer, renderer) {
const bufferSize = buffer.descriptor.size;
const device = renderer.gpu.device;
const stagingBuffer = new Buffer.Buffer({
data: new Float32Array(24e5),
usage: _const.BufferUsage.MAP_READ | _const.BufferUsage.COPY_DST
});
const stagingGPUBuffer = renderer.buffer.createGPUBuffer(stagingBuffer);
const commandEncoder = device.createCommandEncoder();
commandEncoder.copyBufferToBuffer(
renderer.buffer.getGPUBuffer(buffer),
0,
// Source offset
stagingGPUBuffer,
0,
// Destination offset
bufferSize
);
device.queue.submit([commandEncoder.finish()]);
void stagingGPUBuffer.mapAsync(
GPUMapMode.READ,
0,
// Offset
bufferSize
// Length
).then(() => {
stagingGPUBuffer.getMappedRange(0, bufferSize);
stagingGPUBuffer.unmap();
});
}
exports.GpuReadBuffer = GpuReadBuffer;
//# sourceMappingURL=GpuReadBuffer.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"GpuReadBuffer.js","sources":["../../../../../src/rendering/renderers/gpu/buffer/GpuReadBuffer.ts"],"sourcesContent":["import { Buffer } from '../../shared/buffer/Buffer';\nimport { BufferUsage } from '../../shared/buffer/const';\n\nimport type { WebGPURenderer } from '../WebGPURenderer';\n\nexport function GpuReadBuffer(buffer: Buffer, renderer: WebGPURenderer)\n{\n const bufferSize = buffer.descriptor.size;\n\n const device = renderer.gpu.device;\n\n const stagingBuffer = new Buffer({\n data: new Float32Array(2400000),\n usage: BufferUsage.MAP_READ | BufferUsage.COPY_DST,\n });\n\n const stagingGPUBuffer = renderer.buffer.createGPUBuffer(stagingBuffer);\n\n const commandEncoder = device.createCommandEncoder();\n\n commandEncoder.copyBufferToBuffer(\n renderer.buffer.getGPUBuffer(buffer),\n 0, // Source offset\n stagingGPUBuffer,\n 0, // Destination offset\n bufferSize,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n\n void stagingGPUBuffer.mapAsync(\n GPUMapMode.READ,\n 0, // Offset\n bufferSize, // Length\n ).then(() =>\n {\n stagingGPUBuffer.getMappedRange(0, bufferSize);\n stagingGPUBuffer.unmap();\n });\n}\n"],"names":["Buffer","BufferUsage"],"mappings":";;;;;;AAKgB,SAAA,aAAA,CAAc,QAAgB,QAC9C,EAAA;AACI,EAAM,MAAA,UAAA,GAAa,OAAO,UAAW,CAAA,IAAA,CAAA;AAErC,EAAM,MAAA,MAAA,GAAS,SAAS,GAAI,CAAA,MAAA,CAAA;AAE5B,EAAM,MAAA,aAAA,GAAgB,IAAIA,aAAO,CAAA;AAAA,IAC7B,IAAA,EAAM,IAAI,YAAA,CAAa,IAAO,CAAA;AAAA,IAC9B,KAAA,EAAOC,kBAAY,CAAA,QAAA,GAAWA,kBAAY,CAAA,QAAA;AAAA,GAC7C,CAAA,CAAA;AAED,EAAA,MAAM,gBAAmB,GAAA,QAAA,CAAS,MAAO,CAAA,eAAA,CAAgB,aAAa,CAAA,CAAA;AAEtE,EAAM,MAAA,cAAA,GAAiB,OAAO,oBAAqB,EAAA,CAAA;AAEnD,EAAe,cAAA,CAAA,kBAAA;AAAA,IACX,QAAA,CAAS,MAAO,CAAA,YAAA,CAAa,MAAM,CAAA;AAAA,IACnC,CAAA;AAAA;AAAA,IACA,gBAAA;AAAA,IACA,CAAA;AAAA;AAAA,IACA,UAAA;AAAA,GACJ,CAAA;AAEA,EAAA,MAAA,CAAO,MAAM,MAAO,CAAA,CAAC,cAAe,CAAA,MAAA,EAAQ,CAAC,CAAA,CAAA;AAE7C,EAAA,KAAK,gBAAiB,CAAA,QAAA;AAAA,IAClB,UAAW,CAAA,IAAA;AAAA,IACX,CAAA;AAAA;AAAA,IACA,UAAA;AAAA;AAAA,GACJ,CAAE,KAAK,MACP;AACI,IAAiB,gBAAA,CAAA,cAAA,CAAe,GAAG,UAAU,CAAA,CAAA;AAC7C,IAAA,gBAAA,CAAiB,KAAM,EAAA,CAAA;AAAA,GAC1B,CAAA,CAAA;AACL;;;;"}

View File

@@ -0,0 +1,37 @@
import { Buffer } from '../../shared/buffer/Buffer.mjs';
import { BufferUsage } from '../../shared/buffer/const.mjs';
"use strict";
function GpuReadBuffer(buffer, renderer) {
const bufferSize = buffer.descriptor.size;
const device = renderer.gpu.device;
const stagingBuffer = new Buffer({
data: new Float32Array(24e5),
usage: BufferUsage.MAP_READ | BufferUsage.COPY_DST
});
const stagingGPUBuffer = renderer.buffer.createGPUBuffer(stagingBuffer);
const commandEncoder = device.createCommandEncoder();
commandEncoder.copyBufferToBuffer(
renderer.buffer.getGPUBuffer(buffer),
0,
// Source offset
stagingGPUBuffer,
0,
// Destination offset
bufferSize
);
device.queue.submit([commandEncoder.finish()]);
void stagingGPUBuffer.mapAsync(
GPUMapMode.READ,
0,
// Offset
bufferSize
// Length
).then(() => {
stagingGPUBuffer.getMappedRange(0, bufferSize);
stagingGPUBuffer.unmap();
});
}
export { GpuReadBuffer };
//# sourceMappingURL=GpuReadBuffer.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"GpuReadBuffer.mjs","sources":["../../../../../src/rendering/renderers/gpu/buffer/GpuReadBuffer.ts"],"sourcesContent":["import { Buffer } from '../../shared/buffer/Buffer';\nimport { BufferUsage } from '../../shared/buffer/const';\n\nimport type { WebGPURenderer } from '../WebGPURenderer';\n\nexport function GpuReadBuffer(buffer: Buffer, renderer: WebGPURenderer)\n{\n const bufferSize = buffer.descriptor.size;\n\n const device = renderer.gpu.device;\n\n const stagingBuffer = new Buffer({\n data: new Float32Array(2400000),\n usage: BufferUsage.MAP_READ | BufferUsage.COPY_DST,\n });\n\n const stagingGPUBuffer = renderer.buffer.createGPUBuffer(stagingBuffer);\n\n const commandEncoder = device.createCommandEncoder();\n\n commandEncoder.copyBufferToBuffer(\n renderer.buffer.getGPUBuffer(buffer),\n 0, // Source offset\n stagingGPUBuffer,\n 0, // Destination offset\n bufferSize,\n );\n\n device.queue.submit([commandEncoder.finish()]);\n\n void stagingGPUBuffer.mapAsync(\n GPUMapMode.READ,\n 0, // Offset\n bufferSize, // Length\n ).then(() =>\n {\n stagingGPUBuffer.getMappedRange(0, bufferSize);\n stagingGPUBuffer.unmap();\n });\n}\n"],"names":[],"mappings":";;;;AAKgB,SAAA,aAAA,CAAc,QAAgB,QAC9C,EAAA;AACI,EAAM,MAAA,UAAA,GAAa,OAAO,UAAW,CAAA,IAAA,CAAA;AAErC,EAAM,MAAA,MAAA,GAAS,SAAS,GAAI,CAAA,MAAA,CAAA;AAE5B,EAAM,MAAA,aAAA,GAAgB,IAAI,MAAO,CAAA;AAAA,IAC7B,IAAA,EAAM,IAAI,YAAA,CAAa,IAAO,CAAA;AAAA,IAC9B,KAAA,EAAO,WAAY,CAAA,QAAA,GAAW,WAAY,CAAA,QAAA;AAAA,GAC7C,CAAA,CAAA;AAED,EAAA,MAAM,gBAAmB,GAAA,QAAA,CAAS,MAAO,CAAA,eAAA,CAAgB,aAAa,CAAA,CAAA;AAEtE,EAAM,MAAA,cAAA,GAAiB,OAAO,oBAAqB,EAAA,CAAA;AAEnD,EAAe,cAAA,CAAA,kBAAA;AAAA,IACX,QAAA,CAAS,MAAO,CAAA,YAAA,CAAa,MAAM,CAAA;AAAA,IACnC,CAAA;AAAA;AAAA,IACA,gBAAA;AAAA,IACA,CAAA;AAAA;AAAA,IACA,UAAA;AAAA,GACJ,CAAA;AAEA,EAAA,MAAA,CAAO,MAAM,MAAO,CAAA,CAAC,cAAe,CAAA,MAAA,EAAQ,CAAC,CAAA,CAAA;AAE7C,EAAA,KAAK,gBAAiB,CAAA,QAAA;AAAA,IAClB,UAAW,CAAA,IAAA;AAAA,IACX,CAAA;AAAA;AAAA,IACA,UAAA;AAAA;AAAA,GACJ,CAAE,KAAK,MACP;AACI,IAAiB,gBAAA,CAAA,cAAA,CAAe,GAAG,UAAU,CAAA,CAAA;AAC7C,IAAA,gBAAA,CAAiB,KAAM,EAAA,CAAA;AAAA,GAC1B,CAAA,CAAA;AACL;;;;"}

View File

@@ -0,0 +1,13 @@
export declare class UboBatch {
private _buffer;
data: Float32Array;
private readonly _minUniformOffsetAlignment;
byteIndex: number;
constructor({ minUniformOffsetAlignment }: {
minUniformOffsetAlignment: number;
});
clear(): void;
addEmptyGroup(size: number): number;
addGroup(array: Float32Array): number;
destroy(): void;
}

View File

@@ -0,0 +1,42 @@
'use strict';
"use strict";
class UboBatch {
constructor({ minUniformOffsetAlignment }) {
this._minUniformOffsetAlignment = 256;
this.byteIndex = 0;
this._minUniformOffsetAlignment = minUniformOffsetAlignment;
this.data = new Float32Array(65535);
}
clear() {
this.byteIndex = 0;
}
addEmptyGroup(size) {
if (size > this._minUniformOffsetAlignment / 4) {
throw new Error(`UniformBufferBatch: array is too large: ${size * 4}`);
}
const start = this.byteIndex;
let newSize = start + size * 4;
newSize = Math.ceil(newSize / this._minUniformOffsetAlignment) * this._minUniformOffsetAlignment;
if (newSize > this.data.length * 4) {
throw new Error("UniformBufferBatch: ubo batch got too big");
}
this.byteIndex = newSize;
return start;
}
addGroup(array) {
const offset = this.addEmptyGroup(array.length);
for (let i = 0; i < array.length; i++) {
this.data[offset / 4 + i] = array[i];
}
return offset;
}
destroy() {
this._buffer.destroy();
this._buffer = null;
this.data = null;
}
}
exports.UboBatch = UboBatch;
//# sourceMappingURL=UboBatch.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"UboBatch.js","sources":["../../../../../src/rendering/renderers/gpu/buffer/UboBatch.ts"],"sourcesContent":["import type { Buffer } from '../../shared/buffer/Buffer';\n\nexport class UboBatch\n{\n private _buffer: Buffer;\n public data: Float32Array;\n private readonly _minUniformOffsetAlignment: number = 256;\n\n public byteIndex = 0;\n\n constructor({ minUniformOffsetAlignment }: {minUniformOffsetAlignment: number})\n {\n this._minUniformOffsetAlignment = minUniformOffsetAlignment;\n this.data = new Float32Array(65535);\n }\n\n public clear(): void\n {\n this.byteIndex = 0;\n }\n\n public addEmptyGroup(size: number): number\n {\n // update the buffer.. only float32 for now!\n if (size > this._minUniformOffsetAlignment / 4)\n {\n throw new Error(`UniformBufferBatch: array is too large: ${size * 4}`);\n }\n\n const start = this.byteIndex;\n\n let newSize = start + (size * 4);\n\n newSize = Math.ceil(newSize / this._minUniformOffsetAlignment) * this._minUniformOffsetAlignment;\n\n if (newSize > this.data.length * 4)\n {\n // TODO push a new buffer\n throw new Error('UniformBufferBatch: ubo batch got too big');\n }\n\n this.byteIndex = newSize;\n\n return start;\n }\n\n public addGroup(array: Float32Array): number\n {\n const offset = this.addEmptyGroup(array.length);\n\n for (let i = 0; i < array.length; i++)\n {\n this.data[(offset / 4) + i] = array[i];\n }\n\n return offset;\n }\n\n public destroy()\n {\n this._buffer.destroy();\n this._buffer = null;\n\n this.data = null;\n }\n}\n"],"names":[],"mappings":";;;AAEO,MAAM,QACb,CAAA;AAAA,EAOI,WAAA,CAAY,EAAE,yBAAA,EACd,EAAA;AALA,IAAA,IAAA,CAAiB,0BAAqC,GAAA,GAAA,CAAA;AAEtD,IAAA,IAAA,CAAO,SAAY,GAAA,CAAA,CAAA;AAIf,IAAA,IAAA,CAAK,0BAA6B,GAAA,yBAAA,CAAA;AAClC,IAAK,IAAA,CAAA,IAAA,GAAO,IAAI,YAAA,CAAa,KAAK,CAAA,CAAA;AAAA,GACtC;AAAA,EAEO,KACP,GAAA;AACI,IAAA,IAAA,CAAK,SAAY,GAAA,CAAA,CAAA;AAAA,GACrB;AAAA,EAEO,cAAc,IACrB,EAAA;AAEI,IAAI,IAAA,IAAA,GAAO,IAAK,CAAA,0BAAA,GAA6B,CAC7C,EAAA;AACI,MAAA,MAAM,IAAI,KAAA,CAAM,CAA2C,wCAAA,EAAA,IAAA,GAAO,CAAC,CAAE,CAAA,CAAA,CAAA;AAAA,KACzE;AAEA,IAAA,MAAM,QAAQ,IAAK,CAAA,SAAA,CAAA;AAEnB,IAAI,IAAA,OAAA,GAAU,QAAS,IAAO,GAAA,CAAA,CAAA;AAE9B,IAAA,OAAA,GAAU,KAAK,IAAK,CAAA,OAAA,GAAU,IAAK,CAAA,0BAA0B,IAAI,IAAK,CAAA,0BAAA,CAAA;AAEtE,IAAA,IAAI,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CACjC,EAAA;AAEI,MAAM,MAAA,IAAI,MAAM,2CAA2C,CAAA,CAAA;AAAA,KAC/D;AAEA,IAAA,IAAA,CAAK,SAAY,GAAA,OAAA,CAAA;AAEjB,IAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAAA,EAEO,SAAS,KAChB,EAAA;AACI,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,aAAc,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAE9C,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAClC,EAAA,EAAA;AACI,MAAA,IAAA,CAAK,KAAM,MAAS,GAAA,CAAA,GAAK,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA,CAAA;AAAA,KACzC;AAEA,IAAO,OAAA,MAAA,CAAA;AAAA,GACX;AAAA,EAEO,OACP,GAAA;AACI,IAAA,IAAA,CAAK,QAAQ,OAAQ,EAAA,CAAA;AACrB,IAAA,IAAA,CAAK,OAAU,GAAA,IAAA,CAAA;AAEf,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AAAA,GAChB;AACJ;;;;"}

View File

@@ -0,0 +1,40 @@
"use strict";
class UboBatch {
constructor({ minUniformOffsetAlignment }) {
this._minUniformOffsetAlignment = 256;
this.byteIndex = 0;
this._minUniformOffsetAlignment = minUniformOffsetAlignment;
this.data = new Float32Array(65535);
}
clear() {
this.byteIndex = 0;
}
addEmptyGroup(size) {
if (size > this._minUniformOffsetAlignment / 4) {
throw new Error(`UniformBufferBatch: array is too large: ${size * 4}`);
}
const start = this.byteIndex;
let newSize = start + size * 4;
newSize = Math.ceil(newSize / this._minUniformOffsetAlignment) * this._minUniformOffsetAlignment;
if (newSize > this.data.length * 4) {
throw new Error("UniformBufferBatch: ubo batch got too big");
}
this.byteIndex = newSize;
return start;
}
addGroup(array) {
const offset = this.addEmptyGroup(array.length);
for (let i = 0; i < array.length; i++) {
this.data[offset / 4 + i] = array[i];
}
return offset;
}
destroy() {
this._buffer.destroy();
this._buffer = null;
this.data = null;
}
}
export { UboBatch };
//# sourceMappingURL=UboBatch.mjs.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"UboBatch.mjs","sources":["../../../../../src/rendering/renderers/gpu/buffer/UboBatch.ts"],"sourcesContent":["import type { Buffer } from '../../shared/buffer/Buffer';\n\nexport class UboBatch\n{\n private _buffer: Buffer;\n public data: Float32Array;\n private readonly _minUniformOffsetAlignment: number = 256;\n\n public byteIndex = 0;\n\n constructor({ minUniformOffsetAlignment }: {minUniformOffsetAlignment: number})\n {\n this._minUniformOffsetAlignment = minUniformOffsetAlignment;\n this.data = new Float32Array(65535);\n }\n\n public clear(): void\n {\n this.byteIndex = 0;\n }\n\n public addEmptyGroup(size: number): number\n {\n // update the buffer.. only float32 for now!\n if (size > this._minUniformOffsetAlignment / 4)\n {\n throw new Error(`UniformBufferBatch: array is too large: ${size * 4}`);\n }\n\n const start = this.byteIndex;\n\n let newSize = start + (size * 4);\n\n newSize = Math.ceil(newSize / this._minUniformOffsetAlignment) * this._minUniformOffsetAlignment;\n\n if (newSize > this.data.length * 4)\n {\n // TODO push a new buffer\n throw new Error('UniformBufferBatch: ubo batch got too big');\n }\n\n this.byteIndex = newSize;\n\n return start;\n }\n\n public addGroup(array: Float32Array): number\n {\n const offset = this.addEmptyGroup(array.length);\n\n for (let i = 0; i < array.length; i++)\n {\n this.data[(offset / 4) + i] = array[i];\n }\n\n return offset;\n }\n\n public destroy()\n {\n this._buffer.destroy();\n this._buffer = null;\n\n this.data = null;\n }\n}\n"],"names":[],"mappings":";AAEO,MAAM,QACb,CAAA;AAAA,EAOI,WAAA,CAAY,EAAE,yBAAA,EACd,EAAA;AALA,IAAA,IAAA,CAAiB,0BAAqC,GAAA,GAAA,CAAA;AAEtD,IAAA,IAAA,CAAO,SAAY,GAAA,CAAA,CAAA;AAIf,IAAA,IAAA,CAAK,0BAA6B,GAAA,yBAAA,CAAA;AAClC,IAAK,IAAA,CAAA,IAAA,GAAO,IAAI,YAAA,CAAa,KAAK,CAAA,CAAA;AAAA,GACtC;AAAA,EAEO,KACP,GAAA;AACI,IAAA,IAAA,CAAK,SAAY,GAAA,CAAA,CAAA;AAAA,GACrB;AAAA,EAEO,cAAc,IACrB,EAAA;AAEI,IAAI,IAAA,IAAA,GAAO,IAAK,CAAA,0BAAA,GAA6B,CAC7C,EAAA;AACI,MAAA,MAAM,IAAI,KAAA,CAAM,CAA2C,wCAAA,EAAA,IAAA,GAAO,CAAC,CAAE,CAAA,CAAA,CAAA;AAAA,KACzE;AAEA,IAAA,MAAM,QAAQ,IAAK,CAAA,SAAA,CAAA;AAEnB,IAAI,IAAA,OAAA,GAAU,QAAS,IAAO,GAAA,CAAA,CAAA;AAE9B,IAAA,OAAA,GAAU,KAAK,IAAK,CAAA,OAAA,GAAU,IAAK,CAAA,0BAA0B,IAAI,IAAK,CAAA,0BAAA,CAAA;AAEtE,IAAA,IAAI,OAAU,GAAA,IAAA,CAAK,IAAK,CAAA,MAAA,GAAS,CACjC,EAAA;AAEI,MAAM,MAAA,IAAI,MAAM,2CAA2C,CAAA,CAAA;AAAA,KAC/D;AAEA,IAAA,IAAA,CAAK,SAAY,GAAA,OAAA,CAAA;AAEjB,IAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAAA,EAEO,SAAS,KAChB,EAAA;AACI,IAAA,MAAM,MAAS,GAAA,IAAA,CAAK,aAAc,CAAA,KAAA,CAAM,MAAM,CAAA,CAAA;AAE9C,IAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAClC,EAAA,EAAA;AACI,MAAA,IAAA,CAAK,KAAM,MAAS,GAAA,CAAA,GAAK,CAAC,CAAA,GAAI,MAAM,CAAC,CAAA,CAAA;AAAA,KACzC;AAEA,IAAO,OAAA,MAAA,CAAA;AAAA,GACX;AAAA,EAEO,OACP,GAAA;AACI,IAAA,IAAA,CAAK,QAAQ,OAAQ,EAAA,CAAA;AACrB,IAAA,IAAA,CAAK,OAAU,GAAA,IAAA,CAAA;AAEf,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AAAA,GAChB;AACJ;;;;"}