{"version":3,"file":"GpuShaderSystem.mjs","sources":["../../../../../src/rendering/renderers/gpu/shader/GpuShaderSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../../extensions/Extensions';\n\nimport type { GPU } from '../GpuDeviceSystem';\nimport type { GpuProgram } from './GpuProgram';\n\n/**\n * Data structure for GPU program layout.\n * Contains bind group layouts and pipeline layout.\n * @category rendering\n * @advanced\n */\nexport interface GPUProgramData\n{\n    bindGroups: GPUBindGroupLayout[]\n    pipeline: GPUPipelineLayout\n}\n\n/**\n * A system that manages the rendering of GpuPrograms.\n * @category rendering\n * @advanced\n */\nexport class GpuShaderSystem\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGPUSystem,\n        ],\n        name: 'shader',\n    } as const;\n\n    private _gpu: GPU;\n\n    private readonly _gpuProgramData: Record<number, GPUProgramData> = Object.create(null);\n\n    protected contextChange(gpu: GPU): void\n    {\n        this._gpu = gpu;\n    }\n\n    public getProgramData(program: GpuProgram)\n    {\n        return this._gpuProgramData[program._layoutKey] || this._createGPUProgramData(program);\n    }\n\n    private _createGPUProgramData(program: GpuProgram)\n    {\n        const device = this._gpu.device;\n\n        const bindGroups = program.gpuLayout.map((group) => device.createBindGroupLayout({ entries: group }));\n\n        const pipelineLayoutDesc = { bindGroupLayouts: bindGroups };\n\n        this._gpuProgramData[program._layoutKey] = {\n            bindGroups,\n            pipeline: device.createPipelineLayout(pipelineLayoutDesc),\n        };\n\n        // generally we avoid having to make this automatically\n        // keeping this for a reminder, if any issues popup\n        // program._gpuLayout = {\n        //     bindGroups: null,\n        //     pipeline: 'auto',\n        // };\n\n        return this._gpuProgramData[program._layoutKey];\n    }\n\n    public destroy(): void\n    {\n        // TODO destroy the _gpuProgramData\n        this._gpu = null;\n        (this._gpuProgramData as null) = null;\n    }\n}\n"],"names":[],"mappings":";;;AAsBO,MAAM,eAAA,CACb;AAAA,EADO,WAAA,GAAA;AAYH,IAAA,IAAA,CAAiB,eAAA,mBAAkD,MAAA,CAAO,MAAA,CAAO,IAAI,CAAA;AAAA,EAAA;AAAA,EAE3E,cAAc,GAAA,EACxB;AACI,IAAA,IAAA,CAAK,IAAA,GAAO,GAAA;AAAA,EAChB;AAAA,EAEO,eAAe,OAAA,EACtB;AACI,IAAA,OAAO,KAAK,eAAA,CAAgB,OAAA,CAAQ,UAAU,CAAA,IAAK,IAAA,CAAK,sBAAsB,OAAO,CAAA;AAAA,EACzF;AAAA,EAEQ,sBAAsB,OAAA,EAC9B;AACI,IAAA,MAAM,MAAA,GAAS,KAAK,IAAA,CAAK,MAAA;AAEzB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,SAAA,CAAU,GAAA,CAAI,CAAC,KAAA,KAAU,MAAA,CAAO,qBAAA,CAAsB,EAAE,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA;AAEpG,IAAA,MAAM,kBAAA,GAAqB,EAAE,gBAAA,EAAkB,UAAA,EAAW;AAE1D,IAAA,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,UAAU,CAAA,GAAI;AAAA,MACvC,UAAA;AAAA,MACA,QAAA,EAAU,MAAA,CAAO,oBAAA,CAAqB,kBAAkB;AAAA,KAC5D;AASA,IAAA,OAAO,IAAA,CAAK,eAAA,CAAgB,OAAA,CAAQ,UAAU,CAAA;AAAA,EAClD;AAAA,EAEO,OAAA,GACP;AAEI,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAC,KAAK,eAAA,GAA2B,IAAA;AAAA,EACrC;AACJ;AAAA;AArDa,eAAA,CAGK,SAAA,GAAY;AAAA,EACtB,IAAA,EAAM;AAAA,IACF,aAAA,CAAc;AAAA,GAClB;AAAA,EACA,IAAA,EAAM;AACV,CAAA;;;;"}