From 508ca7356e50fca92e1aaa0f691a3876d5dcb998 Mon Sep 17 00:00:00 2001 From: ChenMo Date: Thu, 26 Feb 2026 11:53:11 +0800 Subject: [PATCH 1/2] Extract _createRenderBuffer to deduplicate renderbuffer creation in GLRenderTarget (#2897) * refactor: simplify GLRenderTarget with private _createRenderBuffer method --- packages/rhi-webgl/src/GLRenderTarget.ts | 50 +++++++++++----------- tests/src/rhi-webgl/GLRenderTarget.test.ts | 45 +++++++++++++++++++ 2 files changed, 70 insertions(+), 25 deletions(-) create mode 100644 tests/src/rhi-webgl/GLRenderTarget.test.ts diff --git a/packages/rhi-webgl/src/GLRenderTarget.ts b/packages/rhi-webgl/src/GLRenderTarget.ts index 0ae8338ec..2f481ea43 100644 --- a/packages/rhi-webgl/src/GLRenderTarget.ts +++ b/packages/rhi-webgl/src/GLRenderTarget.ts @@ -254,13 +254,7 @@ export class GLRenderTarget implements IPlatformRenderTarget { ); } else if (this._target.antiAliasing <= 1) { const { internalFormat, attachment } = GLTexture._getRenderBufferDepthFormatDetail(_depth, gl, isWebGL2); - const depthRenderBuffer = gl.createRenderbuffer(); - - this._depthRenderBuffer = depthRenderBuffer; - - gl.bindRenderbuffer(gl.RENDERBUFFER, depthRenderBuffer); - gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, width, height); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, depthRenderBuffer); + this._depthRenderBuffer = this._createRenderBuffer(internalFormat, attachment); } } @@ -271,33 +265,23 @@ export class GLRenderTarget implements IPlatformRenderTarget { private _bindMSAAFBO(): void { const gl = this._gl; const isWebGL2 = this._isWebGL2; - const MSAADepthRenderBuffer = gl.createRenderbuffer(); /** @ts-ignore */ - const { _depth, colorTextureCount, antiAliasing, width, height } = this._target; + const { _depth, colorTextureCount } = this._target; this._blitDrawBuffers = new Array(colorTextureCount); - this._MSAADepthRenderBuffer = MSAADepthRenderBuffer; gl.bindFramebuffer(gl.FRAMEBUFFER, this._MSAAFrameBuffer); // prepare MRT+MSAA color RBOs for (let i = 0; i < colorTextureCount; i++) { - const MSAAColorRenderBuffer = gl.createRenderbuffer(); - - this._MSAAColorRenderBuffers[i] = MSAAColorRenderBuffer; this._blitDrawBuffers[i] = gl.NONE; - gl.bindRenderbuffer(gl.RENDERBUFFER, MSAAColorRenderBuffer); - gl.renderbufferStorageMultisample( - gl.RENDERBUFFER, - antiAliasing, + const internalFormat = /** @ts-ignore */ - (this._target.getColorTexture(i)._platformTexture as GLTexture)._formatDetail.internalFormat, - width, - height - ); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0 + i, gl.RENDERBUFFER, MSAAColorRenderBuffer); + (this._target.getColorTexture(i)._platformTexture as GLTexture)._formatDetail.internalFormat; + + this._MSAAColorRenderBuffers[i] = this._createRenderBuffer(internalFormat, gl.COLOR_ATTACHMENT0 + i); } gl.drawBuffers(this._oriDrawBuffers); @@ -309,9 +293,7 @@ export class GLRenderTarget implements IPlatformRenderTarget { (_depth._platformTexture as GLTexture)._formatDetail : GLTexture._getRenderBufferDepthFormatDetail(_depth, gl, isWebGL2); - gl.bindRenderbuffer(gl.RENDERBUFFER, MSAADepthRenderBuffer); - gl.renderbufferStorageMultisample(gl.RENDERBUFFER, antiAliasing, internalFormat, width, height); - gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, MSAADepthRenderBuffer); + this._MSAADepthRenderBuffer = this._createRenderBuffer(internalFormat, attachment); } this._checkFrameBuffer(); @@ -319,6 +301,24 @@ export class GLRenderTarget implements IPlatformRenderTarget { gl.bindRenderbuffer(gl.RENDERBUFFER, null); } + private _createRenderBuffer(internalFormat: GLenum, attachment: GLenum): WebGLRenderbuffer { + const gl = this._gl; + const { width, height, antiAliasing } = this._target; + const renderBuffer = gl.createRenderbuffer(); + + gl.bindRenderbuffer(gl.RENDERBUFFER, renderBuffer); + + if (antiAliasing > 1) { + gl.renderbufferStorageMultisample(gl.RENDERBUFFER, antiAliasing, internalFormat, width, height); + } else { + gl.renderbufferStorage(gl.RENDERBUFFER, internalFormat, width, height); + } + + gl.framebufferRenderbuffer(gl.FRAMEBUFFER, attachment, gl.RENDERBUFFER, renderBuffer); + + return renderBuffer; + } + private _checkFrameBuffer(): void { const gl = this._gl; const e = gl.checkFramebufferStatus(gl.FRAMEBUFFER); diff --git a/tests/src/rhi-webgl/GLRenderTarget.test.ts b/tests/src/rhi-webgl/GLRenderTarget.test.ts new file mode 100644 index 000000000..e62fcc23b --- /dev/null +++ b/tests/src/rhi-webgl/GLRenderTarget.test.ts @@ -0,0 +1,45 @@ +import { RenderTarget, Texture2D, TextureFormat } from "@galacean/engine-core"; +import { WebGLEngine } from "@galacean/engine-rhi-webgl"; +import { describe, beforeAll, expect, it } from "vitest"; + +describe("GLRenderTarget", () => { + let engine: WebGLEngine; + + beforeAll(async () => { + const canvas = document.createElement("canvas"); + engine = await WebGLEngine.create({ canvas }); + }); + + describe("lifecycle", () => { + it("should create and destroy non-MSAA render target", () => { + const colorTexture = new Texture2D(engine, 512, 512); + const renderTarget = new RenderTarget(engine, 512, 512, colorTexture, TextureFormat.Depth16, 1); + + // @ts-ignore + const glRenderTarget = renderTarget._platformRenderTarget as any; + + expect(() => { + glRenderTarget.activeRenderTarget(0); + glRenderTarget.blitRenderTarget(); + }).not.toThrow(); + + renderTarget.destroy(); + }); + + it("should create and destroy MSAA render target", () => { + const colorTexture = new Texture2D(engine, 512, 512); + const renderTarget = new RenderTarget(engine, 512, 512, colorTexture, TextureFormat.Depth16, 4); + + // @ts-ignore + const glRenderTarget = renderTarget._platformRenderTarget as any; + + expect(() => { + glRenderTarget.activeRenderTarget(0); + glRenderTarget.blitRenderTarget(); + }).not.toThrow(); + + renderTarget.destroy(); + }); + }); + +}); From d79647a9ae2c464559c683bc47c8339f28349b46 Mon Sep 17 00:00:00 2001 From: AZhan Date: Fri, 20 Mar 2026 15:36:57 +0800 Subject: [PATCH 2/2] fix: text dirty flag set error (#2931) --- packages/ui/src/component/advanced/Text.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ui/src/component/advanced/Text.ts b/packages/ui/src/component/advanced/Text.ts index ba4413af6..b89e3852c 100644 --- a/packages/ui/src/component/advanced/Text.ts +++ b/packages/ui/src/component/advanced/Text.ts @@ -320,7 +320,7 @@ export class Text extends UIRenderer implements ITextRenderer { const canvas = this._getRootCanvas(); if (this._isContainDirtyFlag(DirtyFlag.LocalPositionBounds)) { this._updateLocalData(); - this._setDirtyFlagTrue(DirtyFlag.LocalPositionBounds); + this._setDirtyFlagFalse(DirtyFlag.LocalPositionBounds); } if (this._isContainDirtyFlag(DirtyFlag.WorldPosition)) {