예제 #1
0
 public void SetRenderTarget(RenderTarget2D newRenderTarget, bool setParams = true, bool isPushPop = false)
 {
     unchecked { RenderTargetChangeIndex++; }
     Device.SetRenderTarget(newRenderTarget);
     CachedCurrentRenderTarget = new RenderTargetStackEntry(newRenderTarget);
     ResetDeviceState(newRenderTarget, setParams);
 }
예제 #2
0
 private void SetRenderTargets(RenderTargetStackEntry entry, bool setParams = true, bool isPushPop = false)
 {
     unchecked { RenderTargetChangeIndex++; }
     CachedCurrentRenderTarget = entry;
     if (entry.Count <= 1)
     {
         Device.SetRenderTarget(entry.First);
         CachedCurrentRenderTarget = entry;
     }
     else
     {
         Device.SetRenderTargets(entry.Multiple);
     }
     ResetDeviceState(entry.First, setParams);
 }
예제 #3
0
            public bool Equals(RenderTargetStackEntry entry)
            {
                if (entry.Count != Count)
                {
                    return(false);
                }

                if (Count == 1)
                {
                    return(object.ReferenceEquals(entry.First, First));
                }
                else
                {
                    return(object.ReferenceEquals(entry.Single, Single) &&
                           object.ReferenceEquals(entry.Multiple, Multiple));
                }
            }
예제 #4
0
        public void AssertRenderTarget(RenderTarget2D renderTarget)
        {
#if DEBUG
            var currentRenderTargets      = Device.GetRenderTargets();
            var cachedCurrentRenderTarget = CachedCurrentRenderTarget;
            var actualCurrentRenderTarget = new RenderTargetStackEntry(currentRenderTargets);
            if (!cachedCurrentRenderTarget.Equals(actualCurrentRenderTarget))
            {
                throw new Exception("Mismatch between cached and actual render target(s)");
            }

            foreach (var crt in currentRenderTargets)
            {
                if (crt.RenderTarget == renderTarget)
                {
                    return;
                }
            }
            throw new Exception("Render target was not bound.");
#endif
        }
예제 #5
0
        internal void UpdateTargetInfo(RenderTarget2D target, bool knownTarget, bool setParams)
        {
            if (knownTarget)
            {
                // HACK: Don't reconstruct to avoid destroying an existing stack trace
                if (CachedCurrentRenderTarget.First != target)
                {
                    CachedCurrentRenderTarget = new RenderTargetStackEntry(target);
                }
            }
            else if (ParanoidRenderTargetChecks)
            {
                var rts = Device.GetRenderTargets();
                if ((rts == null) || (rts.Length == 0))
                {
                    CachedCurrentRenderTarget = RenderTargetStackEntry.None;
                }
                else
                {
                    CachedCurrentRenderTarget = new RenderTargetStackEntry(rts, CachedCurrentRenderTarget.Batch, CachedCurrentRenderTarget.StackTrace);
                }
            }

            var target1     = CachedCurrentRenderTarget.First;
            var targetWidth = target1 != null
                ? target1.Width
                : Device.PresentationParameters.BackBufferWidth;
            var targetHeight = target1 != null
                ? target1.Height
                : Device.PresentationParameters.BackBufferHeight;

            /*
             * Some sources claim in GL it's based on the viewport, but it is not on geforce at least
             * var targetWidth = Device.Viewport.Width;
             * var targetHeight = Device.Viewport.Height;
             */

            var material = CurrentMaterial;

            if (material == null)
            {
                return;
            }

            var rtd = material.Parameters?.RenderTargetDimensions;

            if (rtd == null)
            {
                return;
            }

            if (!setParams)
            {
                return;
            }

            if (NeedsYFlip)
            {
                if (CachedCurrentRenderTarget.First == null)
                {
                    targetHeight *= -1;
                }
            }

            rtd.SetValue(new Vector2(targetWidth, targetHeight));

            // material.Flush();
        }