{"version":3,"file":"Shader.mjs","sources":["../../../../../src/rendering/renderers/shared/shader/Shader.ts"],"sourcesContent":["/* eslint-disable no-new */\nimport EventEmitter from 'eventemitter3';\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 * @memberof rendering\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\nexport interface GlShaderWith extends ShaderBase\n{\n    /** The WebGL program used by the WebGL renderer. */\n    glProgram: GlProgram\n}\n\nexport interface GpuShaderWith extends ShaderBase\n{\n    /** The WebGPU program used by the WebGPU renderer. */\n    gpuProgram: GpuProgram\n}\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 * @memberof rendering\n */\nexport type ShaderWith = GlShaderWith | GpuShaderWith;\n\n/**\n * A descriptor for a shader with groups.\n * @memberof rendering\n */\nexport type ShaderWithGroups = ShaderWithGroupsDescriptor & ShaderWith;\nexport interface IShaderWithGroups extends ShaderWithGroupsDescriptor, ShaderBase {}\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 * @memberof rendering\n */\nexport type ShaderWithResources = ShaderWithResourcesDescriptor & ShaderWith;\nexport interface IShaderWithResources extends ShaderWithResourcesDescriptor, ShaderBase {}\n\nexport type ShaderDescriptor = ShaderWithGroups & ShaderWithResources;\n\ntype GlShaderFromWith = {\n    gpu?: GpuProgramOptions,\n    gl: GlProgramOptions\n};\ntype GpuShaderFromWith = {\n    gpu: GpuProgramOptions,\n    gl?: GlProgramOptions\n};\nexport type ShaderFromGroups = (GlShaderFromWith | GpuShaderFromWith) & Omit<ShaderWithGroups, 'glProgram' | 'gpuProgram'>;\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 * @memberof rendering\n */\nexport class Shader extends EventEmitter<{'destroy': Shader}>\n{\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     * @ignore\n     */\n    public _uniformBindMap: Record<number, Record<number, string>> = Object.create(null);\n    private readonly _ownedBindGroups: BindGroup[] = [];\n\n    /**\n     * Fired after rendering finishes.\n     * @event rendering.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 {ShaderWithResourcesDescriptor} options - The options for the shader using ShaderWithResourcesDescriptor.\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        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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"}