Repository navigation
Fix stale texture unit cache in WebGL multi-texture mode #762
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Draft
Copilot
wants to merge
5
commits into
master
Choose a base branch
from
fix/multitexture
base: master
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Draft
Changes from all commits
Commits
Show all changes
5 commits
Select commit
Hold shift + click to select a range
47dd1e6
Fix stale texture unit cache in WebGL multi-texture mode
samme 6cb50ea
Fix remaining multi-texture binding cases
Copilot b097368
Preserve texture unit bindings during TileSprite uploads, shader init…
samme 398c6f8
Remove duplicate multi-texture binding fixes after merge
samme 57ad1de
Treat source-less render targets as never stale in multi-texture binding
samme File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -248,6 +248,50 @@ PIXI.WebGLSpriteBatch.prototype.end = function () | |
| this.flush(); | ||
| }; | ||
|
|
||
| /** | ||
| * Multi-texture mode: makes sure the base texture is uploaded if dirty and bound to the given texture unit. | ||
| * Flushes the batch first if the unit binding or contents will change. | ||
| * | ||
| * @method PIXI.WebGLSpriteBatch#bindMultiTexture | ||
| * @private | ||
| * @param {PIXI.BaseTexture} baseTexture | ||
| * @param {number} textureUnit | ||
| * @return {boolean} False if the texture is dirty but can't be uploaded yet (not loaded), so the sprite should be skipped. | ||
| */ | ||
| PIXI.WebGLSpriteBatch.prototype.bindMultiTexture = function (baseTexture, textureUnit) | ||
| { | ||
| var gl = this.gl; | ||
|
|
||
| if (!baseTexture.source && baseTexture._glTextures[gl.id]) | ||
| { | ||
| // a render target (RenderTexture) has no source to upload, so it is never stale | ||
| baseTexture._dirty[gl.id] = false; | ||
| } | ||
|
|
||
| var dirty = baseTexture._dirty[gl.id] || !baseTexture._glTextures[gl.id]; | ||
|
|
||
| if (!dirty && PIXI.WebGLRenderer.textureArray[textureUnit] === baseTexture) | ||
| { | ||
| return true; | ||
| } | ||
|
|
||
| this.flush(); | ||
|
|
||
| if (dirty) | ||
| { | ||
| // the upload binds on the base texture's own unit, which has to be the one the vertices sample | ||
| baseTexture.textureIndex = textureUnit; | ||
|
|
||
| return this.renderSession.renderer.updateTexture(baseTexture); | ||
| } | ||
|
|
||
| gl.activeTexture(gl.TEXTURE0 + textureUnit); | ||
| gl.bindTexture(gl.TEXTURE_2D, baseTexture._glTextures[gl.id]); | ||
| PIXI.WebGLRenderer.textureArray[textureUnit] = baseTexture; | ||
|
|
||
| return true; | ||
| }; | ||
|
|
||
| /** | ||
| * @method PIXI.WebGLSpriteBatch#render | ||
| * @param sprite {Sprite} the sprite to render when using this spritebatch | ||
|
|
@@ -260,13 +304,9 @@ PIXI.WebGLSpriteBatch.prototype.render = function (sprite, matrix) | |
| if (PIXI._enableMultiTextureToggle) | ||
| { | ||
| var baseTexture = texture.baseTexture; | ||
| var gl = this.gl; | ||
| if (PIXI.WebGLRenderer.textureArray[baseTexture.textureIndex] != baseTexture) // eslint-disable-line eqeqeq | ||
| if (!this.bindMultiTexture(baseTexture, baseTexture.textureIndex)) | ||
| { | ||
| this.flush(); | ||
| gl.activeTexture(gl.TEXTURE0 + baseTexture.textureIndex); | ||
| gl.bindTexture(gl.TEXTURE_2D, baseTexture._glTextures[gl.id]); | ||
| PIXI.WebGLRenderer.textureArray[baseTexture.textureIndex] = baseTexture; | ||
| return; | ||
| } | ||
| } | ||
|
|
||
|
|
@@ -447,14 +487,9 @@ PIXI.WebGLSpriteBatch.prototype.renderTilingSprite = function (sprite) | |
|
|
||
| if (PIXI._enableMultiTextureToggle) | ||
| { | ||
| var baseTexture = texture.baseTexture; | ||
| var gl = this.gl; | ||
| if (PIXI.WebGLRenderer.textureArray[textureIndex] != baseTexture) // eslint-disable-line eqeqeq | ||
| if (!this.bindMultiTexture(texture.baseTexture, textureIndex)) | ||
| { | ||
| this.flush(); | ||
| gl.activeTexture(gl.TEXTURE0 + textureIndex); | ||
| gl.bindTexture(gl.TEXTURE_2D, baseTexture._glTextures[gl.id]); | ||
| PIXI.WebGLRenderer.textureArray[textureIndex] = baseTexture; | ||
| return; | ||
| } | ||
| } | ||
|
|
||
|
|
@@ -782,8 +817,9 @@ PIXI.WebGLSpriteBatch.prototype.renderBatch = function (texture, size, startInde | |
| return; | ||
| } | ||
| } | ||
| else | ||
| else if (!PIXI._enableMultiTextureToggle) | ||
|
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Restored the cached texture bindings after first-use multi-texture shader initialization in |
||
| { | ||
| // in multi-texture mode the batch's textures are already bound on their own units | ||
| gl.bindTexture(gl.TEXTURE_2D, texture._glTextures[gl.id]); | ||
| } | ||
|
|
||
|
|
||
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Flushed the sprite batch before the eager TileSprite texture upload in
6cb50ea.