Promote texture and framebuffer management into base class

This commit is contained in:
Tom Payne
2013-03-19 20:02:27 +01:00
parent 657f58005e
commit 6c32170a08
3 changed files with 95 additions and 124 deletions

View File

@@ -28,13 +28,6 @@ ol.renderer.webgl.ImageLayer = function(mapRenderer, imageLayer) {
*/
this.image_ = null;
/**
* The last rendered texture.
* @private
* @type {WebGLTexture}
*/
this.texture_ = null;
/**
* @private
* @type {!goog.vec.Mat4.Number}
@@ -86,19 +79,6 @@ ol.renderer.webgl.ImageLayer.prototype.createTexture_ = function(image) {
};
/**
* @inheritDoc
*/
ol.renderer.webgl.ImageLayer.prototype.disposeInternal = function() {
var mapRenderer = this.getMapRenderer();
var gl = mapRenderer.getGL();
if (!gl.isContextLost()) {
gl.deleteTexture(this.texture_);
}
goog.base(this, 'disposeInternal');
};
/**
* @inheritDoc
*/
@@ -107,14 +87,6 @@ ol.renderer.webgl.ImageLayer.prototype.getTexCoordMatrix = function() {
};
/**
* @inheritDoc
*/
ol.renderer.webgl.ImageLayer.prototype.getTexture = function() {
return this.texture_;
};
/**
* @inheritDoc
*/
@@ -131,14 +103,6 @@ ol.renderer.webgl.ImageLayer.prototype.getImageLayer = function() {
};
/**
* @inheritDoc
*/
ol.renderer.webgl.ImageLayer.prototype.handleWebGLContextLost = function() {
this.texture_ = null;
};
/**
* @inheritDoc
*/
@@ -153,7 +117,7 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame =
var viewRotation = view2DState.rotation;
var image = this.image_;
var texture = this.texture_;
var texture = this.texture;
var imageLayer = this.getImageLayer();
var imageSource = imageLayer.getImageSource();
@@ -171,13 +135,13 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame =
} else if (imageState == ol.ImageState.LOADED) {
image = image_;
texture = this.createTexture_(image_);
if (!goog.isNull(this.texture_)) {
if (!goog.isNull(this.texture)) {
frameState.postRenderFunctions.push(
goog.partial(function(gl, texture) {
if (!gl.isContextLost()) {
gl.deleteTexture(texture);
}
}, gl, this.texture_));
}, gl, this.texture));
}
}
}
@@ -198,7 +162,7 @@ ol.renderer.webgl.ImageLayer.prototype.renderFrame =
goog.vec.Mat4.translate(texCoordMatrix, 0, -1, 0);
this.image_ = image;
this.texture_ = texture;
this.texture = texture;
this.updateAttributions(frameState.attributions, image.getAttributions());
}

View File

