UNPKG

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 20.9 kB
{"version":3,"file":"GpuRenderTargetAdaptor.mjs","sources":["../../../../../src/rendering/renderers/gpu/renderTarget/GpuRenderTargetAdaptor.ts"],"sourcesContent":["import { CLEAR } from '../../gl/const';\nimport { CanvasSource } from '../../shared/texture/sources/CanvasSource';\nimport { TextureSource } from '../../shared/texture/sources/TextureSource';\nimport { GpuRenderTarget } from './GpuRenderTarget';\n\nimport type { RgbaArray } from '../../../../color/Color';\nimport type { Rectangle } from '../../../../maths/shapes/Rectangle';\nimport type { CLEAR_OR_BOOL } from '../../gl/const';\nimport type { RenderTarget } from '../../shared/renderTarget/RenderTarget';\nimport type { RenderTargetAdaptor, RenderTargetSystem } from '../../shared/renderTarget/RenderTargetSystem';\nimport type { Texture } from '../../shared/texture/Texture';\nimport type { WebGPURenderer } from '../WebGPURenderer';\n\n/**\n * The WebGPU adaptor for the render target system. Allows the Render Target System to\n * be used with the WebGPU renderer\n * @category rendering\n * @ignore\n */\nexport class GpuRenderTargetAdaptor implements RenderTargetAdaptor<GpuRenderTarget>\n{\n private _renderTargetSystem: RenderTargetSystem<GpuRenderTarget>;\n private _renderer: WebGPURenderer<HTMLCanvasElement>;\n\n public init(renderer: WebGPURenderer, renderTargetSystem: RenderTargetSystem<GpuRenderTarget>): void\n {\n this._renderer = renderer;\n this._renderTargetSystem = renderTargetSystem;\n }\n\n public copyToTexture(\n sourceRenderSurfaceTexture: RenderTarget,\n destinationTexture: Texture,\n originSrc: { x: number; y: number; },\n size: { width: number; height: number; },\n originDest: { x: number; y: number; },\n )\n {\n const renderer = this._renderer;\n\n const baseGpuTexture = this._getGpuColorTexture(\n sourceRenderSurfaceTexture\n );\n\n const backGpuTexture = renderer.texture.getGpuSource(\n destinationTexture.source\n );\n\n renderer.encoder.commandEncoder.copyTextureToTexture(\n {\n texture: baseGpuTexture,\n origin: originSrc,\n },\n {\n texture: backGpuTexture,\n origin: originDest,\n },\n size\n );\n\n return destinationTexture;\n }\n\n public startRenderPass(\n renderTarget: RenderTarget,\n clear: CLEAR_OR_BOOL = true,\n clearColor?: RgbaArray,\n viewport?: Rectangle,\n mipLevel = 0,\n layer = 0\n )\n {\n const renderTargetSystem = this._renderTargetSystem;\n\n const gpuRenderTarget = renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n if (layer !== 0 && gpuRenderTarget.msaaTextures?.length)\n {\n throw new Error('[RenderTargetSystem] Rendering to array layers is not supported with MSAA render targets.');\n }\n\n if (mipLevel > 0 && gpuRenderTarget.msaaTextures?.length)\n {\n throw new Error('[RenderTargetSystem] Rendering to mip levels is not supported with MSAA render targets.');\n }\n\n const descriptor = this.getDescriptor(renderTarget, clear, clearColor, mipLevel, layer);\n\n gpuRenderTarget.descriptor = descriptor;\n\n // TODO we should not finish a render pass each time we bind\n // for example filters - we would want to push / pop render targets\n this._renderer.pipeline.setRenderTarget(gpuRenderTarget);\n this._renderer.encoder.beginRenderPass(gpuRenderTarget);\n this._renderer.encoder.setViewport(viewport);\n }\n\n public finishRenderPass()\n {\n this._renderer.encoder.endRenderPass();\n }\n\n /**\n * returns the gpu texture for the first color texture in the render target\n * mainly used by the filter manager to get copy the texture for blending\n * @param renderTarget\n * @returns a gpu texture\n */\n private _getGpuColorTexture(renderTarget: RenderTarget): GPUTexture\n {\n const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n if (gpuRenderTarget.contexts[0])\n {\n return gpuRenderTarget.contexts[0].getCurrentTexture();\n }\n\n return this._renderer.texture.getGpuSource(\n renderTarget.colorTextures[0].source\n );\n }\n\n public getDescriptor(\n renderTarget: RenderTarget,\n clear: CLEAR_OR_BOOL,\n clearValue: RgbaArray,\n mipLevel = 0,\n layer = 0\n ): GPURenderPassDescriptor\n {\n if (typeof clear === 'boolean')\n {\n clear = clear ? CLEAR.ALL : CLEAR.NONE;\n }\n\n const renderTargetSystem = this._renderTargetSystem;\n\n const gpuRenderTarget = renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n const colorAttachments = renderTarget.colorTextures.map(\n (texture, i) =>\n {\n const context = gpuRenderTarget.contexts[i];\n\n let view: GPUTextureView;\n let resolveTarget: GPUTextureView;\n\n if (context)\n {\n if (layer !== 0)\n {\n // eslint-disable-next-line max-len\n throw new Error('[RenderTargetSystem] Rendering to array layers is not supported for canvas targets.');\n }\n\n const currentTexture = context.getCurrentTexture();\n\n const canvasTextureView = currentTexture.createView();\n\n view = canvasTextureView;\n }\n else\n {\n view = this._renderer.texture.getGpuSource(texture).createView({\n // Render attachments must be 2d views; for array/cube textures we select a single layer.\n dimension: '2d',\n baseMipLevel: mipLevel,\n mipLevelCount: 1,\n baseArrayLayer: layer,\n arrayLayerCount: 1,\n });\n }\n\n if (gpuRenderTarget.msaaTextures[i])\n {\n resolveTarget = view;\n view = this._renderer.texture.getTextureView(\n gpuRenderTarget.msaaTextures[i]\n );\n }\n\n const loadOp = ((clear as CLEAR) & CLEAR.COLOR ? 'clear' : 'load') as GPULoadOp;\n\n clearValue ??= renderTargetSystem.defaultClearColor;\n\n return {\n view,\n resolveTarget,\n clearValue,\n storeOp: 'store',\n loadOp\n };\n }\n ) as GPURenderPassColorAttachment[];\n\n let depthStencilAttachment: GPURenderPassDepthStencilAttachment;\n\n // if we have a depth or stencil buffer, we need to ensure we have a texture for it\n // this is WebGPU specific - as WebGL does not require textures to run a depth / stencil buffer\n if ((renderTarget.stencil || renderTarget.depth) && !renderTarget.depthStencilTexture)\n {\n renderTarget.ensureDepthStencilTexture();\n renderTarget.depthStencilTexture.source.sampleCount = gpuRenderTarget.msaa ? 4 : 1;\n }\n\n if (renderTarget.depthStencilTexture)\n {\n const stencilLoadOp = (clear & CLEAR.STENCIL ? 'clear' : 'load') as GPULoadOp;\n const depthLoadOp = (clear & CLEAR.DEPTH ? 'clear' : 'load') as GPULoadOp;\n\n depthStencilAttachment = {\n view: this._renderer.texture\n .getGpuSource(renderTarget.depthStencilTexture.source)\n .createView({\n dimension: '2d',\n baseMipLevel: mipLevel,\n mipLevelCount: 1,\n baseArrayLayer: layer,\n arrayLayerCount: 1,\n }),\n stencilStoreOp: 'store',\n stencilLoadOp,\n depthClearValue: 1.0,\n depthLoadOp,\n depthStoreOp: 'store',\n };\n }\n\n const descriptor: GPURenderPassDescriptor = {\n colorAttachments,\n depthStencilAttachment,\n };\n\n return descriptor;\n }\n\n public clear(\n renderTarget: RenderTarget,\n clear: CLEAR_OR_BOOL = true,\n clearColor?: RgbaArray,\n viewport?: Rectangle,\n mipLevel = 0,\n layer = 0\n )\n {\n if (!clear) return;\n\n const { gpu, encoder } = this._renderer;\n\n const device = gpu.device;\n\n const standAlone = encoder.commandEncoder === null;\n\n if (standAlone)\n {\n const commandEncoder = device.createCommandEncoder();\n const renderPassDescriptor = this.getDescriptor(renderTarget, clear, clearColor, mipLevel, layer);\n\n const passEncoder = commandEncoder.beginRenderPass(renderPassDescriptor);\n\n passEncoder.setViewport(viewport.x, viewport.y, viewport.width, viewport.height, 0, 1);\n\n passEncoder.end();\n\n const gpuCommands = commandEncoder.finish();\n\n device.queue.submit([gpuCommands]);\n }\n else\n {\n this.startRenderPass(renderTarget, clear, clearColor, viewport, mipLevel, layer);\n }\n }\n\n public initGpuRenderTarget(renderTarget: RenderTarget): GpuRenderTarget\n {\n // always true for WebGPU\n renderTarget.isRoot = true;\n\n const gpuRenderTarget = new GpuRenderTarget();\n\n gpuRenderTarget.colorTargetCount = renderTarget.colorTextures.length;\n\n // create a context...\n // is a canvas...\n renderTarget.colorTextures.forEach((colorTexture, i) =>\n {\n if (colorTexture instanceof CanvasSource)\n {\n const context = colorTexture.resource.getContext(\n 'webgpu'\n ) as unknown as GPUCanvasContext;\n\n const alphaMode = (colorTexture as CanvasSource).transparent ? 'premultiplied' : 'opaque';\n\n try\n {\n context.configure({\n device: this._renderer.gpu.device,\n usage: GPUTextureUsage.TEXTURE_BINDING\n | GPUTextureUsage.COPY_DST\n | GPUTextureUsage.RENDER_ATTACHMENT\n | GPUTextureUsage.COPY_SRC,\n format: 'bgra8unorm',\n alphaMode,\n });\n }\n catch (e)\n {\n console.error(e);\n }\n\n gpuRenderTarget.contexts[i] = context;\n }\n\n gpuRenderTarget.msaa = colorTexture.source.antialias;\n\n if (colorTexture.source.antialias)\n {\n const msaaTexture = new TextureSource({\n width: 0,\n height: 0,\n sampleCount: 4,\n arrayLayerCount: colorTexture.source.arrayLayerCount,\n });\n\n gpuRenderTarget.msaaTextures[i] = msaaTexture;\n }\n });\n\n if (gpuRenderTarget.msaa)\n {\n gpuRenderTarget.msaaSamples = 4;\n\n if (renderTarget.depthStencilTexture)\n {\n renderTarget.depthStencilTexture.source.sampleCount = 4;\n }\n }\n\n return gpuRenderTarget;\n }\n\n public destroyGpuRenderTarget(gpuRenderTarget: GpuRenderTarget)\n {\n gpuRenderTarget.contexts.forEach((context) =>\n {\n context.unconfigure();\n });\n\n gpuRenderTarget.msaaTextures.forEach((texture) =>\n {\n texture.destroy();\n });\n\n gpuRenderTarget.msaaTextures.length = 0;\n gpuRenderTarget.contexts.length = 0;\n }\n\n public ensureDepthStencilTexture(renderTarget: RenderTarget)\n {\n // TODO This function will be more useful once we cache the descriptors\n const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n if (renderTarget.depthStencilTexture && gpuRenderTarget.msaa)\n {\n renderTarget.depthStencilTexture.source.sampleCount = 4;\n }\n }\n\n public resizeGpuRenderTarget(renderTarget: RenderTarget)\n {\n const gpuRenderTarget = this._renderTargetSystem.getGpuRenderTarget(renderTarget);\n\n gpuRenderTarget.width = renderTarget.width;\n gpuRenderTarget.height = renderTarget.height;\n\n if (gpuRenderTarget.msaa)\n {\n renderTarget.colorTextures.forEach((colorTexture, i) =>\n {\n const msaaTexture = gpuRenderTarget.msaaTextures[i];\n\n msaaTexture?.resize(\n colorTexture.source.width,\n colorTexture.source.height,\n colorTexture.source._resolution\n );\n });\n }\n }\n}\n"],"names":[],"mappings":"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"}