diff options
Diffstat (limited to 'Ryujinx.Graphics.Gpu/Image')
-rw-r--r-- | Ryujinx.Graphics.Gpu/Image/Texture.cs | 14 | ||||
-rw-r--r-- | Ryujinx.Graphics.Gpu/Image/TextureManager.cs | 43 |
2 files changed, 56 insertions, 1 deletions
diff --git a/Ryujinx.Graphics.Gpu/Image/Texture.cs b/Ryujinx.Graphics.Gpu/Image/Texture.cs index eacfa4f5..b2fa15a2 100644 --- a/Ryujinx.Graphics.Gpu/Image/Texture.cs +++ b/Ryujinx.Graphics.Gpu/Image/Texture.cs @@ -48,6 +48,16 @@ namespace Ryujinx.Graphics.Gpu.Image public Target Target { get; private set; } /// <summary> + /// Texture width. + /// </summary> + public int Width { get; private set; } + + /// <summary> + /// Texture height. + /// </summary> + public int Height { get; private set; } + + /// <summary> /// Texture information. /// </summary> public TextureInfo Info { get; private set; } @@ -926,7 +936,7 @@ namespace Ryujinx.Graphics.Gpu.Image FlushTextureDataToGuest(tracked); } } - + /// <summary> /// Gets a host texture to use for flushing the texture, at 1x resolution. /// If the HostTexture is already at 1x resolution, it is returned directly. @@ -1322,6 +1332,8 @@ namespace Ryujinx.Graphics.Gpu.Image { Info = info; Target = info.Target; + Width = info.Width; + Height = info.Height; CanForceAnisotropy = CanTextureForceAnisotropy(); _depth = info.GetDepth(); diff --git a/Ryujinx.Graphics.Gpu/Image/TextureManager.cs b/Ryujinx.Graphics.Gpu/Image/TextureManager.cs index 70cb57d0..90e26442 100644 --- a/Ryujinx.Graphics.Gpu/Image/TextureManager.cs +++ b/Ryujinx.Graphics.Gpu/Image/TextureManager.cs @@ -19,6 +19,9 @@ namespace Ryujinx.Graphics.Gpu.Image private Texture _rtDepthStencil; private ITexture _rtHostDs; + public int ClipRegionWidth { get; private set; } + public int ClipRegionHeight { get; private set; } + /// <summary> /// The scaling factor applied to all currently bound render targets. /// </summary> @@ -211,6 +214,17 @@ namespace Ryujinx.Graphics.Gpu.Image } /// <summary> + /// Sets the host clip region, which should be the intersection of all render target texture sizes. + /// </summary> + /// <param name="width">Width of the clip region, defined as the minimum width across all bound textures</param> + /// <param name="height">Height of the clip region, defined as the minimum height across all bound textures</param> + public void SetClipRegion(int width, int height) + { + ClipRegionWidth = width; + ClipRegionHeight = height; + } + + /// <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> @@ -410,6 +424,35 @@ namespace Ryujinx.Graphics.Gpu.Image } /// <summary> + /// Update host framebuffer attachments based on currently bound render target buffers. + /// </summary> + /// <remarks> + /// All attachments other than <paramref name="index"/> will be unbound. + /// </remarks> + /// <param name="index">Index of the render target color to be updated</param> + public void UpdateRenderTarget(int index) + { + new Span<ITexture>(_rtHostColors).Fill(null); + _rtHostColors[index] = _rtColors[index]?.HostTexture; + + _context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, null); + } + + /// <summary> + /// Update host framebuffer attachments based on currently bound render target buffers. + /// </summary> + /// <remarks> + /// All color attachments will be unbound. + /// </remarks> + public void UpdateRenderTargetDepthStencil() + { + new Span<ITexture>(_rtHostColors).Fill(null); + _rtHostDs = _rtDepthStencil?.HostTexture; + + _context.Renderer.Pipeline.SetRenderTargets(_rtHostColors, _rtHostDs); + } + + /// <summary> /// Forces all textures, samplers, images and render targets to be rebound the next time /// CommitGraphicsBindings is called. /// </summary> |