Compare commits

...

5 commits

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

See merge request ryubing/ryujinx!14
2025-03-28 20:55:12 +00:00
Hack茶ん
1e6b2ea9ca Update Korean translation 2025-03-28 10:01:12 +00:00
Isaac Marovitz
c1051a9d6a Return 2025-03-27 18:29:26 -05:00
Isaac Marovitz
27b042ca16 Always declare even in bad state on GLSL 2025-03-27 18:29:26 -05:00
Isaac Marovitz
27b5251bd3 Initial Changes 2025-03-27 18:29:26 -05:00
3 changed files with 33 additions and 21 deletions

View file

@ -512,13 +512,9 @@ namespace Ryujinx.Graphics.Shader.CodeGen.Glsl
if (context.Definitions.Stage == ShaderStage.Fragment && context.Definitions.DualSourceBlend)
{
IoDefinition firstOutput = outputs.ElementAtOrDefault(0);
IoDefinition secondOutput = outputs.ElementAtOrDefault(1);
if (firstOutput.Location + 1 == secondOutput.Location)
{
DeclareOutputDualSourceBlendAttribute(context, firstOutput.Location);
outputs = outputs.Skip(2);
}
DeclareOutputDualSourceBlendAttribute(context, firstOutput.Location);
outputs = outputs.Skip(2);
}
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)
{
// Compute has no output attributes, and fragment is the last stage, so we
// don't need to initialize outputs on those stages.
if (stage == ShaderStage.Compute || stage == ShaderStage.Fragment)
// Compute has no output attributes, so we
// don't need to initialize outputs on that stage.
if (stage == ShaderStage.Compute)
{
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)
{
InitializeVertexOutputs(context);

View file

@ -4934,7 +4934,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"ko_KR": "터보 모드 배수 :",
"no_NO": "Multiplikator i turbomodus:",
"pl_PL": "",
"pt_BR": "",
@ -4959,7 +4959,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"ko_KR": "터보 모드 배수 목표 값입니다.\n\n모르면 200으로 두세요.",
"no_NO": "Målverdien for multiplikatoren i turbomodus. \n\nLa syå på 200 hvis du er usikker.",
"pl_PL": "",
"pt_BR": "",
@ -4984,7 +4984,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"ko_KR": "터보 모드는 게임이 프레임 속도에 민감하지 않을 때 효과적으로 속도를 높이거나 낮추는 에뮬레이터 기능입니다.\n이 기능은 Ryujinx 키보드 단축키 설정에서 구성할 수 있는 단축키를 사용하여 게임 내에서 전환할 수 있습니다.\n\n모르면 200으로 두세요.",
"no_NO": "Turbo-modus er en emulatorfunksjon som effektivt øker eller senker hastigheten når et spill ikke er følsom for bildefrekvens.\nDu kan slå på denne funksjonen i spillet med en hurtigtast, som kan konfigureres i Ryujinx Keyboard Hotkeys-innstillingene.\n\nLa den stå på 200 hvis du er usikker.",
"pl_PL": "",
"pt_BR": "",
@ -18184,7 +18184,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"ko_KR": "{0}FPS({1}밀리초)",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
@ -18209,7 +18209,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"ko_KR": "{0}FPS({1}밀리초), ({2}%) 터보",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
@ -23959,7 +23959,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"ko_KR": "터보 모드 :",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
@ -23984,7 +23984,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"ko_KR": "터보 모드 단축키입니다.\nRyujinx CPU 설정에서 터보 모드의 동작을 구성합니다.\n\n모르면 바인딩 해제 상태로 두세요.",
"no_NO": "Hurtigtasten for turbo-modus.\nKonfigurer oppførselen til turbo-modus i Ryujinx CPU-innstillinger.\n\nLa være ubundet hvis du er usikker.",
"pl_PL": "",
"pt_BR": "",
@ -24009,7 +24009,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"ko_KR": "누르고 있는 동안만",
"no_NO": "Bare mens du trykker på",
"pl_PL": "",
"pt_BR": "",
@ -24209,7 +24209,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "플레이 가능",
"ko_KR": "원활",
"no_NO": "Spillbar",
"pl_PL": "",
"pt_BR": "Jogável",
@ -24234,7 +24234,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "게임 내",
"ko_KR": "가능",
"no_NO": "",
"pl_PL": "",
"pt_BR": "No jogo",
@ -24284,7 +24284,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "부",
"ko_KR": "부",
"no_NO": "Starter",
"pl_PL": "",
"pt_BR": "Inicializa",
@ -24309,7 +24309,7 @@
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "없음",
"ko_KR": "불가능",
"no_NO": "Ingenting",
"pl_PL": "",
"pt_BR": "Nada",