diff options
author | gdkchan <gab.dark.100@gmail.com> | 2021-04-02 11:33:39 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-02 16:33:39 +0200 |
commit | f665e1b40969d1673c7a12c44235aefb2a2ea627 (patch) | |
tree | b97dc6b308ffb3b8ccacd09c9eaa2512a0c2fdd8 /Ryujinx.Graphics.Gpu/Image/TextureManager.cs | |
parent | 9ae60207c4e93388b97e10af5ead090a038f8a7c (diff) |
Hold reference for render targets in use (#2156)
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Image/TextureManager.cs')
-rw-r--r-- | Ryujinx.Graphics.Gpu/Image/TextureManager.cs | 52 |
1 files changed, 26 insertions, 26 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/TextureManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureManager.cs index 2b756e4c..17bb553f 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureManager.cs +++ b/Ryujinx.Graphics.Gpu/Image/TextureManager.cs @@ -198,6 +198,27 @@ namespace Ryujinx.Graphics.Gpu.Image } /// <summary> + /// Sets the render target depth-stencil buffer. + /// </summary> + /// <param name="depthStencil">The depth-stencil buffer texture</param> + /// <returns>True if render target scale must be updated.</returns> + public bool SetRenderTargetDepthStencil(Texture depthStencil) + { + bool hasValue = depthStencil != null; + bool changesScale = (hasValue != (_rtDepthStencil != null)) || (hasValue && RenderTargetScale != depthStencil.ScaleFactor); + + if (_rtDepthStencil != depthStencil) + { + _rtDepthStencil?.SignalModifying(false); + depthStencil?.SignalModifying(true); + + _rtDepthStencil = depthStencil; + } + + return changesScale || (hasValue && depthStencil.ScaleMode != TextureScaleMode.Blacklisted && depthStencil.ScaleFactor != GraphicsConfig.ResScale); + } + + /// <summary> /// Gets the first available bound colour target, or the depth stencil target if not present. /// </summary> /// <returns>The first bound colour target, otherwise the depth stencil target</returns> @@ -291,27 +312,6 @@ namespace Ryujinx.Graphics.Gpu.Image } /// <summary> - /// Sets the render target depth-stencil buffer. - /// </summary> - /// <param name="depthStencil">The depth-stencil buffer texture</param> - /// <returns>True if render target scale must be updated.</returns> - public bool SetRenderTargetDepthStencil(Texture depthStencil) - { - bool hasValue = depthStencil != null; - bool changesScale = (hasValue != (_rtDepthStencil != null)) || (hasValue && RenderTargetScale != depthStencil.ScaleFactor); - - if (_rtDepthStencil != depthStencil) - { - _rtDepthStencil?.SignalModifying(false); - depthStencil?.SignalModifying(true); - - _rtDepthStencil = depthStencil; - } - - return changesScale || (hasValue && depthStencil.ScaleMode != TextureScaleMode.Blacklisted && depthStencil.ScaleFactor != GraphicsConfig.ResScale); - } - - /// <summary> /// Commits bindings on the compute pipeline. /// </summary> public void CommitComputeBindings() @@ -716,7 +716,7 @@ namespace Ryujinx.Graphics.Gpu.Image // If they don't, it may still be mapped to the same physical region, so we // do a more expensive check to tell if they are mapped into the same physical regions. // If the GPU VA for the texture has ever been unmapped, then the range must be checked regardless. - if ((overlap.Info.GpuAddress != info.GpuAddress || overlap.ChangedMapping) && + if ((overlap.Info.GpuAddress != info.GpuAddress || overlap.ChangedMapping) && !_context.MemoryManager.CompareRange(overlap.Range, info.GpuAddress)) { continue; @@ -775,7 +775,7 @@ namespace Ryujinx.Graphics.Gpu.Image Array.Resize(ref _overlapInfo, _textureOverlaps.Length); } - // =============== Find Texture View of Existing Texture =============== + // =============== Find Texture View of Existing Texture =============== int fullyCompatible = 0; @@ -841,7 +841,7 @@ namespace Ryujinx.Graphics.Gpu.Image if (texture != null) { // This texture could be a view of multiple parent textures with different storages, even if it is a view. - // When a texture is created, make sure all possible dependencies to other textures are created as copies. + // When a texture is created, make sure all possible dependencies to other textures are created as copies. // (even if it could be fulfilled without a copy) for (int index = 0; index < overlapsCount; index++) @@ -859,7 +859,7 @@ namespace Ryujinx.Graphics.Gpu.Image texture.SynchronizeMemory(); } - // =============== Create a New Texture =============== + // =============== Create a New Texture =============== // No match, create a new texture. if (texture == null) @@ -993,7 +993,7 @@ namespace Ryujinx.Graphics.Gpu.Image overlap.ReplaceView(texture, overlapInfo, newView, oInfo.FirstLayer, oInfo.FirstLevel); } } - + texture.SynchronizeMemory(); } |