{"version":3,"file":"Shader.mjs","sources":["../../../../../src/rendering/renderers/shared/shader/Shader.ts"],"sourcesContent":["import EventEmitter from 'eventemitter3';\nimport { uid } from '../../../../utils/data/uid';\nimport { GlProgram } from '../../gl/shader/GlProgram';\nimport { BindGroup } from '../../gpu/shader/BindGroup';\nimport { GpuProgram } from '../../gpu/shader/GpuProgram';\nimport { RendererType } from '../../types';\nimport { UniformGroup } from './UniformGroup';\n\nimport type { GlProgramOptions } from '../../gl/shader/GlProgram';\nimport type { BindResource } from '../../gpu/shader/BindResource';\nimport type { GpuProgramOptions } from '../../gpu/shader/GpuProgram';\n\n/**\n * A record of {@link BindGroup}'s used by the shader.\n *\n * `Record<number, BindGroup>`\n * @category rendering\n * @advanced\n */\nexport type ShaderGroups = Record<number, BindGroup>;\n\ninterface ShaderBase\n{\n    /** The WebGL program used by the WebGL renderer. */\n    glProgram?: GlProgram\n    /** The WebGPU program used by the WebGPU renderer. */\n    gpuProgram?: GpuProgram\n    /**\n     * A number that uses two bits on whether the shader is compatible with the WebGL renderer and/or the WebGPU renderer.\n     * 0b00 - not compatible with either\n     * 0b01 - compatible with WebGL\n     * 0b10 - compatible with WebGPU\n     * This is automatically set based on if a {@link GlProgram} or {@link GpuProgram} is provided.\n     */\n    compatibleRenderers?: number\n}\n\n/**\n * A base interface for shaders that includes the common properties.\n * @category rendering\n * @advanced\n */\nexport interface GlShaderWith extends ShaderBase\n{\n    /** The WebGL program used by the WebGL renderer. */\n    glProgram: GlProgram\n}\n\n/**\n * A base interface for shaders that includes the common properties.\n * @category rendering\n * @advanced\n */\nexport interface GpuShaderWith extends ShaderBase\n{\n    /** The WebGPU program used by the WebGPU renderer. */\n    gpuProgram: GpuProgram\n}\n\n/**\n * A descriptor for a shader with groups.\n * This is used to define a shader that uses {@link BindGroup}'s.\n * @category rendering\n * @advanced\n */\nexport interface ShaderWithGroupsDescriptor\n{\n    /** A record of {@link BindGroup}'s used by the shader. */\n    groups: ShaderGroups;\n    /** an optional map of how to bind the groups. This is automatically generated by reading the WebGPU program */\n    groupMap?: Record<string, Record<string, any>>;\n}\n\ninterface ShaderWithResourcesDescriptor\n{\n    /**\n     * A key value of uniform resources used by the shader.\n     * Under the hood pixi will look at the provided shaders and figure out where\n     * the resources are mapped. Its up to you to make sure the resource key\n     * matches the uniform name in the webGPU program. WebGL is a little more forgiving!\n     */\n    resources?: Record<string, any>;\n}\n\ninterface GroupsData\n{\n    group: number\n    binding: number\n    name: string\n}\n\n/**\n * A descriptor for a shader\n * @category rendering\n * @advanced\n */\nexport type ShaderWith = GlShaderWith | GpuShaderWith;\n\n/**\n * A descriptor for a shader with groups.\n * @category rendering\n * @advanced\n */\nexport type ShaderWithGroups = ShaderWithGroupsDescriptor & ShaderWith;\n\n/**\n * A descriptor for a shader with resources. This is an easier way to work with uniforms.\n * especially when you are not working with bind groups\n * @category rendering\n * @advanced\n */\nexport type ShaderWithResources = ShaderWithResourcesDescriptor & ShaderWith;\n/**\n * A shader that can be used with both WebGL and WebGPU.\n * @category rendering\n * @advanced\n */\nexport interface IShaderWithResources extends ShaderWithResourcesDescriptor, ShaderBase {}\n\n/**\n * A descriptor for a shader that can be used with both WebGL and WebGPU.\n * @category rendering\n * @advanced\n */\nexport type ShaderDescriptor = ShaderWithGroups & ShaderWithResources;\n\n/**\n * A descriptor for a shader with resources and groups.\n * @category rendering\n */\ntype GlShaderFromWith = {\n    gpu?: GpuProgramOptions,\n    gl: GlProgramOptions\n};\n/**\n * A descriptor for a shader with groups and resources.\n * @category rendering\n */\ntype GpuShaderFromWith = {\n    gpu: GpuProgramOptions,\n    gl?: GlProgramOptions\n};\n/**\n * A descriptor for a shader that can be used with both WebGL and WebGPU.\n * @category rendering\n * @advanced\n */\nexport type ShaderFromGroups = (GlShaderFromWith | GpuShaderFromWith) & Omit<ShaderWithGroups, 'glProgram' | 'gpuProgram'>;\n/**\n * A descriptor for a shader that can be used with both WebGL and WebGPU.\n * @category rendering\n * @advanced\n */\nexport type ShaderFromResources = (GlShaderFromWith | GpuShaderFromWith)\n& Omit<ShaderWithResources, 'glProgram' | 'gpuProgram'>;\n\n/**\n * The Shader class is an integral part of the PixiJS graphics pipeline.\n * Central to rendering in PixiJS are two key elements: A [shader] and a [geometry].\n * The shader incorporates a {@link GlProgram} for WebGL or a {@link GpuProgram} for WebGPU,\n * instructing the respective technology on how to render the geometry.\n *\n * The primary goal of the Shader class is to offer a unified interface compatible with both WebGL and WebGPU.\n * When constructing a shader, you need to provide both a WebGL program and a WebGPU program due to the distinctions\n * between the two rendering engines. If only one is provided, the shader won't function with the omitted renderer.\n *\n * Both WebGL and WebGPU utilize the same resource object when passed into the shader.\n * Post-creation, the shader's interface remains consistent across both WebGL and WebGPU.\n * The sole distinction lies in whether a glProgram or a gpuProgram is employed.\n *\n * Modifying shader uniforms, which can encompass:\n *  - TextureSampler {@link TextureStyle}\n *  - TextureSource {@link TextureSource}\n *  - UniformsGroups {@link UniformGroup}\n * @example\n *\n * const shader = new Shader({\n *     glProgram: glProgram,\n *     gpuProgram: gpuProgram,\n *     resources: {\n *         uTexture: texture.source,\n *         uSampler: texture.sampler,\n *         uColor: [1, 0, 0, 1],\n *     },\n * });\n *\n * // update the uniforms\n * shader.resources.uColor[1] = 1;\n * shader.resources.uTexture = texture2.source;\n * @class\n * @category rendering\n * @advanced\n */\nexport class Shader extends EventEmitter<{'destroy': Shader}>\n{\n    /** A unique identifier for the shader */\n    public readonly uid: number = uid('shader');\n    /** An instance of the GPU program used by the WebGPU renderer */\n    public gpuProgram: GpuProgram;\n    /** An instance of the GL program used by the WebGL renderer */\n    public glProgram: GlProgram;\n    /**\n     * A number that uses two bits on whether the shader is compatible with the WebGL renderer and/or the WebGPU renderer.\n     * 0b00 - not compatible with either\n     * 0b01 - compatible with WebGL\n     * 0b10 - compatible with WebGPU\n     * This is automatically set based on if a {@link GlProgram} or {@link GpuProgram} is provided.\n     */\n    public readonly compatibleRenderers: number;\n    /** */\n    public groups: Record<number, BindGroup>;\n    /** A record of the resources used by the shader. */\n    public resources: Record<string, any>;\n    /**\n     * A record of the uniform groups and resources used by the shader.\n     * This is used by WebGL renderer to sync uniform data.\n     * @internal\n     */\n    public _uniformBindMap: Record<number, Record<number, string>> = Object.create(null);\n    private readonly _ownedBindGroups: BindGroup[] = [];\n\n    /** @internal */\n    public _destroyed: boolean = false;\n\n    /**\n     * Fired after rendering finishes.\n     * @event Shader#destroy\n     */\n\n    /**\n     * There are two ways to create a shader.\n     * one is to pass in resources which is a record of uniform groups and resources.\n     * another is to pass in groups which is a record of {@link BindGroup}s.\n     * this second method is really to make use of shared {@link BindGroup}s.\n     * For most cases you will want to use resources as they are easier to work with.\n     * USe Groups if you want to share {@link BindGroup}s between shaders.\n     * you cannot mix and match - either use resources or groups.\n     * @param options - The options for the shader\n     */\n    constructor(options: ShaderWithResources);\n    constructor(options: ShaderWithGroups);\n    constructor(options: ShaderDescriptor)\n    {\n        super();\n\n        /* eslint-disable prefer-const */\n        let {\n            gpuProgram,\n            glProgram,\n            groups,\n            resources,\n            compatibleRenderers,\n            groupMap\n        } = options;\n        /* eslint-enable prefer-const */\n\n        this.gpuProgram = gpuProgram;\n        this.glProgram = glProgram;\n\n        if (compatibleRenderers === undefined)\n        {\n            compatibleRenderers = 0;\n\n            if (gpuProgram)compatibleRenderers |= RendererType.WEBGPU;\n            if (glProgram)compatibleRenderers |= RendererType.WEBGL;\n        }\n\n        this.compatibleRenderers = compatibleRenderers;\n\n        const nameHash: Record<string, GroupsData> = {};\n\n        if (!resources && !groups)\n        {\n            resources = {};\n        }\n\n        if (resources && groups)\n        {\n            throw new Error('[Shader] Cannot have both resources and groups');\n        }\n        else if (!gpuProgram && groups && !groupMap)\n        {\n            throw new Error('[Shader] No group map or WebGPU shader provided - consider using resources instead.');\n        }\n        else if (!gpuProgram && groups && groupMap)\n        {\n            for (const i in groupMap)\n            {\n                for (const j in groupMap[i])\n                {\n                    const uniformName = groupMap[i][j];\n\n                    nameHash[uniformName] = {\n                        group: i as unknown as number,\n                        binding: j as unknown as number,\n                        name: uniformName\n                    };\n                }\n            }\n        }\n        else if (gpuProgram && groups && !groupMap)\n        {\n            const groupData = gpuProgram.structsAndGroups.groups;\n\n            groupMap = {};\n\n            groupData.forEach((data) =>\n            {\n                groupMap[data.group] = groupMap[data.group] || {};\n                groupMap[data.group][data.binding] = data.name;\n\n                nameHash[data.name] = data;\n            });\n        }\n        else if (resources)\n        {\n            groups = {};\n            groupMap = {};\n\n            if (gpuProgram)\n            {\n                const groupData = gpuProgram.structsAndGroups.groups;\n\n                groupData.forEach((data) =>\n                {\n                    groupMap[data.group] = groupMap[data.group] || {};\n                    groupMap[data.group][data.binding] = data.name;\n\n                    nameHash[data.name] = data;\n                });\n            }\n\n            let bindTick = 0;\n\n            for (const i in resources)\n            {\n                if (nameHash[i]) continue;\n\n                // build out a dummy bind group..\n                if (!groups[99])\n                {\n                    groups[99] = new BindGroup();\n                    this._ownedBindGroups.push(groups[99]);\n                }\n                // Yes i know this is a little strange, but wil line up the shaders neatly\n                // basically we want to be driven by how webGPU does things.\n                // so making a fake group will work and not affect gpu as it means no gpu shader was provided..\n                nameHash[i] = { group: 99, binding: bindTick, name: i };\n\n                groupMap[99] = groupMap[99] || {};\n                groupMap[99][bindTick] = i;\n\n                bindTick++;\n            }\n\n            for (const i in resources)\n            {\n                const name = i;\n                let value = resources[i];\n\n                if (!(value.source) && !(value as BindResource)._resourceType)\n                {\n                    value = new UniformGroup(value);\n                }\n\n                const data = nameHash[name];\n\n                if (data)\n                {\n                    if (!groups[data.group])\n                    {\n                        groups[data.group] = new BindGroup();\n\n                        this._ownedBindGroups.push(groups[data.group]);\n                    }\n\n                    groups[data.group].setResource(value, data.binding);\n                }\n            }\n        }\n\n        this.groups = groups;\n        this._uniformBindMap = groupMap;\n\n        this.resources = this._buildResourceAccessor(groups, nameHash);\n    }\n\n    /**\n     * Sometimes a resource group will be provided later (for example global uniforms)\n     * In such cases, this method can be used to let the shader know about the group.\n     * @param name - the name of the resource group\n     * @param groupIndex - the index of the group (should match the webGPU shader group location)\n     * @param bindIndex - the index of the bind point (should match the webGPU shader bind point)\n     */\n    public addResource(name: string, groupIndex: number, bindIndex: number): void\n    {\n        this._uniformBindMap[groupIndex] ||= {};\n\n        this._uniformBindMap[groupIndex][bindIndex] ||= name;\n\n        if (!this.groups[groupIndex])\n        {\n            this.groups[groupIndex] = new BindGroup();\n            this._ownedBindGroups.push(this.groups[groupIndex]);\n        }\n    }\n\n    private _buildResourceAccessor(groups: ShaderGroups, nameHash: Record<string, GroupsData>)\n    {\n        const uniformsOut = {};\n\n        for (const i in nameHash)\n        {\n            const data = nameHash[i];\n\n            // add getter setter for uniforms\n            Object.defineProperty(uniformsOut, data.name, {\n                get()\n                {\n                    return groups[data.group].getResource(data.binding);\n                },\n                set(value)\n                {\n                    groups[data.group].setResource(value, data.binding);\n                }\n            });\n        }\n\n        return uniformsOut;\n    }\n\n    /**\n     * Use to destroy the shader when its not longer needed.\n     * It will destroy the resources and remove listeners.\n     * @param destroyPrograms - if the programs should be destroyed as well.\n     * Make sure its not being used by other shaders!\n     */\n    public destroy(destroyPrograms = false): void\n    {\n        if (this._destroyed) return;\n        this._destroyed = true;\n\n        this.emit('destroy', this);\n\n        if (destroyPrograms)\n        {\n            this.gpuProgram?.destroy();\n            this.glProgram?.destroy();\n        }\n\n        this.gpuProgram = null;\n        this.glProgram = null;\n\n        this.removeAllListeners();\n\n        this._uniformBindMap = null;\n\n        this._ownedBindGroups.forEach((bindGroup) =>\n        {\n            bindGroup.destroy();\n        });\n\n        (this._ownedBindGroups as null) = null;\n\n        this.resources = null;\n        this.groups = null;\n    }\n\n    /**\n     * A short hand function to create a shader based of a vertex and fragment shader.\n     * @param options\n     * @returns A shiny new PixiJS shader!\n     */\n    public static from(options: ShaderFromGroups): Shader;\n    public static from(options: ShaderFromResources): Shader;\n    public static from(options: ShaderFromGroups & ShaderFromResources): Shader\n    {\n        const { gpu, gl, ...rest } = options;\n\n        let gpuProgram: GpuProgram;\n        let glProgram: GlProgram;\n\n        if (gpu)\n        {\n            gpuProgram = GpuProgram.from(gpu);\n        }\n\n        if (gl)\n        {\n            glProgram = GlProgram.from(gl);\n        }\n\n        return new Shader({\n            gpuProgram,\n            glProgram,\n            ...rest\n        });\n    }\n}\n"],"names":[],"mappings":"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"}