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
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"
|
|
);
|