Track buffer dirty state by map
This commit is contained in:
@@ -23,6 +23,7 @@ goog.require('ol.renderer.webgl.ImageLayer');
|
|||||||
goog.require('ol.renderer.webgl.TileLayer');
|
goog.require('ol.renderer.webgl.TileLayer');
|
||||||
goog.require('ol.renderer.webgl.VertexShader');
|
goog.require('ol.renderer.webgl.VertexShader');
|
||||||
goog.require('ol.structs.Buffer');
|
goog.require('ol.structs.Buffer');
|
||||||
|
goog.require('ol.structs.IntegerSet');
|
||||||
goog.require('ol.structs.LRUCache');
|
goog.require('ol.structs.LRUCache');
|
||||||
goog.require('ol.webgl');
|
goog.require('ol.webgl');
|
||||||
goog.require('ol.webgl.WebGLContextEventType');
|
goog.require('ol.webgl.WebGLContextEventType');
|
||||||
@@ -35,7 +36,9 @@ ol.WEBGL_TEXTURE_CACHE_HIGH_WATER_MARK = 1024;
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @typedef {{buffer: WebGLBuffer}}
|
* @typedef {{buf: ol.structs.Buffer,
|
||||||
|
* buffer: WebGLBuffer,
|
||||||
|
* dirtySet: ol.structs.IntegerSet}}
|
||||||
*/
|
*/
|
||||||
ol.renderer.webgl.BufferCacheEntry;
|
ol.renderer.webgl.BufferCacheEntry;
|
||||||
|
|
||||||
@@ -241,13 +244,11 @@ goog.inherits(ol.renderer.webgl.Map, ol.renderer.Map);
|
|||||||
ol.renderer.webgl.Map.prototype.bindBuffer = function(target, buf) {
|
ol.renderer.webgl.Map.prototype.bindBuffer = function(target, buf) {
|
||||||
var gl = this.getGL();
|
var gl = this.getGL();
|
||||||
var arr = buf.getArray();
|
var arr = buf.getArray();
|
||||||
// FIXME dirty set should be in buffer cache
|
|
||||||
var dirtySet = buf.getDirtySet();
|
|
||||||
var bufferKey = goog.getUid(buf);
|
var bufferKey = goog.getUid(buf);
|
||||||
if (bufferKey in this.bufferCache_) {
|
if (bufferKey in this.bufferCache_) {
|
||||||
var bufferCacheEntry = this.bufferCache_[bufferKey];
|
var bufferCacheEntry = this.bufferCache_[bufferKey];
|
||||||
gl.bindBuffer(target, bufferCacheEntry.buffer);
|
gl.bindBuffer(target, bufferCacheEntry.buffer);
|
||||||
dirtySet.forEachRange(function(start, stop) {
|
bufferCacheEntry.dirtySet.forEachRange(function(start, stop) {
|
||||||
// FIXME check if slice is really efficient here
|
// FIXME check if slice is really efficient here
|
||||||
var slice = arr.slice(start, stop);
|
var slice = arr.slice(start, stop);
|
||||||
gl.bufferSubData(
|
gl.bufferSubData(
|
||||||
@@ -257,6 +258,7 @@ ol.renderer.webgl.Map.prototype.bindBuffer = function(target, buf) {
|
|||||||
new Float32Array(slice) :
|
new Float32Array(slice) :
|
||||||
new Uint16Array(slice));
|
new Uint16Array(slice));
|
||||||
});
|
});
|
||||||
|
bufferCacheEntry.dirtySet.clear();
|
||||||
} else {
|
} else {
|
||||||
var buffer = gl.createBuffer();
|
var buffer = gl.createBuffer();
|
||||||
gl.bindBuffer(target, buffer);
|
gl.bindBuffer(target, buffer);
|
||||||
@@ -266,11 +268,14 @@ ol.renderer.webgl.Map.prototype.bindBuffer = function(target, buf) {
|
|||||||
target == goog.webgl.ARRAY_BUFFER ?
|
target == goog.webgl.ARRAY_BUFFER ?
|
||||||
new Float32Array(arr) : new Uint16Array(arr),
|
new Float32Array(arr) : new Uint16Array(arr),
|
||||||
goog.webgl.STATIC_DRAW);
|
goog.webgl.STATIC_DRAW);
|
||||||
|
var dirtySet = new ol.structs.IntegerSet();
|
||||||
|
buf.addDirtySet(dirtySet);
|
||||||
this.bufferCache_[bufferKey] = {
|
this.bufferCache_[bufferKey] = {
|
||||||
buffer: buffer
|
buf: buf,
|
||||||
|
buffer: buffer,
|
||||||
|
dirtySet: dirtySet
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
dirtySet.clear();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -343,6 +348,7 @@ ol.renderer.webgl.Map.prototype.deleteBuffer = function(buf) {
|
|||||||
var bufferKey = goog.getUid(buf);
|
var bufferKey = goog.getUid(buf);
|
||||||
goog.asserts.assert(bufferKey in this.bufferCache_);
|
goog.asserts.assert(bufferKey in this.bufferCache_);
|
||||||
var bufferCacheEntry = this.bufferCache_[bufferKey];
|
var bufferCacheEntry = this.bufferCache_[bufferKey];
|
||||||
|
bufferCacheEntry.buf.removeDirtySet(bufferCacheEntry.dirtySet);
|
||||||
if (!gl.isContextLost()) {
|
if (!gl.isContextLost()) {
|
||||||
gl.deleteBuffer(bufferCacheEntry.buffer);
|
gl.deleteBuffer(bufferCacheEntry.buffer);
|
||||||
}
|
}
|
||||||
@@ -355,6 +361,9 @@ ol.renderer.webgl.Map.prototype.deleteBuffer = function(buf) {
|
|||||||
*/
|
*/
|
||||||
ol.renderer.webgl.Map.prototype.disposeInternal = function() {
|
ol.renderer.webgl.Map.prototype.disposeInternal = function() {
|
||||||
var gl = this.getGL();
|
var gl = this.getGL();
|
||||||
|
goog.object.forEach(this.bufferCache_, function(bufferCacheEntry) {
|
||||||
|
bufferCacheEntry.buf.removeDirtySet(bufferCacheEntry.dirtySet);
|
||||||
|
});
|
||||||
if (!gl.isContextLost()) {
|
if (!gl.isContextLost()) {
|
||||||
goog.object.forEach(this.bufferCache_, function(bufferCacheEntry) {
|
goog.object.forEach(this.bufferCache_, function(bufferCacheEntry) {
|
||||||
gl.deleteBuffer(bufferCacheEntry.buffer);
|
gl.deleteBuffer(bufferCacheEntry.buffer);
|
||||||
|
|||||||
Reference in New Issue
Block a user