diff --git a/src/Ryujinx.Ava/Modules/Updater/Updater.cs b/src/Ryujinx.Ava/Modules/Updater/Updater.cs
index 77d77d794..839526c4e 100644
--- a/src/Ryujinx.Ava/Modules/Updater/Updater.cs
+++ b/src/Ryujinx.Ava/Modules/Updater/Updater.cs
@@ -740,6 +740,18 @@ namespace Ryujinx.Modules
{
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())
{
foreach (string dir in WindowsDependencyDirs)
diff --git a/src/Ryujinx.Ava/UI/Controls/ApplicationGridView.axaml b/src/Ryujinx.Ava/UI/Controls/ApplicationGridView.axaml
index f7a120b1a..3d55793f9 100644
--- a/src/Ryujinx.Ava/UI/Controls/ApplicationGridView.axaml
+++ b/src/Ryujinx.Ava/UI/Controls/ApplicationGridView.axaml
@@ -32,10 +32,10 @@
+ JustifyContent="FlexStart" />
diff --git a/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs b/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs
index 8227a7ff1..d8103ac71 100644
--- a/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs
+++ b/src/Ryujinx.Graphics.Gpu/Engine/Compute/ComputeClass.cs
@@ -151,8 +151,6 @@ namespace Ryujinx.Graphics.Gpu.Engine.Compute
ShaderProgramInfo info = cs.Shaders[0].Info;
- bool hasUnaligned = _channel.BufferManager.HasUnalignedStorageBuffers;
-
for (int index = 0; index < info.SBuffers.Count; 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);
}
- if ((_channel.BufferManager.HasUnalignedStorageBuffers) != hasUnaligned)
+ if (_channel.BufferManager.HasUnalignedStorageBuffers != computeState.HasUnalignedStorageBuffer)
{
// 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);
_context.Renderer.Pipeline.SetProgram(cs.HostProgram);
diff --git a/src/Ryujinx.Graphics.Texture/SizeCalculator.cs b/src/Ryujinx.Graphics.Texture/SizeCalculator.cs
index 4ddd8d4df..0120bd7ac 100644
--- a/src/Ryujinx.Graphics.Texture/SizeCalculator.cs
+++ b/src/Ryujinx.Graphics.Texture/SizeCalculator.cs
@@ -90,6 +90,7 @@ namespace Ryujinx.Graphics.Texture
mipOffsets[level] = layerSize;
sliceSizes[level] = totalBlocksOfGobsInY * robSize;
+ levelSizes[level] = totalBlocksOfGobsInZ * sliceSizes[level];
if (is3D)
{
@@ -116,12 +117,15 @@ namespace Ryujinx.Graphics.Texture
// 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.
- sliceSizes[level] -= gobSize * (mipGobBlocksInZ - gobRemainderZ);
+ levelSizes[level] -= gobSize * (mipGobBlocksInZ - gobRemainderZ);
+
+ if (sliceSizes[level] > levelSizes[level])
+ {
+ sliceSizes[level] = levelSizes[level];
+ }
}
}
- levelSizes[level] = totalBlocksOfGobsInZ * sliceSizes[level];
-
layerSize += levelSizes[level];
depthLevelOffset += d;
diff --git a/src/Ryujinx/Modules/Updater/Updater.cs b/src/Ryujinx/Modules/Updater/Updater.cs
index 3e0dc99b4..344edf9e5 100644
--- a/src/Ryujinx/Modules/Updater/Updater.cs
+++ b/src/Ryujinx/Modules/Updater/Updater.cs
@@ -565,6 +565,18 @@ namespace Ryujinx.Modules
{
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())
{
foreach (string dir in WindowsDependencyDirs)