Use "Screen Scissor" as size hint for render targets (#1703)

"Screen scissor" is the minimum size of all render targets, and is set when any render target is bound on NVN or OpenGL. Since it works on all active texture's real sizes, it is therefore more reliable than viewport 0's width, and is actually set before clear.

This fixes a regression with Hyrule Warriors: Age Of Calamity's cubemaps, which did not set viewport dimensions before clear. This resulted in attempting to create a cubemap with rectangular sides, which is logically and physically impossible. (also it just fails)
This commit is contained in:
riperiperi 2020-11-12 23:40:26 +00:00 committed by GitHub
parent 48f6570557
commit c652494219
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 15 additions and 2 deletions

View file

@ -355,8 +355,8 @@ namespace Ryujinx.Graphics.Gpu.Engine
int samplesInX = msaaMode.SamplesInX();
int samplesInY = msaaMode.SamplesInY();
var extents = state.Get<ViewportExtents>(MethodOffset.ViewportExtents, 0);
Size sizeHint = new Size(extents.X + extents.Width, extents.Y + extents.Height, 1);
var scissor = state.Get<ScreenScissorState>(MethodOffset.ScreenScissorState);
Size sizeHint = new Size(scissor.X + scissor.Width, scissor.Y + scissor.Height, 1);
bool changedScale = false;

View file

@ -45,6 +45,7 @@ namespace Ryujinx.Graphics.Gpu.State
TextureBarrierTiled = 0x3df,
RtColorMaskShared = 0x3e4,
RtDepthStencilState = 0x3f8,
ScreenScissorState = 0x3fd,
VertexAttribState = 0x458,
RtControl = 0x487,
RtDepthStencilSize = 0x48a,

View file

@ -0,0 +1,12 @@
namespace Ryujinx.Graphics.Gpu.State
{
struct ScreenScissorState
{
#pragma warning disable CS0649
public ushort X;
public ushort Width;
public ushort Y;
public ushort Height;
#pragma warning restore CS0649
}
}