@@ -3,6 +3,7 @@
goog.provide('ol.renderer.webgl.Layer');
goog.require('goog.vec.Mat4');
goog.require('ol.FrameState');
goog.require('ol.layer.Layer');
goog.require('ol.renderer.Layer');
goog.require('ol.vec.Mat4');
@@ -19,6 +20,24 @@ ol.renderer.webgl.Layer = function(mapRenderer, layer) {
goog.base(this, mapRenderer, layer);
/**
* @protected
* @type {WebGLTexture}
*/
this.texture = null;
/**
* @protected
* @type {WebGLFramebuffer}
*/
this.framebuffer = null;
/**
* @protected
* @type {number|undefined}
*/
this.framebufferDimension = undefined;
/**
* @private
* @type {!goog.vec.Mat4.Float32}
@@ -64,6 +83,68 @@ ol.renderer.webgl.Layer = function(mapRenderer, layer) {
goog.inherits(ol.renderer.webgl.Layer, ol.renderer.Layer);
/**
* @param {ol.FrameState} frameState Frame state.
* @param {number} framebufferDimension Framebuffer dimension.
* @protected
*/
ol.renderer.webgl.Layer.prototype.bindFramebuffer =
function(frameState, framebufferDimension) {
var mapRenderer = this.getMapRenderer();
var gl = mapRenderer.getGL();
if (!goog.isDef(this.framebufferDimension) ||
this.framebufferDimension != framebufferDimension) {
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();
gl.bindTexture(goog.webgl.TEXTURE_2D, texture);
gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA,
framebufferDimension, framebufferDimension, 0, goog.webgl.RGBA,
goog.webgl.UNSIGNED_BYTE, null);
gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER,
goog.webgl.LINEAR);
gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER,
goog.webgl.LINEAR);
var framebuffer = gl.createFramebuffer();
gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, framebuffer);
gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER,
goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, texture, 0);
this.texture = texture;
this.framebuffer = framebuffer;
this.framebufferDimension = framebufferDimension;
} else {
gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer);
}
};
/**
* @inheritDoc
*/
ol.renderer.webgl.Layer.prototype.disposeInternal = function() {
var mapRenderer = this.getMapRenderer();
var gl = mapRenderer.getGL();
if (!gl.isContextLost()) {
gl.deleteBuffer(this.arrayBuffer_);
}
goog.base(this, 'disposeInternal');
};
/**
* @return {!goog.vec.Mat4.Float32} Color matrix.
*/
@@ -94,7 +175,9 @@ ol.renderer.webgl.Layer.prototype.getTexCoordMatrix = goog.abstractMethod;
/**
* @return {WebGLTexture} Texture.
*/
ol.renderer.webgl.Layer.prototype.getTexture = goog.abstractMethod;
ol.renderer.webgl.Layer.prototype.getTexture = function() {
return this.texture;
};
/**
@@ -150,7 +233,11 @@ ol.renderer.webgl.Layer.prototype.handleLayerSaturationChange = function() {
/**
* Handle webglcontextlost.
*/
ol.renderer.webgl.Layer.prototype.handleWebGLContextLost = goog.nullFunction;
ol.renderer.webgl.Layer.prototype.handleWebGLContextLost = function() {
this.texture = null;
this.framebuffer = null;
this.framebufferDimension = undefined;
};
/**

View File

@@ -13,7 +13,6 @@ goog.require('goog.vec.Mat4');
goog.require('goog.vec.Vec4');
goog.require('goog.webgl');
goog.require('ol.Extent');
goog.require('ol.FrameState');
goog.require('ol.Size');
goog.require('ol.Tile');
goog.require('ol.TileCoord');
@@ -117,24 +116,6 @@ ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) {
*/
this.arrayBuffer_ = null;
/**
* @private
* @type {WebGLTexture}
*/
this.texture_ = null;
/**
* @private
* @type {WebGLFramebuffer}
*/
this.framebuffer_ = null;
/**
* @private
* @type {number|undefined}
*/
this.framebufferDimension_ = undefined;
/**
* @private
* @type {!goog.vec.Mat4.Number}
@@ -163,55 +144,6 @@ ol.renderer.webgl.TileLayer = function(mapRenderer, tileLayer) {
goog.inherits(ol.renderer.webgl.TileLayer, ol.renderer.webgl.Layer);
/**
* @param {ol.FrameState} frameState Frame state.
* @param {number} framebufferDimension Framebuffer dimension.
* @private
*/
ol.renderer.webgl.TileLayer.prototype.bindFramebuffer_ =
function(frameState, framebufferDimension) {
var mapRenderer = this.getMapRenderer();
var gl = mapRenderer.getGL();
if (!goog.isDef(this.framebufferDimension_) ||
this.framebufferDimension_ != framebufferDimension) {
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();
gl.bindTexture(goog.webgl.TEXTURE_2D, texture);
gl.texImage2D(goog.webgl.TEXTURE_2D, 0, goog.webgl.RGBA,
framebufferDimension, framebufferDimension, 0, goog.webgl.RGBA,
goog.webgl.UNSIGNED_BYTE, null);
gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MAG_FILTER,
goog.webgl.LINEAR);
gl.texParameteri(goog.webgl.TEXTURE_2D, goog.webgl.TEXTURE_MIN_FILTER,
goog.webgl.LINEAR);
var framebuffer = gl.createFramebuffer();
gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, framebuffer);
gl.framebufferTexture2D(goog.webgl.FRAMEBUFFER,
goog.webgl.COLOR_ATTACHMENT0, goog.webgl.TEXTURE_2D, texture, 0);
this.texture_ = texture;
this.framebuffer_ = framebuffer;
this.framebufferDimension_ = framebufferDimension;
} else {
gl.bindFramebuffer(goog.webgl.FRAMEBUFFER, this.framebuffer_);
}
};
/**
* @inheritDoc
*/
@@ -220,8 +152,6 @@ ol.renderer.webgl.TileLayer.prototype.disposeInternal = function() {
var gl = mapRenderer.getGL();
if (!gl.isContextLost()) {
gl.deleteBuffer(this.arrayBuffer_);
gl.deleteFramebuffer(this.framebuffer_);
gl.deleteTexture(this.texture_);
}
goog.base(this, 'disposeInternal');
};
@@ -235,14 +165,6 @@ ol.renderer.webgl.TileLayer.prototype.getTexCoordMatrix = function() {
};
/**
* @inheritDoc
*/
ol.renderer.webgl.TileLayer.prototype.getTexture = function() {
return this.texture_;
};
/**
* @inheritDoc
*/
@@ -263,11 +185,9 @@ ol.renderer.webgl.TileLayer.prototype.getTileLayer = function() {
* @inheritDoc
*/
ol.renderer.webgl.TileLayer.prototype.handleWebGLContextLost = function() {
goog.base(this, 'handleWebGLContextLost');
this.locations_ = null;
this.arrayBuffer_ = null;
this.texture_ = null;
this.framebuffer_ = null;
this.framebufferDimension_ = undefined;
};
@@ -330,7 +250,7 @@ ol.renderer.webgl.TileLayer.prototype.renderFrame =
minX + framebufferExtentSize.width,
minY + framebufferExtentSize.height);
this.bindFramebuffer_(frameState, framebufferDimension);
this.bindFramebuffer(frameState, framebufferDimension);
gl.viewport(0, 0, framebufferDimension, framebufferDimension);
gl.clearColor(0, 0, 0, 0);