Skip to content
20 changes: 20 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,26 @@ All notable changes to Stability Matrix will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning 2.0](https://semver.org/spec/v2.0.0.html).

## v2.15.5
### Added
- Added new package - [Wan2GP](https://github.com/deepbeepmeep/Wan2GP)
- Added [Stable Diffusion WebUI Forge - Neo](https://github.com/Haoming02/sd-webui-forge-classic/tree/neo) as a separate package for convenience
- Added Tiled VAE decoding as an Inference addon thanks to @NeuralFault!
- Added togglable `--uv` argument to the SD.Next launch options
### Changed
- Moved the original Stable Diffusion WebUI Forge to the "Legacy" packages tab due to inactivity
- Updated to cu130 torch index for ComfyUI installs with Nvidia GPUs
- Consolidated and fixed AMD GPU architecture detection
- Updated SageAttention installer to latest v2.2.0-windows.post4 version
- Updated torch index for Forge-based UIs to rocm6.4 / cu128 depending on GPU - thanks to @NeuralFault!
### Fixed
- Fixed [#1450](https://github.com/LykosAI/StabilityMatrix/issues/1450) - Older SD.Next not launching due to forced `--uv` argument
- Fixed duplicate custom node installations when installing workflows from the Workflow Browser - thanks again to @NeuralFault!
#### 🌟 Visionaries
To our incredible Visionaries: **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, and **whudunit**! Your generosity drives this project forward and helps us turn ideas into reality. Thank you for being such a vital part of Stability Matrix!
#### 🚀 Pioneers
A massive thank you to our Pioneer crew! Your support keeps the lights on and the updates flowing. Shoutout to: **Szir777**, **Noah M**, **[USA]TechDude**, **Thom**, **SeraphOfSalem**, **Desert Viber**, **Adam**, **Droolguy**, **ACTUALLY_the_Real_Willem_Dafoe**, **takyamtom**, **robek**, **Phil R**, **Tundra Everquill**, **TheTekknician**, and a warm welcome to our new Pioneers, **Benjamin M** and **Ghislain G**!
Comment on lines +23 to +26
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

medium

The heading levels for "Visionaries" and "Pioneers" are ####, which is inconsistent with the ### level used for "Added", "Changed", and "Fixed". For better document structure and visual consistency, consider using ### for these sections as well. This would also align with the formatting in the pull request description.

Suggested change
#### 🌟 Visionaries
To our incredible Visionaries: **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, and **whudunit**! Your generosity drives this project forward and helps us turn ideas into reality. Thank you for being such a vital part of Stability Matrix!
#### 🚀 Pioneers
A massive thank you to our Pioneer crew! Your support keeps the lights on and the updates flowing. Shoutout to: **Szir777**, **Noah M**, **[USA]TechDude**, **Thom**, **SeraphOfSalem**, **Desert Viber**, **Adam**, **Droolguy**, **ACTUALLY_the_Real_Willem_Dafoe**, **takyamtom**, **robek**, **Phil R**, **Tundra Everquill**, **TheTekknician**, and a warm welcome to our new Pioneers, **Benjamin M** and **Ghislain G**!
### 🌟 Visionaries
To our incredible Visionaries: **Waterclouds**, **JungleDragon**, **bluepopsicle**, **Bob S**, and **whudunit**! Your generosity drives this project forward and helps us turn ideas into reality. Thank you for being such a vital part of Stability Matrix!
### 🚀 Pioneers
A massive thank you to our Pioneer crew! Your support keeps the lights on and the updates flowing. Shoutout to: **Szir777**, **Noah M**, **[USA]TechDude**, **Thom**, **SeraphOfSalem**, **Desert Viber**, **Adam**, **Droolguy**, **ACTUALLY_the_Real_Willem_Dafoe**, **takyamtom**, **robek**, **Phil R**, **Tundra Everquill**, **TheTekknician**, and a warm welcome to our new Pioneers, **Benjamin M** and **Ghislain G**!


## v2.15.4
### Changed
- Updated Early Access indicators in the Civitai Details page to be more visible
Expand Down
53 changes: 3 additions & 50 deletions StabilityMatrix.Avalonia/Helpers/UnixPrerequisiteHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -697,9 +697,9 @@ public async Task InstallUvIfNecessary(IProgress<ProgressReport>? progress = nul
File.Delete(UvDownloadPath);
}

public string? GetGfxArchFromAmdGpuName()
public string? GetGfxArchFromAmdGpuName(GpuInfo? gpu = null)
{
var gpu =
gpu ??=
settingsManager.Settings.PreferredGpu
?? HardwareHelper.IterGpuInfo().FirstOrDefault(x => x is { Name: not null, IsAmd: true });

Expand All @@ -710,54 +710,7 @@ public async Task InstallUvIfNecessary(IProgress<ProgressReport>? progress = nul
var name = gpu.Name;
var nameNoSpaces = name.Replace(" ", "", StringComparison.Ordinal);

return name switch
{
// RDNA4
_ when Has("9060") || Has("9070") => "gfx1201",

// RDNA3.5 APUs
_ when Has("860M") => "gfx1152",
_ when Has("890M") => "gfx1150",
_ when Has("8040S") || Has("8050S") || Has("8060S") || Has("880M") || Has("Z2 Extreme") =>
"gfx1151",

// RDNA3 APUs (Phoenix)
_ when Has("740M") || Has("760M") || Has("780M") || Has("Z1") || Has("Z2") => "gfx1103",

// RDNA3 dGPU Navi33
_ when Has("7400") || Has("7500") || Has("7600") || Has("7650") || Has("7700S") => "gfx1102",

// RDNA3 dGPU Navi32
_ when Has("7700") || Has("RX 7800") || HasNoSpace("RX7800") => "gfx1101",

// RDNA3 dGPU Navi31 (incl. Pro)
_ when Has("W7800") || Has("7900") || Has("7950") || Has("7990") => "gfx1100",

// RDNA2 APUs (Rembrandt)
_ when Has("660M") || Has("680M") => "gfx1035",

// RDNA2 Navi24 low-end (incl. some mobiles)
_ when Has("6300") || Has("6400") || Has("6450") || Has("6500") || Has("6550") || Has("6500M") =>
"gfx1034",

// RDNA2 Navi23
_ when Has("6600") || Has("6650") || Has("6700S") || Has("6800S") || Has("6600M") => "gfx1032",

// RDNA2 Navi22 (note: desktop 6800 is NOT here; that’s Navi21/gfx1030)
_ when Has("6700") || Has("6750") || Has("6800M") || Has("6850M") => "gfx1031",

// RDNA2 Navi21 (big die)
_ when Has("6800") || Has("6900") || Has("6950") => "gfx1030",

_ => null,
};

bool HasNoSpace(string s) =>
nameNoSpaces.Contains(
s.Replace(" ", "", StringComparison.Ordinal),
StringComparison.OrdinalIgnoreCase
);
bool Has(string s) => name.Contains(s, StringComparison.OrdinalIgnoreCase);
return gpu.GetAmdGfxArch();
}

private async Task DownloadAndExtractPrerequisite(
Expand Down
57 changes: 3 additions & 54 deletions StabilityMatrix.Avalonia/Helpers/WindowsPrerequisiteHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -932,67 +932,16 @@ public async Task AddMissingLibsToVenv(
// await downloadPath.DeleteAsync();
}

public string? GetGfxArchFromAmdGpuName()
public string? GetGfxArchFromAmdGpuName(GpuInfo? gpu = null)
{
var gpu =
gpu ??=
settingsManager.Settings.PreferredGpu
?? HardwareHelper.IterGpuInfo().FirstOrDefault(x => x is { Name: not null, IsAmd: true });

if (gpu?.Name is null || !gpu.IsAmd)
return null;

// Normalize for safer substring checks (handles RX7800 vs RX 7800, etc.)
var name = gpu.Name;
var nameNoSpaces = name.Replace(" ", "", StringComparison.Ordinal);

return name switch
{
// RDNA4
_ when Has("9060") || Has("9070") => "gfx1201",

// RDNA3.5 APUs
_ when Has("860M") => "gfx1152",
_ when Has("890M") => "gfx1150",
_ when Has("8040S") || Has("8050S") || Has("8060S") || Has("880M") || Has("Z2 Extreme") =>
"gfx1151",

// RDNA3 APUs (Phoenix)
_ when Has("740M") || Has("760M") || Has("780M") || Has("Z1") || Has("Z2") => "gfx1103",

// RDNA3 dGPU Navi33
_ when Has("7400") || Has("7500") || Has("7600") || Has("7650") || Has("7700S") => "gfx1102",

// RDNA3 dGPU Navi32
_ when Has("7700") || Has("RX 7800") || HasNoSpace("RX7800") => "gfx1101",

// RDNA3 dGPU Navi31 (incl. Pro)
_ when Has("W7800") || Has("7900") || Has("7950") || Has("7990") => "gfx1100",

// RDNA2 APUs (Rembrandt)
_ when Has("660M") || Has("680M") => "gfx1035",

// RDNA2 Navi24 low-end (incl. some mobiles)
_ when Has("6300") || Has("6400") || Has("6450") || Has("6500") || Has("6550") || Has("6500M") =>
"gfx1034",

// RDNA2 Navi23
_ when Has("6600") || Has("6650") || Has("6700S") || Has("6800S") || Has("6600M") => "gfx1032",

// RDNA2 Navi22 (note: desktop 6800 is NOT here; that’s Navi21/gfx1030)
_ when Has("6700") || Has("6750") || Has("6800M") || Has("6850M") => "gfx1031",

// RDNA2 Navi21 (big die)
_ when Has("6800") || Has("6900") || Has("6950") => "gfx1030",

_ => null,
};

bool HasNoSpace(string s) =>
nameNoSpaces.Contains(
s.Replace(" ", "", StringComparison.Ordinal),
StringComparison.OrdinalIgnoreCase
);
bool Has(string s) => name.Contains(s, StringComparison.OrdinalIgnoreCase);
return gpu.GetAmdGfxArch();
}

private async Task DownloadAndExtractPrerequisite(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ or NotifyCollectionChangedAction.Reset
{
if (sources.Count == 0)
{
SelectedImageIndex = 0;
SelectedImageIndex = -1;
}
else if (SelectedImageIndex == -1)
{
Expand Down Expand Up @@ -159,7 +159,7 @@ private async Task FlyoutPreview(IImage? image)
var viewerVm = vmFactory.Get<ImageViewerViewModel>();
viewerVm.ImageSource = new ImageSource((Bitmap)image);

var dialog = new BetterContentDialog { Content = new ImageViewerDialog { DataContext = viewerVm, } };
var dialog = new BetterContentDialog { Content = new ImageViewerDialog { DataContext = viewerVm } };

await dialog.ShowAsync();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -602,6 +602,7 @@ private async Task ChangeVersion()

viewModel.SelectedBasePackage = basePackage;
viewModel.CanSelectBasePackage = false;
viewModel.ShowPythonVersionSelection = false;
viewModel.IsReleaseMode = Package.Version?.IsReleaseMode ?? false;

var dialog = new TaskDialog
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ IPyInstallationManager pyInstallationManager
[ObservableProperty]
private string searchFilter = string.Empty;

private SourceCache<BasePackage, string> packageSource = new(p => p.GithubUrl);
private SourceCache<BasePackage, string> packageSource = new(p => p.Name);

public IObservableCollection<BasePackage> InferencePackages { get; } =
new ObservableCollectionExtended<BasePackage>();
Expand Down Expand Up @@ -119,10 +119,7 @@ protected override void OnInitialLoaded()
.ObserveOn(SynchronizationContext.Current)
.Subscribe();

packageSource.EditDiff(
packageFactory.GetAllAvailablePackages(),
(a, b) => a.GithubUrl == b.GithubUrl
);
packageSource.EditDiff(packageFactory.GetAllAvailablePackages(), (a, b) => a.Name == b.Name);
}

public void OnPackageSelected(BasePackage? package)
Expand Down
14 changes: 14 additions & 0 deletions StabilityMatrix.Core/Helper/Factory/PackageFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,13 @@ public BasePackage GetNewBasePackage(InstalledPackage installedPackage)
prerequisiteHelper,
pyInstallationManager
),
"forge-neo" => new ForgeNeo(
githubApiCache,
settingsManager,
downloadService,
prerequisiteHelper,
pyInstallationManager
),
"framepack" => new FramePack(
githubApiCache,
settingsManager,
Expand All @@ -236,6 +243,13 @@ public BasePackage GetNewBasePackage(InstalledPackage installedPackage)
prerequisiteHelper,
pyInstallationManager
),
"Wan2GP" => new Wan2GP(
githubApiCache,
settingsManager,
downloadService,
prerequisiteHelper,
pyInstallationManager
),
_ => throw new ArgumentOutOfRangeException(nameof(installedPackage)),
};
}
Expand Down
89 changes: 53 additions & 36 deletions StabilityMatrix.Core/Helper/HardwareInfo/GpuInfo.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,42 +77,59 @@ public bool IsWindowsRocmSupportedGpu()
if (!IsAmd || string.IsNullOrWhiteSpace(Name))
return null;

var name = Name.ToLowerInvariant();

if (name.Contains("9070") || name.Contains("R9700"))
return "gfx1201";

if (name.Contains("9060"))
return "gfx1200";

if (name.Contains("z2") || name.Contains("880m") || name.Contains("8050s") || name.Contains("8060s"))
return "gfx1151";

if (name.Contains("740m") || name.Contains("760m") || name.Contains("780m") || name.Contains("z1"))
return "gfx1103";

if (
name.Contains("w7400")
|| name.Contains("w7500")
|| name.Contains("w7600")
|| name.Contains("7500 xt")
|| name.Contains("7600")
|| name.Contains("7650 gre")
|| name.Contains("7700s")
)
return "gfx1102";

if (
name.Contains("v710")
|| name.Contains("7700")
|| (name.Contains("7800") && !name.Contains("w7800"))
)
return "gfx1101";

if (name.Contains("w7800") || name.Contains("7900") || name.Contains("7950") || name.Contains("7990"))
return "gfx1100";

return null;
// Normalize for safer substring checks (handles RX7800 vs RX 7800, etc.)
var name = Name;
var nameNoSpaces = name.Replace(" ", "", StringComparison.Ordinal);

return name switch
{
// RDNA4
_ when Has("R9700") || Has("9070") => "gfx1201",
_ when Has("9060") => "gfx1200",

// RDNA3.5 APUs
_ when Has("860M") => "gfx1152",
_ when Has("890M") => "gfx1150",
_ when Has("8040S") || Has("8050S") || Has("8060S") || Has("880M") || Has("Z2 Extreme") =>
"gfx1151",

// RDNA3 APUs (Phoenix)
_ when Has("740M") || Has("760M") || Has("780M") || Has("Z1") || Has("Z2") => "gfx1103",

// RDNA3 dGPU Navi33
_ when Has("7400") || Has("7500") || Has("7600") || Has("7650") || Has("7700S") => "gfx1102",

// RDNA3 dGPU Navi32
_ when Has("7700") || Has("RX 7800") || HasNoSpace("RX7800") => "gfx1101",

// RDNA3 dGPU Navi31 (incl. Pro)
_ when Has("W7800") || Has("7900") || Has("7950") || Has("7990") => "gfx1100",

// RDNA2 APUs (Rembrandt)
_ when Has("660M") || Has("680M") => "gfx1035",

// RDNA2 Navi24 low-end (incl. some mobiles)
_ when Has("6300") || Has("6400") || Has("6450") || Has("6500") || Has("6550") || Has("6500M") =>
"gfx1034",

// RDNA2 Navi23
_ when Has("6600") || Has("6650") || Has("6700S") || Has("6800S") || Has("6600M") => "gfx1032",

// RDNA2 Navi22 (note: desktop 6800 is NOT here; that’s Navi21/gfx1030)
_ when Has("6700") || Has("6750") || Has("6800M") || Has("6850M") => "gfx1031",

// RDNA2 Navi21 (big die)
_ when Has("6800") || Has("6900") || Has("6950") => "gfx1030",

_ => null,
};

bool HasNoSpace(string s) =>
nameNoSpaces.Contains(
s.Replace(" ", "", StringComparison.Ordinal),
StringComparison.OrdinalIgnoreCase
);
bool Has(string s) => name.Contains(s, StringComparison.OrdinalIgnoreCase);
}

public virtual bool Equals(GpuInfo? other)
Expand Down
3 changes: 2 additions & 1 deletion StabilityMatrix.Core/Helper/IPrerequisiteHelper.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using System.Diagnostics;
using System.Runtime.Versioning;
using StabilityMatrix.Core.Exceptions;
using StabilityMatrix.Core.Helper.HardwareInfo;
using StabilityMatrix.Core.Models;
using StabilityMatrix.Core.Models.FileInterfaces;
using StabilityMatrix.Core.Models.Packages;
Expand Down Expand Up @@ -298,5 +299,5 @@ Task AddMissingLibsToVenv(
Task InstallPythonIfNecessary(PyVersion version, IProgress<ProgressReport>? progress = null);
Task InstallVirtualenvIfNecessary(PyVersion version, IProgress<ProgressReport>? progress = null);
Task InstallTkinterIfNecessary(PyVersion version, IProgress<ProgressReport>? progress = null);
string? GetGfxArchFromAmdGpuName();
string? GetGfxArchFromAmdGpuName(GpuInfo? gpu = null);
}
Loading
Loading