anchor.diff:    chronosGL.bindTransformFeedback(transform);
   
     ResizeIons(null);
  -  SelectRenderer(null);
   
     void animate(timeMs) {
  -    orbit.azimuth += 0.001;
  +    orbit.azimuth += 0.002;
       orbit.animate(0.0); // argument is not used
   
  -    if (programJS.enabled) UpdateIonsJS(0.06);
  -
  -    phase.draw([perspective]);
  -
  -    HTML.window.animationFrame.then(animate);
  -    fps.UpdateFrameCount(timeMs);
  -
  -    // use vertex shader output as input for next round
  -    if (programGPU.enabled) {
  +    if (gCpuCompute.checked) {
  +      UpdateIonsJS(0.06);
  +      programJS.Draw(mdJS, [perspective, matJS]);
  +    } else {
  +      programGPU.Draw(mdIn, [perspective, matGPU]);
  +      // use vertex shader output as input for next round
         chronosGL.bindBuffer(GL_ARRAY_BUFFER, mdIn.GetBuffer(aVertexPosition));
         chronosGL.bindBuffer(
             GL_TRANSFORM_FEEDBACK_BUFFER, mdOut.GetBuffer(aVertexPosition));
         chronosGL.copyBufferSubData(
             GL_TRANSFORM_FEEDBACK_BUFFER, GL_ARRAY_BUFFER, 0, 0, ions.length * 3);
       }
  +    HTML.window.animationFrame.then(animate);
  +    fps.UpdateFrameCount(timeMs);
     }
   
     gParticles.onChange.listen(ResizeIons);
  -  gCpuCompute.onChange.listen(SelectRenderer);
     animate(0.0);
   }
  
positive.code:   Perspective perspective = new Perspective(orbit, 0.1, 1000.0)
      ..AdjustAspect(width, height);
  
    RenderPhase phase = new RenderPhase("main", chronosGL)
      ..viewPortW = width
      ..viewPortH = height;
    RenderProgram programJS = phase.createProgram(createPointSpritesShader());
    RenderProgram programGPU = phase.createProgram(createParticleShader());
  
  
    List<Pole> srcPoles =
        MakeRowOfPoles([2.0, 1.0, 0.0, -1.0, -2.0], 0.0, 2.0, 3.0);
  
negative.code:   // JS version setup
    Material matJS = new Material.Transparent("stars", BlendEquationMix)
      ..SetUniform(uTexture, Utils.createParticleTexture(chronosGL))
      ..SetUniform(uModelMatrix, new VM.Matrix4.identity())
      ..SetUniform(uPointSize, 200.0);
    MeshData mdJS = programJS.MakeMeshData("mdJS", GL_POINTS)
      ..AddVertices(ionsPos);
  
    // GPU version setup
    Material matGPU = new Material.Transparent("stars", BlendEquationMix)
      ..SetUniform(uTexture, Utils.createParticleTexture(chronosGL))
      ..SetUniform(uModelMatrix, new VM.Matrix4.identity())
      ..SetUniform(uPointSize, 200.0)
      ..SetUniform(uSources, ExtractPolePos(srcPoles))
      ..SetUniform(uSinks, ExtractPolePos(dstPoles));
  