function testOutputTextureIsClonedWhenRecompiling(mode) { const gpu = new GPU({ mode }); const kernel = gpu.createKernel(function(value) { return value[this.thread.x] + 1; }, { output: [1], immutable: true, pipeline: true }); const result1 = kernel([1]); assert.equal(result1.toArray()[0], 2); const result2 = kernel(result1); result1.delete(); assert.equal(result2.toArray()[0], 3); result2.delete(); const result3 = kernel([3]); assert.equal(result3.toArray()[0], 4); const result4 = kernel(result3); result3.delete(); assert.equal(result4.toArray()[0], 5); result4.delete(); gpu.destroy(); }
function testImmutableKernelTextureRecycling(precision, mode) { const gpu = new GPU({ mode }); const kernel = gpu.createKernel(function(v) { return v[0] + 1; }, { output: [1], pipeline: true, immutable: true, precision, }); let result = kernel([0]); const newTextureSpy = sinon.spy(kernel.texture.constructor.prototype, 'newTexture'); for (let i = 0; i < 10; i++) { let lastResult = result; result = kernel(result); lastResult.delete(); } assert.deepEqual(result.toArray(), new Float32Array([11])); assert.equal(newTextureSpy.callCount, 1); assert.equal(gpu.kernels.length, 2); newTextureSpy.restore(); gpu.destroy(); }
assert.notEqual(toTexture.texture.texture, one.texture); assert.equal(two.texture._refs, 2); one.delete(); two.delete(); assert.equal(one.texture._refs, 0); assert.equal(two.texture._refs, 1); // still used by toTexture.texture two.delete(); // already deleted assert.equal(two.texture._refs, 1); // still used by toTexture gpu.destroy()
assert.equal(result.texture._refs, 7); clone1.delete(); assert.equal(result.texture._refs, 6); clone2.delete(); assert.equal(result.texture._refs, 5); clone3.delete(); assert.equal(result.texture._refs, 4); clone4.delete(); assert.equal(result.texture._refs, 3); clone5.delete(); assert.equal(result.texture._refs, 2); result.delete(); assert.equal(result.texture._refs, 1); const spy = sinon.spy(kernel.kernel.context, 'deleteTexture');
/** * @param {Array} newCharacters * @returns {Function({nickname: string})} */ const _deleteCharacter = (newCharacters) => ({ nickname }) => { const character = newCharacters.get(nickname); if (character === undefined) return; if (character.isMine()) setMyCharacter(() => null); newCharacters.delete(nickname); }