import Check from "../Core/Check.js";
import defaultValue from "../Core/defaultValue.js";
import defined from "../Core/defined.js";
import destroyObject from "../Core/destroyObject.js";
import DeveloperError from "../Core/DeveloperError.js";
import Framebuffer from "./Framebuffer.js";
/**
* Creates a multisampling wrapper around two framebuffers with optional initial
* color and depth-stencil attachments. The first framebuffer has multisampled
* renderbuffer attachments and is bound to READ_FRAMEBUFFER during the blit. The
* second is bound to DRAW_FRAMEBUFFER during the blit, and has texture attachments
* to store the copied pixels.
*
* @param {object} options The initial framebuffer attachments. context
, width
, and height
are required. The possible properties are colorTextures
, colorRenderbuffers
, depthStencilTexture
, depthStencilRenderbuffer
, and destroyAttachments
.
*
* @exception {DeveloperError} Both color renderbuffer and texture attachments must be provided.
* @exception {DeveloperError} Both depth-stencil renderbuffer and texture attachments must be provided.
*
* @private
* @constructor
*/
function MultisampleFramebuffer(options) {
options = defaultValue(options, defaultValue.EMPTY_OBJECT);
const context = options.context;
const width = options.width;
const height = options.height;
//>>includeStart('debug', pragmas.debug);
Check.defined("options.context", context);
Check.defined("options.width", width);
Check.defined("options.height", height);
//>>includeEnd('debug');
this._width = width;
this._height = height;
const colorRenderbuffers = options.colorRenderbuffers;
const colorTextures = options.colorTextures;
if (defined(colorRenderbuffers) !== defined(colorTextures)) {
throw new DeveloperError(
"Both color renderbuffer and texture attachments must be provided."
);
}
const depthStencilRenderbuffer = options.depthStencilRenderbuffer;
const depthStencilTexture = options.depthStencilTexture;
if (defined(depthStencilRenderbuffer) !== defined(depthStencilTexture)) {
throw new DeveloperError(
"Both depth-stencil renderbuffer and texture attachments must be provided."
);
}
this._renderFramebuffer = new Framebuffer({
context: context,
colorRenderbuffers: colorRenderbuffers,
depthStencilRenderbuffer: depthStencilRenderbuffer,
destroyAttachments: options.destroyAttachments,
});
this._colorFramebuffer = new Framebuffer({
context: context,
colorTextures: colorTextures,
depthStencilTexture: depthStencilTexture,
destroyAttachments: options.destroyAttachments,
});
}
MultisampleFramebuffer.prototype.getRenderFramebuffer = function () {
return this._renderFramebuffer;
};
MultisampleFramebuffer.prototype.getColorFramebuffer = function () {
return this._colorFramebuffer;
};
MultisampleFramebuffer.prototype.blitFramebuffers = function (
context,
blitStencil
) {
this._renderFramebuffer.bindRead();
this._colorFramebuffer.bindDraw();
const gl = context._gl;
let mask = 0;
if (this._colorFramebuffer._colorTextures.length > 0) {
mask |= gl.COLOR_BUFFER_BIT;
}
if (defined(this._colorFramebuffer.depthStencilTexture)) {
mask |= gl.DEPTH_BUFFER_BIT | (blitStencil ? gl.STENCIL_BUFFER_BIT : 0);
}
gl.blitFramebuffer(
0,
0,
this._width,
this._height,
0,
0,
this._width,
this._height,
mask,
gl.NEAREST
);
gl.bindFramebuffer(gl.READ_FRAMEBUFFER, null);
gl.bindFramebuffer(gl.DRAW_FRAMEBUFFER, null);
};
MultisampleFramebuffer.prototype.isDestroyed = function () {
return false;
};
MultisampleFramebuffer.prototype.destroy = function () {
this._renderFramebuffer.destroy();
this._colorFramebuffer.destroy();
return destroyObject(this);
};
export default MultisampleFramebuffer;