Example #1
0
        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);
            }
        }
Example #2
0
        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));
            }
        }
Example #3
0
        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);
            }
        }
Example #4
0
 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);
 }
Example #5
0
        public void Flush()
        {
            ThreadedHelpers.SpinUntilNonNull(ref Base);

            Base.Flush();
        }