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;