123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- 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;
- }
- let renderStateScratch;
- const drawCommandScratch = new DrawCommand({
- primitiveType: PrimitiveType.TRIANGLES,
- });
- const 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');
- const outputTexture = computeCommand.outputTexture;
- const width = outputTexture.width;
- const height = outputTexture.height;
- const context = this._context;
- const vertexArray = defined(computeCommand.vertexArray)
- ? computeCommand.vertexArray
- : context.getViewportQuadVertexArray();
- const shaderProgram = defined(computeCommand.shaderProgram)
- ? computeCommand.shaderProgram
- : createViewportQuadShader(context, computeCommand.fragmentShaderSource);
- const framebuffer = createFramebuffer(context, outputTexture);
- const renderState = createRenderState(width, height);
- const uniformMap = computeCommand.uniformMap;
- const clearCommand = clearCommandScratch;
- clearCommand.framebuffer = framebuffer;
- clearCommand.renderState = renderState;
- clearCommand.execute(context);
- const 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;
|