{"version":3,"file":"GpuShaderSystem.mjs","sources":["../../../../../src/rendering/renderers/gpu/shader/GpuShaderSystem.ts"],"sourcesContent":["import { ExtensionType } from '../../../../extensions/Extensions';\n\nimport type { ShaderSystem } from '../../shared/shader/ShaderSystem';\nimport type { GPU } from '../GpuDeviceSystem';\nimport type { GpuProgram } from './GpuProgram';\n\nexport interface GPUProgramData\n{\n    bindGroups: GPUBindGroupLayout[]\n    pipeline: GPUPipelineLayout\n}\n\n/**\n * A system that manages the rendering of GpuPrograms.\n * @memberof rendering\n */\nexport class GpuShaderSystem implements ShaderSystem\n{\n    /** @ignore */\n    public static extension = {\n        type: [\n            ExtensionType.WebGPUSystem,\n        ],\n        name: 'shader',\n    } as const;\n\n    public maxTextures: number;\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        this.maxTextures = gpu.device.limits.maxSampledTexturesPerShaderStage;\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":";;;AAgBO,MAAM,eACb,CAAA;AAAA,EADO,WAAA,GAAA;AAcH,IAAiB,IAAA,CAAA,eAAA,mBAAyD,MAAA,CAAA,MAAA,CAAO,IAAI,CAAA,CAAA;AAAA,GAAA;AAAA,EAE3E,cAAc,GACxB,EAAA;AACI,IAAA,IAAA,CAAK,IAAO,GAAA,GAAA,CAAA;AAEZ,IAAK,IAAA,CAAA,WAAA,GAAc,GAAI,CAAA,MAAA,CAAO,MAAO,CAAA,gCAAA,CAAA;AAAA,GACzC;AAAA,EAEO,eAAe,OACtB,EAAA;AACI,IAAA,OAAO,KAAK,eAAgB,CAAA,OAAA,CAAQ,UAAU,CAAK,IAAA,IAAA,CAAK,sBAAsB,OAAO,CAAA,CAAA;AAAA,GACzF;AAAA,EAEQ,sBAAsB,OAC9B,EAAA;AACI,IAAM,MAAA,MAAA,GAAS,KAAK,IAAK,CAAA,MAAA,CAAA;AAEzB,IAAA,MAAM,UAAa,GAAA,OAAA,CAAQ,SAAU,CAAA,GAAA,CAAI,CAAC,KAAA,KAAU,MAAO,CAAA,qBAAA,CAAsB,EAAE,OAAA,EAAS,KAAM,EAAC,CAAC,CAAA,CAAA;AAEpG,IAAM,MAAA,kBAAA,GAAqB,EAAE,gBAAA,EAAkB,UAAW,EAAA,CAAA;AAE1D,IAAK,IAAA,CAAA,eAAA,CAAgB,OAAQ,CAAA,UAAU,CAAI,GAAA;AAAA,MACvC,UAAA;AAAA,MACA,QAAA,EAAU,MAAO,CAAA,oBAAA,CAAqB,kBAAkB,CAAA;AAAA,KAC5D,CAAA;AASA,IAAO,OAAA,IAAA,CAAK,eAAgB,CAAA,OAAA,CAAQ,UAAU,CAAA,CAAA;AAAA,GAClD;AAAA,EAEO,OACP,GAAA;AAEI,IAAA,IAAA,CAAK,IAAO,GAAA,IAAA,CAAA;AACZ,IAAC,KAAK,eAA2B,GAAA,IAAA,CAAA;AAAA,GACrC;AACJ,CAAA;AAAA;AAzDa,eAAA,CAGK,SAAY,GAAA;AAAA,EACtB,IAAM,EAAA;AAAA,IACF,aAAc,CAAA,YAAA;AAAA,GAClB;AAAA,EACA,IAAM,EAAA,QAAA;AACV,CAAA;;;;"}