Files
nothoughts/node_modules/pixi.js/lib/rendering/renderers/gpu/BindGroupSystem.js
2025-08-04 18:57:35 +02:00

88 lines
2.7 KiB
JavaScript

'use strict';
var Extensions = require('../../../extensions/Extensions.js');
"use strict";
class BindGroupSystem {
constructor(renderer) {
this._hash = /* @__PURE__ */ Object.create(null);
this._renderer = renderer;
}
contextChange(gpu) {
this._gpu = gpu;
}
getBindGroup(bindGroup, program, groupIndex) {
bindGroup._updateKey();
const gpuBindGroup = this._hash[bindGroup._key] || this._createBindGroup(bindGroup, program, groupIndex);
return gpuBindGroup;
}
_createBindGroup(group, program, groupIndex) {
const device = this._gpu.device;
const groupLayout = program.layout[groupIndex];
const entries = [];
const renderer = this._renderer;
for (const j in groupLayout) {
const resource = group.resources[j] ?? group.resources[groupLayout[j]];
let gpuResource;
if (resource._resourceType === "uniformGroup") {
const uniformGroup = resource;
renderer.ubo.updateUniformGroup(uniformGroup);
const buffer = uniformGroup.buffer;
gpuResource = {
buffer: renderer.buffer.getGPUBuffer(buffer),
offset: 0,
size: buffer.descriptor.size
};
} else if (resource._resourceType === "buffer") {
const buffer = resource;
gpuResource = {
buffer: renderer.buffer.getGPUBuffer(buffer),
offset: 0,
size: buffer.descriptor.size
};
} else if (resource._resourceType === "bufferResource") {
const bufferResource = resource;
gpuResource = {
buffer: renderer.buffer.getGPUBuffer(bufferResource.buffer),
offset: bufferResource.offset,
size: bufferResource.size
};
} else if (resource._resourceType === "textureSampler") {
const sampler = resource;
gpuResource = renderer.texture.getGpuSampler(sampler);
} else if (resource._resourceType === "textureSource") {
const texture = resource;
gpuResource = renderer.texture.getGpuSource(texture).createView({});
}
entries.push({
binding: groupLayout[j],
resource: gpuResource
});
}
const layout = renderer.shader.getProgramData(program).bindGroups[groupIndex];
const gpuBindGroup = device.createBindGroup({
layout,
entries
});
this._hash[group._key] = gpuBindGroup;
return gpuBindGroup;
}
destroy() {
for (const key of Object.keys(this._hash)) {
this._hash[key] = null;
}
this._hash = null;
this._renderer = null;
}
}
/** @ignore */
BindGroupSystem.extension = {
type: [
Extensions.ExtensionType.WebGPUSystem
],
name: "bindGroup"
};
exports.BindGroupSystem = BindGroupSystem;
//# sourceMappingURL=BindGroupSystem.js.map