123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- 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;
|