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.

157 lines
5.0 KiB
JavaScript

import { BoundingRectangle } from "../../Source/Cesium.js";
import { PixelFormat } from "../../Source/Cesium.js";
import { Buffer } from "../../Source/Cesium.js";
import { BufferUsage } from "../../Source/Cesium.js";
import { ComputeCommand } from "../../Source/Cesium.js";
import { ShaderProgram } from "../../Source/Cesium.js";
import { Texture } from "../../Source/Cesium.js";
import { VertexArray } from "../../Source/Cesium.js";
import { Material } from "../../Source/Cesium.js";
import { ViewportQuad } from "../../Source/Cesium.js";
import createScene from "../createScene.js";
describe(
"Renderer/ComputeCommand",
function () {
var scene;
var context;
beforeAll(function () {
scene = createScene();
context = scene.context;
});
afterAll(function () {
scene.destroyForSpecs();
});
afterEach(function () {
scene.primitives.removeAll();
});
function CommandMockPrimitive(command) {
this.update = function (frameState) {
frameState.commandList.push(command);
};
this.destroy = function () {};
}
it("throws if no shader is provided", function () {
var outputTexture = new Texture({
context: context,
width: 1,
height: 1,
pixelFormat: PixelFormat.RGBA,
});
var computeCommand = new ComputeCommand({
outputTexture: outputTexture,
});
scene.primitives.add(new CommandMockPrimitive(computeCommand));
expect(function () {
scene.renderForSpecs();
}).toThrowDeveloperError();
});
it("throws if no output texture is provided", function () {
var computeCommand = new ComputeCommand({
fragmentShaderSource: "void main() { gl_FragColor = vec4(1.0); }",
});
scene.primitives.add(new CommandMockPrimitive(computeCommand));
expect(function () {
scene.renderForSpecs();
}).toThrowDeveloperError();
});
it("renderer resources are preserved or destroyed based on the persists flag", function () {
var vertexShader =
"attribute vec4 position; void main() { gl_PointSize = 1.0; gl_Position = position; }";
var fragmentShader = "void main() { gl_FragColor = vec4(1.0); }";
var shaderProgram = ShaderProgram.fromCache({
context: context,
vertexShaderSource: vertexShader,
fragmentShaderSource: fragmentShader,
attributeLocations: {
position: 0,
},
});
var vertexArray = new VertexArray({
context: context,
attributes: [
{
index: 0,
vertexBuffer: Buffer.createVertexBuffer({
context: context,
typedArray: new Float32Array([0, 0, 0, 1]),
usage: BufferUsage.STATIC_DRAW,
}),
componentsPerAttribute: 4,
},
],
});
var outputTexture = new Texture({
context: context,
width: 1,
height: 1,
pixelFormat: PixelFormat.RGBA,
});
var computeCommand = new ComputeCommand({
vertexArray: vertexArray,
shaderProgram: shaderProgram,
outputTexture: outputTexture,
});
// check that resources are preserved when persists is true
computeCommand.persists = true;
scene.primitives.add(new CommandMockPrimitive(computeCommand));
scene.renderForSpecs();
context.shaderCache.destroyReleasedShaderPrograms();
scene.primitives.removeAll();
expect(shaderProgram.isDestroyed()).toEqual(false);
expect(vertexArray.isDestroyed()).toEqual(false);
expect(outputTexture.isDestroyed()).toEqual(false);
// check that resources are destroyed when persists is false, except
// outputTexture which is always preserved
computeCommand.persists = false;
scene.primitives.add(new CommandMockPrimitive(computeCommand));
scene.renderForSpecs();
context.shaderCache.destroyReleasedShaderPrograms();
scene.primitives.removeAll();
expect(shaderProgram.isDestroyed()).toEqual(true);
expect(vertexArray.isDestroyed()).toEqual(true);
expect(outputTexture.isDestroyed()).toEqual(false);
});
it("renders to a texture and draws that texture to the screen", function () {
var outputTexture = new Texture({
context: context,
width: 1,
height: 1,
pixelFormat: PixelFormat.RGBA,
});
var computeCommand = new ComputeCommand({
fragmentShaderSource: "void main() { gl_FragColor = vec4(1.0); }",
outputTexture: outputTexture,
});
var viewportQuad = new ViewportQuad();
viewportQuad.rectangle = new BoundingRectangle(0, 0, 1, 1);
viewportQuad.material = Material.fromType(Material.ImageType);
viewportQuad.material.uniforms.image = outputTexture;
expect(scene).toRender([0, 0, 0, 255]);
scene.primitives.add(new CommandMockPrimitive(computeCommand));
scene.primitives.add(viewportQuad);
expect(scene).notToRender([0, 0, 0, 255]);
});
},
"WebGL"
);