public bool ReserveForHostAccess() { if (Base != null) { return(Base.ReserveForHostAccess()); } else { bool result = true; // A very light lock, as this case is uncommon. ThreadedHelpers.SpinUntilExchange(ref _createLock, 1, 0); if (Base != null) { result = Base.ReserveForHostAccess(); } else { _reserved = true; } Volatile.Write(ref _createLock, 0); return(result); } }
public ReadOnlySpan <byte> GetData(int layer, int level) { if (_renderer.IsGpuThread()) { ResultBox <PinnedSpan <byte> > box = new ResultBox <PinnedSpan <byte> >(); _renderer.New <TextureGetDataSliceCommand>().Set(Ref(this), Ref(box), layer, level); _renderer.InvokeCommand(); return(box.Result.Get()); } else { ThreadedHelpers.SpinUntilNonNull(ref Base); return(Base.GetData(layer, level)); } }
public void CopyTo(ITexture destination, Extents2D srcRegion, Extents2D dstRegion, bool linearFilter) { ThreadedTexture dest = (ThreadedTexture)destination; if (_renderer.IsGpuThread()) { _renderer.New <TextureCopyToScaledCommand>().Set(Ref(this), Ref(dest), srcRegion, dstRegion, linearFilter); _renderer.QueueCommand(); } else { // Scaled copy can happen on another thread for a res scale flush. ThreadedHelpers.SpinUntilNonNull(ref Base); ThreadedHelpers.SpinUntilNonNull(ref dest.Base); Base.CopyTo(dest.Base, srcRegion, dstRegion, linearFilter); } }
public void Create(IRenderer renderer, CounterType type, System.EventHandler <ulong> eventHandler, bool hostReserved) { ThreadedHelpers.SpinUntilExchange(ref _createLock, 1, 0); Base = renderer.ReportCounter(type, eventHandler, hostReserved || _reserved); Volatile.Write(ref _createLock, 0); }
public void Flush() { ThreadedHelpers.SpinUntilNonNull(ref Base); Base.Flush(); }