Compare commits

...

8 commits

Author SHA1 Message Date
KeatonTheBot
f2a2ed1c99 Merge branch 'feature/dsb-ub' into 'master'
Workaround undefined behavior in bad dual source blend states

See merge request ryubing/ryujinx!4
2025-04-14 16:46:47 -05:00
WilliamWsyHK
e0181d3410 Update translations of zh-tw
See merge request ryubing/ryujinx!9
2025-04-14 15:33:07 -05:00
TheToid
4c7c5ea323 MACOS build fixes
See merge request ryubing/ryujinx!12
2025-04-14 15:21:37 -05:00
yeager
4a6d9c2b3f Swedish update in locales.json (again)
See merge request ryubing/ryujinx!11
2025-04-14 15:17:46 -05:00
KeatonTheBot
abe95caee7 Merge branch ryujinx:master into feature/dsb-ub 2025-04-06 15:27:56 -05:00
Isaac Marovitz
8d50681112 Return 2025-04-06 15:26:27 -05:00
Isaac Marovitz
b63af3545c Always declare even in bad state on GLSL 2025-04-06 15:26:27 -05:00
Isaac Marovitz
3942cda3de Initial Changes 2025-04-06 15:26:27 -05:00
6 changed files with 63 additions and 39 deletions

4
.gitignore vendored
View file

@ -178,3 +178,7 @@ PublishProfiles/
# Ignore MacOS Attribute Files # Ignore MacOS Attribute Files
._* ._*
# Ignore distribution build files
distribution/macos/temp/
distribution/macos/output/

View file

