1 | {"version":3,"file":"FramebufferSystem.js","sources":["../../src/framebuffer/FramebufferSystem.ts"],"sourcesContent":["import { BUFFER_BITS, ENV, MSAA_QUALITY } from '@pixi/constants';\nimport { extensions, ExtensionType } from '@pixi/extensions';\nimport { Rectangle } from '@pixi/math';\nimport { settings } from '@pixi/settings';\nimport { Framebuffer } from './Framebuffer';\nimport { GLFramebuffer } from './GLFramebuffer';\n\nimport type { ExtensionMetadata } from '@pixi/extensions';\nimport type { IRenderingContext } from '../IRenderer';\nimport type { Renderer } from '../Renderer';\nimport type { ISystem } from '../system/ISystem';\n\nconst tempRectangle = new Rectangle();\n\n/**\n * System plugin to the renderer to manage framebuffers.\n * @memberof PIXI\n */\nexport class FramebufferSystem implements ISystem\n{\n /** @ignore */\n static extension: ExtensionMetadata = {\n type: ExtensionType.RendererSystem,\n name: 'framebuffer',\n };\n\n /** A list of managed framebuffers. */\n public readonly managedFramebuffers: Array<Framebuffer>;\n public current: Framebuffer;\n public viewport: Rectangle;\n public hasMRT: boolean;\n public writeDepthTexture: boolean;\n protected CONTEXT_UID: number;\n protected gl: IRenderingContext;\n\n /** Framebuffer value that shows that we don't know what is bound. */\n protected unknownFramebuffer: Framebuffer;\n protected msaaSamples: Array<number>;\n public renderer: Renderer;\n\n /**\n * @param renderer - The renderer this System works for.\n */\n constructor(renderer: Renderer)\n {\n this.renderer = renderer;\n this.managedFramebuffers = [];\n this.unknownFramebuffer = new Framebuffer(10, 10);\n\n this.msaaSamples = null;\n }\n\n /** Sets up the renderer context and necessary buffers. */\n protected contextChange(): void\n {\n this.disposeAll(true);\n\n const gl = this.gl = this.renderer.gl;\n\n this.CONTEXT_UID = this.renderer.CONTEXT_UID;\n this.current = this.unknownFramebuffer;\n this.viewport = new Rectangle();\n this.hasMRT = true;\n this.writeDepthTexture = true;\n\n // webgl2\n if (this.renderer.context.webGLVersion === 1)\n {\n // webgl 1!\n let nativeDrawBuffersExtension = this.renderer.context.extensions.drawBuffers;\n let nativeDepthTextureExtension = this.renderer.context.extensions.depthTexture;\n\n if (settings.PREFER_ENV === ENV.WEBGL_LEGACY)\n {\n nativeDrawBuffersExtension = null;\n nativeDepthTextureExtension = null;\n }\n\n if (nativeDrawBuffersExtension)\n {\n gl.drawBuffers = (activeTextures: number[]): void =>\n nativeDrawBuffersExtension.drawBuffersWEBGL(activeTextures);\n }\n else\n {\n this.hasMRT = false;\n gl.drawBuffers = (): void =>\n {\n // empty\n };\n }\n\n if (!nativeDepthTextureExtension)\n {\n this.writeDepthTexture = false;\n }\n }\n else\n {\n // WebGL2\n // cache possible MSAA samples\n this.msaaSamples = gl.getInternalformatParameter(gl.RENDERBUFFER, gl.RGBA8, gl.SAMPLES);\n }\n }\n\n /**\n * Bind a framebuffer.\n * @param framebuffer\n * @param frame - frame, default is framebuffer size\n * @param mipLevel - optional mip level to set on the framebuffer - defaults to 0\n */\n bind(framebuffer?: Framebuffer, frame?: Rectangle, mipLevel = 0): void\n {\n const { gl } = this;\n\n if (framebuffer)\n {\n // TODO caching layer!\n\n const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID] || this.initFramebuffer(framebuffer);\n\n if (this.current !== framebuffer)\n {\n this.current = framebuffer;\n gl.bindFramebuffer(gl.FRAMEBUFFER, fbo.framebuffer);\n }\n // make sure all textures are unbound..\n\n if (fbo.mipLevel !== mipLevel)\n {\n framebuffer.dirtyId++;\n framebuffer.dirtyFormat++;\n fbo.mipLevel = mipLevel;\n }\n\n // now check for updates...\n if (fbo.dirtyId !== framebuffer.dirtyId)\n {\n fbo.dirtyId = framebuffer.dirtyId;\n\n if (fbo.dirtyFormat !== framebuffer.dirtyFormat)\n {\n fbo.dirtyFormat = framebuffer.dirtyFormat;\n fbo.dirtySize = framebuffer.dirtySize;\n this.updateFramebuffer(framebuffer, mipLevel);\n }\n else if (fbo.dirtySize !== framebuffer.dirtySize)\n {\n fbo.dirtySize = framebuffer.dirtySize;\n this.resizeFramebuffer(framebuffer);\n }\n }\n\n for (let i = 0; i < framebuffer.colorTextures.length; i++)\n {\n const tex = framebuffer.colorTextures[i];\n\n this.renderer.texture.unbind(tex.parentTextureArray || tex);\n }\n\n if (framebuffer.depthTexture)\n {\n this.renderer.texture.unbind(framebuffer.depthTexture);\n }\n\n if (frame)\n {\n const mipWidth = (frame.width >> mipLevel);\n const mipHeight = (frame.height >> mipLevel);\n\n const scale = mipWidth / frame.width;\n\n this.setViewport(\n frame.x * scale,\n frame.y * scale,\n mipWidth,\n mipHeight\n );\n }\n else\n {\n const mipWidth = (framebuffer.width >> mipLevel);\n const mipHeight = (framebuffer.height >> mipLevel);\n\n this.setViewport(0, 0, mipWidth, mipHeight);\n }\n }\n else\n {\n if (this.current)\n {\n this.current = null;\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n\n if (frame)\n {\n this.setViewport(frame.x, frame.y, frame.width, frame.height);\n }\n else\n {\n this.setViewport(0, 0, this.renderer.width, this.renderer.height);\n }\n }\n }\n\n /**\n * Set the WebGLRenderingContext's viewport.\n * @param x - X position of viewport\n * @param y - Y position of viewport\n * @param width - Width of viewport\n * @param height - Height of viewport\n */\n setViewport(x: number, y: number, width: number, height: number): void\n {\n const v = this.viewport;\n\n x = Math.round(x);\n y = Math.round(y);\n width = Math.round(width);\n height = Math.round(height);\n\n if (v.width !== width || v.height !== height || v.x !== x || v.y !== y)\n {\n v.x = x;\n v.y = y;\n v.width = width;\n v.height = height;\n\n this.gl.viewport(x, y, width, height);\n }\n }\n\n /**\n * Get the size of the current width and height. Returns object with `width` and `height` values.\n * @readonly\n */\n get size(): { x: number; y: number; width: number; height: number }\n {\n if (this.current)\n {\n // TODO store temp\n return { x: 0, y: 0, width: this.current.width, height: this.current.height };\n }\n\n return { x: 0, y: 0, width: this.renderer.width, height: this.renderer.height };\n }\n\n /**\n * Clear the color of the context\n * @param r - Red value from 0 to 1\n * @param g - Green value from 0 to 1\n * @param b - Blue value from 0 to 1\n * @param a - Alpha value from 0 to 1\n * @param {PIXI.BUFFER_BITS} [mask=BUFFER_BITS.COLOR | BUFFER_BITS.DEPTH] - Bitwise OR of masks\n * that indicate the buffers to be cleared, by default COLOR and DEPTH buffers.\n */\n clear(r: number, g: number, b: number, a: number, mask: BUFFER_BITS = BUFFER_BITS.COLOR | BUFFER_BITS.DEPTH): void\n {\n const { gl } = this;\n\n // TODO clear color can be set only one right?\n gl.clearColor(r, g, b, a);\n gl.clear(mask);\n }\n\n /**\n * Initialize framebuffer for this context\n * @protected\n * @param framebuffer\n * @returns - created GLFramebuffer\n */\n initFramebuffer(framebuffer: Framebuffer): GLFramebuffer\n {\n const { gl } = this;\n const fbo = new GLFramebuffer(gl.createFramebuffer());\n\n fbo.multisample = this.detectSamples(framebuffer.multisample);\n framebuffer.glFramebuffers[this.CONTEXT_UID] = fbo;\n\n this.managedFramebuffers.push(framebuffer);\n framebuffer.disposeRunner.add(this);\n\n return fbo;\n }\n\n /**\n * Resize the framebuffer\n * @param framebuffer\n * @protected\n */\n resizeFramebuffer(framebuffer: Framebuffer): void\n {\n const { gl } = this;\n\n const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID];\n\n if (fbo.stencil)\n {\n gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.stencil);\n\n if (fbo.msaaBuffer)\n {\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample,\n gl.DEPTH24_STENCIL8, framebuffer.width, framebuffer.height);\n }\n else\n {\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, framebuffer.width, framebuffer.height);\n }\n }\n\n const colorTextures = framebuffer.colorTextures;\n\n let count = colorTextures.length;\n\n if (!gl.drawBuffers)\n {\n count = Math.min(count, 1);\n }\n\n for (let i = 0; i < count; i++)\n {\n const texture = colorTextures[i];\n const parentTexture = texture.parentTextureArray || texture;\n\n this.renderer.texture.bind(parentTexture, 0);\n\n if (i === 0 && fbo.msaaBuffer)\n {\n gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.msaaBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample,\n parentTexture._glTextures[this.CONTEXT_UID].internalFormat, framebuffer.width, framebuffer.height);\n }\n }\n\n if (framebuffer.depthTexture && this.writeDepthTexture)\n {\n this.renderer.texture.bind(framebuffer.depthTexture, 0);\n }\n }\n\n /**\n * Update the framebuffer\n * @param framebuffer\n * @param mipLevel\n * @protected\n */\n updateFramebuffer(framebuffer: Framebuffer, mipLevel: number): void\n {\n const { gl } = this;\n\n const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID];\n\n // bind the color texture\n const colorTextures = framebuffer.colorTextures;\n\n let count = colorTextures.length;\n\n if (!gl.drawBuffers)\n {\n count = Math.min(count, 1);\n }\n\n if (fbo.multisample > 1 && this.canMultisampleFramebuffer(framebuffer))\n {\n fbo.msaaBuffer = fbo.msaaBuffer || gl.createRenderbuffer();\n }\n else if (fbo.msaaBuffer)\n {\n gl.deleteRenderbuffer(fbo.msaaBuffer);\n fbo.msaaBuffer = null;\n\n if (fbo.blitFramebuffer)\n {\n fbo.blitFramebuffer.dispose();\n fbo.blitFramebuffer = null;\n }\n }\n\n const activeTextures = [];\n\n for (let i = 0; i < count; i++)\n {\n const texture = colorTextures[i];\n const parentTexture = texture.parentTextureArray || texture;\n\n this.renderer.texture.bind(parentTexture, 0);\n\n if (i === 0 && fbo.msaaBuffer)\n {\n gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.msaaBuffer);\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample,\n parentTexture._glTextures[this.CONTEXT_UID].internalFormat, framebuffer.width, framebuffer.height);\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.RENDERBUFFER, fbo.msaaBuffer);\n }\n else\n {\n gl.framebufferTexture2D(gl.FRAMEBUFFER,\n gl.COLOR_ATTACHMENT0 + i,\n texture.target,\n parentTexture._glTextures[this.CONTEXT_UID].texture,\n mipLevel);\n\n activeTextures.push(gl.COLOR_ATTACHMENT0 + i);\n }\n }\n\n if (activeTextures.length > 1)\n {\n gl.drawBuffers(activeTextures);\n }\n\n if (framebuffer.depthTexture)\n {\n const writeDepthTexture = this.writeDepthTexture;\n\n if (writeDepthTexture)\n {\n const depthTexture = framebuffer.depthTexture;\n\n this.renderer.texture.bind(depthTexture, 0);\n\n gl.framebufferTexture2D(gl.FRAMEBUFFER,\n gl.DEPTH_ATTACHMENT,\n gl.TEXTURE_2D,\n depthTexture._glTextures[this.CONTEXT_UID].texture,\n mipLevel);\n }\n }\n\n if ((framebuffer.stencil || framebuffer.depth) && !(framebuffer.depthTexture && this.writeDepthTexture))\n {\n fbo.stencil = fbo.stencil || gl.createRenderbuffer();\n\n gl.bindRenderbuffer(gl.RENDERBUFFER, fbo.stencil);\n\n if (fbo.msaaBuffer)\n {\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample,\n gl.DEPTH24_STENCIL8, framebuffer.width, framebuffer.height);\n }\n else\n {\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, framebuffer.width, framebuffer.height);\n }\n\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, fbo.stencil);\n }\n else if (fbo.stencil)\n {\n gl.deleteRenderbuffer(fbo.stencil);\n fbo.stencil = null;\n }\n }\n\n /**\n * Returns true if the frame buffer can be multisampled.\n * @param framebuffer\n */\n protected canMultisampleFramebuffer(framebuffer: Framebuffer): boolean\n {\n return this.renderer.context.webGLVersion !== 1\n && framebuffer.colorTextures.length <= 1 && !framebuffer.depthTexture;\n }\n\n /**\n * Detects number of samples that is not more than a param but as close to it as possible\n * @param samples - number of samples\n * @returns - recommended number of samples\n */\n protected detectSamples(samples: MSAA_QUALITY): MSAA_QUALITY\n {\n const { msaaSamples } = this;\n let res: number = MSAA_QUALITY.NONE;\n\n if (samples <= 1 || msaaSamples === null)\n {\n return res;\n }\n for (let i = 0; i < msaaSamples.length; i++)\n {\n if (msaaSamples[i] <= samples)\n {\n res = msaaSamples[i];\n break;\n }\n }\n\n if (res === 1)\n {\n res = MSAA_QUALITY.NONE;\n }\n\n return res;\n }\n\n /**\n * Only works with WebGL2\n *\n * blits framebuffer to another of the same or bigger size\n * after that target framebuffer is bound\n *\n * Fails with WebGL warning if blits multisample framebuffer to different size\n * @param framebuffer - by default it blits \"into itself\", from renderBuffer to texture.\n * @param sourcePixels - source rectangle in pixels\n * @param destPixels - dest rectangle in pixels, assumed to be the same as sourcePixels\n */\n public blit(framebuffer?: Framebuffer, sourcePixels?: Rectangle, destPixels?: Rectangle): void\n {\n const { current, renderer, gl, CONTEXT_UID } = this;\n\n if (renderer.context.webGLVersion !== 2)\n {\n return;\n }\n\n if (!current)\n {\n return;\n }\n const fbo = current.glFramebuffers[CONTEXT_UID];\n\n if (!fbo)\n {\n return;\n }\n if (!framebuffer)\n {\n if (!fbo.msaaBuffer)\n {\n return;\n }\n\n const colorTexture = current.colorTextures[0];\n\n if (!colorTexture)\n {\n return;\n }\n\n if (!fbo.blitFramebuffer)\n {\n fbo.blitFramebuffer = new Framebuffer(current.width, current.height);\n fbo.blitFramebuffer.addColorTexture(0, colorTexture);\n }\n\n framebuffer = fbo.blitFramebuffer;\n\n if (framebuffer.colorTextures[0] !== colorTexture)\n {\n framebuffer.colorTextures[0] = colorTexture;\n framebuffer.dirtyId++;\n framebuffer.dirtyFormat++;\n }\n\n if (framebuffer.width !== current.width || framebuffer.height !== current.height)\n {\n framebuffer.width = current.width;\n framebuffer.height = current.height;\n framebuffer.dirtyId++;\n framebuffer.dirtySize++;\n }\n }\n\n if (!sourcePixels)\n {\n sourcePixels = tempRectangle;\n sourcePixels.width = current.width;\n sourcePixels.height = current.height;\n }\n if (!destPixels)\n {\n destPixels = sourcePixels;\n }\n\n const sameSize = sourcePixels.width === destPixels.width && sourcePixels.height === destPixels.height;\n\n this.bind(framebuffer);\n gl.bindFramebuffer(gl.READ_FRAMEBUFFER, fbo.framebuffer);\n gl.blitFramebuffer(\n sourcePixels.left, sourcePixels.top, sourcePixels.right, sourcePixels.bottom,\n destPixels.left, destPixels.top, destPixels.right, destPixels.bottom,\n gl.COLOR_BUFFER_BIT, sameSize ? gl.NEAREST : gl.LINEAR\n );\n }\n\n /**\n * Disposes framebuffer.\n * @param framebuffer - framebuffer that has to be disposed of\n * @param contextLost - If context was lost, we suppress all delete function calls\n */\n disposeFramebuffer(framebuffer: Framebuffer, contextLost?: boolean): void\n {\n const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID];\n const gl = this.gl;\n\n if (!fbo)\n {\n return;\n }\n\n delete framebuffer.glFramebuffers[this.CONTEXT_UID];\n\n const index = this.managedFramebuffers.indexOf(framebuffer);\n\n if (index >= 0)\n {\n this.managedFramebuffers.splice(index, 1);\n }\n\n framebuffer.disposeRunner.remove(this);\n\n if (!contextLost)\n {\n gl.deleteFramebuffer(fbo.framebuffer);\n\n if (fbo.msaaBuffer)\n {\n gl.deleteRenderbuffer(fbo.msaaBuffer);\n }\n\n if (fbo.stencil)\n {\n gl.deleteRenderbuffer(fbo.stencil);\n }\n }\n\n if (fbo.blitFramebuffer)\n {\n this.disposeFramebuffer(fbo.blitFramebuffer, contextLost);\n }\n }\n\n /**\n * Disposes all framebuffers, but not textures bound to them.\n * @param [contextLost=false] - If context was lost, we suppress all delete function calls\n */\n disposeAll(contextLost?: boolean): void\n {\n const list = this.managedFramebuffers;\n\n (this.managedFramebuffers as any) = [];\n\n for (let i = 0; i < list.length; i++)\n {\n this.disposeFramebuffer(list[i], contextLost);\n }\n }\n\n /**\n * Forcing creation of stencil buffer for current framebuffer, if it wasn't done before.\n * Used by MaskSystem, when its time to use stencil mask for Graphics element.\n *\n * Its an alternative for public lazy `framebuffer.enableStencil`, in case we need stencil without rebind.\n * @private\n */\n forceStencil(): void\n {\n const framebuffer = this.current;\n\n if (!framebuffer)\n {\n return;\n }\n\n const fbo = framebuffer.glFramebuffers[this.CONTEXT_UID];\n\n if (!fbo || fbo.stencil)\n {\n return;\n }\n\n framebuffer.stencil = true;\n\n const w = framebuffer.width;\n const h = framebuffer.height;\n const gl = this.gl;\n const stencil = gl.createRenderbuffer();\n\n gl.bindRenderbuffer(gl.RENDERBUFFER, stencil);\n\n if (fbo.msaaBuffer)\n {\n gl.renderbufferStorageMultisample(gl.RENDERBUFFER, fbo.multisample, gl.DEPTH24_STENCIL8, w, h);\n }\n else\n {\n gl.renderbufferStorage(gl.RENDERBUFFER, gl.DEPTH_STENCIL, w, h);\n }\n\n fbo.stencil = stencil;\n gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.DEPTH_STENCIL_ATTACHMENT, gl.RENDERBUFFER, stencil);\n }\n\n /** Resets framebuffer stored state, binds screen framebuffer. Should be called before renderTexture reset(). */\n reset(): void\n {\n this.current = this.unknownFramebuffer;\n this.viewport = new Rectangle();\n }\n\n destroy(): void\n {\n this.renderer = null;\n }\n}\n\nextensions.add(FramebufferSystem);\n"],"names":["Rectangle","Framebuffer","settings","ENV","BUFFER_BITS","GLFramebuffer","MSAA_QUALITY","ExtensionType","extensions"],"mappings":"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"} |