Scale texture resolution before sending to backend (#1646)

* Work

* Propagate scale factor to copy temp. Not really needed, just here for consistency

* PR feedback
This commit is contained in:
gdkchan 2020-10-29 18:57:34 -03:00 committed by GitHub
parent 780c7530d6
commit 423da5cc91
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
7 changed files with 47 additions and 52 deletions

View file

@ -181,7 +181,7 @@ namespace Ryujinx.Graphics.Gpu.Image
{ {
Debug.Assert(!isView); Debug.Assert(!isView);
TextureCreateInfo createInfo = TextureManager.GetCreateInfo(Info, _context.Capabilities); TextureCreateInfo createInfo = TextureManager.GetCreateInfo(Info, _context.Capabilities, ScaleFactor);
HostTexture = _context.Renderer.CreateTexture(createInfo, ScaleFactor); HostTexture = _context.Renderer.CreateTexture(createInfo, ScaleFactor);
SynchronizeMemory(); // Load the data. SynchronizeMemory(); // Load the data.
@ -204,7 +204,7 @@ namespace Ryujinx.Graphics.Gpu.Image
ScaleFactor = GraphicsConfig.ResScale; ScaleFactor = GraphicsConfig.ResScale;
} }
TextureCreateInfo createInfo = TextureManager.GetCreateInfo(Info, _context.Capabilities); TextureCreateInfo createInfo = TextureManager.GetCreateInfo(Info, _context.Capabilities, ScaleFactor);
HostTexture = _context.Renderer.CreateTexture(createInfo, ScaleFactor); HostTexture = _context.Renderer.CreateTexture(createInfo, ScaleFactor);
} }
} }
@ -232,8 +232,7 @@ namespace Ryujinx.Graphics.Gpu.Image
ScaleFactor, ScaleFactor,
ScaleMode); ScaleMode);
TextureCreateInfo createInfo = TextureManager.GetCreateInfo(info, _context.Capabilities); TextureCreateInfo createInfo = TextureManager.GetCreateInfo(info, _context.Capabilities, ScaleFactor);
texture.HostTexture = HostTexture.CreateView(createInfo, firstLayer, firstLevel); texture.HostTexture = HostTexture.CreateView(createInfo, firstLayer, firstLevel);
_viewStorage.AddView(texture); _viewStorage.AddView(texture);
@ -375,7 +374,7 @@ namespace Ryujinx.Graphics.Gpu.Image
Info.SwizzleB, Info.SwizzleB,
Info.SwizzleA)); Info.SwizzleA));
TextureCreateInfo createInfo = TextureManager.GetCreateInfo(Info, _context.Capabilities); TextureCreateInfo createInfo = TextureManager.GetCreateInfo(Info, _context.Capabilities, ScaleFactor);
if (_viewStorage != this) if (_viewStorage != this)
{ {
@ -451,7 +450,7 @@ namespace Ryujinx.Graphics.Gpu.Image
Info.SwizzleB, Info.SwizzleB,
Info.SwizzleA); Info.SwizzleA);
TextureCreateInfo createInfo = TextureManager.GetCreateInfo(viewInfo, _context.Capabilities); TextureCreateInfo createInfo = TextureManager.GetCreateInfo(viewInfo, _context.Capabilities, ScaleFactor);
for (int i = 0; i < Info.DepthOrLayers; i++) for (int i = 0; i < Info.DepthOrLayers; i++)
{ {
@ -475,8 +474,7 @@ namespace Ryujinx.Graphics.Gpu.Image
{ {
if (storage == null) if (storage == null)
{ {
TextureCreateInfo createInfo = TextureManager.GetCreateInfo(Info, _context.Capabilities); TextureCreateInfo createInfo = TextureManager.GetCreateInfo(Info, _context.Capabilities, scale);
storage = _context.Renderer.CreateTexture(createInfo, scale); storage = _context.Renderer.CreateTexture(createInfo, scale);
} }
@ -530,12 +528,10 @@ namespace Ryujinx.Graphics.Gpu.Image
Logger.Debug?.Print(LogClass.Gpu, $" Recreating view {Info.Width}x{Info.Height} {Info.FormatInfo.Format.ToString()}."); Logger.Debug?.Print(LogClass.Gpu, $" Recreating view {Info.Width}x{Info.Height} {Info.FormatInfo.Format.ToString()}.");
view.ScaleFactor = scale; view.ScaleFactor = scale;
TextureCreateInfo viewCreateInfo = TextureManager.GetCreateInfo(view.Info, _context.Capabilities); TextureCreateInfo viewCreateInfo = TextureManager.GetCreateInfo(view.Info, _context.Capabilities, scale);
ITexture newView = HostTexture.CreateView(viewCreateInfo, view._firstLayer - _firstLayer, view._firstLevel - _firstLevel); ITexture newView = HostTexture.CreateView(viewCreateInfo, view._firstLayer - _firstLayer, view._firstLevel - _firstLevel);
view.ReplaceStorage(newView); view.ReplaceStorage(newView);
view.ScaleMode = newScaleMode; view.ScaleMode = newScaleMode;
} }
} }

