pixi.js
Version:
<p align="center"> <a href="https://pixijs.com" target="_blank" rel="noopener noreferrer"> <img height="150" src="https://files.pixijs.download/branding/pixijs-logo-transparent-dark.svg?v=1" alt="PixiJS logo"> </a> </p> <br/> <p align="center">
1 lines • 21.7 kB
Source Map (JSON)
{"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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"}