@ -3844,7 +3844,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "Показати оригінальний UI (Потрібен перезапуск)", "uk_UA": "Показати оригінальний UI (Потрібен перезапуск)",
"zh_CN": "显示原始 UI 样式 (需要重启)", "zh_CN": "显示原始 UI 样式 (需要重启)",
"zh_TW": "" "zh_TW": "顯示原始 UI 樣式 (需要重新啟動 Ryujinx)"
} }
}, },
{ {
@ -3869,7 +3869,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "Показати старий інтерфейс Avalonia Ryujinx, який був у Ryujinx 1.1.1403. Ця опція активна за замовчуванням на всіх інших, окрім Windows платформах.\nПовернеться класична панель заголовка, а всі суттєві зміни інтерфейсу будуть скасовані, зокрема горизонтальне розміщення навігації в налаштуваннях.", "uk_UA": "Показати старий інтерфейс Avalonia Ryujinx, який був у Ryujinx 1.1.1403. Ця опція активна за замовчуванням на всіх інших, окрім Windows платформах.\nПовернеться класична панель заголовка, а всі суттєві зміни інтерфейсу будуть скасовані, зокрема горизонтальне розміщення навігації в налаштуваннях.",
"zh_CN": "显示旧的类似 Ryujinx 1.1.1403 的 Avalonia Ryujinx UI。在非 Windows 平台上默认启用此选项。\n经典样式的标题栏已回归并且恢复了对窗口布局的重大重构;例如在工具提示上方放置设置导航。", "zh_CN": "显示旧的类似 Ryujinx 1.1.1403 的 Avalonia Ryujinx UI。在非 Windows 平台上默认启用此选项。\n经典样式的标题栏已回归并且恢复了对窗口布局的重大重构;例如在工具提示上方放置设置导航。",
"zh_TW": "" "zh_TW": "顯示舊版 Ryujinx 1.1.1403 的 Avalonia UI 樣式。在非 Windows 平台預設啟用。\n經典樣式的標題欄已回歸並且還原了對設定視窗佈局的大型重構例如在工具提示上方設置導覽列。"
} }
}, },
{ {
@ -4944,7 +4944,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "Множник Турборежиму:", "uk_UA": "Множник Турборежиму:",
"zh_CN": "涡轮模式倍数:", "zh_CN": "涡轮模式倍数:",
"zh_TW": "" "zh_TW": "加速模式倍數:"
} }
}, },
{ {
@ -4969,7 +4969,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "Цільове значення коефіцієнта Турборежиму.\n\nЗалиште 200, якщо не впевнені", "uk_UA": "Цільове значення коефіцієнта Турборежиму.\n\nЗалиште 200, якщо не впевнені",
"zh_CN": "涡轮模式倍数的目标值。\n\n如果不确定请保留为 200。", "zh_CN": "涡轮模式倍数的目标值。\n\n如果不确定请保留为 200。",
"zh_TW": "" "zh_TW": "加速模式倍數的數值。\n\n如果不確定請保持數值為 200。"
} }
}, },
{ {
@ -4994,7 +4994,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "Турборежим це функція емулятора, яка ефективно прискорює або сповільнює гру, якщо та не чутлива до частоти кадрів. Цю функцію можна ввімкнути/вимкнути безпосередньо під час гри за допомогою гарячої клавіші, яку можна налаштувати в меню Гарячі клавіші в налаштуваннях.", "uk_UA": "Турборежим це функція емулятора, яка ефективно прискорює або сповільнює гру, якщо та не чутлива до частоти кадрів. Цю функцію можна ввімкнути/вимкнути безпосередньо під час гри за допомогою гарячої клавіші, яку можна налаштувати в меню Гарячі клавіші в налаштуваннях.",
"zh_CN": "涡轮模式是一种模拟器功能当游戏对帧率不敏感时它可以有效地导致加速或降速。\n您可以在游戏中使用热键切换此功能,它可以在 Ryujinx 的键盘热键设置进行设置。\n\n如果不确定则保留为 200。", "zh_CN": "涡轮模式是一种模拟器功能当游戏对帧率不敏感时它可以有效地导致加速或降速。\n您可以在游戏中使用热键切换此功能,它可以在 Ryujinx 的键盘热键设置进行设置。\n\n如果不确定则保留为 200。",
"zh_TW": "" "zh_TW": "加速模式是一種模擬器功能,其目的為加速或減速對不是以影格速率為速度 (frame-rate sensitive) 的遊戲。\n你可以在遊戲中以快捷鍵切換此功能而快捷鍵可於 Ryujinx 鍵盤快捷鍵中設置。\n\n如果不確定請保持數值為 200。"
} }
}, },
{ {
@ -18269,7 +18269,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "{0} FPS ({1}ms), Турбо ({2}%)", "uk_UA": "{0} FPS ({1}ms), Турбо ({2}%)",
"zh_CN": "{0} FPS ({1}ms), 涡轮 ({2}%)", "zh_CN": "{0} FPS ({1}ms), 涡轮 ({2}%)",
"zh_TW": "" "zh_TW": "{0} FPS ({1}ms), 加速 ({2}%)"
} }
}, },
{ {
@ -19914,7 +19914,7 @@
"pl_PL": "Skróty Klawiszowe Klawiatury", "pl_PL": "Skróty Klawiszowe Klawiatury",
"pt_BR": "Atalhos do Teclado", "pt_BR": "Atalhos do Teclado",
"ru_RU": "Горячие клавиши", "ru_RU": "Горячие клавиши",
"sv_SE": "Snabbtangenter för tangentbord", "sv_SE": "Snabbtangenter",
"th_TH": "ปุ่มลัดของคีย์บอร์ด", "th_TH": "ปุ่มลัดของคีย์บอร์ด",
"tr_TR": "Klavye Kısayolları", "tr_TR": "Klavye Kısayolları",
"uk_UA": "Гарячі клавіші", "uk_UA": "Гарячі клавіші",
@ -24019,7 +24019,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "Турбомод:", "uk_UA": "Турбомод:",
"zh_CN": "涡轮模式: ", "zh_CN": "涡轮模式: ",
"zh_TW": "" "zh_TW": "加速模式:"
} }
}, },
{ {
@ -24044,7 +24044,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "Гаряча клавіша Турборежиму.\nКонфігурація поведінки турборежиму в налаштуваннях Процесору Ryujinx.\n\nНе прив'язуйте, якщо не впевнені.", "uk_UA": "Гаряча клавіша Турборежиму.\nКонфігурація поведінки турборежиму в налаштуваннях Процесору Ryujinx.\n\nНе прив'язуйте, якщо не впевнені.",
"zh_CN": "涡轮模式热键。\n可以在 Ryujinx CPU 设置中配置涡轮模式的行为。\n\n如果不确定请保留为未绑定。", "zh_CN": "涡轮模式热键。\n可以在 Ryujinx CPU 设置中配置涡轮模式的行为。\n\n如果不确定请保留为未绑定。",
"zh_TW": "" "zh_TW": "加速模式快捷鍵。\n可以在 Ryujinx CPU 設定中設定加速模式的倍數。\n\n如果不確定請保持為「未分配」。"
} }
}, },
{ {
@ -24069,7 +24069,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "Тільки під час натискання", "uk_UA": "Тільки під час натискання",
"zh_CN": "仅在按下时", "zh_CN": "仅在按下时",
"zh_TW": "" "zh_TW": "只在按下時"
} }
}, },
{ {
@ -24119,7 +24119,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "Список сумісності — {0} ігор", "uk_UA": "Список сумісності — {0} ігор",
"zh_CN": "兼容性列表 - {0} 条", "zh_CN": "兼容性列表 - {0} 条",
"zh_TW": "" "zh_TW": "相容性列表 - {0} 則紀錄"
} }
}, },
{ {
@ -24194,7 +24194,7 @@
"tr_TR": "", "tr_TR": "",
"uk_UA": "Шукати серед {0} перевірених ігор...", "uk_UA": "Шукати серед {0} перевірених ігор...",
"zh_CN": "搜索 {0} 兼容性条目...", "zh_CN": "搜索 {0} 兼容性条目...",
"zh_TW": "" "zh_TW": "從相容性列表的 {0} 則紀錄中搜尋..."
} }
}, },
{ {

View file

@ -562,9 +562,11 @@ search_path = [
for path in content_directory.rglob("**/*.dylib"): for path in content_directory.rglob("**/*.dylib"):
if not path.name.startswith("._"):
current_search_path = [path.parent] current_search_path = [path.parent]
current_search_path.extend(search_path) current_search_path.extend(search_path)
print(f"Fixing path '{path}' using search path of '{current_search_path}' for context of '{content_directory}'.")
fixup_dylib( fixup_dylib(
path, path,
get_path_related_to_target_exec(content_directory, path), get_path_related_to_target_exec(content_directory, path),
@ -573,6 +575,7 @@ for path in content_directory.rglob("**/*.dylib"):
) )
for path in content_directory.rglob("**/*.so"): for path in content_directory.rglob("**/*.so"):
if not path.name.startswith("._"):
current_search_path = [path.parent] current_search_path = [path.parent]
current_search_path.extend(search_path) current_search_path.extend(search_path)

View file

@ -30,9 +30,14 @@ cp -r "$PUBLISH_DIRECTORY/THIRDPARTY.md" "$APP_BUNDLE_DIRECTORY/Contents/Resourc
echo -n "APPL????" > "$APP_BUNDLE_DIRECTORY/Contents/PkgInfo" echo -n "APPL????" > "$APP_BUNDLE_DIRECTORY/Contents/PkgInfo"
# Fixup libraries and executable # Fixup libraries and executable
echo "Running bundle fix up python script"
python3 bundle_fix_up.py "$APP_BUNDLE_DIRECTORY" MacOS/Ryujinx python3 bundle_fix_up.py "$APP_BUNDLE_DIRECTORY" MacOS/Ryujinx
# Resign all dyplib files as ad-hoc after changing them
find "$APP_BUNDLE_DIRECTORY/Contents/Frameworks" -type f -name "*.dylib" -exec codesign --force --sign - {} \;
# Now sign it # Now sign it
echo "Starting signing process"
if ! [ -x "$(command -v codesign)" ]; if ! [ -x "$(command -v codesign)" ];
then then
if ! [ -x "$(command -v rcodesign)" ]; if ! [ -x "$(command -v rcodesign)" ];
@ -42,9 +47,9 @@ then
fi fi
# cargo install apple-codesign # cargo install apple-codesign
echo "Usign rcodesign for ad-hoc signing" echo "Using rcodesign for ad-hoc signing"
rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$APP_BUNDLE_DIRECTORY" rcodesign sign --entitlements-xml-path "$ENTITLEMENTS_FILE_PATH" "$APP_BUNDLE_DIRECTORY"
else else
echo "Usign codesign for ad-hoc signing" echo "Using codesign for ad-hoc signing"
codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f -s - "$APP_BUNDLE_DIRECTORY" codesign --entitlements "$ENTITLEMENTS_FILE_PATH" -f -s - "$APP_BUNDLE_DIRECTORY"
fi fi

View file

@ -512,14 +512,10 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
if (context.Definitions.Stage == ShaderStage.Fragment && context.Definitions.DualSourceBlend) if (context.Definitions.Stage == ShaderStage.Fragment && context.Definitions.DualSourceBlend)
{ {
IoDefinition firstOutput = outputs.ElementAtOrDefault(0); IoDefinition firstOutput = outputs.ElementAtOrDefault(0);
IoDefinition secondOutput = outputs.ElementAtOrDefault(1);
if (firstOutput.Location + 1 == secondOutput.Location)
{
DeclareOutputDualSourceBlendAttribute(context, firstOutput.Location); DeclareOutputDualSourceBlendAttribute(context, firstOutput.Location);
outputs = outputs.Skip(2); outputs = outputs.Skip(2);
} }
}
foreach (IoDefinition ioDefinition in outputs) foreach (IoDefinition ioDefinition in outputs)
{ {

View file

@ -181,13 +181,29 @@ namespace Ryujinx.Graphics.Shader.Translation
private static void EmitOutputsInitialization(EmitterContext context, AttributeUsage attributeUsage, IGpuAccessor gpuAccessor, ShaderStage stage) private static void EmitOutputsInitialization(EmitterContext context, AttributeUsage attributeUsage, IGpuAccessor gpuAccessor, ShaderStage stage)
{ {
// Compute has no output attributes, and fragment is the last stage, so we // Compute has no output attributes, so we
// don't need to initialize outputs on those stages. // don't need to initialize outputs on that stage.
if (stage == ShaderStage.Compute || stage == ShaderStage.Fragment) if (stage == ShaderStage.Compute)
{ {
return; return;
} }
if (stage == ShaderStage.Fragment)
{
// Fragment is the last stage, so we don't need to
// initialize outputs unless we're using DSB, in which
// we need to make sure the ouput has a valid value.
if (gpuAccessor.QueryGraphicsState().DualSourceBlendEnable)
{
for (int i = 0; i < 4; i++)
{
context.Store(StorageKind.Output, IoVariable.FragmentOutputColor, null, Const(1), Const(i), ConstF(0));
}
}
return;
}
if (stage == ShaderStage.Vertex) if (stage == ShaderStage.Vertex)
{ {
InitializeVertexOutputs(context); InitializeVertexOutputs(context);