Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5813b2e354 | ||
|
|
af1906ea04 | ||
|
|
68848000f7 | ||
|
|
d98da47a0f | ||
|
|
306f7e93a0 | ||
|
|
8954ff3af2 | ||
|
|
d2f3adbf69 |
@@ -740,6 +740,18 @@ namespace Ryujinx.Modules
|
|||||||
{
|
{
|
||||||
var files = Directory.EnumerateFiles(HomeDir); // All files directly in base dir.
|
var files = Directory.EnumerateFiles(HomeDir); // All files directly in base dir.
|
||||||
|
|
||||||
|
// Determine and exclude user files only when the updater is running, not when cleaning old files
|
||||||
|
if (_running)
|
||||||
|
{
|
||||||
|
// Compare the loose files in base directory against the loose files from the incoming update, and store foreign ones in a user list.
|
||||||
|
var oldFiles = Directory.EnumerateFiles(HomeDir, "*", SearchOption.TopDirectoryOnly).Select(Path.GetFileName);
|
||||||
|
var newFiles = Directory.EnumerateFiles(UpdatePublishDir, "*", SearchOption.TopDirectoryOnly).Select(Path.GetFileName);
|
||||||
|
var userFiles = oldFiles.Except(newFiles).Select(filename => Path.Combine(HomeDir, filename));
|
||||||
|
|
||||||
|
// Remove user files from the paths in files.
|
||||||
|
files = files.Except(userFiles);
|
||||||
|
}
|
||||||
|
|
||||||
if (OperatingSystem.IsWindows())
|
if (OperatingSystem.IsWindows())
|
||||||
{
|
{
|
||||||
foreach (string dir in WindowsDependencyDirs)
|
foreach (string dir in WindowsDependencyDirs)
|
||||||
|
|||||||
@@ -32,10 +32,10 @@
|
|||||||
<ListBox.ItemsPanel>
|
<ListBox.ItemsPanel>
|
||||||
<ItemsPanelTemplate>
|
<ItemsPanelTemplate>
|
||||||
<flex:FlexPanel
|
<flex:FlexPanel
|
||||||
HorizontalAlignment="Stretch"
|
HorizontalAlignment="Center"
|
||||||
VerticalAlignment="Stretch"
|
VerticalAlignment="Stretch"
|
||||||
AlignContent="FlexStart"
|
AlignContent="FlexStart"
|
||||||
JustifyContent="Center" />
|
JustifyContent="FlexStart" />
|
||||||
</ItemsPanelTemplate>
|
</ItemsPanelTemplate>
|
||||||
</ListBox.ItemsPanel>
|
</ListBox.ItemsPanel>
|
||||||
<ListBox.Styles>
|
<ListBox.Styles>
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#nullable enable
|
#nullable enable
|
||||||
|
using Ryujinx.Common.Logging;
|
||||||
using System;
|
using System;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
@@ -18,12 +19,14 @@ namespace Ryujinx.Common.Utilities
|
|||||||
public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
public override TEnum Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
|
||||||
{
|
{
|
||||||
var enumValue = reader.GetString();
|
var enumValue = reader.GetString();
|
||||||
if (string.IsNullOrEmpty(enumValue))
|
|
||||||
|
if (Enum.TryParse(enumValue, out TEnum value))
|
||||||
{
|
{
|
||||||
return default;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Enum.Parse<TEnum>(enumValue);
|
Logger.Warning?.Print(LogClass.Configuration, $"Failed to parse enum value \"{enumValue}\" for {typeof(TEnum)}, using default \"{default(TEnum)}\"");
|
||||||
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options)
|
public override void Write(Utf8JsonWriter writer, TEnum value, JsonSerializerOptions options)
|
||||||
@@ -31,4 +34,4 @@ namespace Ryujinx.Common.Utilities
|
|||||||
writer.WriteStringValue(value.ToString());
|
writer.WriteStringValue(value.ToString());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -151,8 +151,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Compute
|
|||||||
|
|
||||||
ShaderProgramInfo info = cs.Shaders[0].Info;
|
ShaderProgramInfo info = cs.Shaders[0].Info;
|
||||||
|
|
||||||
bool hasUnaligned = _channel.BufferManager.HasUnalignedStorageBuffers;
|
|
||||||
|
|
||||||
for (int index = 0; index < info.SBuffers.Count; index++)
|
for (int index = 0; index < info.SBuffers.Count; index++)
|
||||||
{
|
{
|
||||||
BufferDescriptor sb = info.SBuffers[index];
|
BufferDescriptor sb = info.SBuffers[index];
|
||||||
@@ -177,9 +175,17 @@ namespace Ryujinx.Graphics.Gpu.Engine.Compute
|
|||||||
_channel.BufferManager.SetComputeStorageBuffer(sb.Slot, sbDescriptor.PackAddress(), size, sb.Flags);
|
_channel.BufferManager.SetComputeStorageBuffer(sb.Slot, sbDescriptor.PackAddress(), size, sb.Flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((_channel.BufferManager.HasUnalignedStorageBuffers) != hasUnaligned)
|
if (_channel.BufferManager.HasUnalignedStorageBuffers != computeState.HasUnalignedStorageBuffer)
|
||||||
{
|
{
|
||||||
// Refetch the shader, as assumptions about storage buffer alignment have changed.
|
// Refetch the shader, as assumptions about storage buffer alignment have changed.
|
||||||
|
computeState = new GpuChannelComputeState(
|
||||||
|
qmd.CtaThreadDimension0,
|
||||||
|
qmd.CtaThreadDimension1,
|
||||||
|
qmd.CtaThreadDimension2,
|
||||||
|
localMemorySize,
|
||||||
|
sharedMemorySize,
|
||||||
|
_channel.BufferManager.HasUnalignedStorageBuffers);
|
||||||
|
|
||||||
cs = memoryManager.Physical.ShaderCache.GetComputeShader(_channel, poolState, computeState, shaderGpuVa);
|
cs = memoryManager.Physical.ShaderCache.GetComputeShader(_channel, poolState, computeState, shaderGpuVa);
|
||||||
|
|
||||||
_context.Renderer.Pipeline.SetProgram(cs.HostProgram);
|
_context.Renderer.Pipeline.SetProgram(cs.HostProgram);
|
||||||
|
|||||||
@@ -541,7 +541,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
depth,
|
depth,
|
||||||
lhs.FormatInfo.BlockHeight,
|
lhs.FormatInfo.BlockHeight,
|
||||||
lhs.GobBlocksInY,
|
lhs.GobBlocksInY,
|
||||||
lhs.GobBlocksInZ);
|
lhs.GobBlocksInZ,
|
||||||
|
level);
|
||||||
|
|
||||||
return gobBlocksInY == rhs.GobBlocksInY &&
|
return gobBlocksInY == rhs.GobBlocksInY &&
|
||||||
gobBlocksInZ == rhs.GobBlocksInZ;
|
gobBlocksInZ == rhs.GobBlocksInZ;
|
||||||
@@ -587,7 +588,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
lhsDepth,
|
lhsDepth,
|
||||||
lhs.FormatInfo.BlockHeight,
|
lhs.FormatInfo.BlockHeight,
|
||||||
lhs.GobBlocksInY,
|
lhs.GobBlocksInY,
|
||||||
lhs.GobBlocksInZ);
|
lhs.GobBlocksInZ,
|
||||||
|
lhsLevel);
|
||||||
|
|
||||||
int rhsHeight = Math.Max(1, rhs.Height >> rhsLevel);
|
int rhsHeight = Math.Max(1, rhs.Height >> rhsLevel);
|
||||||
int rhsDepth = Math.Max(1, rhs.GetDepth() >> rhsLevel);
|
int rhsDepth = Math.Max(1, rhs.GetDepth() >> rhsLevel);
|
||||||
@@ -597,7 +599,8 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
rhsDepth,
|
rhsDepth,
|
||||||
rhs.FormatInfo.BlockHeight,
|
rhs.FormatInfo.BlockHeight,
|
||||||
rhs.GobBlocksInY,
|
rhs.GobBlocksInY,
|
||||||
rhs.GobBlocksInZ);
|
rhs.GobBlocksInZ,
|
||||||
|
rhsLevel);
|
||||||
|
|
||||||
return lhsGobBlocksInY == rhsGobBlocksInY &&
|
return lhsGobBlocksInY == rhsGobBlocksInY &&
|
||||||
lhsGobBlocksInZ == rhsGobBlocksInZ;
|
lhsGobBlocksInZ == rhsGobBlocksInZ;
|
||||||
|
|||||||
@@ -484,7 +484,7 @@ namespace Ryujinx.Graphics.Gpu.Image
|
|||||||
depthOrLayers = Math.Max(1, depthOrLayers >> minLod);
|
depthOrLayers = Math.Max(1, depthOrLayers >> minLod);
|
||||||
}
|
}
|
||||||
|
|
||||||
(gobBlocksInY, gobBlocksInZ) = SizeCalculator.GetMipGobBlockSizes(height, depth, formatInfo.BlockHeight, gobBlocksInY, gobBlocksInZ);
|
(gobBlocksInY, gobBlocksInZ) = SizeCalculator.GetMipGobBlockSizes(height, depth, formatInfo.BlockHeight, gobBlocksInY, gobBlocksInZ, minLod);
|
||||||
}
|
}
|
||||||
|
|
||||||
levels = (maxLod - minLod) + 1;
|
levels = (maxLod - minLod) + 1;
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
mipGobBlocksInY >>= 1;
|
mipGobBlocksInY >>= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (d <= (mipGobBlocksInZ >> 1) && mipGobBlocksInZ != 1)
|
if (level > 0 && d <= (mipGobBlocksInZ >> 1) && mipGobBlocksInZ != 1)
|
||||||
{
|
{
|
||||||
mipGobBlocksInZ >>= 1;
|
mipGobBlocksInZ >>= 1;
|
||||||
}
|
}
|
||||||
@@ -407,7 +407,7 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
mipGobBlocksInY >>= 1;
|
mipGobBlocksInY >>= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (d <= (mipGobBlocksInZ >> 1) && mipGobBlocksInZ != 1)
|
if (level > 0 && d <= (mipGobBlocksInZ >> 1) && mipGobBlocksInZ != 1)
|
||||||
{
|
{
|
||||||
mipGobBlocksInZ >>= 1;
|
mipGobBlocksInZ >>= 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
int gobBlocksInTileX,
|
int gobBlocksInTileX,
|
||||||
int gpuLayerSize = 0)
|
int gpuLayerSize = 0)
|
||||||
{
|
{
|
||||||
bool is3D = depth > 1;
|
bool is3D = depth > 1 || gobBlocksInZ > 1;
|
||||||
|
|
||||||
int layerSize = 0;
|
int layerSize = 0;
|
||||||
|
|
||||||
@@ -67,7 +67,7 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
mipGobBlocksInY >>= 1;
|
mipGobBlocksInY >>= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (d <= (mipGobBlocksInZ >> 1) && mipGobBlocksInZ != 1)
|
if (level > 0 && d <= (mipGobBlocksInZ >> 1) && mipGobBlocksInZ != 1)
|
||||||
{
|
{
|
||||||
mipGobBlocksInZ >>= 1;
|
mipGobBlocksInZ >>= 1;
|
||||||
}
|
}
|
||||||
@@ -88,6 +88,10 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
|
|
||||||
int robSize = widthInGobs * mipGobBlocksInY * mipGobBlocksInZ * GobSize;
|
int robSize = widthInGobs * mipGobBlocksInY * mipGobBlocksInZ * GobSize;
|
||||||
|
|
||||||
|
mipOffsets[level] = layerSize;
|
||||||
|
sliceSizes[level] = totalBlocksOfGobsInY * robSize;
|
||||||
|
levelSizes[level] = totalBlocksOfGobsInZ * sliceSizes[level];
|
||||||
|
|
||||||
if (is3D)
|
if (is3D)
|
||||||
{
|
{
|
||||||
int gobSize = mipGobBlocksInY * GobSize;
|
int gobSize = mipGobBlocksInY * GobSize;
|
||||||
@@ -105,11 +109,22 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
|
|
||||||
allOffsets[z + depthLevelOffset] = baseOffset + zLow * gobSize + zHigh * sliceSize;
|
allOffsets[z + depthLevelOffset] = baseOffset + zLow * gobSize + zHigh * sliceSize;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
mipOffsets[level] = layerSize;
|
int gobRemainderZ = d % mipGobBlocksInZ;
|
||||||
sliceSizes[level] = totalBlocksOfGobsInY * robSize;
|
|
||||||
levelSizes[level] = totalBlocksOfGobsInZ * sliceSizes[level];
|
if (gobRemainderZ != 0 && level == levels - 1)
|
||||||
|
{
|
||||||
|
// The slice only covers up to the end of this slice's depth, rather than the full aligned size.
|
||||||
|
// Avoids size being too large on partial views of 3d textures.
|
||||||
|
|
||||||
|
levelSizes[level] -= gobSize * (mipGobBlocksInZ - gobRemainderZ);
|
||||||
|
|
||||||
|
if (sliceSizes[level] > levelSizes[level])
|
||||||
|
{
|
||||||
|
sliceSizes[level] = levelSizes[level];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
layerSize += levelSizes[level];
|
layerSize += levelSizes[level];
|
||||||
|
|
||||||
@@ -267,7 +282,8 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
int depth,
|
int depth,
|
||||||
int blockHeight,
|
int blockHeight,
|
||||||
int gobBlocksInY,
|
int gobBlocksInY,
|
||||||
int gobBlocksInZ)
|
int gobBlocksInZ,
|
||||||
|
int level = int.MaxValue)
|
||||||
{
|
{
|
||||||
height = BitUtils.DivRoundUp(height, blockHeight);
|
height = BitUtils.DivRoundUp(height, blockHeight);
|
||||||
|
|
||||||
@@ -276,7 +292,7 @@ namespace Ryujinx.Graphics.Texture
|
|||||||
gobBlocksInY >>= 1;
|
gobBlocksInY >>= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (depth <= (gobBlocksInZ >> 1) && gobBlocksInZ != 1)
|
while (level-- > 0 && depth <= (gobBlocksInZ >> 1) && gobBlocksInZ != 1)
|
||||||
{
|
{
|
||||||
gobBlocksInZ >>= 1;
|
gobBlocksInZ >>= 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,49 +1,16 @@
|
|||||||
using System;
|
using Ryujinx.Common.Memory;
|
||||||
|
using System;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu.Types
|
namespace Ryujinx.HLE.HOS.Services.Nv.NvDrvServices.NvHostCtrlGpu.Types
|
||||||
{
|
{
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
|
||||||
struct ZbcColorArray
|
|
||||||
{
|
|
||||||
private uint element0;
|
|
||||||
private uint element1;
|
|
||||||
private uint element2;
|
|
||||||
private uint element3;
|
|
||||||
|
|
||||||
public uint this[int index]
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
if (index == 0)
|
|
||||||
{
|
|
||||||
return element0;
|
|
||||||
}
|
|
||||||
else if (index == 1)
|
|
||||||
{
|
|
||||||
return element1;
|
|
||||||
}
|
|
||||||
else if (index == 2)
|
|
||||||
{
|
|
||||||
return element2;
|
|
||||||
}
|
|
||||||
else if (index == 2)
|
|
||||||
{
|
|
||||||
return element3;
|
|
||||||
}
|
|
||||||
|
|
||||||
throw new IndexOutOfRangeException();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
[StructLayout(LayoutKind.Sequential)]
|
[StructLayout(LayoutKind.Sequential)]
|
||||||
struct ZbcSetTableArguments
|
struct ZbcSetTableArguments
|
||||||
{
|
{
|
||||||
public ZbcColorArray ColorDs;
|
public Array4<uint> ColorDs;
|
||||||
public ZbcColorArray ColorL2;
|
public Array4<uint> ColorL2;
|
||||||
public uint Depth;
|
public uint Depth;
|
||||||
public uint Format;
|
public uint Format;
|
||||||
public uint Type;
|
public uint Type;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -565,6 +565,18 @@ namespace Ryujinx.Modules
|
|||||||
{
|
{
|
||||||
var files = Directory.EnumerateFiles(HomeDir); // All files directly in base dir.
|
var files = Directory.EnumerateFiles(HomeDir); // All files directly in base dir.
|
||||||
|
|
||||||
|
// Determine and exclude user files only when the updater is running, not when cleaning old files
|
||||||
|
if (Running)
|
||||||
|
{
|
||||||
|
// Compare the loose files in base directory against the loose files from the incoming update, and store foreign ones in a user list.
|
||||||
|
var oldFiles = Directory.EnumerateFiles(HomeDir, "*", SearchOption.TopDirectoryOnly).Select(Path.GetFileName);
|
||||||
|
var newFiles = Directory.EnumerateFiles(UpdatePublishDir, "*", SearchOption.TopDirectoryOnly).Select(Path.GetFileName);
|
||||||
|
var userFiles = oldFiles.Except(newFiles).Select(filename => Path.Combine(HomeDir, filename));
|
||||||
|
|
||||||
|
// Remove user files from the paths in files.
|
||||||
|
files = files.Except(userFiles);
|
||||||
|
}
|
||||||
|
|
||||||
if (OperatingSystem.IsWindows())
|
if (OperatingSystem.IsWindows())
|
||||||
{
|
{
|
||||||
foreach (string dir in WindowsDependencyDirs)
|
foreach (string dir in WindowsDependencyDirs)
|
||||||
|
|||||||
Reference in New Issue
Block a user