View file

@ -754,7 +754,7 @@ namespace Ryujinx.Graphics.Gpu.Image
} }
break; break;
} }
else if (overlapCompatibility == TextureViewCompatibility.CopyOnly) else if (overlapCompatibility == TextureViewCompatibility.CopyOnly)
{ {
// TODO: Copy rules for targets created after the container texture. See below. // TODO: Copy rules for targets created after the container texture. See below.
@ -833,7 +833,7 @@ namespace Ryujinx.Graphics.Gpu.Image
TextureInfo overlapInfo = AdjustSizes(texture, overlap.Info, oInfo.FirstLevel); TextureInfo overlapInfo = AdjustSizes(texture, overlap.Info, oInfo.FirstLevel);
TextureCreateInfo createInfo = GetCreateInfo(overlapInfo, _context.Capabilities); TextureCreateInfo createInfo = GetCreateInfo(overlapInfo, _context.Capabilities, overlap.ScaleFactor);
if (texture.ScaleFactor != overlap.ScaleFactor) if (texture.ScaleFactor != overlap.ScaleFactor)
{ {
@ -944,7 +944,7 @@ namespace Ryujinx.Graphics.Gpu.Image
} }
else else
{ {
// Bpp may be a mismatch between the target texture and the param. // Bpp may be a mismatch between the target texture and the param.
// Due to the way linear strided and block layouts work, widths can be multiplied by Bpp for comparison. // Due to the way linear strided and block layouts work, widths can be multiplied by Bpp for comparison.
// Note: tex.Width is the aligned texture size. Prefer param.XCount, as the destination should be a texture with that exact size. // Note: tex.Width is the aligned texture size. Prefer param.XCount, as the destination should be a texture with that exact size.
@ -1054,8 +1054,9 @@ namespace Ryujinx.Graphics.Gpu.Image
/// </summary> /// </summary>
/// <param name="info">Texture information</param> /// <param name="info">Texture information</param>
/// <param name="caps">GPU capabilities</param> /// <param name="caps">GPU capabilities</param>
/// <param name="scale">Texture scale factor, to be applied to the texture size</param>
/// <returns>The texture creation information</returns> /// <returns>The texture creation information</returns>
public static TextureCreateInfo GetCreateInfo(TextureInfo info, Capabilities caps) public static TextureCreateInfo GetCreateInfo(TextureInfo info, Capabilities caps, float scale)
{ {
FormatInfo formatInfo = info.FormatInfo; FormatInfo formatInfo = info.FormatInfo;
@ -1092,6 +1093,12 @@ namespace Ryujinx.Graphics.Gpu.Image
int depth = info.GetDepth() * info.GetLayers(); int depth = info.GetDepth() * info.GetLayers();
if (scale != 1f)
{
width = (int)MathF.Ceiling(width * scale);
height = (int)MathF.Ceiling(height * scale);
}
return new TextureCreateInfo( return new TextureCreateInfo(
width, width,
height, height,

View file

@ -1,6 +1,5 @@
using OpenTK.Graphics.OpenGL; using OpenTK.Graphics.OpenGL;
using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL;
using System;
namespace Ryujinx.Graphics.OpenGL.Image namespace Ryujinx.Graphics.OpenGL.Image
{ {
@ -10,8 +9,8 @@ namespace Ryujinx.Graphics.OpenGL.Image
public TextureCreateInfo Info { get; } public TextureCreateInfo Info { get; }
public int Width { get; } public int Width => Info.Width;
public int Height { get; } public int Height => Info.Height;
public float ScaleFactor { get; } public float ScaleFactor { get; }
public Target Target => Info.Target; public Target Target => Info.Target;
@ -20,8 +19,6 @@ namespace Ryujinx.Graphics.OpenGL.Image
public TextureBase(TextureCreateInfo info, float scaleFactor = 1f) public TextureBase(TextureCreateInfo info, float scaleFactor = 1f)
{ {
Info = info; Info = info;
Width = (int)Math.Ceiling(Info.Width * scaleFactor);
Height = (int)Math.Ceiling(Info.Height * scaleFactor);
ScaleFactor = scaleFactor; ScaleFactor = scaleFactor;
Handle = GL.GenTexture(); Handle = GL.GenTexture();

View file

@ -129,7 +129,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
public TextureView BgraSwap(TextureView from) public TextureView BgraSwap(TextureView from)
{ {
TextureView to = (TextureView)_renderer.CreateTexture(from.Info, 1f); TextureView to = (TextureView)_renderer.CreateTexture(from.Info, from.ScaleFactor);
EnsurePbo(from); EnsurePbo(from);

View file

@ -15,16 +15,15 @@ namespace Ryujinx.Graphics.OpenGL.Image
int srcLayer, int srcLayer,
int dstLayer, int dstLayer,
int srcLevel, int srcLevel,
int dstLevel, int dstLevel)
float scaleFactor = 1f)
{ {
int srcWidth = (int)Math.Ceiling(srcInfo.Width * scaleFactor); int srcWidth = srcInfo.Width;
int srcHeight = (int)Math.Ceiling(srcInfo.Height * scaleFactor); int srcHeight = srcInfo.Height;
int srcDepth = srcInfo.GetDepthOrLayers(); int srcDepth = srcInfo.GetDepthOrLayers();
int srcLevels = srcInfo.Levels; int srcLevels = srcInfo.Levels;
int dstWidth = (int)Math.Ceiling(dstInfo.Width * scaleFactor); int dstWidth = dstInfo.Width;
int dstHeight = (int)Math.Ceiling(dstInfo.Height * scaleFactor); int dstHeight = dstInfo.Height;
int dstDepth = dstInfo.GetDepthOrLayers(); int dstDepth = dstInfo.GetDepthOrLayers();
int dstLevels = dstInfo.Levels; int dstLevels = dstInfo.Levels;

View file

@ -37,9 +37,6 @@ namespace Ryujinx.Graphics.OpenGL.Image
GL.BindTexture(target, Handle); GL.BindTexture(target, Handle);
int width = (int)Math.Ceiling(Info.Width * ScaleFactor);
int height = (int)Math.Ceiling(Info.Height * ScaleFactor);
FormatInfo format = FormatTable.GetFormatInfo(Info.Format); FormatInfo format = FormatTable.GetFormatInfo(Info.Format);
SizedInternalFormat internalFormat; SizedInternalFormat internalFormat;
@ -60,7 +57,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
TextureTarget1d.Texture1D, TextureTarget1d.Texture1D,
Info.Levels, Info.Levels,
internalFormat, internalFormat,
width); Info.Width);
break; break;
case Target.Texture1DArray: case Target.Texture1DArray:
@ -68,8 +65,8 @@ namespace Ryujinx.Graphics.OpenGL.Image
TextureTarget2d.Texture1DArray, TextureTarget2d.Texture1DArray,
Info.Levels, Info.Levels,
internalFormat, internalFormat,
width, Info.Width,
height); Info.Height);
break; break;
case Target.Texture2D: case Target.Texture2D:
@ -77,8 +74,8 @@ namespace Ryujinx.Graphics.OpenGL.Image
TextureTarget2d.Texture2D, TextureTarget2d.Texture2D,
Info.Levels, Info.Levels,
internalFormat, internalFormat,
width, Info.Width,
height); Info.Height);
break; break;
case Target.Texture2DArray: case Target.Texture2DArray:
@ -86,8 +83,8 @@ namespace Ryujinx.Graphics.OpenGL.Image
TextureTarget3d.Texture2DArray, TextureTarget3d.Texture2DArray,
Info.Levels, Info.Levels,
internalFormat, internalFormat,
width, Info.Width,
height, Info.Height,
Info.Depth); Info.Depth);
break; break;
@ -96,8 +93,8 @@ namespace Ryujinx.Graphics.OpenGL.Image
TextureTargetMultisample2d.Texture2DMultisample, TextureTargetMultisample2d.Texture2DMultisample,
Info.Samples, Info.Samples,
internalFormat, internalFormat,
width, Info.Width,
height, Info.Height,
true); true);
break; break;
@ -106,8 +103,8 @@ namespace Ryujinx.Graphics.OpenGL.Image
TextureTargetMultisample3d.Texture2DMultisampleArray, TextureTargetMultisample3d.Texture2DMultisampleArray,
Info.Samples, Info.Samples,
internalFormat, internalFormat,
width, Info.Width,
height, Info.Height,
Info.Depth, Info.Depth,
true); true);
break; break;
@ -117,8 +114,8 @@ namespace Ryujinx.Graphics.OpenGL.Image
TextureTarget3d.Texture3D, TextureTarget3d.Texture3D,
Info.Levels, Info.Levels,
internalFormat, internalFormat,
width, Info.Width,
height, Info.Height,
Info.Depth); Info.Depth);
break; break;
@ -127,8 +124,8 @@ namespace Ryujinx.Graphics.OpenGL.Image
TextureTarget2d.TextureCubeMap, TextureTarget2d.TextureCubeMap,
Info.Levels, Info.Levels,
internalFormat, internalFormat,
width, Info.Width,
height); Info.Height);
break; break;
case Target.CubemapArray: case Target.CubemapArray:
@ -136,8 +133,8 @@ namespace Ryujinx.Graphics.OpenGL.Image
(TextureTarget3d)All.TextureCubeMapArray, (TextureTarget3d)All.TextureCubeMapArray,
Info.Levels, Info.Levels,
internalFormat, internalFormat,
width, Info.Width,
height, Info.Height,
Info.Depth); Info.Depth);
break; break;

