Skip to content

Commit e5c3cc8

Browse files
committed
fix(webgl): handle dirty context for textures/quads
1 parent 37052c7 commit e5c3cc8

2 files changed

Lines changed: 30 additions & 5 deletions

File tree

src/vgl/texture.js

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ vgl.texture = function () {
3333
this.m_texture = null;
3434

3535
var m_setupTimestamp = timestamp(),
36+
m_setupContext = null,
3637
m_that = this;
3738

3839
function activateTextureUnit(renderState) {
@@ -52,8 +53,11 @@ vgl.texture = function () {
5253
// Activate the texture unit first
5354
activateTextureUnit(renderState);
5455

55-
renderState.m_context.deleteTexture(this.m_textureHandle);
56+
if (this.m_textureHandle && m_setupContext === renderState.m_context) {
57+
renderState.m_context.deleteTexture(this.m_textureHandle);
58+
}
5659
this.m_textureHandle = renderState.m_context.createTexture();
60+
m_setupContext = renderState.m_context;
5761
renderState.m_context.bindTexture(vgl.GL.TEXTURE_2D, this.m_textureHandle);
5862
renderState.m_context.texParameteri(vgl.GL.TEXTURE_2D,
5963
vgl.GL.TEXTURE_MIN_FILTER,
@@ -101,7 +105,9 @@ vgl.texture = function () {
101105
*/
102106
this.bind = function (renderState) {
103107
// TODO Call setup via material setup
104-
if (this.getMTime() > m_setupTimestamp.getMTime()) {
108+
if (renderState.m_contextChanged ||
109+
m_setupContext !== renderState.m_context ||
110+
this.getMTime() > m_setupTimestamp.getMTime()) {
105111
this.setup(renderState);
106112
}
107113

@@ -289,6 +295,16 @@ vgl.texture = function () {
289295
return this.m_textureHandle;
290296
};
291297

298+
/**
299+
* Return true if the texture handle belongs to the specified context.
300+
*
301+
* @param {WebGLRenderingContext} context A candidate GL context.
302+
* @returns {boolean} True if the texture has been setup for the context.
303+
*/
304+
this.hasContext = function (context) {
305+
return !!this.m_textureHandle && m_setupContext === context;
306+
};
307+
292308
return this;
293309
};
294310

src/webgl/quadFeature.js

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,12 @@ var webgl_quadFeature = function (arg) {
5555
newbuf = false;
5656

5757
if (m_quads.imgQuads.length) {
58+
if (renderState.m_contextChanged) {
59+
m_glBuffers.imgQuadsPosition = null;
60+
}
5861
if (!m_imgposbuf || m_imgposbuf.length < m_quads.imgQuads.length * 12 ||
5962
!m_glBuffers.imgQuadsPosition) {
60-
if (m_glBuffers.imgQuadsPosition) {
63+
if (m_glBuffers.imgQuadsPosition && !renderState.m_contextChanged) {
6164
context.deleteBuffer(m_glBuffers.imgQuadsPosition);
6265
}
6366
m_glBuffers.imgQuadsPosition = context.createBuffer();
@@ -93,9 +96,12 @@ var webgl_quadFeature = function (arg) {
9396
newbuf = false;
9497

9598
if (m_quads.clrQuads.length) {
99+
if (renderState.m_contextChanged) {
100+
m_glBuffers.clrQuadsPosition = null;
101+
}
96102
if (!m_clrposbuf || m_clrposbuf.length < m_quads.clrQuads.length * 12 ||
97103
!m_glBuffers.clrQuadsPosition) {
98-
if (m_glBuffers.clrQuadsPosition) {
104+
if (m_glBuffers.clrQuadsPosition && !renderState.m_contextChanged) {
99105
context.deleteBuffer(m_glBuffers.clrQuadsPosition);
100106
}
101107
m_glBuffers.clrQuadsPosition = context.createBuffer();
@@ -393,7 +399,10 @@ var webgl_quadFeature = function (arg) {
393399
nearestPixel = curZoom >= nearestPixel;
394400
}
395401
m_quads.imgQuads.forEach((quad) => {
396-
if ((quad.image || quad.imageTexture) && quad.texture && quad.texture.nearestPixel() !== nearestPixel && quad.texture.textureHandle()) {
402+
if ((quad.image || quad.imageTexture) && quad.texture &&
403+
quad.texture.nearestPixel() !== nearestPixel &&
404+
quad.texture.textureHandle() &&
405+
quad.texture.hasContext(renderState.m_context)) {
397406
/* This could just be
398407
* quad.texture.setNearestPixel(nearestPixel);
399408
* but that needlessly redecodes the image. Instead, just change the

0 commit comments

Comments
 (0)