You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
136 lines
3.9 KiB
JavaScript
136 lines
3.9 KiB
JavaScript
import BoundingRectangle from "../Core/BoundingRectangle.js";
|
|
import Check from "../Core/Check.js";
|
|
import Color from "../Core/Color.js";
|
|
import defined from "../Core/defined.js";
|
|
import destroyObject from "../Core/destroyObject.js";
|
|
import DeveloperError from "../Core/DeveloperError.js";
|
|
import PrimitiveType from "../Core/PrimitiveType.js";
|
|
import ViewportQuadVS from "../Shaders/ViewportQuadVS.js";
|
|
import ClearCommand from "./ClearCommand.js";
|
|
import DrawCommand from "./DrawCommand.js";
|
|
import Framebuffer from "./Framebuffer.js";
|
|
import RenderState from "./RenderState.js";
|
|
import ShaderProgram from "./ShaderProgram.js";
|
|
|
|
/**
|
|
* @private
|
|
*/
|
|
function ComputeEngine(context) {
|
|
this._context = context;
|
|
}
|
|
|
|
var renderStateScratch;
|
|
var drawCommandScratch = new DrawCommand({
|
|
primitiveType: PrimitiveType.TRIANGLES,
|
|
});
|
|
var clearCommandScratch = new ClearCommand({
|
|
color: new Color(0.0, 0.0, 0.0, 0.0),
|
|
});
|
|
|
|
function createFramebuffer(context, outputTexture) {
|
|
return new Framebuffer({
|
|
context: context,
|
|
colorTextures: [outputTexture],
|
|
destroyAttachments: false,
|
|
});
|
|
}
|
|
|
|
function createViewportQuadShader(context, fragmentShaderSource) {
|
|
return ShaderProgram.fromCache({
|
|
context: context,
|
|
vertexShaderSource: ViewportQuadVS,
|
|
fragmentShaderSource: fragmentShaderSource,
|
|
attributeLocations: {
|
|
position: 0,
|
|
textureCoordinates: 1,
|
|
},
|
|
});
|
|
}
|
|
|
|
function createRenderState(width, height) {
|
|
if (
|
|
!defined(renderStateScratch) ||
|
|
renderStateScratch.viewport.width !== width ||
|
|
renderStateScratch.viewport.height !== height
|
|
) {
|
|
renderStateScratch = RenderState.fromCache({
|
|
viewport: new BoundingRectangle(0, 0, width, height),
|
|
});
|
|
}
|
|
return renderStateScratch;
|
|
}
|
|
|
|
ComputeEngine.prototype.execute = function (computeCommand) {
|
|
//>>includeStart('debug', pragmas.debug);
|
|
Check.defined("computeCommand", computeCommand);
|
|
//>>includeEnd('debug');
|
|
|
|
// This may modify the command's resources, so do error checking afterwards
|
|
if (defined(computeCommand.preExecute)) {
|
|
computeCommand.preExecute(computeCommand);
|
|
}
|
|
|
|
//>>includeStart('debug', pragmas.debug);
|
|
if (
|
|
!defined(computeCommand.fragmentShaderSource) &&
|
|
!defined(computeCommand.shaderProgram)
|
|
) {
|
|
throw new DeveloperError(
|
|
"computeCommand.fragmentShaderSource or computeCommand.shaderProgram is required."
|
|
);
|
|
}
|
|
|
|
Check.defined("computeCommand.outputTexture", computeCommand.outputTexture);
|
|
//>>includeEnd('debug');
|
|
|
|
var outputTexture = computeCommand.outputTexture;
|
|
var width = outputTexture.width;
|
|
var height = outputTexture.height;
|
|
|
|
var context = this._context;
|
|
var vertexArray = defined(computeCommand.vertexArray)
|
|
? computeCommand.vertexArray
|
|
: context.getViewportQuadVertexArray();
|
|
var shaderProgram = defined(computeCommand.shaderProgram)
|
|
? computeCommand.shaderProgram
|
|
: createViewportQuadShader(context, computeCommand.fragmentShaderSource);
|
|
var framebuffer = createFramebuffer(context, outputTexture);
|
|
var renderState = createRenderState(width, height);
|
|
var uniformMap = computeCommand.uniformMap;
|
|
|
|
var clearCommand = clearCommandScratch;
|
|
clearCommand.framebuffer = framebuffer;
|
|
clearCommand.renderState = renderState;
|
|
clearCommand.execute(context);
|
|
|
|
var drawCommand = drawCommandScratch;
|
|
drawCommand.vertexArray = vertexArray;
|
|
drawCommand.renderState = renderState;
|
|
drawCommand.shaderProgram = shaderProgram;
|
|
drawCommand.uniformMap = uniformMap;
|
|
drawCommand.framebuffer = framebuffer;
|
|
drawCommand.execute(context);
|
|
|
|
framebuffer.destroy();
|
|
|
|
if (!computeCommand.persists) {
|
|
shaderProgram.destroy();
|
|
if (defined(computeCommand.vertexArray)) {
|
|
vertexArray.destroy();
|
|
}
|
|
}
|
|
|
|
if (defined(computeCommand.postExecute)) {
|
|
computeCommand.postExecute(outputTexture);
|
|
}
|
|
};
|
|
|
|
ComputeEngine.prototype.isDestroyed = function () {
|
|
return false;
|
|
};
|
|
|
|
ComputeEngine.prototype.destroy = function () {
|
|
return destroyObject(this);
|
|
};
|
|
export default ComputeEngine;
|