View file

@ -134,7 +134,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
_incompatibleFormatView = (TextureView)_renderer.CreateTexture(Info, ScaleFactor); _incompatibleFormatView = (TextureView)_renderer.CreateTexture(Info, ScaleFactor);
} }
TextureCopyUnscaled.Copy(_parent.Info, _incompatibleFormatView.Info, _parent.Handle, _incompatibleFormatView.Handle, FirstLayer, 0, FirstLevel, 0, ScaleFactor); TextureCopyUnscaled.Copy(_parent.Info, _incompatibleFormatView.Info, _parent.Handle, _incompatibleFormatView.Handle, FirstLayer, 0, FirstLevel, 0);
return _incompatibleFormatView.Handle; return _incompatibleFormatView.Handle;
} }
@ -146,7 +146,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
{ {
if (_incompatibleFormatView != null) if (_incompatibleFormatView != null)
{ {
TextureCopyUnscaled.Copy(_incompatibleFormatView.Info, _parent.Info, _incompatibleFormatView.Handle, _parent.Handle, 0, FirstLayer, 0, FirstLevel, ScaleFactor); TextureCopyUnscaled.Copy(_incompatibleFormatView.Info, _parent.Info, _incompatibleFormatView.Handle, _parent.Handle, 0, FirstLayer, 0, FirstLevel);
} }
} }
@ -154,7 +154,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
{ {
TextureView destinationView = (TextureView)destination; TextureView destinationView = (TextureView)destination;
TextureCopyUnscaled.Copy(Info, destinationView.Info, Handle, destinationView.Handle, 0, firstLayer, 0, firstLevel, ScaleFactor); TextureCopyUnscaled.Copy(Info, destinationView.Info, Handle, destinationView.Handle, 0, firstLayer, 0, firstLevel);
if (destinationView._emulatedViewParent != null) if (destinationView._emulatedViewParent != null)
{ {
@ -166,8 +166,7 @@ namespace Ryujinx.Graphics.OpenGL.Image
0, 0,
destinationView.FirstLayer, destinationView.FirstLayer,
0, 0,
destinationView.FirstLevel, destinationView.FirstLevel);
ScaleFactor);
} }
} }