"use strict";
|
/**
|
* @license
|
* Copyright 2017 Google Inc. All Rights Reserved.
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
* you may not use this file except in compliance with the License.
|
* You may obtain a copy of the License at
|
*
|
* http://www.apache.org/licenses/LICENSE-2.0
|
*
|
* Unless required by applicable law or agreed to in writing, software
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
* See the License for the specific language governing permissions and
|
* limitations under the License.
|
* =============================================================================
|
*/
|
Object.defineProperty(exports, "__esModule", { value: true });
|
var environment_1 = require("../../environment");
|
var tex_util_1 = require("./tex_util");
|
var TextureManager = /** @class */ (function () {
|
function TextureManager(gpgpu) {
|
this.gpgpu = gpgpu;
|
this.numUsedTextures = 0;
|
this.numFreeTextures = 0;
|
this.freeTextures = {};
|
this.logEnabled = false;
|
this.usedTextures = {};
|
}
|
TextureManager.prototype.acquireTexture = function (shapeRC, usage, isPacked) {
|
var physicalTexType = getPhysicalFromLogicalTextureType(usage, isPacked);
|
var shapeKey = getKeyFromTextureShape(shapeRC, physicalTexType, isPacked);
|
if (!(shapeKey in this.freeTextures)) {
|
this.freeTextures[shapeKey] = [];
|
}
|
if (!(shapeKey in this.usedTextures)) {
|
this.usedTextures[shapeKey] = [];
|
}
|
if (this.freeTextures[shapeKey].length > 0) {
|
this.numFreeTextures--;
|
this.numUsedTextures++;
|
this.log();
|
var newTexture_1 = this.freeTextures[shapeKey].shift();
|
this.usedTextures[shapeKey].push(newTexture_1);
|
return newTexture_1;
|
}
|
this.numUsedTextures++;
|
this.log();
|
var newTexture;
|
if (physicalTexType === tex_util_1.PhysicalTextureType.PACKED_2X2_FLOAT32) {
|
newTexture = this.gpgpu.createPackedMatrixTexture(shapeRC[0], shapeRC[1]);
|
}
|
else if (physicalTexType === tex_util_1.PhysicalTextureType.PACKED_2X2_FLOAT16) {
|
newTexture =
|
this.gpgpu.createFloat16PackedMatrixTexture(shapeRC[0], shapeRC[1]);
|
}
|
else if (physicalTexType === tex_util_1.PhysicalTextureType.UNPACKED_FLOAT32) {
|
newTexture =
|
this.gpgpu.createFloat32MatrixTexture(shapeRC[0], shapeRC[1]);
|
}
|
else if (physicalTexType === tex_util_1.PhysicalTextureType.UNPACKED_FLOAT16) {
|
newTexture =
|
this.gpgpu.createFloat16MatrixTexture(shapeRC[0], shapeRC[1]);
|
}
|
else if (physicalTexType === tex_util_1.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE) {
|
newTexture =
|
this.gpgpu.createUnsignedBytesMatrixTexture(shapeRC[0], shapeRC[1]);
|
}
|
this.usedTextures[shapeKey].push(newTexture);
|
return newTexture;
|
};
|
TextureManager.prototype.releaseTexture = function (texture, shape, logicalTexType, isPacked) {
|
if (this.freeTextures == null) {
|
// Already disposed.
|
return;
|
}
|
var physicalTexType = getPhysicalFromLogicalTextureType(logicalTexType, isPacked);
|
var shapeKey = getKeyFromTextureShape(shape, physicalTexType, isPacked);
|
if (!(shapeKey in this.freeTextures)) {
|
this.freeTextures[shapeKey] = [];
|
}
|
this.freeTextures[shapeKey].push(texture);
|
this.numFreeTextures++;
|
this.numUsedTextures--;
|
var texList = this.usedTextures[shapeKey];
|
var texIndex = texList.indexOf(texture);
|
if (texIndex < 0) {
|
throw new Error('Cannot release a texture that was never provided by this ' +
|
'texture manager');
|
}
|
texList.splice(texIndex, 1);
|
this.log();
|
};
|
TextureManager.prototype.log = function () {
|
if (!this.logEnabled) {
|
return;
|
}
|
var total = this.numFreeTextures + this.numUsedTextures;
|
console.log('Free/Used', this.numFreeTextures + " / " + this.numUsedTextures, "(" + total + ")");
|
};
|
TextureManager.prototype.getNumUsedTextures = function () {
|
return this.numUsedTextures;
|
};
|
TextureManager.prototype.getNumFreeTextures = function () {
|
return this.numFreeTextures;
|
};
|
TextureManager.prototype.dispose = function () {
|
var _this = this;
|
if (this.freeTextures == null) {
|
// Already disposed.
|
return;
|
}
|
for (var texShape in this.freeTextures) {
|
this.freeTextures[texShape].forEach(function (tex) {
|
_this.gpgpu.deleteMatrixTexture(tex);
|
});
|
}
|
for (var texShape in this.usedTextures) {
|
this.usedTextures[texShape].forEach(function (tex) {
|
_this.gpgpu.deleteMatrixTexture(tex);
|
});
|
}
|
this.freeTextures = null;
|
this.usedTextures = null;
|
this.numUsedTextures = 0;
|
this.numFreeTextures = 0;
|
};
|
return TextureManager;
|
}());
|
exports.TextureManager = TextureManager;
|
function getPhysicalTextureForRendering(isPacked) {
|
if (environment_1.env().getBool('WEBGL_RENDER_FLOAT32_ENABLED')) {
|
if (isPacked) {
|
return tex_util_1.PhysicalTextureType.PACKED_2X2_FLOAT32;
|
}
|
return tex_util_1.PhysicalTextureType.UNPACKED_FLOAT32;
|
}
|
if (isPacked) {
|
return tex_util_1.PhysicalTextureType.PACKED_2X2_FLOAT16;
|
}
|
return tex_util_1.PhysicalTextureType.UNPACKED_FLOAT16;
|
}
|
function getPhysicalFromLogicalTextureType(logicalTexType, isPacked) {
|
if (logicalTexType === tex_util_1.TextureUsage.UPLOAD) {
|
return tex_util_1.PhysicalTextureType.PACKED_2X2_FLOAT32;
|
}
|
else if (logicalTexType === tex_util_1.TextureUsage.RENDER || logicalTexType == null) {
|
return getPhysicalTextureForRendering(isPacked);
|
}
|
else if (logicalTexType === tex_util_1.TextureUsage.DOWNLOAD ||
|
logicalTexType === tex_util_1.TextureUsage.PIXELS) {
|
return tex_util_1.PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE;
|
}
|
throw new Error("Unknown logical texture type " + logicalTexType);
|
}
|
function getKeyFromTextureShape(shapeRowsCol, physicalTexType, isPacked) {
|
return shapeRowsCol[0] + "_" + shapeRowsCol[1] + "_" + physicalTexType + "_" + isPacked;
|
}
|
//# sourceMappingURL=texture_manager.js.map
|