/**
    Constructor based on existing host memory. Will keep any region of interest
    valid, by determining 'intersection' of regions.
    @param data existing device memroy
    @param ofs offset to new region
    @param _size size of new region
  */
  inline HostMemoryReference( HostMemory<Type, Dim> &data, const Size<Dim> &ofs,
                              const Size<Dim> &_size):
    Layout<Type, Dim>(data),
    Pointer<Type, Dim>(data),
    HostMemory<Type, Dim>(data)
  {
    this->buffer = data.getBuffer() + data.getOffset(ofs);
    this->size = _size;

    for(int i = Dim; i--;)
    {
      // Min and Max did not work here !!!
      int new_ofs = (int)this->region_ofs[i]-(int)ofs[i];
      if (new_ofs < 0)
        new_ofs = 0;
      if (new_ofs > (int)this->size[i])
        new_ofs = (int)this->size[i];
      this->region_ofs[i] = new_ofs;
      int new_size = this->region_size[i];
      if (this->region_size[i] > this->size[i] - this->region_ofs[i])
        new_size = this->size[i] - this->region_ofs[i];
      this->region_size[i] = new_size;
    }
  }
void
copy(Texture<Type, Dim> &dst, const HostMemory<Type, Dim> &src)
{
  CUDA_CHECK_SIZE;
  dst.glTexSubImage(src.getBuffer());
}