{"version":3,"file":"BindGroupSystem.mjs","sources":["../../../../src/rendering/renderers/gpu/BindGroupSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../extensions/Extensions';\n\nimport type { Buffer } from '../shared/buffer/Buffer';\nimport type { BufferResource } from '../shared/buffer/BufferResource';\nimport type { UniformGroup } from '../shared/shader/UniformGroup';\nimport type { System } from '../shared/system/System';\nimport type { TextureSource } from '../shared/texture/sources/TextureSource';\nimport type { TextureStyle } from '../shared/texture/TextureStyle';\nimport type { GPU } from './GpuDeviceSystem';\nimport type { BindGroup } from './shader/BindGroup';\nimport type { BindResource } from './shader/BindResource';\nimport type { GpuProgram } from './shader/GpuProgram';\nimport type { WebGPURenderer } from './WebGPURenderer';\n\n/**\n * This manages the WebGPU bind groups. this is how data is bound to a shader when rendering\n * @memberof rendering\n */\nexport class BindGroupSystem implements System\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGPUSystem,\n        ],\n        name: 'bindGroup',\n    } as const;\n\n    private readonly _renderer: WebGPURenderer;\n\n    private _hash: Record<string, GPUBindGroup> = Object.create(null);\n    private _gpu: GPU;\n\n    constructor(renderer: WebGPURenderer)\n    {\n        this._renderer = renderer;\n    }\n\n    protected contextChange(gpu: GPU): void\n    {\n        this._gpu = gpu;\n    }\n\n    public getBindGroup(bindGroup: BindGroup, program: GpuProgram, groupIndex: number): GPUBindGroup\n    {\n        bindGroup._updateKey();\n\n        const gpuBindGroup = this._hash[bindGroup._key] || this._createBindGroup(bindGroup, program, groupIndex);\n\n        return gpuBindGroup;\n    }\n\n    private _createBindGroup(group: BindGroup, program: GpuProgram, groupIndex: number): GPUBindGroup\n    {\n        const device = this._gpu.device;\n        const groupLayout = program.layout[groupIndex];\n        const entries: GPUBindGroupEntry[] = [];\n        const renderer = this._renderer;\n\n        for (const j in groupLayout)\n        {\n            const resource: BindResource = group.resources[j] ?? group.resources[groupLayout[j]];\n            let gpuResource: GPUSampler | GPUTextureView | GPUExternalTexture | GPUBufferBinding;\n            // TODO make this dynamic..\n\n            if (resource._resourceType === 'uniformGroup')\n            {\n                const uniformGroup = resource as UniformGroup;\n\n                renderer.ubo.updateUniformGroup(uniformGroup as UniformGroup);\n\n                const buffer = uniformGroup.buffer;\n\n                gpuResource = {\n                    buffer: renderer.buffer.getGPUBuffer(buffer),\n                    offset: 0,\n                    size: buffer.descriptor.size,\n                };\n            }\n            else if (resource._resourceType === 'buffer')\n            {\n                const buffer = resource as Buffer;\n\n                gpuResource = {\n                    buffer: renderer.buffer.getGPUBuffer(buffer),\n                    offset: 0,\n                    size: buffer.descriptor.size,\n                };\n            }\n            else if (resource._resourceType === 'bufferResource')\n            {\n                const bufferResource = resource as BufferResource;\n\n                gpuResource = {\n                    buffer: renderer.buffer.getGPUBuffer(bufferResource.buffer),\n                    offset: bufferResource.offset,\n                    size: bufferResource.size,\n                };\n            }\n            else if (resource._resourceType === 'textureSampler')\n            {\n                const sampler = resource as TextureStyle;\n\n                gpuResource = renderer.texture.getGpuSampler(sampler);\n            }\n            else if (resource._resourceType === 'textureSource')\n            {\n                const texture = resource as TextureSource;\n\n                gpuResource = renderer.texture.getGpuSource(texture).createView({\n\n                });\n            }\n\n            entries.push({\n                binding: groupLayout[j],\n                resource: gpuResource,\n            });\n        }\n\n        const layout = renderer.shader.getProgramData(program).bindGroups[groupIndex];\n\n        const gpuBindGroup = device.createBindGroup({\n            layout,\n            entries,\n        });\n\n        this._hash[group._key] = gpuBindGroup;\n\n        return gpuBindGroup;\n    }\n\n    public destroy(): void\n    {\n        for (const key of Object.keys(this._hash))\n        {\n            this._hash[key] = null;\n        }\n\n        this._hash = null;\n\n        (this._renderer as null) = null;\n    }\n}\n"],"names":[],"mappings":"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"}