anchor.diff:  
       static member Expr = add
   
  +type private ScanRange = { offset : int; delta : int; count : int }
  +
   type private ScanImage2d(runtime : IComputeRuntime, add : Expr<V4d -> V4d -> V4d>) =
   
       static let ceilDiv (v : int) (d : int) =
  
positive.code:     let mk2d (dim : int) (x : int) (y : int) =
          if dim = 0 then V2i(x,y)
          else V2i(y,x)
  
      [<LocalSize(X = halfScanSize, Y = 1)>]
      let scanImageKernel2dTexture (add : Expr<V4d -> V4d -> V4d>) (dim : int) (outputImage : Image2d<Formats.rgba32f>) =
  
negative.code:             yield ComputeCommand.Bind scanTexture
              yield ComputeCommand.SetInput xInput
              yield ComputeCommand.Dispatch(V2i(ceilDiv input.Size.X Kernels.scanSize, input.Size.Y))
              yield ComputeCommand.Sync(output.Texture)
  
              let xRange = { offset = 0; delta = 1; count = input.Size.X }
              yield! buildDim args 0 output (next xRange)
              if xRange.count > Kernels.scanSize then
                  yield! repair args 0 output xRange
  
              let yRange = { offset = 0; delta = 1; count = input.Size.Y }
              yield! buildDim args 1 output yRange
          ]
  
  
  