public void SetRenderTarget(RenderTarget2D newRenderTarget, bool setParams = true, bool isPushPop = false) { unchecked { RenderTargetChangeIndex++; } Device.SetRenderTarget(newRenderTarget); CachedCurrentRenderTarget = new RenderTargetStackEntry(newRenderTarget); ResetDeviceState(newRenderTarget, setParams); }
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); }
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)); } }
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 }
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(); }