88 lines
2.7 KiB
JavaScript
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
|