Merge pull request #111 from twpayne/webgl-renderer-clean-ups

WebGL renderer clean ups
This commit is contained in:
Tom Payne
2013-01-14 03:33:04 -08:00
3 changed files with 32 additions and 53 deletions
+15 -6
View File
@@ -1,7 +1,5 @@
// FIXME clear textureCache // FIXME clear textureCache
// FIXME defer texture loads until after render when animating
// FIXME generational tile texture garbage collector newFrame/get // FIXME generational tile texture garbage collector newFrame/get
// FIXME defer cleanup until post-render
// FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE) // FIXME check against gl.getParameter(webgl.MAX_TEXTURE_SIZE)
goog.provide('ol.renderer.webgl.Map'); goog.provide('ol.renderer.webgl.Map');
@@ -119,6 +117,12 @@ ol.renderer.webgl.Map = function(container, map) {
this.canvas_.className = 'ol-unselectable'; this.canvas_.className = 'ol-unselectable';
goog.dom.insertChildAt(container, this.canvas_, 0); goog.dom.insertChildAt(container, this.canvas_, 0);
/**
* @private
* @type {boolean}
*/
this.renderedVisible_ = true;
/** /**
* @private * @private
* @type {ol.Size} * @type {ol.Size}
@@ -267,7 +271,6 @@ ol.renderer.webgl.Map.prototype.canRotate = goog.functions.TRUE;
* @inheritDoc * @inheritDoc
*/ */
ol.renderer.webgl.Map.prototype.createLayerRenderer = function(layer) { ol.renderer.webgl.Map.prototype.createLayerRenderer = function(layer) {
var gl = this.getGL();
if (layer instanceof ol.layer.TileLayer) { if (layer instanceof ol.layer.TileLayer) {
return new ol.renderer.webgl.TileLayer(this, layer); return new ol.renderer.webgl.TileLayer(this, layer);
} else { } else {
@@ -495,9 +498,10 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
var gl = this.getGL(); var gl = this.getGL();
if (goog.isNull(frameState)) { if (goog.isNull(frameState)) {
gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, null); if (this.renderedVisible_) {
gl.clearColor(0, 0, 0, 0); goog.style.showElement(this.canvas_, false);
gl.clear(goog.webgl.COLOR_BUFFER_BIT); this.renderedVisible_ = false;
}
return false; return false;
} }
@@ -575,6 +579,11 @@ ol.renderer.webgl.Map.prototype.renderFrame = function(frameState) {
gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4); gl.drawArrays(goog.webgl.TRIANGLE_STRIP, 0, 4);
}, this); }, this);
if (!this.renderedVisible_) {
goog.style.showElement(this.canvas_, true);
this.renderedVisible_ = true;
}
}; };
-6
View File
@@ -3,12 +3,6 @@ goog.provide('ol.renderer.webgl');
goog.require('ol.webgl'); goog.require('ol.webgl');
/**
* @define {boolean} Free resources immediately.
*/
ol.renderer.webgl.FREE_RESOURCES_IMMEDIATELY = false;
/** /**
* @return {boolean} Is supported. * @return {boolean} Is supported.
*/ */
+17 -41
View File
@@ -8,7 +8,6 @@ goog.provide('ol.renderer.webgl.tilelayerrenderer.shader.Vertex');
goog.require('goog.array'); goog.require('goog.array');
goog.require('goog.asserts'); goog.require('goog.asserts');
goog.require('goog.debug.Logger');
goog.require('goog.events.EventType'); goog.require('goog.events.EventType');
goog.require('goog.object'); goog.require('goog.object');
goog.require('goog.structs.PriorityQueue'); goog.require('goog.structs.PriorityQueue');
@@ -88,14 +87,6 @@ ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) {
goog.base(this, mapRenderer, tileLayer); goog.base(this, mapRenderer, tileLayer);
if (goog.DEBUG) {
/**
* @inheritDoc
*/
this.logger = goog.debug.Logger.getLogger(
'ol.renderer.webgl.tilelayerrenderer.' + goog.getUid(this));
}
/** /**
* @private * @private
* @type {ol.renderer.webgl.FragmentShader} * @type {ol.renderer.webgl.FragmentShader}
@@ -179,28 +170,14 @@ ol.renderer.webgl.TileLayer.prototype.bindFramebuffer_ =
if (!goog.isDef(this.framebufferDimension_) || if (!goog.isDef(this.framebufferDimension_) ||
this.framebufferDimension_ != framebufferDimension) { this.framebufferDimension_ != framebufferDimension) {
if (goog.DEBUG) { var map = this.getMap();
this.logger.info('re-sizing framebuffer'); frameState.postRenderFunctions.push(
} goog.partial(function(gl, framebuffer, texture) {
if (!gl.isContextLost()) {
if (ol.renderer.webgl.FREE_RESOURCES_IMMEDIATELY) { gl.deleteFramebuffer(framebuffer);
if (goog.DEBUG) { gl.deleteTexture(texture);
this.logger.info('freeing WebGL resources'); }
} }, gl, this.framebuffer_, this.texture_));
if (!gl.isContextLost()) {
gl.deleteFramebuffer(this.framebuffer_);
gl.deleteTexture(this.texture_);
}
} else {
var map = this.getMap();
frameState.postRenderFunctions.push(
goog.partial(function(gl, framebuffer, texture) {
if (!gl.isContextLost()) {
gl.deleteFramebuffer(framebuffer);
gl.deleteTexture(texture);
}
}, gl, this.framebuffer_, this.texture_));
}
var texture = gl.createTexture(); var texture = gl.createTexture();
gl.bindTexture(goog.webgl.TEXTURE_2D, texture); gl.bindTexture(goog.webgl.TEXTURE_2D, texture);
@@ -243,15 +220,6 @@ ol.renderer.webgl.TileLayer.prototype.disposeInternal = function() {
}; };
/**
* @return {ol.layer.TileLayer} Layer.
* @inheritDoc
*/
ol.renderer.webgl.TileLayer.prototype.getLayer = function() {
return /** @type {ol.layer.TileLayer} */ (goog.base(this, 'getLayer'));
};
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -268,6 +236,14 @@ ol.renderer.webgl.TileLayer.prototype.getTexture = function() {
}; };
/**
* @return {ol.layer.TileLayer} Tile layer.
*/
ol.renderer.webgl.TileLayer.prototype.getTileLayer = function() {
return /** @type {ol.layer.TileLayer} */ (this.getLayer());
};
/** /**
* @inheritDoc * @inheritDoc
*/ */
@@ -292,7 +268,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
var view2DState = frameState.view2DState; var view2DState = frameState.view2DState;
var center = view2DState.center; var center = view2DState.center;
var tileLayer = this.getLayer(); var tileLayer = this.getTileLayer();
var tileSource = tileLayer.getTileSource(); var tileSource = tileLayer.getTileSource();
var tileGrid = tileSource.getTileGrid(); var tileGrid = tileSource.getTileGrid();
var z = tileGrid.getZForResolution(view2DState.resolution); var z = tileGrid.getZForResolution(view2DState.resolution);