Compare commits

..

7 Commits

Author SHA1 Message Date
Keaton
efafdbce07 Merge a002202d42 into cdf4016c25 2025-01-27 22:06:41 +01:00
Evan Husted
a002202d42 Merge branch 'master' into VP9-loop-filtering 2025-01-26 16:03:14 -06:00
Evan Husted
428b1e5cea Merge branch 'master' into VP9-loop-filtering 2025-01-23 01:09:44 -06:00
TSR Berry
e6f7d6e1d5 Remove duplicate BitUtils methods 2025-01-20 11:03:50 -06:00
TSR Berry
0ad5def417 Adjust docstrings for CodecError.cs 2025-01-20 11:03:50 -06:00
gdkchan
f012c3fbef Initialize loop filter parameters 2025-01-20 11:03:49 -06:00
gdkchan
b69b432b4c Implement VP9 loop filtering 2025-01-20 11:03:49 -06:00
308 changed files with 5197 additions and 8147 deletions

View File

@@ -29,7 +29,7 @@ env:
jobs: jobs:
tag: tag:
name: Create tag name: Create tag
runs-on: ubuntu-24.04 runs-on: ubuntu-20.04
steps: steps:
- name: Get version info - name: Get version info
id: version_info id: version_info
@@ -202,7 +202,7 @@ jobs:
macos_release: macos_release:
name: Release MacOS universal name: Release MacOS universal
runs-on: ubuntu-24.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4

View File

@@ -18,7 +18,7 @@ env:
jobs: jobs:
tag: tag:
name: Create tag name: Create tag
runs-on: ubuntu-24.04 runs-on: ubuntu-20.04
steps: steps:
- name: Get version info - name: Get version info
id: version_info id: version_info
@@ -183,7 +183,7 @@ jobs:
macos_release: macos_release:
name: Release MacOS universal name: Release MacOS universal
runs-on: ubuntu-24.04 runs-on: ubuntu-20.04
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4

View File

@@ -42,7 +42,7 @@
<PackageVersion Include="Ryujinx.Graphics.Nvdec.Dependencies" Version="5.0.3-build14" /> <PackageVersion Include="Ryujinx.Graphics.Nvdec.Dependencies" Version="5.0.3-build14" />
<PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" /> <PackageVersion Include="Ryujinx.Graphics.Vulkan.Dependencies.MoltenVK" Version="1.2.0" />
<PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" /> <PackageVersion Include="Ryujinx.SDL2-CS" Version="2.30.0-build32" />
<PackageVersion Include="Gommon" Version="2.7.1.1" /> <PackageVersion Include="Gommon" Version="2.7.1" />
<PackageVersion Include="securifybv.ShellLink" Version="0.1.0" /> <PackageVersion Include="securifybv.ShellLink" Version="0.1.0" />
<PackageVersion Include="Sep" Version="0.6.0" /> <PackageVersion Include="Sep" Version="0.6.0" />
<PackageVersion Include="shaderc.net" Version="0.1.0" /> <PackageVersion Include="shaderc.net" Version="0.1.0" />

View File

@@ -39,12 +39,12 @@
<p align="center"> <p align="center">
Click below to join the Discord: Click below to join the Discord:
<br> <br>
<a href="https://discord.gg/PEuzjrFXUA"> <a href="https://discord.gg/dHPrkBkkyA">
<img src="https://img.shields.io/discord/1294443224030511104?color=5865F2&label=Ryubing&logo=discord&logoColor=white" alt="Discord"> <img src="https://img.shields.io/discord/1294443224030511104?color=5865F2&label=Ryubing&logo=discord&logoColor=white" alt="Discord">
</a> </a>
<br> <br>
<br> <br>
<img src="https://raw.githubusercontent.com/Ryubing/Ryujinx/refs/heads/master/docs/shell.png"> <img src="https://raw.githubusercontent.com/GreemDev/Ryujinx/refs/heads/master/docs/shell.png">
</p> </p>
## Usage ## Usage

View File

@@ -332,7 +332,6 @@
0100E680149DC000,"Arcaea",,playable,2023-03-16 19:31:21 0100E680149DC000,"Arcaea",,playable,2023-03-16 19:31:21
01003C2010C78000,"Archaica: The Path Of Light",crash,nothing,2020-10-16 13:22:26 01003C2010C78000,"Archaica: The Path Of Light",crash,nothing,2020-10-16 13:22:26
01004DA012976000,"Area 86",,playable,2020-12-16 16:45:52 01004DA012976000,"Area 86",,playable,2020-12-16 16:45:52
01008d8006a6a000,"Arena of Valor",crash,boots,2025-02-03 22:19:34
0100691013C46000,"ARIA CHRONICLE",,playable,2022-11-16 13:50:55 0100691013C46000,"ARIA CHRONICLE",,playable,2022-11-16 13:50:55
0100D4A00B284000,"ARK: Survival Evolved",gpu;nvdec;online-broken;UE4;ldn-untested,ingame,2024-04-16 00:53:56 0100D4A00B284000,"ARK: Survival Evolved",gpu;nvdec;online-broken;UE4;ldn-untested,ingame,2024-04-16 00:53:56
0100C56012C96000,"Arkanoid vs. Space Invaders",services,ingame,2021-01-21 12:50:30 0100C56012C96000,"Arkanoid vs. Space Invaders",services,ingame,2021-01-21 12:50:30
@@ -427,7 +426,6 @@
0100E48013A34000,"Balan Wonderworld Demo",gpu;services;UE4;demo,ingame,2023-02-16 20:05:07 0100E48013A34000,"Balan Wonderworld Demo",gpu;services;UE4;demo,ingame,2023-02-16 20:05:07
0100CD801CE5E000,"Balatro",,ingame,2024-04-21 02:01:53 0100CD801CE5E000,"Balatro",,ingame,2024-04-21 02:01:53
010010A00DA48000,"Baldur's Gate and Baldur's Gate II: Enhanced Editions",32-bit,playable,2022-09-12 23:52:15 010010A00DA48000,"Baldur's Gate and Baldur's Gate II: Enhanced Editions",32-bit,playable,2022-09-12 23:52:15
0100fd1014726000,"Baldur's Gate: Dark Alliance",ldn-untested,ingame,2025-02-03 22:21:00
0100BC400FB64000,"Balthazar's Dream",,playable,2022-09-13 00:13:22 0100BC400FB64000,"Balthazar's Dream",,playable,2022-09-13 00:13:22
01008D30128E0000,"Bamerang",,playable,2022-10-26 00:29:39 01008D30128E0000,"Bamerang",,playable,2022-10-26 00:29:39
010013C010C5C000,"Banner of the Maid",,playable,2021-06-14 15:23:37 010013C010C5C000,"Banner of the Maid",,playable,2021-06-14 15:23:37
@@ -530,7 +528,6 @@
01005950022EC000,"Blade Strangers",nvdec,playable,2022-07-17 19:02:43 01005950022EC000,"Blade Strangers",nvdec,playable,2022-07-17 19:02:43
0100DF0011A6A000,"Bladed Fury",,playable,2022-10-26 11:36:26 0100DF0011A6A000,"Bladed Fury",,playable,2022-10-26 11:36:26
0100CFA00CC74000,"Blades of Time",deadlock;online,boots,2022-07-17 19:19:58 0100CFA00CC74000,"Blades of Time",deadlock;online,boots,2022-07-17 19:19:58
01003d700dd8a000,"Blades",,boots,2025-02-03 22:22:00
01006CC01182C000,"Blair Witch",nvdec;UE4,playable,2022-10-01 14:06:16 01006CC01182C000,"Blair Witch",nvdec;UE4,playable,2022-10-01 14:06:16
010039501405E000,"Blanc",gpu;slow,ingame,2023-02-22 14:00:13 010039501405E000,"Blanc",gpu;slow,ingame,2023-02-22 14:00:13
0100698009C6E000,"Blasphemous",nvdec,playable,2021-03-01 12:15:31 0100698009C6E000,"Blasphemous",nvdec,playable,2021-03-01 12:15:31
@@ -958,7 +955,7 @@
010012800EBAE000,"Disney TSUM TSUM FESTIVAL",crash,menus,2020-07-14 14:05:28 010012800EBAE000,"Disney TSUM TSUM FESTIVAL",crash,menus,2020-07-14 14:05:28
01009740120FE000,"DISTRAINT 2",,playable,2020-09-03 16:08:12 01009740120FE000,"DISTRAINT 2",,playable,2020-09-03 16:08:12
010075B004DD2000,"DISTRAINT: Deluxe Edition",,playable,2020-06-15 23:42:24 010075B004DD2000,"DISTRAINT: Deluxe Edition",,playable,2020-06-15 23:42:24
010027400CDC6000,"Divinity: Original Sin 2 - Definitive Edition",services;crash;online-broken;regression,ingame,2025-02-03 22:12:30 010027400CDC6000,"Divinity: Original Sin 2 - Definitive Edition",services;crash;online-broken;regression,menus,2023-08-13 17:20:03
01001770115C8000,"Dodo Peak",nvdec;UE4,playable,2022-10-04 16:13:05 01001770115C8000,"Dodo Peak",nvdec;UE4,playable,2022-10-04 16:13:05
010077B0100DA000,"Dogurai",,playable,2020-10-04 02:40:16 010077B0100DA000,"Dogurai",,playable,2020-10-04 02:40:16
010048100D51A000,"Dokapon Up! Mugen no Roulette",gpu;Needs Update,menus,2022-12-08 19:39:10 010048100D51A000,"Dokapon Up! Mugen no Roulette",gpu;Needs Update,menus,2022-12-08 19:39:10
@@ -969,7 +966,6 @@
0100751007ADA000,"Don't Starve: Nintendo Switch Edition",nvdec,playable,2022-02-05 20:43:34 0100751007ADA000,"Don't Starve: Nintendo Switch Edition",nvdec,playable,2022-02-05 20:43:34
010088B010DD2000,"Dongo Adventure",,playable,2022-10-04 16:22:26 010088B010DD2000,"Dongo Adventure",,playable,2022-10-04 16:22:26
0100C1F0051B6000,"Donkey Kong Country™: Tropical Freeze",,playable,2024-08-05 16:46:10 0100C1F0051B6000,"Donkey Kong Country™: Tropical Freeze",,playable,2024-08-05 16:46:10
01009D901BC56000,"Donkey Kong Country™: Returns HD",gpu,ingame,2025-02-16 13:44:12
0100F2C00F060000,"Doodle Derby",,boots,2020-12-04 22:51:48 0100F2C00F060000,"Doodle Derby",,boots,2020-12-04 22:51:48
0100416004C00000,"DOOM",gpu;slow;nvdec;online-broken,ingame,2024-09-23 15:40:07 0100416004C00000,"DOOM",gpu;slow;nvdec;online-broken,ingame,2024-09-23 15:40:07
010018900DD00000,"DOOM (1993)",nvdec;online-broken,menus,2022-09-06 13:32:19 010018900DD00000,"DOOM (1993)",nvdec;online-broken,menus,2022-09-06 13:32:19
@@ -1159,7 +1155,7 @@
010095600AA36000,"Fill-a-Pix: Phil's Epic Adventure",,playable,2020-12-22 13:48:22 010095600AA36000,"Fill-a-Pix: Phil's Epic Adventure",,playable,2020-12-22 13:48:22
0100C3A00BB76000,"Fimbul",nvdec,playable,2022-07-26 13:31:47 0100C3A00BB76000,"Fimbul",nvdec,playable,2022-07-26 13:31:47
0100C8200E942000,"Fin and the Ancient Mystery",nvdec,playable,2020-12-17 16:40:39 0100C8200E942000,"Fin and the Ancient Mystery",nvdec,playable,2020-12-17 16:40:39
01000EA014150000,"FINAL FANTASY",,playable,2025-02-16 21:27:30 01000EA014150000,"FINAL FANTASY",crash,nothing,2024-09-05 20:55:30
01006B7014156000,"FINAL FANTASY II",crash,nothing,2024-04-13 19:18:04 01006B7014156000,"FINAL FANTASY II",crash,nothing,2024-04-13 19:18:04
01006F000B056000,"FINAL FANTASY IX",audout;nvdec,playable,2021-06-05 11:35:00 01006F000B056000,"FINAL FANTASY IX",audout;nvdec,playable,2021-06-05 11:35:00
0100AA201415C000,"FINAL FANTASY V",,playable,2023-04-26 01:11:55 0100AA201415C000,"FINAL FANTASY V",,playable,2023-04-26 01:11:55
@@ -1250,7 +1246,7 @@
0100A6B00D4EC000,"Furwind",,playable,2021-02-19 19:44:08 0100A6B00D4EC000,"Furwind",,playable,2021-02-19 19:44:08
0100ECE00C0C4000,"Fury Unleashed",crash;services,ingame,2020-10-18 11:52:40 0100ECE00C0C4000,"Fury Unleashed",crash;services,ingame,2020-10-18 11:52:40
010070000ED9E000,"Fury Unleashed Demo",,playable,2020-10-08 20:09:21 010070000ED9E000,"Fury Unleashed Demo",,playable,2020-10-08 20:09:21
0100E1F013674000,"FUSER™",nvdec;UE4;slow;gpu,ingame,2025-02-12 16:03:00 0100E1F013674000,"FUSER™",nvdec;UE4,playable,2022-10-17 20:58:32
0100A7A015E4C000,"Fushigi no Gensokyo Lotus Labyrinth",Needs Update;audio;gpu;nvdec,ingame,2021-01-20 15:30:02 0100A7A015E4C000,"Fushigi no Gensokyo Lotus Labyrinth",Needs Update;audio;gpu;nvdec,ingame,2021-01-20 15:30:02
01003C300B274000,"Futari de! Nyanko Daisensou",,playable,2024-01-05 22:26:52 01003C300B274000,"Futari de! Nyanko Daisensou",,playable,2024-01-05 22:26:52
010055801134E000,"FUZE Player",online-broken;vulkan-backend-bug,ingame,2022-10-18 12:23:53 010055801134E000,"FUZE Player",online-broken;vulkan-backend-bug,ingame,2022-10-18 12:23:53
@@ -1658,7 +1654,7 @@
0100A73006E74000,"Legendary Eleven",,playable,2021-06-08 12:09:03 0100A73006E74000,"Legendary Eleven",,playable,2021-06-08 12:09:03
0100A7700B46C000,"Legendary Fishing",online,playable,2021-04-14 15:08:46 0100A7700B46C000,"Legendary Fishing",online,playable,2021-04-14 15:08:46
0100739018020000,"LEGO® 2K Drive",gpu;ldn-works,ingame,2024-04-09 02:05:12 0100739018020000,"LEGO® 2K Drive",gpu;ldn-works,ingame,2024-04-09 02:05:12
010085500130a000,"LEGO® CITY Undercover",nvdec,playable,2024-09-30 08:44:27 01003A30012C0000,"LEGO® CITY Undercover",nvdec,playable,2024-09-30 08:44:27
010070D009FEC000,"LEGO® DC Super-Villains",,playable,2021-05-27 18:10:37 010070D009FEC000,"LEGO® DC Super-Villains",,playable,2021-05-27 18:10:37
010052A00B5D2000,"LEGO® Harry Potter™ Collection",crash,ingame,2024-01-31 10:28:07 010052A00B5D2000,"LEGO® Harry Potter™ Collection",crash,ingame,2024-01-31 10:28:07
010073C01AF34000,"LEGO® Horizon Adventures™",vulkan-backend-bug;opengl-backend-bug;UE4,ingame,2025-01-07 04:24:56 010073C01AF34000,"LEGO® Horizon Adventures™",vulkan-backend-bug;opengl-backend-bug;UE4,ingame,2025-01-07 04:24:56
@@ -1800,7 +1796,6 @@
010005A00B312000,"Megaton Rainfall",gpu;opengl,boots,2022-08-04 18:29:43 010005A00B312000,"Megaton Rainfall",gpu;opengl,boots,2022-08-04 18:29:43
0100EA100DF92000,"Meiji Katsugeki Haikara Ryuuseigumi - Seibai Shimaseu, Yonaoshi Kagyou",32-bit;nvdec,playable,2022-12-05 13:19:12 0100EA100DF92000,"Meiji Katsugeki Haikara Ryuuseigumi - Seibai Shimaseu, Yonaoshi Kagyou",32-bit;nvdec,playable,2022-12-05 13:19:12
0100B360068B2000,"Mekorama",gpu,boots,2021-06-17 16:37:21 0100B360068B2000,"Mekorama",gpu,boots,2021-06-17 16:37:21
010012301932A000,"Melatonin",,playable,2025-02-16 04:08:17
01000FA010340000,"Melbits World",nvdec;online,menus,2021-11-26 13:51:22 01000FA010340000,"Melbits World",nvdec;online,menus,2021-11-26 13:51:22
0100F68019636000,"Melon Journey",,playable,2023-04-23 21:20:01 0100F68019636000,"Melon Journey",,playable,2023-04-23 21:20:01
010079C012896000,"Memories Off -Innocent Fille- for Dearest",,playable,2020-08-04 07:31:22 010079C012896000,"Memories Off -Innocent Fille- for Dearest",,playable,2020-08-04 07:31:22
@@ -1918,7 +1913,6 @@
010073E008E6E000,"Mugsters",,playable,2021-01-28 17:57:17 010073E008E6E000,"Mugsters",,playable,2021-01-28 17:57:17
0100A8400471A000,"MUJO",,playable,2020-05-08 16:31:04 0100A8400471A000,"MUJO",,playable,2020-05-08 16:31:04
0100211005E94000,"Mulaka",,playable,2021-01-28 18:07:20 0100211005E94000,"Mulaka",,playable,2021-01-28 18:07:20
01008e2013fb4000,"Multi Quiz",ldn-untested,ingame,2025-02-03 22:26:00
010038B00B9AE000,"Mummy Pinball",,playable,2022-08-05 16:08:11 010038B00B9AE000,"Mummy Pinball",,playable,2022-08-05 16:08:11
01008E200C5C2000,"Muse Dash",,playable,2020-06-06 14:41:29 01008E200C5C2000,"Muse Dash",,playable,2020-06-06 14:41:29
010035901046C000,"Mushroom Quest",,playable,2020-05-17 13:07:08 010035901046C000,"Mushroom Quest",,playable,2020-05-17 13:07:08
@@ -2034,7 +2028,6 @@
010003C00B868000,"Ninjin: Clash of Carrots",online-broken,playable,2024-07-10 05:12:26 010003C00B868000,"Ninjin: Clash of Carrots",online-broken,playable,2024-07-10 05:12:26
0100746010E4C000,"NinNinDays",,playable,2022-11-20 15:17:29 0100746010E4C000,"NinNinDays",,playable,2022-11-20 15:17:29
0100C9A00ECE6000,"Nintendo 64™ Nintendo Switch Online",gpu;vulkan,ingame,2024-04-23 20:21:07 0100C9A00ECE6000,"Nintendo 64™ Nintendo Switch Online",gpu;vulkan,ingame,2024-04-23 20:21:07
0100e0601c632000,"Nintendo 64™ Nintendo Switch Online: MATURE 17+",,ingame,2025-02-03 22:27:00
0100D870045B6000,"Nintendo Entertainment System™ - Nintendo Switch Online",online,playable,2022-07-01 15:45:06 0100D870045B6000,"Nintendo Entertainment System™ - Nintendo Switch Online",online,playable,2022-07-01 15:45:06
0100C4B0034B2000,"Nintendo Labo Toy-Con 01 Variety Kit",gpu,ingame,2022-08-07 12:56:07 0100C4B0034B2000,"Nintendo Labo Toy-Con 01 Variety Kit",gpu,ingame,2022-08-07 12:56:07
01001E9003502000,"Nintendo Labo Toy-Con 03 Vehicle Kit",services;crash,menus,2022-08-03 17:20:11 01001E9003502000,"Nintendo Labo Toy-Con 03 Vehicle Kit",services;crash,menus,2022-08-03 17:20:11
@@ -2065,7 +2058,7 @@
010002700C34C000,"Numbala",,playable,2020-05-11 12:01:07 010002700C34C000,"Numbala",,playable,2020-05-11 12:01:07
010020500C8C8000,"Number Place 10000",gpu,menus,2021-11-24 09:14:23 010020500C8C8000,"Number Place 10000",gpu,menus,2021-11-24 09:14:23
010003701002C000,"Nurse Love Syndrome",,playable,2022-10-13 10:05:22 010003701002C000,"Nurse Love Syndrome",,playable,2022-10-13 10:05:22
,"nx-hbmenu",Needs Update;homebrew,boots,2024-04-06 22:05:32 0000000000000000,"nx-hbmenu",Needs Update;homebrew,boots,2024-04-06 22:05:32
,"nxquake2",services;crash;homebrew,nothing,2022-08-04 23:14:04 ,"nxquake2",services;crash;homebrew,nothing,2022-08-04 23:14:04
010049F00EC30000,"Nyan Cat: Lost in Space",online,playable,2021-06-12 13:22:03 010049F00EC30000,"Nyan Cat: Lost in Space",online,playable,2021-06-12 13:22:03
01002E6014FC4000,"O---O",,playable,2022-10-29 12:12:14 01002E6014FC4000,"O---O",,playable,2022-10-29 12:12:14
@@ -2473,7 +2466,7 @@
0100AFE00DDAC000,"Royal Roads",,playable,2020-11-17 12:54:38 0100AFE00DDAC000,"Royal Roads",,playable,2020-11-17 12:54:38
0100E2C00B414000,"RPG Maker MV",nvdec,playable,2021-01-05 20:12:01 0100E2C00B414000,"RPG Maker MV",nvdec,playable,2021-01-05 20:12:01
01005CD015986000,"rRootage Reloaded",,playable,2022-08-05 23:20:18 01005CD015986000,"rRootage Reloaded",,playable,2022-08-05 23:20:18
,"RSDKv5u",homebrew,ingame,2024-04-01 16:25:34 0000000000000000,"RSDKv5u",homebrew,ingame,2024-04-01 16:25:34
010009B00D33C000,"Rugby Challenge 4",slow;online-broken;UE4,playable,2022-10-06 12:45:53 010009B00D33C000,"Rugby Challenge 4",slow;online-broken;UE4,playable,2022-10-06 12:45:53
01006EC00F2CC000,"RUINER",UE4,playable,2022-10-03 14:11:33 01006EC00F2CC000,"RUINER",UE4,playable,2022-10-03 14:11:33
010074F00DE4A000,"Run the Fan",,playable,2021-02-27 13:36:28 010074F00DE4A000,"Run the Fan",,playable,2021-02-27 13:36:28
@@ -2482,7 +2475,6 @@
010081C0191D8000,"Rune Factory 3 Special",,playable,2023-10-15 08:32:49 010081C0191D8000,"Rune Factory 3 Special",,playable,2023-10-15 08:32:49
010051D00E3A4000,"Rune Factory 4 Special",32-bit;crash;nvdec,ingame,2023-05-06 08:49:17 010051D00E3A4000,"Rune Factory 4 Special",32-bit;crash;nvdec,ingame,2023-05-06 08:49:17
010014D01216E000,"Rune Factory 5 (JP)",gpu,ingame,2021-06-01 12:00:36 010014D01216E000,"Rune Factory 5 (JP)",gpu,ingame,2021-06-01 12:00:36
010071E0145F8000,"Rustler",,playable,2025-02-10 20:17:12
0100E21013908000,"RWBY: Grimm Eclipse - Definitive Edition",online-broken,playable,2022-11-03 10:44:01 0100E21013908000,"RWBY: Grimm Eclipse - Definitive Edition",online-broken,playable,2022-11-03 10:44:01
010012C0060F0000,"RXN -Raijin-",nvdec,playable,2021-01-10 16:05:43 010012C0060F0000,"RXN -Raijin-",nvdec,playable,2021-01-10 16:05:43
0100B8B012ECA000,"S.N.I.P.E.R. - Hunter Scope",,playable,2021-04-19 15:58:09 0100B8B012ECA000,"S.N.I.P.E.R. - Hunter Scope",,playable,2021-04-19 15:58:09
@@ -2491,7 +2483,7 @@
0100A5200C2E0000,"Safety First!",,playable,2021-01-06 09:05:23 0100A5200C2E0000,"Safety First!",,playable,2021-01-06 09:05:23
0100A51013530000,"SaGa Frontier Remastered",nvdec,playable,2022-11-03 13:54:56 0100A51013530000,"SaGa Frontier Remastered",nvdec,playable,2022-11-03 13:54:56
010003A00D0B4000,"SaGa SCARLET GRACE: AMBITIONS™",,playable,2022-10-06 13:20:31 010003A00D0B4000,"SaGa SCARLET GRACE: AMBITIONS™",,playable,2022-10-06 13:20:31
01008D100D43E000,"Saints Row IV®: Re-Elected™",ldn-untested;LAN;deadlock,ingame,2025-02-02 16:57:53 01008D100D43E000,"Saints Row IV®: Re-Elected™",ldn-untested;LAN,playable,2023-12-04 18:33:37
0100DE600BEEE000,"SAINTS ROW®: THE THIRD™ - THE FULL PACKAGE",slow;LAN,playable,2023-08-24 02:40:58 0100DE600BEEE000,"SAINTS ROW®: THE THIRD™ - THE FULL PACKAGE",slow;LAN,playable,2023-08-24 02:40:58
01007F000EB36000,"Sakai and...",nvdec,playable,2022-12-15 13:53:19 01007F000EB36000,"Sakai and...",nvdec,playable,2022-12-15 13:53:19
0100B1400E8FE000,"Sakuna: Of Rice and Ruin",,playable,2023-07-24 13:47:13 0100B1400E8FE000,"Sakuna: Of Rice and Ruin",,playable,2023-07-24 13:47:13
@@ -2540,7 +2532,7 @@
0100C3E00B700000,"SEGA AGES Space Harrier",,playable,2021-01-11 12:57:40 0100C3E00B700000,"SEGA AGES Space Harrier",,playable,2021-01-11 12:57:40
010054400D2E6000,"SEGA AGES Virtua Racing",online-broken,playable,2023-01-29 17:08:39 010054400D2E6000,"SEGA AGES Virtua Racing",online-broken,playable,2023-01-29 17:08:39
01001E700AC60000,"SEGA AGES Wonder Boy: Monster Land",online,playable,2021-05-05 16:28:25 01001E700AC60000,"SEGA AGES Wonder Boy: Monster Land",online,playable,2021-05-05 16:28:25
0100B3C014BDA000,"SEGA Genesis™ Nintendo Switch Online",crash;regression,ingame,2025-02-03 22:13:30 0100B3C014BDA000,"SEGA Genesis™ Nintendo Switch Online",crash;regression,nothing,2022-04-11 07:27:21
0100F7300B24E000,"SEGA Mega Drive Classics",online,playable,2021-01-05 11:08:00 0100F7300B24E000,"SEGA Mega Drive Classics",online,playable,2021-01-05 11:08:00
01009840046BC000,"Semispheres",,playable,2021-01-06 23:08:31 01009840046BC000,"Semispheres",,playable,2021-01-06 23:08:31
0100D1800D902000,"SENRAN KAGURA Peach Ball",,playable,2021-06-03 15:12:10 0100D1800D902000,"SENRAN KAGURA Peach Ball",,playable,2021-06-03 15:12:10
@@ -2676,10 +2668,10 @@
01004F401BEBE000,"Song of Nunu: A League of Legends Story",,ingame,2024-07-12 18:53:44 01004F401BEBE000,"Song of Nunu: A League of Legends Story",,ingame,2024-07-12 18:53:44
0100E5400BF94000,"Songbird Symphony",,playable,2021-02-27 02:44:04 0100E5400BF94000,"Songbird Symphony",,playable,2021-02-27 02:44:04
010031D00A604000,"Songbringer",,playable,2020-06-22 10:42:02 010031D00A604000,"Songbringer",,playable,2020-06-22 10:42:02
,"Sonic 1 (2013)",crash;homebrew,ingame,2024-04-06 18:31:20 0000000000000000,"Sonic 1 (2013)",crash;homebrew,ingame,2024-04-06 18:31:20
,"Sonic 2 (2013)",crash;homebrew,ingame,2024-04-01 16:25:30 0000000000000000,"Sonic 2 (2013)",crash;homebrew,ingame,2024-04-01 16:25:30
,"Sonic A.I.R",homebrew,ingame,2024-04-01 16:25:32 0000000000000000,"Sonic A.I.R",homebrew,ingame,2024-04-01 16:25:32
,"Sonic CD",crash;homebrew,ingame,2024-04-01 16:25:31 0000000000000000,"Sonic CD",crash;homebrew,ingame,2024-04-01 16:25:31
010040E0116B8000,"Sonic Colors: Ultimate",,playable,2022-11-12 21:24:26 010040E0116B8000,"Sonic Colors: Ultimate",,playable,2022-11-12 21:24:26
01001270012B6000,"SONIC FORCES™",,playable,2024-07-28 13:11:21 01001270012B6000,"SONIC FORCES™",,playable,2024-07-28 13:11:21
01004AD014BF0000,"Sonic Frontiers",gpu;deadlock;amd-vendor-bug;intel-vendor-bug,ingame,2024-09-05 09:18:53 01004AD014BF0000,"Sonic Frontiers",gpu;deadlock;amd-vendor-bug;intel-vendor-bug,ingame,2024-09-05 09:18:53
@@ -2696,7 +2688,7 @@
0100707011722000,"Space Elite Force",,playable,2020-11-27 15:21:05 0100707011722000,"Space Elite Force",,playable,2020-11-27 15:21:05
010047B010260000,"Space Pioneer",,playable,2022-10-20 12:24:37 010047B010260000,"Space Pioneer",,playable,2022-10-20 12:24:37
010010A009830000,"Space Ribbon",,playable,2022-08-15 17:17:10 010010A009830000,"Space Ribbon",,playable,2022-08-15 17:17:10
,"SpaceCadetPinball",homebrew,ingame,2024-04-18 19:30:04 0000000000000000,"SpaceCadetPinball",homebrew,ingame,2024-04-18 19:30:04
0100D9B0041CE000,"Spacecats with Lasers",,playable,2022-08-15 17:22:44 0100D9B0041CE000,"Spacecats with Lasers",,playable,2022-08-15 17:22:44
010034800FB60000,"Spaceland",,playable,2020-11-01 14:31:56 010034800FB60000,"Spaceland",,playable,2020-11-01 14:31:56
010028D0045CE000,"Sparkle 2",,playable,2020-10-19 11:51:39 010028D0045CE000,"Sparkle 2",,playable,2020-10-19 11:51:39
@@ -2840,9 +2832,8 @@
01009B90006DC000,"Super Mario Maker™ 2",online-broken;ldn-broken,playable,2024-08-25 11:05:19 01009B90006DC000,"Super Mario Maker™ 2",online-broken;ldn-broken,playable,2024-08-25 11:05:19
0100000000010000,"Super Mario Odyssey™",nvdec;intel-vendor-bug;mac-bug,playable,2024-08-25 01:32:34 0100000000010000,"Super Mario Odyssey™",nvdec;intel-vendor-bug;mac-bug,playable,2024-08-25 01:32:34
010036B0034E4000,"Super Mario Party™",gpu;Needs Update;ldn-works,ingame,2024-06-21 05:10:16 010036B0034E4000,"Super Mario Party™",gpu;Needs Update;ldn-works,ingame,2024-06-21 05:10:16
0100965017338000,"Super Mario Party Jamboree",mac-bug;gpu,ingame,2025-02-17 02:09:20
0100BC0018138000,"Super Mario RPG™",gpu;audio;nvdec,ingame,2024-06-19 17:43:42 0100BC0018138000,"Super Mario RPG™",gpu;audio;nvdec,ingame,2024-06-19 17:43:42
,"Super Mario World",homebrew,boots,2024-06-13 01:40:31 0000000000000000,"Super Mario World",homebrew,boots,2024-06-13 01:40:31
010049900F546000,"Super Mario™ 3D All-Stars",services-horizon;slow;vulkan;amd-vendor-bug,ingame,2024-05-07 02:38:16 010049900F546000,"Super Mario™ 3D All-Stars",services-horizon;slow;vulkan;amd-vendor-bug,ingame,2024-05-07 02:38:16
010028600EBDA000,"Super Mario™ 3D World + Bowsers Fury",ldn-works,playable,2024-07-31 10:45:37 010028600EBDA000,"Super Mario™ 3D World + Bowsers Fury",ldn-works,playable,2024-07-31 10:45:37
01004F8006A78000,"Super Meat Boy",services,playable,2020-04-02 23:10:07 01004F8006A78000,"Super Meat Boy",services,playable,2020-04-02 23:10:07
@@ -2973,7 +2964,6 @@
0100C38004DCC000,"The Flame In The Flood: Complete Edition",gpu;nvdec;UE4,ingame,2022-08-22 16:23:49 0100C38004DCC000,"The Flame In The Flood: Complete Edition",gpu;nvdec;UE4,ingame,2022-08-22 16:23:49
010007700D4AC000,"The Forbidden Arts",,playable,2021-01-26 16:26:24 010007700D4AC000,"The Forbidden Arts",,playable,2021-01-26 16:26:24
010030700CBBC000,"The friends of Ringo Ishikawa",,playable,2022-08-22 16:33:17 010030700CBBC000,"The friends of Ringo Ishikawa",,playable,2022-08-22 16:33:17
0100b620139d8000,"The Game of Life 2",ldn-untested,ingame,2025-02-03 22:30:00
01006350148DA000,"The Gardener and the Wild Vines",gpu,ingame,2024-04-29 16:32:10 01006350148DA000,"The Gardener and the Wild Vines",gpu,ingame,2024-04-29 16:32:10
0100B13007A6A000,"The Gardens Between",,playable,2021-01-29 16:16:53 0100B13007A6A000,"The Gardens Between",,playable,2021-01-29 16:16:53
010036E00FB20000,"The Great Ace Attorney Chronicles",,playable,2023-06-22 21:26:29 010036E00FB20000,"The Great Ace Attorney Chronicles",,playable,2023-06-22 21:26:29
@@ -2991,8 +2981,6 @@
010015D003EE4000,"The Jackbox Party Pack 2",online-working,playable,2022-08-22 18:23:40 010015D003EE4000,"The Jackbox Party Pack 2",online-working,playable,2022-08-22 18:23:40
0100CC80013D6000,"The Jackbox Party Pack 3",slow;online-working,playable,2022-08-22 18:41:06 0100CC80013D6000,"The Jackbox Party Pack 3",slow;online-working,playable,2022-08-22 18:41:06
0100E1F003EE8000,"The Jackbox Party Pack 4",online-working,playable,2022-08-22 18:56:34 0100E1F003EE8000,"The Jackbox Party Pack 4",online-working,playable,2022-08-22 18:56:34
01006fe0096ac000,"The Jackbox Party Pack 5",slow;online-working,ingame,2025-02-14 05:32:00
01005a400db52000,"The Jackbox Party Pack 6",slow;online-working,ingame,2025-02-14 05:26:00
010052C00B184000,"The Journey Down: Chapter One",nvdec,playable,2021-02-24 13:32:41 010052C00B184000,"The Journey Down: Chapter One",nvdec,playable,2021-02-24 13:32:41
01006BC00B188000,"The Journey Down: Chapter Three",nvdec,playable,2021-02-24 13:45:27 01006BC00B188000,"The Journey Down: Chapter Three",nvdec,playable,2021-02-24 13:45:27
01009AB00B186000,"The Journey Down: Chapter Two",nvdec,playable,2021-02-24 13:32:13 01009AB00B186000,"The Journey Down: Chapter Two",nvdec,playable,2021-02-24 13:32:13
@@ -3171,7 +3159,6 @@
010055E00CA68000,"Trine 4: The Nightmare Prince",gpu,nothing,2025-01-07 05:47:46 010055E00CA68000,"Trine 4: The Nightmare Prince",gpu,nothing,2025-01-07 05:47:46
0100D9000A930000,"Trine Enchanted Edition",ldn-untested;nvdec,playable,2021-06-03 11:28:15 0100D9000A930000,"Trine Enchanted Edition",ldn-untested;nvdec,playable,2021-06-03 11:28:15
01002D7010A54000,"Trinity Trigger",crash,ingame,2023-03-03 03:09:09 01002D7010A54000,"Trinity Trigger",crash,ingame,2023-03-03 03:09:09
010020700a5e0000,"TRIVIAL PURSUIT Live!",ldn-untested,ingame,2025-02-03 22:35:00
0100868013FFC000,"TRIVIAL PURSUIT Live! 2",,boots,2022-12-19 00:04:33 0100868013FFC000,"TRIVIAL PURSUIT Live! 2",,boots,2022-12-19 00:04:33
0100F78002040000,"Troll and I™",gpu;nvdec,ingame,2021-06-04 16:58:50 0100F78002040000,"Troll and I™",gpu;nvdec,ingame,2021-06-04 16:58:50
0100145011008000,"Trollhunters: Defenders of Arcadia",gpu;nvdec,ingame,2020-11-30 13:27:09 0100145011008000,"Trollhunters: Defenders of Arcadia",gpu;nvdec,ingame,2020-11-30 13:27:09
@@ -3221,7 +3208,6 @@
0100AB2010B4C000,"Unlock The King",,playable,2020-09-01 13:58:27 0100AB2010B4C000,"Unlock The King",,playable,2020-09-01 13:58:27
0100A3E011CB0000,"Unlock the King 2",,playable,2021-06-15 20:43:55 0100A3E011CB0000,"Unlock the King 2",,playable,2021-06-15 20:43:55
01005AA00372A000,"UNO® for Nintendo Switch",nvdec;ldn-untested,playable,2022-07-28 14:49:47 01005AA00372A000,"UNO® for Nintendo Switch",nvdec;ldn-untested,playable,2022-07-28 14:49:47
0100b6e012ebe000,"UNO",ldn-untested,ingame,2025-02-03 22:40:00
0100E5D00CC0C000,"Unravel Two",nvdec,playable,2024-05-23 15:45:05 0100E5D00CC0C000,"Unravel Two",nvdec,playable,2024-05-23 15:45:05
010001300CC4A000,"Unruly Heroes",,playable,2021-01-07 18:09:31 010001300CC4A000,"Unruly Heroes",,playable,2021-01-07 18:09:31
0100B410138C0000,"Unspottable",,playable,2022-10-25 19:28:49 0100B410138C0000,"Unspottable",,playable,2022-10-25 19:28:49
@@ -3386,7 +3372,6 @@
0100F47016F26000,"Yomawari 3",,playable,2022-05-10 08:26:51 0100F47016F26000,"Yomawari 3",,playable,2022-05-10 08:26:51
010012F00B6F2000,"Yomawari: The Long Night Collection",,playable,2022-09-03 14:36:59 010012F00B6F2000,"Yomawari: The Long Night Collection",,playable,2022-09-03 14:36:59
0100CC600ABB2000,"Yonder: The Cloud Catcher Chronicles (Retail Only)",,playable,2021-01-28 14:06:25 0100CC600ABB2000,"Yonder: The Cloud Catcher Chronicles (Retail Only)",,playable,2021-01-28 14:06:25
0100534009ff2000,"Yonder: The Cloud Catcher Chronicles",,playable,2025-02-03 22:19:13
0100BE50042F6000,"Yono and the Celestial Elephants",,playable,2021-01-28 18:23:58 0100BE50042F6000,"Yono and the Celestial Elephants",,playable,2021-01-28 18:23:58
0100F110029C8000,"Yooka-Laylee",,playable,2021-01-28 14:21:45 0100F110029C8000,"Yooka-Laylee",,playable,2021-01-28 14:21:45
010022F00DA66000,"Yooka-Laylee and the Impossible Lair",,playable,2021-03-05 17:32:21 010022F00DA66000,"Yooka-Laylee and the Impossible Lair",,playable,2021-03-05 17:32:21
1 title_id game_name labels status last_updated
332 0100E680149DC000 Arcaea playable 2023-03-16 19:31:21
333 01003C2010C78000 Archaica: The Path Of Light crash nothing 2020-10-16 13:22:26
334 01004DA012976000 Area 86 playable 2020-12-16 16:45:52
01008d8006a6a000 Arena of Valor crash boots 2025-02-03 22:19:34
335 0100691013C46000 ARIA CHRONICLE playable 2022-11-16 13:50:55
336 0100D4A00B284000 ARK: Survival Evolved gpu;nvdec;online-broken;UE4;ldn-untested ingame 2024-04-16 00:53:56
337 0100C56012C96000 Arkanoid vs. Space Invaders services ingame 2021-01-21 12:50:30
426 0100E48013A34000 Balan Wonderworld Demo gpu;services;UE4;demo ingame 2023-02-16 20:05:07
427 0100CD801CE5E000 Balatro ingame 2024-04-21 02:01:53
428 010010A00DA48000 Baldur's Gate and Baldur's Gate II: Enhanced Editions 32-bit playable 2022-09-12 23:52:15
0100fd1014726000 Baldur's Gate: Dark Alliance ldn-untested ingame 2025-02-03 22:21:00
429 0100BC400FB64000 Balthazar's Dream playable 2022-09-13 00:13:22
430 01008D30128E0000 Bamerang playable 2022-10-26 00:29:39
431 010013C010C5C000 Banner of the Maid playable 2021-06-14 15:23:37
528 01005950022EC000 Blade Strangers nvdec playable 2022-07-17 19:02:43
529 0100DF0011A6A000 Bladed Fury playable 2022-10-26 11:36:26
530 0100CFA00CC74000 Blades of Time deadlock;online boots 2022-07-17 19:19:58
01003d700dd8a000 Blades boots 2025-02-03 22:22:00
531 01006CC01182C000 Blair Witch nvdec;UE4 playable 2022-10-01 14:06:16
532 010039501405E000 Blanc gpu;slow ingame 2023-02-22 14:00:13
533 0100698009C6E000 Blasphemous nvdec playable 2021-03-01 12:15:31
955 010012800EBAE000 Disney TSUM TSUM FESTIVAL crash menus 2020-07-14 14:05:28
956 01009740120FE000 DISTRAINT 2 playable 2020-09-03 16:08:12
957 010075B004DD2000 DISTRAINT: Deluxe Edition playable 2020-06-15 23:42:24
958 010027400CDC6000 Divinity: Original Sin 2 - Definitive Edition services;crash;online-broken;regression ingame menus 2025-02-03 22:12:30 2023-08-13 17:20:03
959 01001770115C8000 Dodo Peak nvdec;UE4 playable 2022-10-04 16:13:05
960 010077B0100DA000 Dogurai playable 2020-10-04 02:40:16
961 010048100D51A000 Dokapon Up! Mugen no Roulette gpu;Needs Update menus 2022-12-08 19:39:10
966 0100751007ADA000 Don't Starve: Nintendo Switch Edition nvdec playable 2022-02-05 20:43:34
967 010088B010DD2000 Dongo Adventure playable 2022-10-04 16:22:26
968 0100C1F0051B6000 Donkey Kong Country™: Tropical Freeze playable 2024-08-05 16:46:10
01009D901BC56000 Donkey Kong Country™: Returns HD gpu ingame 2025-02-16 13:44:12
969 0100F2C00F060000 Doodle Derby boots 2020-12-04 22:51:48
970 0100416004C00000 DOOM gpu;slow;nvdec;online-broken ingame 2024-09-23 15:40:07
971 010018900DD00000 DOOM (1993) nvdec;online-broken menus 2022-09-06 13:32:19
1155 010095600AA36000 Fill-a-Pix: Phil's Epic Adventure playable 2020-12-22 13:48:22
1156 0100C3A00BB76000 Fimbul nvdec playable 2022-07-26 13:31:47
1157 0100C8200E942000 Fin and the Ancient Mystery nvdec playable 2020-12-17 16:40:39
1158 01000EA014150000 FINAL FANTASY crash playable nothing 2025-02-16 21:27:30 2024-09-05 20:55:30
1159 01006B7014156000 FINAL FANTASY II crash nothing 2024-04-13 19:18:04
1160 01006F000B056000 FINAL FANTASY IX audout;nvdec playable 2021-06-05 11:35:00
1161 0100AA201415C000 FINAL FANTASY V playable 2023-04-26 01:11:55
1246 0100A6B00D4EC000 Furwind playable 2021-02-19 19:44:08
1247 0100ECE00C0C4000 Fury Unleashed crash;services ingame 2020-10-18 11:52:40
1248 010070000ED9E000 Fury Unleashed Demo playable 2020-10-08 20:09:21
1249 0100E1F013674000 FUSER™ nvdec;UE4;slow;gpu nvdec;UE4 ingame playable 2025-02-12 16:03:00 2022-10-17 20:58:32
1250 0100A7A015E4C000 Fushigi no Gensokyo Lotus Labyrinth Needs Update;audio;gpu;nvdec ingame 2021-01-20 15:30:02
1251 01003C300B274000 Futari de! Nyanko Daisensou playable 2024-01-05 22:26:52
1252 010055801134E000 FUZE Player online-broken;vulkan-backend-bug ingame 2022-10-18 12:23:53
1654 0100A73006E74000 Legendary Eleven playable 2021-06-08 12:09:03
1655 0100A7700B46C000 Legendary Fishing online playable 2021-04-14 15:08:46
1656 0100739018020000 LEGO® 2K Drive gpu;ldn-works ingame 2024-04-09 02:05:12
1657 010085500130a000 01003A30012C0000 LEGO® CITY Undercover nvdec playable 2024-09-30 08:44:27
1658 010070D009FEC000 LEGO® DC Super-Villains playable 2021-05-27 18:10:37
1659 010052A00B5D2000 LEGO® Harry Potter™ Collection crash ingame 2024-01-31 10:28:07
1660 010073C01AF34000 LEGO® Horizon Adventures™ vulkan-backend-bug;opengl-backend-bug;UE4 ingame 2025-01-07 04:24:56
1796 010005A00B312000 Megaton Rainfall gpu;opengl boots 2022-08-04 18:29:43
1797 0100EA100DF92000 Meiji Katsugeki Haikara Ryuuseigumi - Seibai Shimaseu, Yonaoshi Kagyou 32-bit;nvdec playable 2022-12-05 13:19:12
1798 0100B360068B2000 Mekorama gpu boots 2021-06-17 16:37:21
010012301932A000 Melatonin playable 2025-02-16 04:08:17
1799 01000FA010340000 Melbits World nvdec;online menus 2021-11-26 13:51:22
1800 0100F68019636000 Melon Journey playable 2023-04-23 21:20:01
1801 010079C012896000 Memories Off -Innocent Fille- for Dearest playable 2020-08-04 07:31:22
1913 010073E008E6E000 Mugsters playable 2021-01-28 17:57:17
1914 0100A8400471A000 MUJO playable 2020-05-08 16:31:04
1915 0100211005E94000 Mulaka playable 2021-01-28 18:07:20
01008e2013fb4000 Multi Quiz ldn-untested ingame 2025-02-03 22:26:00
1916 010038B00B9AE000 Mummy Pinball playable 2022-08-05 16:08:11
1917 01008E200C5C2000 Muse Dash playable 2020-06-06 14:41:29
1918 010035901046C000 Mushroom Quest playable 2020-05-17 13:07:08
2028 010003C00B868000 Ninjin: Clash of Carrots online-broken playable 2024-07-10 05:12:26
2029 0100746010E4C000 NinNinDays playable 2022-11-20 15:17:29
2030 0100C9A00ECE6000 Nintendo 64™ – Nintendo Switch Online gpu;vulkan ingame 2024-04-23 20:21:07
0100e0601c632000 Nintendo 64™ – Nintendo Switch Online: MATURE 17+ ingame 2025-02-03 22:27:00
2031 0100D870045B6000 Nintendo Entertainment System™ - Nintendo Switch Online online playable 2022-07-01 15:45:06
2032 0100C4B0034B2000 Nintendo Labo Toy-Con 01 Variety Kit gpu ingame 2022-08-07 12:56:07
2033 01001E9003502000 Nintendo Labo Toy-Con 03 Vehicle Kit services;crash menus 2022-08-03 17:20:11
2058 010002700C34C000 Numbala playable 2020-05-11 12:01:07
2059 010020500C8C8000 Number Place 10000 gpu menus 2021-11-24 09:14:23
2060 010003701002C000 Nurse Love Syndrome playable 2022-10-13 10:05:22
2061 0000000000000000 nx-hbmenu Needs Update;homebrew boots 2024-04-06 22:05:32
2062 nxquake2 services;crash;homebrew nothing 2022-08-04 23:14:04
2063 010049F00EC30000 Nyan Cat: Lost in Space online playable 2021-06-12 13:22:03
2064 01002E6014FC4000 O---O playable 2022-10-29 12:12:14
2466 0100AFE00DDAC000 Royal Roads playable 2020-11-17 12:54:38
2467 0100E2C00B414000 RPG Maker MV nvdec playable 2021-01-05 20:12:01
2468 01005CD015986000 rRootage Reloaded playable 2022-08-05 23:20:18
2469 0000000000000000 RSDKv5u homebrew ingame 2024-04-01 16:25:34
2470 010009B00D33C000 Rugby Challenge 4 slow;online-broken;UE4 playable 2022-10-06 12:45:53
2471 01006EC00F2CC000 RUINER UE4 playable 2022-10-03 14:11:33
2472 010074F00DE4A000 Run the Fan playable 2021-02-27 13:36:28
2475 010081C0191D8000 Rune Factory 3 Special playable 2023-10-15 08:32:49
2476 010051D00E3A4000 Rune Factory 4 Special 32-bit;crash;nvdec ingame 2023-05-06 08:49:17
2477 010014D01216E000 Rune Factory 5 (JP) gpu ingame 2021-06-01 12:00:36
010071E0145F8000 Rustler playable 2025-02-10 20:17:12
2478 0100E21013908000 RWBY: Grimm Eclipse - Definitive Edition online-broken playable 2022-11-03 10:44:01
2479 010012C0060F0000 RXN -Raijin- nvdec playable 2021-01-10 16:05:43
2480 0100B8B012ECA000 S.N.I.P.E.R. - Hunter Scope playable 2021-04-19 15:58:09
2483 0100A5200C2E0000 Safety First! playable 2021-01-06 09:05:23
2484 0100A51013530000 SaGa Frontier Remastered nvdec playable 2022-11-03 13:54:56
2485 010003A00D0B4000 SaGa SCARLET GRACE: AMBITIONS™ playable 2022-10-06 13:20:31
2486 01008D100D43E000 Saints Row IV®: Re-Elected™ ldn-untested;LAN;deadlock ldn-untested;LAN ingame playable 2025-02-02 16:57:53 2023-12-04 18:33:37
2487 0100DE600BEEE000 SAINTS ROW®: THE THIRD™ - THE FULL PACKAGE slow;LAN playable 2023-08-24 02:40:58
2488 01007F000EB36000 Sakai and... nvdec playable 2022-12-15 13:53:19
2489 0100B1400E8FE000 Sakuna: Of Rice and Ruin playable 2023-07-24 13:47:13
2532 0100C3E00B700000 SEGA AGES Space Harrier playable 2021-01-11 12:57:40
2533 010054400D2E6000 SEGA AGES Virtua Racing online-broken playable 2023-01-29 17:08:39
2534 01001E700AC60000 SEGA AGES Wonder Boy: Monster Land online playable 2021-05-05 16:28:25
2535 0100B3C014BDA000 SEGA Genesis™ – Nintendo Switch Online crash;regression ingame nothing 2025-02-03 22:13:30 2022-04-11 07:27:21
2536 0100F7300B24E000 SEGA Mega Drive Classics online playable 2021-01-05 11:08:00
2537 01009840046BC000 Semispheres playable 2021-01-06 23:08:31
2538 0100D1800D902000 SENRAN KAGURA Peach Ball playable 2021-06-03 15:12:10
2668 01004F401BEBE000 Song of Nunu: A League of Legends Story ingame 2024-07-12 18:53:44
2669 0100E5400BF94000 Songbird Symphony playable 2021-02-27 02:44:04
2670 010031D00A604000 Songbringer playable 2020-06-22 10:42:02
2671 0000000000000000 Sonic 1 (2013) crash;homebrew ingame 2024-04-06 18:31:20
2672 0000000000000000 Sonic 2 (2013) crash;homebrew ingame 2024-04-01 16:25:30
2673 0000000000000000 Sonic A.I.R homebrew ingame 2024-04-01 16:25:32
2674 0000000000000000 Sonic CD crash;homebrew ingame 2024-04-01 16:25:31
2675 010040E0116B8000 Sonic Colors: Ultimate playable 2022-11-12 21:24:26
2676 01001270012B6000 SONIC FORCES™ playable 2024-07-28 13:11:21
2677 01004AD014BF0000 Sonic Frontiers gpu;deadlock;amd-vendor-bug;intel-vendor-bug ingame 2024-09-05 09:18:53
2688 0100707011722000 Space Elite Force playable 2020-11-27 15:21:05
2689 010047B010260000 Space Pioneer playable 2022-10-20 12:24:37
2690 010010A009830000 Space Ribbon playable 2022-08-15 17:17:10
2691 0000000000000000 SpaceCadetPinball homebrew ingame 2024-04-18 19:30:04
2692 0100D9B0041CE000 Spacecats with Lasers playable 2022-08-15 17:22:44
2693 010034800FB60000 Spaceland playable 2020-11-01 14:31:56
2694 010028D0045CE000 Sparkle 2 playable 2020-10-19 11:51:39
2832 01009B90006DC000 Super Mario Maker™ 2 online-broken;ldn-broken playable 2024-08-25 11:05:19
2833 0100000000010000 Super Mario Odyssey™ nvdec;intel-vendor-bug;mac-bug playable 2024-08-25 01:32:34
2834 010036B0034E4000 Super Mario Party™ gpu;Needs Update;ldn-works ingame 2024-06-21 05:10:16
0100965017338000 Super Mario Party Jamboree mac-bug;gpu ingame 2025-02-17 02:09:20
2835 0100BC0018138000 Super Mario RPG™ gpu;audio;nvdec ingame 2024-06-19 17:43:42
2836 0000000000000000 Super Mario World homebrew boots 2024-06-13 01:40:31
2837 010049900F546000 Super Mario™ 3D All-Stars services-horizon;slow;vulkan;amd-vendor-bug ingame 2024-05-07 02:38:16
2838 010028600EBDA000 Super Mario™ 3D World + Bowser’s Fury ldn-works playable 2024-07-31 10:45:37
2839 01004F8006A78000 Super Meat Boy services playable 2020-04-02 23:10:07
2964 0100C38004DCC000 The Flame In The Flood: Complete Edition gpu;nvdec;UE4 ingame 2022-08-22 16:23:49
2965 010007700D4AC000 The Forbidden Arts playable 2021-01-26 16:26:24
2966 010030700CBBC000 The friends of Ringo Ishikawa playable 2022-08-22 16:33:17
0100b620139d8000 The Game of Life 2 ldn-untested ingame 2025-02-03 22:30:00
2967 01006350148DA000 The Gardener and the Wild Vines gpu ingame 2024-04-29 16:32:10
2968 0100B13007A6A000 The Gardens Between playable 2021-01-29 16:16:53
2969 010036E00FB20000 The Great Ace Attorney Chronicles playable 2023-06-22 21:26:29
2981 010015D003EE4000 The Jackbox Party Pack 2 online-working playable 2022-08-22 18:23:40
2982 0100CC80013D6000 The Jackbox Party Pack 3 slow;online-working playable 2022-08-22 18:41:06
2983 0100E1F003EE8000 The Jackbox Party Pack 4 online-working playable 2022-08-22 18:56:34
01006fe0096ac000 The Jackbox Party Pack 5 slow;online-working ingame 2025-02-14 05:32:00
01005a400db52000 The Jackbox Party Pack 6 slow;online-working ingame 2025-02-14 05:26:00
2984 010052C00B184000 The Journey Down: Chapter One nvdec playable 2021-02-24 13:32:41
2985 01006BC00B188000 The Journey Down: Chapter Three nvdec playable 2021-02-24 13:45:27
2986 01009AB00B186000 The Journey Down: Chapter Two nvdec playable 2021-02-24 13:32:13
3159 010055E00CA68000 Trine 4: The Nightmare Prince gpu nothing 2025-01-07 05:47:46
3160 0100D9000A930000 Trine Enchanted Edition ldn-untested;nvdec playable 2021-06-03 11:28:15
3161 01002D7010A54000 Trinity Trigger crash ingame 2023-03-03 03:09:09
010020700a5e0000 TRIVIAL PURSUIT Live! ldn-untested ingame 2025-02-03 22:35:00
3162 0100868013FFC000 TRIVIAL PURSUIT Live! 2 boots 2022-12-19 00:04:33
3163 0100F78002040000 Troll and I™ gpu;nvdec ingame 2021-06-04 16:58:50
3164 0100145011008000 Trollhunters: Defenders of Arcadia gpu;nvdec ingame 2020-11-30 13:27:09
3208 0100AB2010B4C000 Unlock The King playable 2020-09-01 13:58:27
3209 0100A3E011CB0000 Unlock the King 2 playable 2021-06-15 20:43:55
3210 01005AA00372A000 UNO® for Nintendo Switch nvdec;ldn-untested playable 2022-07-28 14:49:47
0100b6e012ebe000 UNO ldn-untested ingame 2025-02-03 22:40:00
3211 0100E5D00CC0C000 Unravel Two nvdec playable 2024-05-23 15:45:05
3212 010001300CC4A000 Unruly Heroes playable 2021-01-07 18:09:31
3213 0100B410138C0000 Unspottable playable 2022-10-25 19:28:49
3372 0100F47016F26000 Yomawari 3 playable 2022-05-10 08:26:51
3373 010012F00B6F2000 Yomawari: The Long Night Collection playable 2022-09-03 14:36:59
3374 0100CC600ABB2000 Yonder: The Cloud Catcher Chronicles (Retail Only) playable 2021-01-28 14:06:25
0100534009ff2000 Yonder: The Cloud Catcher Chronicles playable 2025-02-03 22:19:13
3375 0100BE50042F6000 Yono and the Celestial Elephants playable 2021-01-28 18:23:58
3376 0100F110029C8000 Yooka-Laylee playable 2021-01-28 14:21:45
3377 010022F00DA66000 Yooka-Laylee and the Impossible Lair playable 2021-03-05 17:32:21

View File

@@ -1,6 +1,7 @@
using ARMeilleure.CodeGen.Linking; using ARMeilleure.CodeGen.Linking;
using ARMeilleure.CodeGen.Unwinding; using ARMeilleure.CodeGen.Unwinding;
using ARMeilleure.Translation.Cache; using ARMeilleure.Translation.Cache;
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace ARMeilleure.CodeGen namespace ARMeilleure.CodeGen

View File

@@ -1,3 +1,4 @@
using System;
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;

View File

@@ -7,7 +7,6 @@ namespace ARMeilleure.Memory
public const int DefaultGranularity = 65536; // Mapping granularity in Windows. public const int DefaultGranularity = 65536; // Mapping granularity in Windows.
public IJitMemoryBlock Block { get; } public IJitMemoryBlock Block { get; }
public IJitMemoryAllocator Allocator { get; }
public nint Pointer => Block.Pointer; public nint Pointer => Block.Pointer;
@@ -22,7 +21,6 @@ namespace ARMeilleure.Memory
granularity = DefaultGranularity; granularity = DefaultGranularity;
} }
Allocator = allocator;
Block = allocator.Reserve(maxSize); Block = allocator.Reserve(maxSize);
_maxSize = maxSize; _maxSize = maxSize;
_sizeGranularity = granularity; _sizeGranularity = granularity;

View File

@@ -1,3 +1,4 @@
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Runtime.Versioning; using System.Runtime.Versioning;

View File

@@ -1,5 +1,6 @@
using ARMeilleure.IntermediateRepresentation; using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using static ARMeilleure.IntermediateRepresentation.Operand.Factory; using static ARMeilleure.IntermediateRepresentation.Operand.Factory;

View File

@@ -1,6 +1,7 @@
using ARMeilleure.IntermediateRepresentation; using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using Ryujinx.Common.Memory.PartialUnmaps; using Ryujinx.Common.Memory.PartialUnmaps;
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using static ARMeilleure.IntermediateRepresentation.Operand.Factory; using static ARMeilleure.IntermediateRepresentation.Operand.Factory;

View File

@@ -1,4 +1,5 @@
using ARMeilleure.Memory; using ARMeilleure.Memory;
using System;
namespace ARMeilleure.State namespace ARMeilleure.State
{ {

View File

@@ -6,6 +6,7 @@ using ARMeilleure.Instructions;
using ARMeilleure.IntermediateRepresentation; using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Memory; using ARMeilleure.Memory;
using ARMeilleure.State; using ARMeilleure.State;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Reflection; using System.Reflection;
using static ARMeilleure.IntermediateRepresentation.Operand.Factory; using static ARMeilleure.IntermediateRepresentation.Operand.Factory;

View File

@@ -2,8 +2,6 @@ using ARMeilleure.CodeGen;
using ARMeilleure.CodeGen.Unwinding; using ARMeilleure.CodeGen.Unwinding;
using ARMeilleure.Memory; using ARMeilleure.Memory;
using ARMeilleure.Native; using ARMeilleure.Native;
using Humanizer;
using Ryujinx.Common.Logging;
using Ryujinx.Memory; using Ryujinx.Memory;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -20,8 +18,9 @@ namespace ARMeilleure.Translation.Cache
private static readonly int _pageMask = _pageSize - 1; private static readonly int _pageMask = _pageSize - 1;
private const int CodeAlignment = 4; // Bytes. private const int CodeAlignment = 4; // Bytes.
private const int CacheSize = 256 * 1024 * 1024; private const int CacheSize = 2047 * 1024 * 1024;
private static ReservedRegion _jitRegion;
private static JitCacheInvalidation _jitCacheInvalidator; private static JitCacheInvalidation _jitCacheInvalidator;
private static CacheMemoryAllocator _cacheAllocator; private static CacheMemoryAllocator _cacheAllocator;
@@ -31,9 +30,6 @@ namespace ARMeilleure.Translation.Cache
private static readonly Lock _lock = new(); private static readonly Lock _lock = new();
private static bool _initialized; private static bool _initialized;
private static readonly List<ReservedRegion> _jitRegions = [];
private static int _activeRegionIndex = 0;
[SupportedOSPlatform("windows")] [SupportedOSPlatform("windows")]
[LibraryImport("kernel32.dll", SetLastError = true)] [LibraryImport("kernel32.dll", SetLastError = true)]
public static partial nint FlushInstructionCache(nint hProcess, nint lpAddress, nuint dwSize); public static partial nint FlushInstructionCache(nint hProcess, nint lpAddress, nuint dwSize);
@@ -52,9 +48,7 @@ namespace ARMeilleure.Translation.Cache
return; return;
} }
ReservedRegion firstRegion = new(allocator, CacheSize); _jitRegion = new ReservedRegion(allocator, CacheSize);
_jitRegions.Add(firstRegion);
_activeRegionIndex = 0;
if (!OperatingSystem.IsWindows() && !OperatingSystem.IsMacOS()) if (!OperatingSystem.IsWindows() && !OperatingSystem.IsMacOS())
{ {
@@ -65,9 +59,7 @@ namespace ARMeilleure.Translation.Cache
if (OperatingSystem.IsWindows()) if (OperatingSystem.IsWindows())
{ {
JitUnwindWindows.InstallFunctionTableHandler( JitUnwindWindows.InstallFunctionTableHandler(_jitRegion.Pointer, CacheSize, _jitRegion.Pointer + Allocate(_pageSize));
firstRegion.Pointer, CacheSize, firstRegion.Pointer + Allocate(_pageSize)
);
} }
_initialized = true; _initialized = true;
@@ -83,8 +75,8 @@ namespace ARMeilleure.Translation.Cache
Debug.Assert(_initialized); Debug.Assert(_initialized);
int funcOffset = Allocate(code.Length); int funcOffset = Allocate(code.Length);
ReservedRegion targetRegion = _jitRegions[_activeRegionIndex];
nint funcPtr = targetRegion.Pointer + funcOffset; nint funcPtr = _jitRegion.Pointer + funcOffset;
if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64) if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
{ {
@@ -98,9 +90,9 @@ namespace ARMeilleure.Translation.Cache
} }
else else
{ {
ReprotectAsWritable(targetRegion, funcOffset, code.Length); ReprotectAsWritable(funcOffset, code.Length);
Marshal.Copy(code, 0, funcPtr, code.Length); Marshal.Copy(code, 0, funcPtr, code.Length);
ReprotectAsExecutable(targetRegion, funcOffset, code.Length); ReprotectAsExecutable(funcOffset, code.Length);
if (OperatingSystem.IsWindows() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64) if (OperatingSystem.IsWindows() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
{ {
@@ -124,83 +116,52 @@ namespace ARMeilleure.Translation.Cache
{ {
Debug.Assert(_initialized); Debug.Assert(_initialized);
foreach (ReservedRegion region in _jitRegions) int funcOffset = (int)(pointer.ToInt64() - _jitRegion.Pointer.ToInt64());
if (TryFind(funcOffset, out CacheEntry entry, out int entryIndex) && entry.Offset == funcOffset)
{ {
if (pointer.ToInt64() < region.Pointer.ToInt64() || _cacheAllocator.Free(funcOffset, AlignCodeSize(entry.Size));
pointer.ToInt64() >= (region.Pointer + CacheSize).ToInt64()) _cacheEntries.RemoveAt(entryIndex);
{
continue;
}
int funcOffset = (int)(pointer.ToInt64() - region.Pointer.ToInt64());
if (TryFind(funcOffset, out CacheEntry entry, out int entryIndex) && entry.Offset == funcOffset)
{
_cacheAllocator.Free(funcOffset, AlignCodeSize(entry.Size));
_cacheEntries.RemoveAt(entryIndex);
}
return;
} }
} }
} }
private static void ReprotectAsWritable(ReservedRegion region, int offset, int size) private static void ReprotectAsWritable(int offset, int size)
{ {
int endOffs = offset + size; int endOffs = offset + size;
int regionStart = offset & ~_pageMask; int regionStart = offset & ~_pageMask;
int regionEnd = (endOffs + _pageMask) & ~_pageMask; int regionEnd = (endOffs + _pageMask) & ~_pageMask;
region.Block.MapAsRwx((ulong)regionStart, (ulong)(regionEnd - regionStart)); _jitRegion.Block.MapAsRwx((ulong)regionStart, (ulong)(regionEnd - regionStart));
} }
private static void ReprotectAsExecutable(ReservedRegion region, int offset, int size) private static void ReprotectAsExecutable(int offset, int size)
{ {
int endOffs = offset + size; int endOffs = offset + size;
int regionStart = offset & ~_pageMask; int regionStart = offset & ~_pageMask;
int regionEnd = (endOffs + _pageMask) & ~_pageMask; int regionEnd = (endOffs + _pageMask) & ~_pageMask;
region.Block.MapAsRx((ulong)regionStart, (ulong)(regionEnd - regionStart)); _jitRegion.Block.MapAsRx((ulong)regionStart, (ulong)(regionEnd - regionStart));
} }
private static int Allocate(int codeSize) private static int Allocate(int codeSize)
{ {
codeSize = AlignCodeSize(codeSize); codeSize = AlignCodeSize(codeSize);
for (int i = _activeRegionIndex; i < _jitRegions.Count; i++) int allocOffset = _cacheAllocator.Allocate(codeSize);
if (allocOffset < 0)
{ {
int allocOffset = _cacheAllocator.Allocate(codeSize); throw new OutOfMemoryException("JIT Cache exhausted.");
if (allocOffset >= 0)
{
_jitRegions[i].ExpandIfNeeded((ulong)allocOffset + (ulong)codeSize);
_activeRegionIndex = i;
return allocOffset;
}
} }
int exhaustedRegion = _activeRegionIndex; _jitRegion.ExpandIfNeeded((ulong)allocOffset + (ulong)codeSize);
ReservedRegion newRegion = new(_jitRegions[0].Allocator, CacheSize);
_jitRegions.Add(newRegion);
_activeRegionIndex = _jitRegions.Count - 1;
int newRegionNumber = _activeRegionIndex;
Logger.Warning?.Print(LogClass.Cpu, $"JIT Cache Region {exhaustedRegion} exhausted, creating new Cache Region {newRegionNumber} ({((long)(newRegionNumber + 1) * CacheSize).Bytes()} Total Allocation)."); return allocOffset;
_cacheAllocator = new CacheMemoryAllocator(CacheSize);
int allocOffsetNew = _cacheAllocator.Allocate(codeSize);
if (allocOffsetNew < 0)
{
throw new OutOfMemoryException("Failed to allocate in new Cache Region!");
}
newRegion.ExpandIfNeeded((ulong)allocOffsetNew + (ulong)codeSize);
return allocOffsetNew;
} }
private static int AlignCodeSize(int codeSize) private static int AlignCodeSize(int codeSize)
{ {
return checked(codeSize + (CodeAlignment - 1)) & ~(CodeAlignment - 1); return checked(codeSize + (CodeAlignment - 1)) & ~(CodeAlignment - 1);
@@ -224,21 +185,18 @@ namespace ARMeilleure.Translation.Cache
{ {
lock (_lock) lock (_lock)
{ {
foreach (ReservedRegion _ in _jitRegions) int index = _cacheEntries.BinarySearch(new CacheEntry(offset, 0, default));
if (index < 0)
{ {
int index = _cacheEntries.BinarySearch(new CacheEntry(offset, 0, default)); index = ~index - 1;
}
if (index < 0) if (index >= 0)
{ {
index = ~index - 1; entry = _cacheEntries[index];
} entryIndex = index;
return true;
if (index >= 0)
{
entry = _cacheEntries[index];
entryIndex = index;
return true;
}
} }
} }

View File

@@ -1,4 +1,5 @@
using ARMeilleure.Memory; using ARMeilleure.Memory;
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace ARMeilleure.Translation.Cache namespace ARMeilleure.Translation.Cache

View File

@@ -1,3 +1,5 @@
using System;
namespace ARMeilleure.Translation namespace ARMeilleure.Translation
{ {
class DelegateInfo class DelegateInfo

View File

@@ -1,3 +1,5 @@
using System;
namespace ARMeilleure.Translation namespace ARMeilleure.Translation
{ {
delegate void DispatcherFunction(nint nativeContext, ulong startAddress); delegate void DispatcherFunction(nint nativeContext, ulong startAddress);

View File

@@ -1,3 +1,5 @@
using System;
namespace ARMeilleure.Translation namespace ARMeilleure.Translation
{ {
delegate ulong GuestFunction(nint nativeContextPtr); delegate ulong GuestFunction(nint nativeContextPtr);

View File

@@ -3,8 +3,6 @@ using ARMeilleure.CodeGen.Linking;
using ARMeilleure.CodeGen.Unwinding; using ARMeilleure.CodeGen.Unwinding;
using ARMeilleure.Common; using ARMeilleure.Common;
using ARMeilleure.Memory; using ARMeilleure.Memory;
using ARMeilleure.State;
using Humanizer;
using Ryujinx.Common; using Ryujinx.Common;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
@@ -32,8 +30,8 @@ namespace ARMeilleure.Translation.PTC
{ {
private const string OuterHeaderMagicString = "PTCohd\0\0"; private const string OuterHeaderMagicString = "PTCohd\0\0";
private const string InnerHeaderMagicString = "PTCihd\0\0"; private const string InnerHeaderMagicString = "PTCihd\0\0";
private const uint InternalVersion = 7007; //! To be incremented manually for each change to the ARMeilleure project. private const uint InternalVersion = 6998; //! To be incremented manually for each change to the ARMeilleure project.
private const string ActualDir = "0"; private const string ActualDir = "0";
private const string BackupDir = "1"; private const string BackupDir = "1";
@@ -186,36 +184,6 @@ namespace ARMeilleure.Translation.PTC
InitializeCarriers(); InitializeCarriers();
} }
private bool ContainsBlacklistedFunctions()
{
List<ulong> blacklist = Profiler.GetBlacklistedFunctions();
bool containsBlacklistedFunctions = false;
_infosStream.Seek(0L, SeekOrigin.Begin);
bool foundBadFunction = false;
for (int index = 0; index < GetEntriesCount(); index++)
{
InfoEntry infoEntry = DeserializeStructure<InfoEntry>(_infosStream);
foreach (ulong address in blacklist)
{
if (infoEntry.Address == address)
{
containsBlacklistedFunctions = true;
Logger.Warning?.Print(LogClass.Ptc, "PPTC cache invalidated: Found blacklisted functions in PPTC cache");
foundBadFunction = true;
break;
}
}
if (foundBadFunction)
{
break;
}
}
return containsBlacklistedFunctions;
}
private void PreLoad() private void PreLoad()
{ {
string fileNameActual = $"{CachePathActual}.cache"; string fileNameActual = $"{CachePathActual}.cache";
@@ -564,7 +532,7 @@ namespace ARMeilleure.Translation.PTC
public void LoadTranslations(Translator translator) public void LoadTranslations(Translator translator)
{ {
if (AreCarriersEmpty() || ContainsBlacklistedFunctions()) if (AreCarriersEmpty())
{ {
return; return;
} }
@@ -867,18 +835,10 @@ namespace ARMeilleure.Translation.PTC
while (profiledFuncsToTranslate.TryDequeue(out (ulong address, PtcProfiler.FuncProfile funcProfile) item)) while (profiledFuncsToTranslate.TryDequeue(out (ulong address, PtcProfiler.FuncProfile funcProfile) item))
{ {
ulong address = item.address; ulong address = item.address;
ExecutionMode executionMode = item.funcProfile.Mode;
bool highCq = item.funcProfile.HighCq;
Debug.Assert(Profiler.IsAddressInStaticCodeRange(address)); Debug.Assert(Profiler.IsAddressInStaticCodeRange(address));
TranslatedFunction func = translator.Translate(address, executionMode, highCq); TranslatedFunction func = translator.Translate(address, item.funcProfile.Mode, item.funcProfile.HighCq);
if (func == null)
{
Profiler.UpdateEntry(address, executionMode, true, true);
continue;
}
bool isAddressUnique = translator.Functions.TryAdd(address, func.GuestSize, func); bool isAddressUnique = translator.Functions.TryAdd(address, func.GuestSize, func);
@@ -924,11 +884,8 @@ namespace ARMeilleure.Translation.PTC
sw.Stop(); sw.Stop();
PtcStateChanged?.Invoke(PtcLoadingState.Loaded, _translateCount, _translateTotalCount); PtcStateChanged?.Invoke(PtcLoadingState.Loaded, _translateCount, _translateTotalCount);
Logger.Info?.Print(LogClass.Ptc, Logger.Info?.Print(LogClass.Ptc, $"{_translateCount} of {_translateTotalCount} functions translated | Thread count: {degreeOfParallelism} in {sw.Elapsed.TotalSeconds} s");
$"{_translateCount} of {_translateTotalCount} functions translated in {sw.Elapsed.TotalSeconds} seconds " +
$"| {"function".ToQuantity(_translateTotalCount - _translateCount)} blacklisted " +
$"| Thread count: {degreeOfParallelism}");
Thread preSaveThread = new(PreSave) Thread preSaveThread = new(PreSave)
{ {

View File

@@ -24,12 +24,11 @@ namespace ARMeilleure.Translation.PTC
{ {
private const string OuterHeaderMagicString = "Pohd\0\0\0\0"; private const string OuterHeaderMagicString = "Pohd\0\0\0\0";
private const uint InternalVersion = 7007; //! Not to be incremented manually for each change to the ARMeilleure project. private const uint InternalVersion = 5518; //! Not to be incremented manually for each change to the ARMeilleure project.
private static readonly uint[] _migrateInternalVersions = private static readonly uint[] _migrateInternalVersions =
[ [
1866, 1866
5518,
]; ];
private const int SaveInterval = 30; // Seconds. private const int SaveInterval = 30; // Seconds.
@@ -78,30 +77,20 @@ namespace ARMeilleure.Translation.PTC
private void TimerElapsed(object _, ElapsedEventArgs __) private void TimerElapsed(object _, ElapsedEventArgs __)
=> new Thread(PreSave) { Name = "Ptc.DiskWriter" }.Start(); => new Thread(PreSave) { Name = "Ptc.DiskWriter" }.Start();
public void AddEntry(ulong address, ExecutionMode mode, bool highCq, bool blacklist = false) public void AddEntry(ulong address, ExecutionMode mode, bool highCq)
{ {
if (IsAddressInStaticCodeRange(address)) if (IsAddressInStaticCodeRange(address))
{ {
Debug.Assert(!highCq); Debug.Assert(!highCq);
if (blacklist) lock (_lock)
{ {
lock (_lock) ProfiledFuncs.TryAdd(address, new FuncProfile(mode, highCq: false));
{
ProfiledFuncs[address] = new FuncProfile(mode, highCq: false, true);
}
}
else
{
lock (_lock)
{
ProfiledFuncs.TryAdd(address, new FuncProfile(mode, highCq: false, false));
}
} }
} }
} }
public void UpdateEntry(ulong address, ExecutionMode mode, bool highCq, bool? blacklist = null) public void UpdateEntry(ulong address, ExecutionMode mode, bool highCq)
{ {
if (IsAddressInStaticCodeRange(address)) if (IsAddressInStaticCodeRange(address))
{ {
@@ -111,7 +100,7 @@ namespace ARMeilleure.Translation.PTC
{ {
Debug.Assert(ProfiledFuncs.ContainsKey(address)); Debug.Assert(ProfiledFuncs.ContainsKey(address));
ProfiledFuncs[address] = new FuncProfile(mode, highCq: true, blacklist ?? ProfiledFuncs[address].Blacklist); ProfiledFuncs[address] = new FuncProfile(mode, highCq: true);
} }
} }
} }
@@ -127,7 +116,7 @@ namespace ARMeilleure.Translation.PTC
foreach (KeyValuePair<ulong, FuncProfile> profiledFunc in ProfiledFuncs) foreach (KeyValuePair<ulong, FuncProfile> profiledFunc in ProfiledFuncs)
{ {
if (!funcs.ContainsKey(profiledFunc.Key) && !profiledFunc.Value.Blacklist) if (!funcs.ContainsKey(profiledFunc.Key))
{ {
profiledFuncsToTranslate.Enqueue((profiledFunc.Key, profiledFunc.Value)); profiledFuncsToTranslate.Enqueue((profiledFunc.Key, profiledFunc.Value));
} }
@@ -142,22 +131,6 @@ namespace ARMeilleure.Translation.PTC
ProfiledFuncs.TrimExcess(); ProfiledFuncs.TrimExcess();
} }
public List<ulong> GetBlacklistedFunctions()
{
List<ulong> funcs = [];
foreach ((ulong ptr, FuncProfile funcProfile) in ProfiledFuncs)
{
if (!funcProfile.Blacklist)
continue;
if (!funcs.Contains(ptr))
funcs.Add(ptr);
}
return funcs;
}
public void PreLoad() public void PreLoad()
{ {
_lastHash = default; _lastHash = default;
@@ -248,18 +221,13 @@ namespace ARMeilleure.Translation.PTC
return false; return false;
} }
Func<ulong, FuncProfile, (ulong, FuncProfile)> migrateEntryFunc = null;
switch (outerHeader.InfoFileVersion) switch (outerHeader.InfoFileVersion)
{ {
case InternalVersion: case InternalVersion:
ProfiledFuncs = Deserialize(stream); ProfiledFuncs = Deserialize(stream);
break; break;
case 1866: case 1866:
migrateEntryFunc = (address, profile) => (address + 0x500000UL, profile); ProfiledFuncs = Deserialize(stream, (address, profile) => (address + 0x500000UL, profile));
goto case 5518;
case 5518:
ProfiledFuncs = DeserializeAddBlacklist(stream, migrateEntryFunc);
break; break;
default: default:
Logger.Error?.Print(LogClass.Ptc, $"No migration path for {nameof(outerHeader.InfoFileVersion)} '{outerHeader.InfoFileVersion}'. Discarding cache."); Logger.Error?.Print(LogClass.Ptc, $"No migration path for {nameof(outerHeader.InfoFileVersion)} '{outerHeader.InfoFileVersion}'. Discarding cache.");
@@ -289,16 +257,6 @@ namespace ARMeilleure.Translation.PTC
return DeserializeDictionary<ulong, FuncProfile>(stream, DeserializeStructure<FuncProfile>); return DeserializeDictionary<ulong, FuncProfile>(stream, DeserializeStructure<FuncProfile>);
} }
private static Dictionary<ulong, FuncProfile> DeserializeAddBlacklist(Stream stream, Func<ulong, FuncProfile, (ulong, FuncProfile)> migrateEntryFunc = null)
{
if (migrateEntryFunc != null)
{
return DeserializeAndUpdateDictionary(stream, (Stream stream) => { return new FuncProfile(DeserializeStructure<FuncProfilePreBlacklist>(stream)); }, migrateEntryFunc);
}
return DeserializeDictionary<ulong, FuncProfile>(stream, (Stream stream) => { return new FuncProfile(DeserializeStructure<FuncProfilePreBlacklist>(stream)); });
}
private static ReadOnlySpan<byte> GetReadOnlySpan(MemoryStream memoryStream) private static ReadOnlySpan<byte> GetReadOnlySpan(MemoryStream memoryStream)
{ {
return new(memoryStream.GetBuffer(), (int)memoryStream.Position, (int)memoryStream.Length - (int)memoryStream.Position); return new(memoryStream.GetBuffer(), (int)memoryStream.Position, (int)memoryStream.Length - (int)memoryStream.Position);
@@ -430,35 +388,13 @@ namespace ARMeilleure.Translation.PTC
} }
} }
[StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 6*/)] [StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 5*/)]
public struct FuncProfile public struct FuncProfile
{ {
public ExecutionMode Mode; public ExecutionMode Mode;
public bool HighCq; public bool HighCq;
public bool Blacklist;
public FuncProfile(ExecutionMode mode, bool highCq, bool blacklist) public FuncProfile(ExecutionMode mode, bool highCq)
{
Mode = mode;
HighCq = highCq;
Blacklist = blacklist;
}
public FuncProfile(FuncProfilePreBlacklist fp)
{
Mode = fp.Mode;
HighCq = fp.HighCq;
Blacklist = false;
}
}
[StructLayout(LayoutKind.Sequential, Pack = 1/*, Size = 5*/)]
public struct FuncProfilePreBlacklist
{
public ExecutionMode Mode;
public bool HighCq;
public FuncProfilePreBlacklist(ExecutionMode mode, bool highCq)
{ {
Mode = mode; Mode = mode;
HighCq = highCq; HighCq = highCq;

View File

@@ -1,4 +1,5 @@
using ARMeilleure.Common; using ARMeilleure.Common;
using System;
namespace ARMeilleure.Translation namespace ARMeilleure.Translation
{ {

View File

@@ -5,6 +5,7 @@ using ARMeilleure.Diagnostics;
using ARMeilleure.Instructions; using ARMeilleure.Instructions;
using ARMeilleure.IntermediateRepresentation; using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.Memory; using ARMeilleure.Memory;
using ARMeilleure.Signal;
using ARMeilleure.State; using ARMeilleure.State;
using ARMeilleure.Translation.Cache; using ARMeilleure.Translation.Cache;
using ARMeilleure.Translation.PTC; using ARMeilleure.Translation.PTC;
@@ -248,11 +249,6 @@ namespace ARMeilleure.Translation
ControlFlowGraph cfg = EmitAndGetCFG(context, blocks, out Range funcRange, out Counter<uint> counter); ControlFlowGraph cfg = EmitAndGetCFG(context, blocks, out Range funcRange, out Counter<uint> counter);
if (cfg == null)
{
return null;
}
ulong funcSize = funcRange.End - funcRange.Start; ulong funcSize = funcRange.End - funcRange.Start;
Logger.EndPass(PassName.Translation, cfg); Logger.EndPass(PassName.Translation, cfg);
@@ -411,11 +407,6 @@ namespace ARMeilleure.Translation
if (opCode.Instruction.Emitter != null) if (opCode.Instruction.Emitter != null)
{ {
opCode.Instruction.Emitter(context); opCode.Instruction.Emitter(context);
if (opCode.Instruction.Name == InstName.Und && blkIndex == 0)
{
range = new Range(rangeStart, rangeEnd);
return null;
}
} }
else else
{ {

View File

@@ -4,6 +4,7 @@ using ARMeilleure.IntermediateRepresentation;
using ARMeilleure.State; using ARMeilleure.State;
using ARMeilleure.Translation.Cache; using ARMeilleure.Translation.Cache;
using System; using System;
using System.Reflection;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using static ARMeilleure.IntermediateRepresentation.Operand.Factory; using static ARMeilleure.IntermediateRepresentation.Operand.Factory;

View File

@@ -4,6 +4,7 @@ using Ryujinx.Common.Logging;
using Ryujinx.Common.Memory; using Ryujinx.Common.Memory;
using Ryujinx.Memory; using Ryujinx.Memory;
using System; using System;
using System.Buffers;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Threading; using System.Threading;

View File

@@ -1,4 +1,5 @@
using Ryujinx.Common.Memory; using Ryujinx.Common.Memory;
using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;

View File

@@ -1,3 +1,4 @@
using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using static Ryujinx.Audio.Backends.SoundIo.Native.SoundIo; using static Ryujinx.Audio.Backends.SoundIo.Native.SoundIo;

View File

@@ -4,6 +4,7 @@ using Ryujinx.Audio.Common;
using Ryujinx.Common.Memory; using Ryujinx.Common.Memory;
using Ryujinx.Memory; using Ryujinx.Memory;
using System; using System;
using System.Buffers;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Threading; using System.Threading;

View File

@@ -1,6 +1,7 @@
using Ryujinx.Common; using Ryujinx.Common;
using Ryujinx.Common.Memory; using Ryujinx.Common.Memory;
using System; using System;
using System.Buffers;
using System.Threading; using System.Threading;
namespace Ryujinx.Audio.Backends.Common namespace Ryujinx.Audio.Backends.Common

View File

@@ -1,3 +1,4 @@
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using CpuAddress = System.UInt64; using CpuAddress = System.UInt64;
using DspAddress = System.UInt64; using DspAddress = System.UInt64;

View File

@@ -6,16 +6,4 @@ namespace Ryujinx.Common.Configuration
Unbounded, Unbounded,
Custom Custom
} }
public static class VSyncModeExtensions
{
public static VSyncMode Next(this VSyncMode vsync, bool customEnabled = false) =>
vsync switch
{
VSyncMode.Switch => customEnabled ? VSyncMode.Custom : VSyncMode.Unbounded,
VSyncMode.Unbounded => VSyncMode.Switch,
VSyncMode.Custom => VSyncMode.Unbounded,
_ => VSyncMode.Switch
};
}
} }

View File

@@ -1,4 +1,5 @@
using Microsoft.Win32; using Microsoft.Win32;
using Ryujinx.Common;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using System; using System;
using System.Diagnostics; using System.Diagnostics;

View File

@@ -1,3 +1,4 @@
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Runtime.Versioning; using System.Runtime.Versioning;

View File

@@ -1,118 +0,0 @@
using System.Text.RegularExpressions;
namespace Ryujinx.Common.Helper
{
public static partial class Patterns
{
#region Accessors
public static readonly Regex Numeric = NumericRegex();
public static readonly Regex AmdGcn = AmdGcnRegex();
public static readonly Regex NvidiaConsumerClass = NvidiaConsumerClassRegex();
public static readonly Regex DomainLp1Ns = DomainLp1NsRegex();
public static readonly Regex DomainLp1Lp1Npln = DomainLp1Lp1NplnRegex();
public static readonly Regex DomainLp1Znc = DomainLp1ZncRegex();
public static readonly Regex DomainSbApi = DomainSbApiRegex();
public static readonly Regex DomainSbAccounts = DomainSbAccountsRegex();
public static readonly Regex DomainAccounts = DomainAccountsRegex();
public static readonly Regex Module = ModuleRegex();
public static readonly Regex FsSdk = FsSdkRegex();
public static readonly Regex SdkMw = SdkMwRegex();
// ReSharper disable once InconsistentNaming
public static readonly Regex CJK = CJKRegex();
public static readonly Regex LdnPassphrase = LdnPassphraseRegex();
public static readonly Regex CleanText = CleanTextRegex();
#endregion
#region Generated pattern stubs
#region Numeric validation
[GeneratedRegex("[0-9]|.")]
internal static partial Regex NumericRegex();
#endregion
#region GPU names
[GeneratedRegex(
"Radeon (((HD|R(5|7|9|X)) )?((M?[2-6]\\d{2}(\\D|$))|([7-8]\\d{3}(\\D|$))|Fury|Nano))|(Pro Duo)")]
internal static partial Regex AmdGcnRegex();
[GeneratedRegex("NVIDIA GeForce (R|G)?TX? (\\d{3}\\d?)M?")]
internal static partial Regex NvidiaConsumerClassRegex();
#endregion
#region DNS blocking
public static readonly Regex[] BlockedHosts =
[
DomainLp1Ns,
DomainLp1Lp1Npln,
DomainLp1Znc,
DomainSbApi,
DomainSbAccounts,
DomainAccounts
];
const RegexOptions DnsRegexOpts =
RegexOptions.CultureInvariant | RegexOptions.IgnoreCase | RegexOptions.ExplicitCapture;
[GeneratedRegex(@"^(.*)\-lp1\.(n|s)\.n\.srv\.nintendo\.net$", DnsRegexOpts)]
internal static partial Regex DomainLp1NsRegex();
[GeneratedRegex(@"^(.*)\-lp1\.lp1\.t\.npln\.srv\.nintendo\.net$", DnsRegexOpts)]
internal static partial Regex DomainLp1Lp1NplnRegex();
[GeneratedRegex(@"^(.*)\-lp1\.(znc|p)\.srv\.nintendo\.net$", DnsRegexOpts)]
internal static partial Regex DomainLp1ZncRegex();
[GeneratedRegex(@"^(.*)\-sb\-api\.accounts\.nintendo\.com$", DnsRegexOpts)]
internal static partial Regex DomainSbApiRegex();
[GeneratedRegex(@"^(.*)\-sb\.accounts\.nintendo\.com$", DnsRegexOpts)]
internal static partial Regex DomainSbAccountsRegex();
[GeneratedRegex(@"^accounts\.nintendo\.com$", DnsRegexOpts)]
internal static partial Regex DomainAccountsRegex();
#endregion
#region Executable information
[GeneratedRegex(@"[a-z]:[\\/][ -~]{5,}\.nss", RegexOptions.IgnoreCase | RegexOptions.CultureInvariant)]
internal static partial Regex ModuleRegex();
[GeneratedRegex(@"sdk_version: ([0-9.]*)")]
internal static partial Regex FsSdkRegex();
[GeneratedRegex(@"SDK MW[ -~]*")]
internal static partial Regex SdkMwRegex();
#endregion
#region CJK
[GeneratedRegex(
"\\p{IsHangulJamo}|\\p{IsCJKRadicalsSupplement}|\\p{IsCJKSymbolsandPunctuation}|\\p{IsEnclosedCJKLettersandMonths}|\\p{IsCJKCompatibility}|\\p{IsCJKUnifiedIdeographsExtensionA}|\\p{IsCJKUnifiedIdeographs}|\\p{IsHangulSyllables}|\\p{IsCJKCompatibilityForms}")]
private static partial Regex CJKRegex();
#endregion
[GeneratedRegex("Ryujinx-[0-9a-f]{8}")]
private static partial Regex LdnPassphraseRegex();
[GeneratedRegex(@"[^\u0000\u0009\u000A\u000D\u0020-\uFFFF]..")]
private static partial Regex CleanTextRegex();
#endregion
}
}

View File

@@ -1,58 +0,0 @@
using Gommon;
using System.Collections.Generic;
using System.Threading;
namespace Ryujinx.Common.Helper
{
public class RefEvent<T>
{
public delegate void Handler(ref T arg);
private readonly Lock _subLock = new();
private readonly List<Handler> _subscriptions = [];
public bool HasSubscribers
{
get
{
lock (_subLock)
return _subscriptions.Count != 0;
}
}
public IReadOnlyList<Handler> Subscriptions
{
get
{
lock (_subLock)
return _subscriptions;
}
}
public void Add(Handler subscriber)
{
Guard.Require(subscriber, nameof(subscriber));
lock (_subLock)
_subscriptions.Add(subscriber);
}
public void Remove(Handler subscriber)
{
Guard.Require(subscriber, nameof(subscriber));
lock (_subLock)
_subscriptions.Remove(subscriber);
}
public void Clear()
{
lock (_subLock)
_subscriptions.Clear();
}
public void Call(ref T arg)
{
foreach (Handler subscription in Subscriptions)
subscription(ref arg);
}
}
}

View File

@@ -10,18 +10,14 @@ namespace Ryujinx.Common.Helper
public static bool IsMacOS => OperatingSystem.IsMacOS(); public static bool IsMacOS => OperatingSystem.IsMacOS();
public static bool IsWindows => OperatingSystem.IsWindows(); public static bool IsWindows => OperatingSystem.IsWindows();
public static bool IsLinux => OperatingSystem.IsLinux(); public static bool IsLinux => OperatingSystem.IsLinux();
public static bool IsArm => RuntimeInformation.OSArchitecture is Architecture.Arm64;
public static bool IsX64 => RuntimeInformation.OSArchitecture is Architecture.X64;
public static bool IsIntelMac => IsMacOS && IsX64; public static bool IsIntelMac => IsMacOS && RuntimeInformation.OSArchitecture is Architecture.X64;
public static bool IsArmMac => IsMacOS && IsArm; public static bool IsArmMac => IsMacOS && RuntimeInformation.OSArchitecture is Architecture.Arm64;
public static bool IsX64Windows => IsWindows && IsX64; public static bool IsX64Windows => IsWindows && (RuntimeInformation.OSArchitecture is Architecture.X64);
public static bool IsArmWindows => IsWindows && IsArm; public static bool IsArmWindows => IsWindows && (RuntimeInformation.OSArchitecture is Architecture.Arm64);
public static bool IsX64Linux => IsLinux && IsX64; public static bool IsX64Linux => IsLinux && (RuntimeInformation.OSArchitecture is Architecture.X64);
public static bool IsArmLinux => IsLinux && IsArmMac; public static bool IsArmLinux => IsLinux && (RuntimeInformation.OSArchitecture is Architecture.Arm64);
} }
} }

View File

@@ -3,6 +3,7 @@ using Ryujinx.Common.Configuration;
using Ryujinx.Common.Helper; using Ryujinx.Common.Helper;
using System; using System;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices;
namespace Ryujinx.Common namespace Ryujinx.Common
{ {
@@ -29,11 +30,10 @@ namespace Ryujinx.Common
public static readonly string[] GreatMetalTitles = public static readonly string[] GreatMetalTitles =
[ [
"01009b500007c000", // ARMS "010076f0049a2000", // Bayonetta
"0100a5c00d162000", // Cuphead "0100a5c00d162000", // Cuphead
"010023800d64a000", // Deltarune "010023800d64a000", // Deltarune
"01003a30012c0000", // LEGO City Undercover "01003a30012c0000", // LEGO City Undercover
"010048701995e000", // Luigi's Manion 2 HD
"010028600EBDA000", // Mario 3D World "010028600EBDA000", // Mario 3D World
"0100152000022000", // Mario Kart 8 Deluxe "0100152000022000", // Mario Kart 8 Deluxe
"010075a016a3a000", // Persona 4 Arena Ultimax "010075a016a3a000", // Persona 4 Arena Ultimax
@@ -47,15 +47,11 @@ namespace Ryujinx.Common
"01006f8002326000", // Animal Crossings: New Horizons "01006f8002326000", // Animal Crossings: New Horizons
"01009bf0072d4000", // Captain Toad: Treasure Tracker "01009bf0072d4000", // Captain Toad: Treasure Tracker
"01009510001ca000", // Fast RMX "01009510001ca000", // Fast RMX
"01005CA01580E000", // Persona 5 Royal "01005CA01580E000", // Persona 5 Royale
"0100b880154fc000", // Persona 5 The Royal (Japan)
"010015100b514000", // Super Mario Bros. Wonder
"0100000000010000", // Super Mario Odyssey "0100000000010000", // Super Mario Odyssey
// Further testing is appreciated, I did not test the entire game: //Isaac claims it has a issue in level 2, but I am not able to replicate it on my M3. More testing would be appreciated:
//"010076f0049a2000", // Bayonetta "010015100b514000", // Super Mario Bros. Wonder
//"0100cf5010fec000", // Bayonetta Origins: Cereza and the Lost Demon
//"0100f4300bf2c000", // New Pokemon Snap
]; ];
public static string GetDiscordGameAsset(string titleId) public static string GetDiscordGameAsset(string titleId)
@@ -163,16 +159,15 @@ namespace Ryujinx.Common
"0100ba0018500000", // Splatoon 3: Splatfest World Premiere "0100ba0018500000", // Splatoon 3: Splatfest World Premiere
//NSO Membership games //NSO Membership games
"0100ccf019c8c000", // F-ZERO 99
"0100c62011050000", // GB - Nintendo Switch Online "0100c62011050000", // GB - Nintendo Switch Online
"010012f017576000", // GBA - Nintendo Switch Online "010012f017576000", // GBA - Nintendo Switch Online
"0100c9a00ece6000", // N64 - Nintendo Switch Online "0100c9a00ece6000", // N64 - Nintendo Switch Online
"0100e0601c632000", // N64 - Nintendo Switch Online 18+ "0100e0601c632000", // N64 - Nintendo Switch Online 18+
"0100d870045b6000", // NES - Nintendo Switch Online "0100d870045b6000", // NES - Nintendo Switch Online
"0100b3c014bda000", // SEGA Genesis - Nintendo Switch Online
"01008d300c50c000", // SNES - Nintendo Switch Online
"0100ccf019c8c000", // F-ZERO 99
"0100ad9012510000", // PAC-MAN 99 "0100ad9012510000", // PAC-MAN 99
"010040600c5ce000", // Tetris 99 "010040600c5ce000", // Tetris 99
"01008d300c50c000", // SNES - Nintendo Switch Online
"0100277011f1a000", // Super Mario Bros. 35 "0100277011f1a000", // Super Mario Bros. 35
//Misc Nintendo 1st party games //Misc Nintendo 1st party games
@@ -218,7 +213,6 @@ namespace Ryujinx.Common
//Misc Games //Misc Games
"010056e00853a000", // A Hat in Time "010056e00853a000", // A Hat in Time
"0100fd1014726000", // Baldurs Gate: Dark Alliance "0100fd1014726000", // Baldurs Gate: Dark Alliance
"01008c2019598000", // Bluey: The Video Game
"0100c6800b934000", // Brawlhalla "0100c6800b934000", // Brawlhalla
"0100dbf01000a000", // Burnout Paradise Remastered "0100dbf01000a000", // Burnout Paradise Remastered
"0100744001588000", // Cars 3: Driven to Win "0100744001588000", // Cars 3: Driven to Win
@@ -229,7 +223,6 @@ namespace Ryujinx.Common
"01008c8012920000", // Dying Light Platinum Edition "01008c8012920000", // Dying Light Platinum Edition
"01001cc01b2d4000", // Goat Simulator 3 "01001cc01b2d4000", // Goat Simulator 3
"01003620068ea000", // Hand of Fate 2 "01003620068ea000", // Hand of Fate 2
"0100f7e00c70e000", // Hogwarts Legacy
"010085500130a000", // Lego City: Undercover "010085500130a000", // Lego City: Undercover
"010073c01af34000", // LEGO Horizon Adventures "010073c01af34000", // LEGO Horizon Adventures
"0100d71004694000", // Minecraft "0100d71004694000", // Minecraft

View File

@@ -1,5 +1,4 @@
using Gommon; using Gommon;
using Ryujinx.Common.Helper;
using System; using System;
using System.Drawing; using System.Drawing;
using System.Threading; using System.Threading;
@@ -56,7 +55,7 @@ namespace Ryujinx.Common.Utilities
{ {
_color = HsbToRgb((_color.GetHue() + Speed) / 360); _color = HsbToRgb((_color.GetHue() + Speed) / 360);
_updatedHandler.Call(ref _color); _updatedHandler.Call(_color.ToArgb());
} }
} }
@@ -68,13 +67,13 @@ namespace Ryujinx.Common.Utilities
_color = Color.Blue; _color = Color.Blue;
} }
public static event RefEvent<Color>.Handler Updated public static event Action<int> Updated
{ {
add => _updatedHandler.Add(value); add => _updatedHandler.Add(value);
remove => _updatedHandler.Remove(value); remove => _updatedHandler.Remove(value);
} }
private static readonly RefEvent<Color> _updatedHandler = new(); private static readonly Event<int> _updatedHandler = new();
private static Color HsbToRgb(float hue, float saturation = 1, float brightness = 1) private static Color HsbToRgb(float hue, float saturation = 1, float brightness = 1)
{ {

View File

@@ -1,5 +1,6 @@
using ARMeilleure.State; using ARMeilleure.State;
using Ryujinx.Memory; using Ryujinx.Memory;
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Runtime.Versioning; using System.Runtime.Versioning;

View File

@@ -5,6 +5,7 @@ using Ryujinx.Memory.Tracking;
using System; using System;
using System.Buffers; using System.Buffers;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.Versioning; using System.Runtime.Versioning;

View File

@@ -1,4 +1,5 @@
using Ryujinx.Memory; using Ryujinx.Memory;
using System;
using System.Runtime.Versioning; using System.Runtime.Versioning;
using System.Threading; using System.Threading;

View File

@@ -2,6 +2,7 @@ using ARMeilleure.Common;
using ARMeilleure.Memory; using ARMeilleure.Memory;
using ARMeilleure.Translation; using ARMeilleure.Translation;
using Ryujinx.Cpu.Signal; using Ryujinx.Cpu.Signal;
using Ryujinx.Memory;
namespace Ryujinx.Cpu.Jit namespace Ryujinx.Cpu.Jit
{ {

View File

@@ -5,6 +5,7 @@ using Ryujinx.Memory.Tracking;
using System; using System;
using System.Buffers; using System.Buffers;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Threading; using System.Threading;

View File

@@ -8,6 +8,7 @@ using Ryujinx.Memory.Tracking;
using System; using System;
using System.Buffers; using System.Buffers;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
namespace Ryujinx.Cpu.Jit namespace Ryujinx.Cpu.Jit

View File

@@ -3,6 +3,7 @@ using ARMeilleure.Memory;
using Ryujinx.Cpu.LightningJit.Arm32; using Ryujinx.Cpu.LightningJit.Arm32;
using Ryujinx.Cpu.LightningJit.Arm64; using Ryujinx.Cpu.LightningJit.Arm64;
using Ryujinx.Cpu.LightningJit.State; using Ryujinx.Cpu.LightningJit.State;
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Ryujinx.Cpu.LightningJit namespace Ryujinx.Cpu.LightningJit

View File

@@ -2,6 +2,7 @@ using ARMeilleure.Common;
using ARMeilleure.Memory; using ARMeilleure.Memory;
using Ryujinx.Cpu.LightningJit.CodeGen; using Ryujinx.Cpu.LightningJit.CodeGen;
using Ryujinx.Cpu.LightningJit.CodeGen.Arm64; using Ryujinx.Cpu.LightningJit.CodeGen.Arm64;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Numerics; using System.Numerics;

View File

@@ -1,4 +1,5 @@
using Ryujinx.Cpu.LightningJit.CodeGen; using Ryujinx.Cpu.LightningJit.CodeGen;
using System;
using System.Diagnostics; using System.Diagnostics;
namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64

View File

@@ -1,3 +1,5 @@
using Ryujinx.Cpu.LightningJit.CodeGen;
namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64 namespace Ryujinx.Cpu.LightningJit.Arm32.Target.Arm64
{ {
static class InstEmitVfpMove static class InstEmitVfpMove

View File

@@ -1,3 +1,5 @@
using System.Diagnostics;
namespace Ryujinx.Cpu.LightningJit.Arm64 namespace Ryujinx.Cpu.LightningJit.Arm64
{ {
static class SysUtils static class SysUtils

View File

@@ -3,6 +3,7 @@ using ARMeilleure.Memory;
using Ryujinx.Cpu.LightningJit.CodeGen; using Ryujinx.Cpu.LightningJit.CodeGen;
using Ryujinx.Cpu.LightningJit.CodeGen.Arm64; using Ryujinx.Cpu.LightningJit.CodeGen.Arm64;
using Ryujinx.Cpu.LightningJit.Graph; using Ryujinx.Cpu.LightningJit.Graph;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Numerics; using System.Numerics;

View File

@@ -1,6 +1,4 @@
using ARMeilleure.Memory; using ARMeilleure.Memory;
using Humanizer;
using Ryujinx.Common.Logging;
using Ryujinx.Memory; using Ryujinx.Memory;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@@ -17,8 +15,9 @@ namespace Ryujinx.Cpu.LightningJit.Cache
private static readonly int _pageMask = _pageSize - 1; private static readonly int _pageMask = _pageSize - 1;
private const int CodeAlignment = 4; // Bytes. private const int CodeAlignment = 4; // Bytes.
private const int CacheSize = 256 * 1024 * 1024; private const int CacheSize = 2047 * 1024 * 1024;
private static ReservedRegion _jitRegion;
private static JitCacheInvalidation _jitCacheInvalidator; private static JitCacheInvalidation _jitCacheInvalidator;
private static CacheMemoryAllocator _cacheAllocator; private static CacheMemoryAllocator _cacheAllocator;
@@ -27,8 +26,6 @@ namespace Ryujinx.Cpu.LightningJit.Cache
private static readonly Lock _lock = new(); private static readonly Lock _lock = new();
private static bool _initialized; private static bool _initialized;
private static readonly List<ReservedRegion> _jitRegions = [];
private static int _activeRegionIndex = 0;
[SupportedOSPlatform("windows")] [SupportedOSPlatform("windows")]
[LibraryImport("kernel32.dll", SetLastError = true)] [LibraryImport("kernel32.dll", SetLastError = true)]
@@ -48,9 +45,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache
return; return;
} }
ReservedRegion firstRegion = new(allocator, CacheSize); _jitRegion = new ReservedRegion(allocator, CacheSize);
_jitRegions.Add(firstRegion);
_activeRegionIndex = 0;
if (!OperatingSystem.IsWindows() && !OperatingSystem.IsMacOS()) if (!OperatingSystem.IsWindows() && !OperatingSystem.IsMacOS())
{ {
@@ -70,8 +65,8 @@ namespace Ryujinx.Cpu.LightningJit.Cache
Debug.Assert(_initialized); Debug.Assert(_initialized);
int funcOffset = Allocate(code.Length); int funcOffset = Allocate(code.Length);
ReservedRegion targetRegion = _jitRegions[_activeRegionIndex];
nint funcPtr = targetRegion.Pointer + funcOffset; nint funcPtr = _jitRegion.Pointer + funcOffset;
if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64) if (OperatingSystem.IsMacOS() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
{ {
@@ -85,11 +80,18 @@ namespace Ryujinx.Cpu.LightningJit.Cache
} }
else else
{ {
ReprotectAsWritable(targetRegion, funcOffset, code.Length); ReprotectAsWritable(funcOffset, code.Length);
Marshal.Copy(code.ToArray(), 0, funcPtr, code.Length); code.CopyTo(new Span<byte>((void*)funcPtr, code.Length));
ReprotectAsExecutable(targetRegion, funcOffset, code.Length); ReprotectAsExecutable(funcOffset, code.Length);
_jitCacheInvalidator?.Invalidate(funcPtr, (ulong)code.Length); if (OperatingSystem.IsWindows() && RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
{
FlushInstructionCache(Process.GetCurrentProcess().Handle, funcPtr, (nuint)code.Length);
}
else
{
_jitCacheInvalidator?.Invalidate(funcPtr, (ulong)code.Length);
}
} }
Add(funcOffset, code.Length); Add(funcOffset, code.Length);
@@ -104,80 +106,50 @@ namespace Ryujinx.Cpu.LightningJit.Cache
{ {
Debug.Assert(_initialized); Debug.Assert(_initialized);
foreach (ReservedRegion region in _jitRegions) int funcOffset = (int)(pointer.ToInt64() - _jitRegion.Pointer.ToInt64());
if (TryFind(funcOffset, out CacheEntry entry, out int entryIndex) && entry.Offset == funcOffset)
{ {
if (pointer.ToInt64() < region.Pointer.ToInt64() || _cacheAllocator.Free(funcOffset, AlignCodeSize(entry.Size));
pointer.ToInt64() >= (region.Pointer + CacheSize).ToInt64()) _cacheEntries.RemoveAt(entryIndex);
{
continue;
}
int funcOffset = (int)(pointer.ToInt64() - region.Pointer.ToInt64());
if (TryFind(funcOffset, out CacheEntry entry, out int entryIndex) && entry.Offset == funcOffset)
{
_cacheAllocator.Free(funcOffset, AlignCodeSize(entry.Size));
_cacheEntries.RemoveAt(entryIndex);
}
return;
} }
} }
} }
private static void ReprotectAsWritable(ReservedRegion region, int offset, int size) private static void ReprotectAsWritable(int offset, int size)
{ {
int endOffs = offset + size; int endOffs = offset + size;
int regionStart = offset & ~_pageMask; int regionStart = offset & ~_pageMask;
int regionEnd = (endOffs + _pageMask) & ~_pageMask; int regionEnd = (endOffs + _pageMask) & ~_pageMask;
region.Block.MapAsRwx((ulong)regionStart, (ulong)(regionEnd - regionStart)); _jitRegion.Block.MapAsRwx((ulong)regionStart, (ulong)(regionEnd - regionStart));
} }
private static void ReprotectAsExecutable(ReservedRegion region, int offset, int size) private static void ReprotectAsExecutable(int offset, int size)
{ {
int endOffs = offset + size; int endOffs = offset + size;
int regionStart = offset & ~_pageMask; int regionStart = offset & ~_pageMask;
int regionEnd = (endOffs + _pageMask) & ~_pageMask; int regionEnd = (endOffs + _pageMask) & ~_pageMask;
region.Block.MapAsRx((ulong)regionStart, (ulong)(regionEnd - regionStart)); _jitRegion.Block.MapAsRx((ulong)regionStart, (ulong)(regionEnd - regionStart));
} }
private static int Allocate(int codeSize) private static int Allocate(int codeSize)
{ {
codeSize = AlignCodeSize(codeSize); codeSize = AlignCodeSize(codeSize);
for (int i = _activeRegionIndex; i < _jitRegions.Count; i++) int allocOffset = _cacheAllocator.Allocate(codeSize);
if (allocOffset < 0)
{ {
int allocOffset = _cacheAllocator.Allocate(codeSize); throw new OutOfMemoryException("JIT Cache exhausted.");
if (allocOffset >= 0)
{
_jitRegions[i].ExpandIfNeeded((ulong)allocOffset + (ulong)codeSize);
_activeRegionIndex = i;
return allocOffset;
}
} }
int exhaustedRegion = _activeRegionIndex; _jitRegion.ExpandIfNeeded((ulong)allocOffset + (ulong)codeSize);
ReservedRegion newRegion = new(_jitRegions[0].Allocator, CacheSize);
_jitRegions.Add(newRegion);
_activeRegionIndex = _jitRegions.Count - 1;
int newRegionNumber = _activeRegionIndex;
Logger.Warning?.Print(LogClass.Cpu, $"JIT Cache Region {exhaustedRegion} exhausted, creating new Cache Region {newRegionNumber} ({((long)(newRegionNumber + 1) * CacheSize).Bytes()} Total Allocation)."); return allocOffset;
_cacheAllocator = new CacheMemoryAllocator(CacheSize);
int allocOffsetNew = _cacheAllocator.Allocate(codeSize);
if (allocOffsetNew < 0)
{
throw new OutOfMemoryException("Failed to allocate in new Cache Region!");
}
newRegion.ExpandIfNeeded((ulong)allocOffsetNew + (ulong)codeSize);
return allocOffsetNew;
} }
private static int AlignCodeSize(int codeSize) private static int AlignCodeSize(int codeSize)

View File

@@ -1,4 +1,5 @@
using ARMeilleure.Memory; using ARMeilleure.Memory;
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Ryujinx.Cpu.LightningJit.Cache namespace Ryujinx.Cpu.LightningJit.Cache

View File

@@ -1,3 +1,4 @@
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Runtime.Versioning; using System.Runtime.Versioning;

View File

@@ -12,7 +12,7 @@ namespace Ryujinx.Cpu.LightningJit.Cache
{ {
private const int CodeAlignment = 4; // Bytes. private const int CodeAlignment = 4; // Bytes.
private const int SharedCacheSize = 2047 * 1024 * 1024; private const int SharedCacheSize = 2047 * 1024 * 1024;
private const int LocalCacheSize = 256 * 1024 * 1024; private const int LocalCacheSize = 128 * 1024 * 1024;
// How many calls to the same function we allow until we pad the shared cache to force the function to become available there // How many calls to the same function we allow until we pad the shared cache to force the function to become available there
// and allow the guest to take the fast path. // and allow the guest to take the fast path.

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;

View File

@@ -1,3 +1,4 @@
using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.Cpu.LightningJit namespace Ryujinx.Cpu.LightningJit

View File

@@ -1,3 +1,5 @@
using System;
namespace Ryujinx.Cpu.LightningJit namespace Ryujinx.Cpu.LightningJit
{ {
class TranslatedFunction class TranslatedFunction

View File

@@ -5,6 +5,7 @@ using Ryujinx.Cpu.LightningJit.Cache;
using Ryujinx.Cpu.LightningJit.CodeGen.Arm64; using Ryujinx.Cpu.LightningJit.CodeGen.Arm64;
using Ryujinx.Cpu.LightningJit.State; using Ryujinx.Cpu.LightningJit.State;
using Ryujinx.Cpu.Signal; using Ryujinx.Cpu.Signal;
using Ryujinx.Memory;
using System; using System;
using System.Collections.Concurrent; using System.Collections.Concurrent;
using System.Collections.Generic; using System.Collections.Generic;

View File

@@ -1,3 +1,4 @@
using System;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Ryujinx.Cpu.Signal namespace Ryujinx.Cpu.Signal

View File

@@ -1,4 +1,6 @@
using Ryujinx.Common.Logging;
using System; using System;
using System.Threading;
namespace Ryujinx.Graphics.Device namespace Ryujinx.Graphics.Device
{ {

View File

@@ -1,5 +1,6 @@
using Ryujinx.Common; using Ryujinx.Common;
using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL;
using System;
using System.Collections.Generic; using System.Collections.Generic;
namespace Ryujinx.Graphics.Gpu.Engine.Threed.Blender namespace Ryujinx.Graphics.Gpu.Engine.Threed.Blender

View File

@@ -913,7 +913,7 @@ namespace Ryujinx.Graphics.Gpu.Engine.Threed
Span<Rectangle<int>> scissors = Span<Rectangle<int>> scissors =
[ [
new(scissorX, scissorY, scissorW, scissorH) new Rectangle<int>(scissorX, scissorY, scissorW, scissorH)
]; ];
_context.Renderer.Pipeline.SetScissors(scissors); _context.Renderer.Pipeline.SetScissors(scissors);

View File

@@ -1,3 +1,4 @@
using Ryujinx.Graphics.Device;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;

View File

@@ -4,6 +4,7 @@ using Ryujinx.Graphics.Gpu.Memory;
using Ryujinx.Graphics.Shader; using Ryujinx.Graphics.Shader;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
namespace Ryujinx.Graphics.Gpu.Image namespace Ryujinx.Graphics.Gpu.Image

View File

@@ -1,4 +1,5 @@
using Ryujinx.Common.Memory; using Ryujinx.Common.Memory;
using Ryujinx.Graphics.Gpu.Image;
using Ryujinx.Memory; using Ryujinx.Memory;
using Ryujinx.Memory.Range; using Ryujinx.Memory.Range;
using System; using System;

View File

@@ -7,6 +7,7 @@ using Ryujinx.Memory;
using Ryujinx.Memory.Range; using Ryujinx.Memory.Range;
using Ryujinx.Memory.Tracking; using Ryujinx.Memory.Tracking;
using System; using System;
using System.Buffers;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;

View File

@@ -1,5 +1,6 @@
using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Shader; using Ryujinx.Graphics.Shader;
using System;
using System.Runtime.CompilerServices; using System.Runtime.CompilerServices;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;

View File

@@ -2,6 +2,7 @@ using Ryujinx.Graphics.GAL;
using Ryujinx.Graphics.Gpu.Engine; using Ryujinx.Graphics.Gpu.Engine;
using Ryujinx.Graphics.Gpu.Image; using Ryujinx.Graphics.Gpu.Image;
using Ryujinx.Graphics.Shader; using Ryujinx.Graphics.Shader;
using System;
using System.Linq; using System.Linq;
namespace Ryujinx.Graphics.Gpu.Shader namespace Ryujinx.Graphics.Gpu.Shader

View File

@@ -729,7 +729,7 @@ namespace Ryujinx.Graphics.Gpu.Shader.DiskCache
ShaderProgram program = translatorContext.Translate(); ShaderProgram program = translatorContext.Translate();
CachedShaderStage[] shaders = [new(program.Info, shader.Code, shader.Cb1Data)]; CachedShaderStage[] shaders = [new CachedShaderStage(program.Info, shader.Code, shader.Cb1Data)];
_compilationQueue.Enqueue(new ProgramCompilation([program], shaders, newSpecState, programIndex, isCompute: true)); _compilationQueue.Enqueue(new ProgramCompilation([program], shaders, newSpecState, programIndex, isCompute: true));
} }

View File

@@ -1,3 +1,4 @@
using Ryujinx.Common;
using Ryujinx.Common.Configuration; using Ryujinx.Common.Configuration;
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL;

View File

@@ -87,7 +87,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
} }
using ManualResetEvent waitEvent = new(false); using ManualResetEvent waitEvent = new(false);
SyncpointWaiterHandle info = _syncpoints[id].RegisterCallback(threshold, _ => waitEvent.Set()); SyncpointWaiterHandle info = _syncpoints[id].RegisterCallback(threshold, (x) => waitEvent.Set());
if (info == null) if (info == null)
{ {
@@ -96,7 +96,7 @@ namespace Ryujinx.Graphics.Gpu.Synchronization
bool signaled = waitEvent.WaitOne(timeout); bool signaled = waitEvent.WaitOne(timeout);
if (!signaled) if (!signaled && info != null)
{ {
Logger.Error?.Print(LogClass.Gpu, $"Wait on syncpoint {id} for threshold {threshold} took more than {timeout.TotalMilliseconds}ms, resuming execution..."); Logger.Error?.Print(LogClass.Gpu, $"Wait on syncpoint {id} for threshold {threshold} took more than {timeout.TotalMilliseconds}ms, resuming execution...");

View File

@@ -1,6 +1,7 @@
using Ryujinx.Common.Logging; using Ryujinx.Common.Logging;
using Ryujinx.Graphics.GAL; using Ryujinx.Graphics.GAL;
using SharpMetal.Metal; using SharpMetal.Metal;
using System;
using System.Runtime.Versioning; using System.Runtime.Versioning;
namespace Ryujinx.Graphics.Metal namespace Ryujinx.Graphics.Metal

View File

@@ -76,7 +76,7 @@ namespace Ryujinx.Graphics.Metal
return model; return model;
} }
return string.Empty; return "";
} }
} }
} }

View File

@@ -1,3 +1,5 @@
using System;
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{ {
struct AVCodec struct AVCodec

View File

@@ -1,3 +1,5 @@
using System;
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{ {
struct AVCodec501 struct AVCodec501

View File

@@ -1,4 +1,5 @@
using Ryujinx.Common.Memory; using Ryujinx.Common.Memory;
using System;
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{ {

View File

@@ -1,4 +1,5 @@
using Ryujinx.Common.Memory; using Ryujinx.Common.Memory;
using System;
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{ {

View File

@@ -1,3 +1,5 @@
using System;
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{ {
struct FFCodec<T> where T : struct struct FFCodec<T> where T : struct

View File

@@ -1,3 +1,5 @@
using System;
namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native namespace Ryujinx.Graphics.Nvdec.FFmpeg.Native
{ {
struct FFCodecLegacy<T> where T : struct struct FFCodecLegacy<T> where T : struct

View File

@@ -1,5 +1,6 @@
using Ryujinx.Graphics.Nvdec.FFmpeg.Native; using Ryujinx.Graphics.Nvdec.FFmpeg.Native;
using Ryujinx.Graphics.Video; using Ryujinx.Graphics.Video;
using System;
namespace Ryujinx.Graphics.Nvdec.FFmpeg namespace Ryujinx.Graphics.Nvdec.FFmpeg
{ {

View File

@@ -59,7 +59,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Common
} }
} }
ArrayPtr<T> allocation = new(ptr, length); ArrayPtr<T> allocation = new ArrayPtr<T>(ptr, length);
allocation.AsSpan().Fill(default); allocation.AsSpan().Fill(default);

View File

@@ -14,8 +14,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return (v & 1) != 0 ? m - ((v + 1) >> 1) : m + (v >> 1); return (v & 1) != 0 ? m - ((v + 1) >> 1) : m + (v >> 1);
} }
private static readonly byte[] _invMapTable = private static readonly byte[] InvMapTable =
[ {
7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176, 189, 202, 215, 228, 241, 254, 1, 2, 3, 4, 7, 20, 33, 46, 59, 72, 85, 98, 111, 124, 137, 150, 163, 176, 189, 202, 215, 228, 241, 254, 1, 2, 3, 4,
5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34, 5, 6, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 34,
35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62,
@@ -28,13 +28,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
206, 207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 206, 207, 208, 209, 210, 211, 212, 213, 214, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227,
229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, 245, 246, 247, 248, 249, 250,
251, 252, 253, 253 251, 252, 253, 253
]; };
public static int InvRemapProb(int v, int m) public static int InvRemapProb(int v, int m)
{ {
Debug.Assert(v < _invMapTable.Length / sizeof(byte)); Debug.Assert(v < InvMapTable.Length / sizeof(byte));
v = _invMapTable[v]; v = InvMapTable[v];
m--; m--;
if (m << 1 <= Prob.MaxProb) if (m << 1 <= Prob.MaxProb)
{ {

View File

@@ -111,23 +111,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
Span<ushort> dst16 = MemoryMarshal.Cast<byte, ushort>(dst); Span<ushort> dst16 = MemoryMarshal.Cast<byte, ushort>(dst);
if (xd.Lossless) if (xd.Lossless)
{ {
Idct.HighbdIwht4X4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIwht4x4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
} }
else else
{ {
switch (txSize) switch (txSize)
{ {
case TxSize.Tx4X4: case TxSize.Tx4x4:
Idct.HighbdIdct4X4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIdct4x4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx8X8: case TxSize.Tx8x8:
Idct.HighbdIdct8X8Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIdct8x8Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx16X16: case TxSize.Tx16x16:
Idct.HighbdIdct16X16Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIdct16x16Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx32X32: case TxSize.Tx32x32:
Idct.HighbdIdct32X32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIdct32x32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
default: default:
Debug.Assert(false, "Invalid transform size"); Debug.Assert(false, "Invalid transform size");
@@ -139,23 +139,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
if (xd.Lossless) if (xd.Lossless)
{ {
Idct.Iwht4X4Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Iwht4x4Add(dqcoeff.AsSpan(), dst, stride, eob);
} }
else else
{ {
switch (txSize) switch (txSize)
{ {
case TxSize.Tx4X4: case TxSize.Tx4x4:
Idct.Idct4X4Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Idct4x4Add(dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx8X8: case TxSize.Tx8x8:
Idct.Idct8X8Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Idct8x8Add(dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx16X16: case TxSize.Tx16x16:
Idct.Idct16X16Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Idct16x16Add(dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx32X32: case TxSize.Tx32x32:
Idct.Idct32X32Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Idct32x32Add(dqcoeff.AsSpan(), dst, stride, eob);
break; break;
default: default:
Debug.Assert(false, "Invalid transform size"); Debug.Assert(false, "Invalid transform size");
@@ -170,11 +170,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
else else
{ {
if (txSize <= TxSize.Tx16X16 && eob <= 10) if (txSize <= TxSize.Tx16x16 && eob <= 10)
{ {
dqcoeff.AsSpan().Slice(0, 4 * (4 << (int)txSize)).Clear(); dqcoeff.AsSpan().Slice(0, 4 * (4 << (int)txSize)).Clear();
} }
else if (txSize == TxSize.Tx32X32 && eob <= 34) else if (txSize == TxSize.Tx32x32 && eob <= 34)
{ {
dqcoeff.AsSpan().Slice(0, 256).Clear(); dqcoeff.AsSpan().Slice(0, 256).Clear();
} }
@@ -202,23 +202,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
Span<ushort> dst16 = MemoryMarshal.Cast<byte, ushort>(dst); Span<ushort> dst16 = MemoryMarshal.Cast<byte, ushort>(dst);
if (xd.Lossless) if (xd.Lossless)
{ {
Idct.HighbdIwht4X4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIwht4x4Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
} }
else else
{ {
switch (txSize) switch (txSize)
{ {
case TxSize.Tx4X4: case TxSize.Tx4x4:
Idct.HighbdIht4X4Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIht4x4Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx8X8: case TxSize.Tx8x8:
Idct.HighbdIht8X8Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIht8x8Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx16X16: case TxSize.Tx16x16:
Idct.HighbdIht16X16Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIht16x16Add(txType, dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
case TxSize.Tx32X32: case TxSize.Tx32x32:
Idct.HighbdIdct32X32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd); Idct.HighbdIdct32x32Add(dqcoeff.AsSpan(), dst16, stride, eob, xd.Bd);
break; break;
default: default:
Debug.Assert(false, "Invalid transform size"); Debug.Assert(false, "Invalid transform size");
@@ -230,23 +230,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
if (xd.Lossless) if (xd.Lossless)
{ {
Idct.Iwht4X4Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Iwht4x4Add(dqcoeff.AsSpan(), dst, stride, eob);
} }
else else
{ {
switch (txSize) switch (txSize)
{ {
case TxSize.Tx4X4: case TxSize.Tx4x4:
Idct.Iht4X4Add(txType, dqcoeff.AsSpan(), dst, stride, eob); Idct.Iht4x4Add(txType, dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx8X8: case TxSize.Tx8x8:
Idct.Iht8X8Add(txType, dqcoeff.AsSpan(), dst, stride, eob); Idct.Iht8x8Add(txType, dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx16X16: case TxSize.Tx16x16:
Idct.Iht16X16Add(txType, dqcoeff.AsSpan(), dst, stride, eob); Idct.Iht16x16Add(txType, dqcoeff.AsSpan(), dst, stride, eob);
break; break;
case TxSize.Tx32X32: case TxSize.Tx32x32:
Idct.Idct32X32Add(dqcoeff.AsSpan(), dst, stride, eob); Idct.Idct32x32Add(dqcoeff.AsSpan(), dst, stride, eob);
break; break;
default: default:
Debug.Assert(false, "Invalid transform size"); Debug.Assert(false, "Invalid transform size");
@@ -261,11 +261,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
else else
{ {
if (txType == TxType.DctDct && txSize <= TxSize.Tx16X16 && eob <= 10) if (txType == TxType.DctDct && txSize <= TxSize.Tx16x16 && eob <= 10)
{ {
dqcoeff.AsSpan().Slice(0, 4 * (4 << (int)txSize)).Clear(); dqcoeff.AsSpan().Slice(0, 4 * (4 << (int)txSize)).Clear();
} }
else if (txSize == TxSize.Tx32X32 && eob <= 34) else if (txSize == TxSize.Tx32x32 && eob <= 34)
{ {
dqcoeff.AsSpan().Slice(0, 256).Clear(); dqcoeff.AsSpan().Slice(0, 256).Clear();
} }
@@ -291,7 +291,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
byte* dst = &pd.Dst.Buf.ToPointer()[dstOffset]; byte* dst = &pd.Dst.Buf.ToPointer()[dstOffset];
Span<byte> dstSpan = pd.Dst.Buf.AsSpan().Slice(dstOffset); Span<byte> dstSpan = pd.Dst.Buf.AsSpan().Slice(dstOffset);
if (mi.SbType < BlockSize.Block8X8) if (mi.SbType < BlockSize.Block8x8)
{ {
if (plane == 0) if (plane == 0)
{ {
@@ -769,21 +769,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
isScaled ? new Ptr<ScaleFactors>(ref sf) : Ptr<ScaleFactors>.Null); isScaled ? new Ptr<ScaleFactors>(ref sf) : Ptr<ScaleFactors>.Null);
xd.BlockRefs[refr] = new Ptr<RefBuffer>(ref refBuf); xd.BlockRefs[refr] = new Ptr<RefBuffer>(ref refBuf);
if (sbType < BlockSize.Block8X8) if (sbType < BlockSize.Block8x8)
{ {
for (plane = 0; plane < Constants.MaxMbPlane; ++plane) for (plane = 0; plane < Constants.MaxMbPlane; ++plane)
{ {
ref MacroBlockDPlane pd = ref xd.Plane[plane]; ref MacroBlockDPlane pd = ref xd.Plane[plane];
ref Buf2D dstBuf = ref pd.Dst; ref Buf2D dstBuf = ref pd.Dst;
int num4X4W = pd.N4W; int num4x4W = pd.N4W;
int num4X4H = pd.N4H; int num4x4H = pd.N4H;
int n4Wx4 = 4 * num4X4W; int n4Wx4 = 4 * num4x4W;
int n4Hx4 = 4 * num4X4H; int n4Hx4 = 4 * num4x4H;
ref Buf2D preBuf = ref pd.Pre[refr]; ref Buf2D preBuf = ref pd.Pre[refr];
int i = 0; int i = 0;
for (int y = 0; y < num4X4H; ++y) for (int y = 0; y < num4x4H; ++y)
{ {
for (int x = 0; x < num4X4W; ++x) for (int x = 0; x < num4x4W; ++x)
{ {
Mv mv = ReconInter.AverageSplitMvs(ref pd, ref mi, refr, i++); Mv mv = ReconInter.AverageSplitMvs(ref pd, ref mi, refr, i++);
DecBuildInterPredictors( DecBuildInterPredictors(
@@ -816,10 +816,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
ref MacroBlockDPlane pd = ref xd.Plane[plane]; ref MacroBlockDPlane pd = ref xd.Plane[plane];
ref Buf2D dstBuf = ref pd.Dst; ref Buf2D dstBuf = ref pd.Dst;
int num4X4W = pd.N4W; int num4x4W = pd.N4W;
int num4X4H = pd.N4H; int num4x4H = pd.N4H;
int n4Wx4 = 4 * num4X4W; int n4Wx4 = 4 * num4x4W;
int n4Hx4 = 4 * num4X4H; int n4Hx4 = 4 * num4x4H;
ref Buf2D preBuf = ref pd.Pre[refr]; ref Buf2D preBuf = ref pd.Pre[refr];
DecBuildInterPredictors( DecBuildInterPredictors(
ref xd, ref xd,
@@ -905,7 +905,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
int bwl, int bwl,
int bhl) int bhl)
{ {
bool less8X8 = bsize < BlockSize.Block8X8; bool less8x8 = bsize < BlockSize.Block8x8;
int bw = 1 << (bwl - 1); int bw = 1 << (bwl - 1);
int bh = 1 << (bhl - 1); int bh = 1 << (bhl - 1);
int xMis = Math.Min(bw, cm.MiCols - miCol); int xMis = Math.Min(bw, cm.MiCols - miCol);
@@ -915,7 +915,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
ref ModeInfo mi = ref SetOffsets(ref cm, ref xd, bsize, miRow, miCol, bw, bh, xMis, yMis, bwl, bhl); ref ModeInfo mi = ref SetOffsets(ref cm, ref xd, bsize, miRow, miCol, bw, bh, xMis, yMis, bwl, bhl);
if (bsize >= BlockSize.Block8X8 && (cm.SubsamplingX != 0 || cm.SubsamplingY != 0)) if (bsize >= BlockSize.Block8x8 && (cm.SubsamplingX != 0 || cm.SubsamplingY != 0))
{ {
BlockSize uvSubsize = Luts.SsSizeLookup[(int)bsize][cm.SubsamplingX][cm.SubsamplingY]; BlockSize uvSubsize = Luts.SsSizeLookup[(int)bsize][cm.SubsamplingX][cm.SubsamplingY];
if (uvSubsize == BlockSize.BlockInvalid) if (uvSubsize == BlockSize.BlockInvalid)
@@ -938,14 +938,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
ref MacroBlockDPlane pd = ref xd.Plane[plane]; ref MacroBlockDPlane pd = ref xd.Plane[plane];
TxSize txSize = plane != 0 ? mi.GetUvTxSize(ref pd) : mi.TxSize; TxSize txSize = plane != 0 ? mi.GetUvTxSize(ref pd) : mi.TxSize;
int num4X4W = pd.N4W; int num4x4W = pd.N4W;
int num4X4H = pd.N4H; int num4x4H = pd.N4H;
int step = 1 << (int)txSize; int step = 1 << (int)txSize;
int row, col; int row, col;
int maxBlocksWide = int maxBlocksWide =
num4X4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX)); num4x4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX));
int maxBlocksHigh = int maxBlocksHigh =
num4X4H + (xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY)); num4x4H + (xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY));
xd.MaxBlocksWide = (uint)(xd.MbToRightEdge >= 0 ? 0 : maxBlocksWide); xd.MaxBlocksWide = (uint)(xd.MbToRightEdge >= 0 ? 0 : maxBlocksWide);
xd.MaxBlocksHigh = (uint)(xd.MbToBottomEdge >= 0 ? 0 : maxBlocksHigh); xd.MaxBlocksHigh = (uint)(xd.MbToBottomEdge >= 0 ? 0 : maxBlocksHigh);
@@ -974,13 +974,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
ref MacroBlockDPlane pd = ref xd.Plane[plane]; ref MacroBlockDPlane pd = ref xd.Plane[plane];
TxSize txSize = plane != 0 ? mi.GetUvTxSize(ref pd) : mi.TxSize; TxSize txSize = plane != 0 ? mi.GetUvTxSize(ref pd) : mi.TxSize;
int num4X4W = pd.N4W; int num4x4W = pd.N4W;
int num4X4H = pd.N4H; int num4x4H = pd.N4H;
int step = 1 << (int)txSize; int step = 1 << (int)txSize;
int row, col; int row, col;
int maxBlocksWide = int maxBlocksWide =
num4X4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX)); num4x4W + (xd.MbToRightEdge >= 0 ? 0 : xd.MbToRightEdge >> (5 + pd.SubsamplingX));
int maxBlocksHigh = num4X4H + int maxBlocksHigh = num4x4H +
(xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY)); (xd.MbToBottomEdge >= 0 ? 0 : xd.MbToBottomEdge >> (5 + pd.SubsamplingY));
xd.MaxBlocksWide = (uint)(xd.MbToRightEdge >= 0 ? 0 : maxBlocksWide); xd.MaxBlocksWide = (uint)(xd.MbToRightEdge >= 0 ? 0 : maxBlocksWide);
@@ -995,7 +995,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
if (!less8X8 && eobtotal == 0) if (!less8x8 && eobtotal == 0)
{ {
mi.Skip = 1; // Skip loopfilter mi.Skip = 1; // Skip loopfilter
} }
@@ -1072,11 +1072,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
int miRow, int miRow,
int miCol, int miCol,
BlockSize bsize, BlockSize bsize,
int n4X4L2) int n4x4L2)
{ {
int n8X8L2 = n4X4L2 - 1; int n8x8L2 = n4x4L2 - 1;
int num8X8Wh = 1 << n8X8L2; int num8x8Wh = 1 << n8x8L2;
int hbs = num8X8Wh >> 1; int hbs = num8x8Wh >> 1;
PartitionType partition; PartitionType partition;
BlockSize subsize; BlockSize subsize;
bool hasRows = miRow + hbs < cm.MiRows; bool hasRows = miRow + hbs < cm.MiRows;
@@ -1088,7 +1088,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return; return;
} }
partition = ReadPartition(ref twd, miRow, miCol, hasRows ? 1 : 0, hasCols ? 1 : 0, n8X8L2); partition = ReadPartition(ref twd, miRow, miCol, hasRows ? 1 : 0, hasCols ? 1 : 0, n8x8L2);
subsize = Luts.SubsizeLookup[(int)partition][(int)bsize]; subsize = Luts.SubsizeLookup[(int)partition][(int)bsize];
if (hbs == 0) if (hbs == 0)
{ {
@@ -1102,29 +1102,29 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
switch (partition) switch (partition)
{ {
case PartitionType.PartitionNone: case PartitionType.PartitionNone:
DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4X4L2, n4X4L2); DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4x4L2, n4x4L2);
break; break;
case PartitionType.PartitionHorz: case PartitionType.PartitionHorz:
DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4X4L2, n8X8L2); DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n4x4L2, n8x8L2);
if (hasRows) if (hasRows)
{ {
DecodeBlock(ref twd, ref cm, miRow + hbs, miCol, subsize, n4X4L2, n8X8L2); DecodeBlock(ref twd, ref cm, miRow + hbs, miCol, subsize, n4x4L2, n8x8L2);
} }
break; break;
case PartitionType.PartitionVert: case PartitionType.PartitionVert:
DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n8X8L2, n4X4L2); DecodeBlock(ref twd, ref cm, miRow, miCol, subsize, n8x8L2, n4x4L2);
if (hasCols) if (hasCols)
{ {
DecodeBlock(ref twd, ref cm, miRow, miCol + hbs, subsize, n8X8L2, n4X4L2); DecodeBlock(ref twd, ref cm, miRow, miCol + hbs, subsize, n8x8L2, n4x4L2);
} }
break; break;
case PartitionType.PartitionSplit: case PartitionType.PartitionSplit:
DecodePartition(ref twd, ref cm, miRow, miCol, subsize, n8X8L2); DecodePartition(ref twd, ref cm, miRow, miCol, subsize, n8x8L2);
DecodePartition(ref twd, ref cm, miRow, miCol + hbs, subsize, n8X8L2); DecodePartition(ref twd, ref cm, miRow, miCol + hbs, subsize, n8x8L2);
DecodePartition(ref twd, ref cm, miRow + hbs, miCol, subsize, n8X8L2); DecodePartition(ref twd, ref cm, miRow + hbs, miCol, subsize, n8x8L2);
DecodePartition(ref twd, ref cm, miRow + hbs, miCol + hbs, subsize, n8X8L2); DecodePartition(ref twd, ref cm, miRow + hbs, miCol + hbs, subsize, n8x8L2);
break; break;
default: default:
Debug.Assert(false, "Invalid partition type"); Debug.Assert(false, "Invalid partition type");
@@ -1133,10 +1133,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
// Update partition context // Update partition context
if (bsize >= BlockSize.Block8X8 && if (bsize >= BlockSize.Block8x8 &&
(bsize == BlockSize.Block8X8 || partition != PartitionType.PartitionSplit)) (bsize == BlockSize.Block8x8 || partition != PartitionType.PartitionSplit))
{ {
DecUpdatePartitionContext(ref twd, miRow, miCol, subsize, num8X8Wh); DecUpdatePartitionContext(ref twd, miRow, miCol, subsize, num8x8Wh);
} }
} }
@@ -1186,7 +1186,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
private static void ReadCoefProbs(ref Vp9EntropyProbs fc, TxMode txMode, ref Reader r) private static void ReadCoefProbs(ref Vp9EntropyProbs fc, TxMode txMode, ref Reader r)
{ {
int maxTxSize = (int)Luts.TxModeToBiggestTxSize[(int)txMode]; int maxTxSize = (int)Luts.TxModeToBiggestTxSize[(int)txMode];
for (int txSize = (int)TxSize.Tx4X4; txSize <= maxTxSize; ++txSize) for (int txSize = (int)TxSize.Tx4x4; txSize <= maxTxSize; ++txSize)
{ {
ReadCoefProbsCommon(ref fc.CoefProbs[txSize], ref r, txSize); ReadCoefProbsCommon(ref fc.CoefProbs[txSize], ref r, txSize);
} }
@@ -1238,16 +1238,16 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
xd.Bd = (int)cm.BitDepth; xd.Bd = (int)cm.BitDepth;
} }
private static readonly byte[] _literalToFilter = private static readonly byte[] LiteralToFilter =
[ {
Constants.EightTapSmooth, Constants.EightTap, Constants.EightTapSharp, Constants.Bilinear Constants.EightTapSmooth, Constants.EightTap, Constants.EightTapSharp, Constants.Bilinear
]; };
private static byte ReadInterpFilter(ref ReadBitBuffer rb) private static byte ReadInterpFilter(ref ReadBitBuffer rb)
{ {
return rb.ReadBit() != 0 return rb.ReadBit() != 0
? (byte)Constants.Switchable ? (byte)Constants.Switchable
: _literalToFilter[rb.ReadLiteral(2)]; : LiteralToFilter[rb.ReadLiteral(2)];
} }
private static void SetupRenderSize(ref Vp9Common cm, ref ReadBitBuffer rb) private static void SetupRenderSize(ref Vp9Common cm, ref ReadBitBuffer rb)
@@ -1519,7 +1519,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
tileData.Xd.LeftSegContext = new Array8<sbyte>(); tileData.Xd.LeftSegContext = new Array8<sbyte>();
for (miCol = tile.MiColStart; miCol < tile.MiColEnd; miCol += Constants.MiBlockSize) for (miCol = tile.MiColStart; miCol < tile.MiColEnd; miCol += Constants.MiBlockSize)
{ {
DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64X64, 4); DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64x64, 4);
} }
cm.Mb.Corrupted |= tileData.Xd.Corrupted; cm.Mb.Corrupted |= tileData.Xd.Corrupted;
@@ -1563,7 +1563,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
tileData.Xd.LeftSegContext = new Array8<sbyte>(); tileData.Xd.LeftSegContext = new Array8<sbyte>();
for (int miCol = tile.MiColStart; miCol < tile.MiColEnd; miCol += Constants.MiBlockSize) for (int miCol = tile.MiColStart; miCol < tile.MiColEnd; miCol += Constants.MiBlockSize)
{ {
DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64X64, 4); DecodePartition(ref tileData, ref cm, miRow, miCol, BlockSize.Block64x64, 4);
} }
} }
@@ -1990,7 +1990,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
cm.Error.InternalError(CodecErr.MemError, "Failed to allocate bool decoder 0"); cm.Error.InternalError(CodecErr.MemError, "Failed to allocate bool decoder 0");
} }
cm.TxMode = xd.Lossless ? TxMode.Only4X4 : r.ReadTxMode(); cm.TxMode = xd.Lossless ? TxMode.Only4x4 : r.ReadTxMode();
if (cm.TxMode == TxMode.TxModeSelect) if (cm.TxMode == TxMode.TxModeSelect)
{ {
ReadTxModeProbs(ref fc, ref r); ReadTxModeProbs(ref fc, ref r);

View File

@@ -59,9 +59,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
switch (maxTxSize) switch (maxTxSize)
{ {
case TxSize.Tx8X8: return fc.Tx8x8Prob[ctx].AsSpan(); case TxSize.Tx8x8: return fc.Tx8x8Prob[ctx].AsSpan();
case TxSize.Tx16X16: return fc.Tx16x16Prob[ctx].AsSpan(); case TxSize.Tx16x16: return fc.Tx16x16Prob[ctx].AsSpan();
case TxSize.Tx32X32: return fc.Tx32x32Prob[ctx].AsSpan(); case TxSize.Tx32x32: return fc.Tx32x32Prob[ctx].AsSpan();
default: default:
Debug.Assert(false, "Invalid maxTxSize."); Debug.Assert(false, "Invalid maxTxSize.");
return ReadOnlySpan<byte>.Empty; return ReadOnlySpan<byte>.Empty;
@@ -72,9 +72,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
switch (maxTxSize) switch (maxTxSize)
{ {
case TxSize.Tx8X8: return counts.Tx8x8[ctx].AsSpan(); case TxSize.Tx8x8: return counts.Tx8x8[ctx].AsSpan();
case TxSize.Tx16X16: return counts.Tx16x16[ctx].AsSpan(); case TxSize.Tx16x16: return counts.Tx16x16[ctx].AsSpan();
case TxSize.Tx32X32: return counts.Tx32x32[ctx].AsSpan(); case TxSize.Tx32x32: return counts.Tx32x32[ctx].AsSpan();
default: default:
Debug.Assert(false, "Invalid maxTxSize."); Debug.Assert(false, "Invalid maxTxSize.");
return Span<uint>.Empty; return Span<uint>.Empty;
@@ -86,10 +86,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
int ctx = xd.GetTxSizeContext(); int ctx = xd.GetTxSizeContext();
ReadOnlySpan<byte> txProbs = GetTxProbs(ref cm.Fc.Value, maxTxSize, ctx); ReadOnlySpan<byte> txProbs = GetTxProbs(ref cm.Fc.Value, maxTxSize, ctx);
TxSize txSize = (TxSize)r.Read(txProbs[0]); TxSize txSize = (TxSize)r.Read(txProbs[0]);
if (txSize != TxSize.Tx4X4 && maxTxSize >= TxSize.Tx16X16) if (txSize != TxSize.Tx4x4 && maxTxSize >= TxSize.Tx16x16)
{ {
txSize += r.Read(txProbs[1]); txSize += r.Read(txProbs[1]);
if (txSize != TxSize.Tx8X8 && maxTxSize >= TxSize.Tx32X32) if (txSize != TxSize.Tx8x8 && maxTxSize >= TxSize.Tx32x32)
{ {
txSize += r.Read(txProbs[2]); txSize += r.Read(txProbs[2]);
} }
@@ -108,7 +108,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
TxMode txMode = cm.TxMode; TxMode txMode = cm.TxMode;
BlockSize bsize = xd.Mi[0].Value.SbType; BlockSize bsize = xd.Mi[0].Value.SbType;
TxSize maxTxSize = Luts.MaxTxSizeLookup[(int)bsize]; TxSize maxTxSize = Luts.MaxTxSizeLookup[(int)bsize];
if (allowSelect && txMode == TxMode.TxModeSelect && bsize >= BlockSize.Block8X8) if (allowSelect && txMode == TxMode.TxModeSelect && bsize >= BlockSize.Block8x8)
{ {
return ReadSelectedTxSize(ref cm, ref xd, maxTxSize, ref r); return ReadSelectedTxSize(ref cm, ref xd, maxTxSize, ref r);
} }
@@ -276,7 +276,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
// Fractional part // Fractional part
fr = r.ReadTree(Luts.MvFpTree, class0 ? fc.Class0Fp[mvcomp][d].AsSpan() : fc.Fp[mvcomp].AsSpan()); fr = r.ReadTree(Luts.MvFPTree, class0 ? fc.Class0Fp[mvcomp][d].AsSpan() : fc.Fp[mvcomp].AsSpan());
// High precision part (if hp is not used, the default value of the hp is 1) // High precision part (if hp is not used, the default value of the hp is 1)
hp = usehp ? r.Read(class0 ? fc.Class0Hp[mvcomp] : fc.Hp[mvcomp]) : 1; hp = usehp ? r.Read(class0 ? fc.Class0Hp[mvcomp] : fc.Hp[mvcomp]) : 1;
@@ -415,7 +415,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
switch (bsize) switch (bsize)
{ {
case BlockSize.Block4X4: case BlockSize.Block4x4:
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
mi.Bmi[i].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[i].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0);
@@ -423,11 +423,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
mi.Mode = mi.Bmi[3].Mode; mi.Mode = mi.Bmi[3].Mode;
break; break;
case BlockSize.Block4X8: case BlockSize.Block4x8:
mi.Bmi[0].Mode = mi.Bmi[2].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[0].Mode = mi.Bmi[2].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0);
mi.Bmi[1].Mode = mi.Bmi[3].Mode = mi.Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[1].Mode = mi.Bmi[3].Mode = mi.Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0);
break; break;
case BlockSize.Block8X4: case BlockSize.Block8x4:
mi.Bmi[0].Mode = mi.Bmi[1].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[0].Mode = mi.Bmi[1].Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0);
mi.Bmi[2].Mode = mi.Bmi[3].Mode = mi.Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0); mi.Bmi[2].Mode = mi.Bmi[3].Mode = mi.Mode = ReadIntraModeY(ref cm, ref xd, ref r, 0);
break; break;
@@ -595,7 +595,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
int miRow, int miRow,
int miCol, int miCol,
int block, int block,
int isSub8X8) int isSub8x8)
{ {
ref Array4<sbyte> refSignBias = ref cm.RefFrameSignBias; ref Array4<sbyte> refSignBias = ref cm.RefFrameSignBias;
int i, refmvCount = 0; int i, refmvCount = 0;
@@ -612,7 +612,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
mvRefList.Slice(0, Constants.MaxMvRefCandidates).Fill(new Mv()); mvRefList.Slice(0, Constants.MaxMvRefCandidates).Fill(new Mv());
i = 0; i = 0;
if (isSub8X8 != 0) if (isSub8x8 != 0)
{ {
// If the size < 8x8 we get the mv from the bmi substructure for the // If the size < 8x8 we get the mv from the bmi substructure for the
// nearest two blocks. // nearest two blocks.
@@ -770,7 +770,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return refmvCount; return refmvCount;
} }
private static void AppendSub8X8ForIdx( private static void AppendSub8x8ForIdx(
ref Vp9Common cm, ref Vp9Common cm,
ref MacroBlockD xd, ref MacroBlockD xd,
Span<Position> mvRefSearch, Span<Position> mvRefSearch,
@@ -779,7 +779,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
int refr, int refr,
int miRow, int miRow,
int miCol, int miCol,
ref Mv bestSub8X8) ref Mv bestSub8x8)
{ {
Span<Mv> mvList = stackalloc Mv[Constants.MaxMvRefCandidates]; Span<Mv> mvList = stackalloc Mv[Constants.MaxMvRefCandidates];
ref ModeInfo mi = ref xd.Mi[0].Value; ref ModeInfo mi = ref xd.Mi[0].Value;
@@ -794,22 +794,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
switch (block) switch (block)
{ {
case 0: case 0:
bestSub8X8 = mvList[refmvCount - 1]; bestSub8x8 = mvList[refmvCount - 1];
break; break;
case 1: case 1:
case 2: case 2:
if (bMode == PredictionMode.NearestMv) if (bMode == PredictionMode.NearestMv)
{ {
bestSub8X8 = bmi[0].Mv[refr]; bestSub8x8 = bmi[0].Mv[refr];
} }
else else
{ {
bestSub8X8 = new Mv(); bestSub8x8 = new Mv();
for (int n = 0; n < refmvCount; ++n) for (int n = 0; n < refmvCount; ++n)
{ {
if (Unsafe.As<Mv, int>(ref bmi[0].Mv[refr]) != Unsafe.As<Mv, int>(ref mvList[n])) if (Unsafe.As<Mv, int>(ref bmi[0].Mv[refr]) != Unsafe.As<Mv, int>(ref mvList[n]))
{ {
bestSub8X8 = mvList[n]; bestSub8x8 = mvList[n];
break; break;
} }
} }
@@ -819,7 +819,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
case 3: case 3:
if (bMode == PredictionMode.NearestMv) if (bMode == PredictionMode.NearestMv)
{ {
bestSub8X8 = bmi[2].Mv[refr]; bestSub8x8 = bmi[2].Mv[refr];
} }
else else
{ {
@@ -828,12 +828,12 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
candidates[1] = bmi[0].Mv[refr]; candidates[1] = bmi[0].Mv[refr];
candidates[2] = mvList[0]; candidates[2] = mvList[0];
candidates[3] = mvList[1]; candidates[3] = mvList[1];
bestSub8X8 = new Mv(); bestSub8x8 = new Mv();
for (int n = 0; n < 2 + Constants.MaxMvRefCandidates; ++n) for (int n = 0; n < 2 + Constants.MaxMvRefCandidates; ++n)
{ {
if (Unsafe.As<Mv, int>(ref bmi[2].Mv[refr]) != Unsafe.As<Mv, int>(ref candidates[n])) if (Unsafe.As<Mv, int>(ref bmi[2].Mv[refr]) != Unsafe.As<Mv, int>(ref candidates[n]))
{ {
bestSub8X8 = candidates[n]; bestSub8x8 = candidates[n];
break; break;
} }
} }
@@ -889,7 +889,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
if (cm.Seg.IsSegFeatureActive(mi.SegmentId, SegLvlFeatures.Skip) != 0) if (cm.Seg.IsSegFeatureActive(mi.SegmentId, SegLvlFeatures.Skip) != 0)
{ {
mi.Mode = PredictionMode.ZeroMv; mi.Mode = PredictionMode.ZeroMv;
if (bsize < BlockSize.Block8X8) if (bsize < BlockSize.Block8x8)
{ {
xd.ErrorInfo.Value.InternalError(CodecErr.UnsupBitstream, xd.ErrorInfo.Value.InternalError(CodecErr.UnsupBitstream,
"Invalid usage of segement feature on small blocks"); "Invalid usage of segement feature on small blocks");
@@ -898,7 +898,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
else else
{ {
if (bsize >= BlockSize.Block8X8) if (bsize >= BlockSize.Block8x8)
{ {
mi.Mode = ReadInterMode(ref cm, ref xd, ref r, interModeCtx); mi.Mode = ReadInterMode(ref cm, ref xd, ref r, interModeCtx);
} }
@@ -932,20 +932,20 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
? ReadSwitchableInterpFilter(ref cm, ref xd, ref r) ? ReadSwitchableInterpFilter(ref cm, ref xd, ref r)
: cm.InterpFilter; : cm.InterpFilter;
if (bsize < BlockSize.Block8X8) if (bsize < BlockSize.Block8x8)
{ {
int num4X4W = 1 << xd.BmodeBlocksWl; int num4x4W = 1 << xd.BmodeBlocksWl;
int num4X4H = 1 << xd.BmodeBlocksHl; int num4x4H = 1 << xd.BmodeBlocksHl;
int idx, idy; int idx, idy;
PredictionMode bMode = 0; PredictionMode bMode = 0;
Array2<Mv> bestSub8X8 = new(); Array2<Mv> bestSub8x8 = new();
const uint InvalidMv = 0x80008000; const uint invalidMv = 0x80008000;
// Initialize the 2nd element as even though it won't be used meaningfully // Initialize the 2nd element as even though it won't be used meaningfully
// if isCompound is false. // if isCompound is false.
Unsafe.As<Mv, uint>(ref bestSub8X8[1]) = InvalidMv; Unsafe.As<Mv, uint>(ref bestSub8x8[1]) = invalidMv;
for (idy = 0; idy < 2; idy += num4X4H) for (idy = 0; idy < 2; idy += num4x4H)
{ {
for (idx = 0; idx < 2; idx += num4X4W) for (idx = 0; idx < 2; idx += num4x4W)
{ {
int j = (idy * 2) + idx; int j = (idy * 2) + idx;
bMode = ReadInterMode(ref cm, ref xd, ref r, interModeCtx); bMode = ReadInterMode(ref cm, ref xd, ref r, interModeCtx);
@@ -954,24 +954,24 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
for (refr = 0; refr < 1 + isCompound; ++refr) for (refr = 0; refr < 1 + isCompound; ++refr)
{ {
AppendSub8X8ForIdx(ref cm, ref xd, mvRefSearch, bMode, j, refr, miRow, miCol, AppendSub8x8ForIdx(ref cm, ref xd, mvRefSearch, bMode, j, refr, miRow, miCol,
ref bestSub8X8[refr]); ref bestSub8x8[refr]);
} }
} }
if (!Assign(ref cm, ref xd, bMode, ref mi.Bmi[j].Mv, ref bestRefMvs, ref bestSub8X8, if (!Assign(ref cm, ref xd, bMode, ref mi.Bmi[j].Mv, ref bestRefMvs, ref bestSub8x8,
isCompound, allowHp, ref r)) isCompound, allowHp, ref r))
{ {
xd.Corrupted |= true; xd.Corrupted |= true;
break; break;
} }
if (num4X4H == 2) if (num4x4H == 2)
{ {
mi.Bmi[j + 2] = mi.Bmi[j]; mi.Bmi[j + 2] = mi.Bmi[j];
} }
if (num4X4W == 2) if (num4x4W == 2)
{ {
mi.Bmi[j + 1] = mi.Bmi[j]; mi.Bmi[j + 1] = mi.Bmi[j];
} }
@@ -1084,7 +1084,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
switch (bsize) switch (bsize)
{ {
case BlockSize.Block4X4: case BlockSize.Block4x4:
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
mi.Value.Bmi[i].Mode = mi.Value.Bmi[i].Mode =
@@ -1093,13 +1093,13 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
mi.Value.Mode = mi.Value.Bmi[3].Mode; mi.Value.Mode = mi.Value.Bmi[3].Mode;
break; break;
case BlockSize.Block4X8: case BlockSize.Block4x8:
mi.Value.Bmi[0].Mode = mi.Value.Bmi[2].Mode = mi.Value.Bmi[0].Mode = mi.Value.Bmi[2].Mode =
ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 0)); ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 0));
mi.Value.Bmi[1].Mode = mi.Value.Bmi[3].Mode = mi.Value.Mode = mi.Value.Bmi[1].Mode = mi.Value.Bmi[3].Mode = mi.Value.Mode =
ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 1)); ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 1));
break; break;
case BlockSize.Block8X4: case BlockSize.Block8x4:
mi.Value.Bmi[0].Mode = mi.Value.Bmi[1].Mode = mi.Value.Bmi[0].Mode = mi.Value.Bmi[1].Mode =
ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 0)); ReadIntraMode(ref r, GetYModeProbs(ref cm.Fc.Value, mi, aboveMi, leftMi, 0));
mi.Value.Bmi[2].Mode = mi.Value.Bmi[3].Mode = mi.Value.Mode = mi.Value.Bmi[2].Mode = mi.Value.Bmi[3].Mode = mi.Value.Mode =

View File

@@ -17,10 +17,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return new Surface(width, height); return new Surface(width, height);
} }
private static ReadOnlySpan<byte> LiteralToFilter => private static ReadOnlySpan<byte> LiteralToFilter => new byte[]
[ {
Constants.EightTapSmooth, Constants.EightTap, Constants.EightTapSharp, Constants.Bilinear Constants.EightTapSmooth, Constants.EightTap, Constants.EightTapSharp, Constants.Bilinear
]; };
public unsafe bool Decode( public unsafe bool Decode(
ref Vp9PictureInfo pictureInfo, ref Vp9PictureInfo pictureInfo,

View File

@@ -17,10 +17,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
private static int GetCoefContext(ReadOnlySpan<short> neighbors, ReadOnlySpan<byte> tokenCache, int c) private static int GetCoefContext(ReadOnlySpan<short> neighbors, ReadOnlySpan<byte> tokenCache, int c)
{ {
const int MaxNeighbors = 2; const int maxNeighbors = 2;
return (1 + tokenCache[neighbors[(MaxNeighbors * c) + 0]] + return (1 + tokenCache[neighbors[(maxNeighbors * c) + 0]] +
tokenCache[neighbors[(MaxNeighbors * c) + 1]]) >> 1; tokenCache[neighbors[(maxNeighbors * c) + 1]]) >> 1;
} }
private static int DecodeCoefs( private static int DecodeCoefs(
@@ -42,7 +42,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
ref Array6<Array6<Array3<byte>>> coefProbs = ref fc.CoefProbs[(int)txSize][(int)type][refr]; ref Array6<Array6<Array3<byte>>> coefProbs = ref fc.CoefProbs[(int)txSize][(int)type][refr];
Span<byte> tokenCache = stackalloc byte[32 * 32]; Span<byte> tokenCache = stackalloc byte[32 * 32];
ReadOnlySpan<byte> bandTranslate = Luts.GetBandTranslate(txSize); ReadOnlySpan<byte> bandTranslate = Luts.GetBandTranslate(txSize);
int dqShift = txSize == TxSize.Tx32X32 ? 1 : 0; int dqShift = txSize == TxSize.Tx32x32 ? 1 : 0;
int v; int v;
short dqv = dq[0]; short dqv = dq[0];
ReadOnlySpan<byte> cat6Prob = xd.Bd == 12 ReadOnlySpan<byte> cat6Prob = xd.Bd == 12
@@ -242,7 +242,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
switch (txSize) switch (txSize)
{ {
case TxSize.Tx4X4: case TxSize.Tx4x4:
ctx = a[0] != 0 ? 1 : 0; ctx = a[0] != 0 ? 1 : 0;
ctx += l[0] != 0 ? 1 : 0; ctx += l[0] != 0 ? 1 : 0;
eob = DecodeCoefs( eob = DecodeCoefs(
@@ -257,8 +257,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
ref r); ref r);
a[0] = l[0] = (sbyte)(eob > 0 ? 1 : 0); a[0] = l[0] = (sbyte)(eob > 0 ? 1 : 0);
break; break;
case TxSize.Tx8X8: case TxSize.Tx8x8:
GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx8X8); GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx8x8);
ctx = MemoryMarshal.Cast<sbyte, ushort>(a)[0] != 0 ? 1 : 0; ctx = MemoryMarshal.Cast<sbyte, ushort>(a)[0] != 0 ? 1 : 0;
ctx += MemoryMarshal.Cast<sbyte, ushort>(l)[0] != 0 ? 1 : 0; ctx += MemoryMarshal.Cast<sbyte, ushort>(l)[0] != 0 ? 1 : 0;
eob = DecodeCoefs( eob = DecodeCoefs(
@@ -274,8 +274,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
MemoryMarshal.Cast<sbyte, ushort>(a)[0] = (ushort)((eob > 0 ? 0x0101 : 0) >> ctxShiftA); MemoryMarshal.Cast<sbyte, ushort>(a)[0] = (ushort)((eob > 0 ? 0x0101 : 0) >> ctxShiftA);
MemoryMarshal.Cast<sbyte, ushort>(l)[0] = (ushort)((eob > 0 ? 0x0101 : 0) >> ctxShiftL); MemoryMarshal.Cast<sbyte, ushort>(l)[0] = (ushort)((eob > 0 ? 0x0101 : 0) >> ctxShiftL);
break; break;
case TxSize.Tx16X16: case TxSize.Tx16x16:
GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx16X16); GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx16x16);
ctx = MemoryMarshal.Cast<sbyte, uint>(a)[0] != 0 ? 1 : 0; ctx = MemoryMarshal.Cast<sbyte, uint>(a)[0] != 0 ? 1 : 0;
ctx += MemoryMarshal.Cast<sbyte, uint>(l)[0] != 0 ? 1 : 0; ctx += MemoryMarshal.Cast<sbyte, uint>(l)[0] != 0 ? 1 : 0;
eob = DecodeCoefs( eob = DecodeCoefs(
@@ -291,8 +291,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
MemoryMarshal.Cast<sbyte, uint>(a)[0] = (uint)((eob > 0 ? 0x01010101 : 0) >> ctxShiftA); MemoryMarshal.Cast<sbyte, uint>(a)[0] = (uint)((eob > 0 ? 0x01010101 : 0) >> ctxShiftA);
MemoryMarshal.Cast<sbyte, uint>(l)[0] = (uint)((eob > 0 ? 0x01010101 : 0) >> ctxShiftL); MemoryMarshal.Cast<sbyte, uint>(l)[0] = (uint)((eob > 0 ? 0x01010101 : 0) >> ctxShiftL);
break; break;
case TxSize.Tx32X32: case TxSize.Tx32x32:
GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx32X32); GetCtxShift(ref xd, ref ctxShiftA, ref ctxShiftL, x, y, 1 << (int)TxSize.Tx32x32);
// NOTE: Casting to ulong here is safe because the default memory // NOTE: Casting to ulong here is safe because the default memory
// alignment is at least 8 bytes and the Tx32x32 is aligned on 8 byte // alignment is at least 8 bytes and the Tx32x32 is aligned on 8 byte
// boundaries. // boundaries.

View File

@@ -34,17 +34,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
return (ushort)((a + b + 1) >> 1); return (ushort)((a + b + 1) >> 1);
} }
public static unsafe void D207Predictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D207Predictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
D207Predictor(dst, stride, 8, above, left); D207Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D207Predictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D207Predictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
D207Predictor(dst, stride, 16, above, left); D207Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D207Predictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D207Predictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
D207Predictor(dst, stride, 32, above, left); D207Predictor(dst, stride, 32, above, left);
} }
@@ -85,17 +85,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void D63Predictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D63Predictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
D63Predictor(dst, stride, 8, above, left); D63Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D63Predictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D63Predictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
D63Predictor(dst, stride, 16, above, left); D63Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D63Predictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D63Predictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
D63Predictor(dst, stride, 32, above, left); D63Predictor(dst, stride, 32, above, left);
} }
@@ -117,17 +117,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void D45Predictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D45Predictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
D45Predictor(dst, stride, 8, above, left); D45Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D45Predictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D45Predictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
D45Predictor(dst, stride, 16, above, left); D45Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D45Predictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D45Predictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
D45Predictor(dst, stride, 32, above, left); D45Predictor(dst, stride, 32, above, left);
} }
@@ -152,17 +152,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void D117Predictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D117Predictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
D117Predictor(dst, stride, 8, above, left); D117Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D117Predictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D117Predictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
D117Predictor(dst, stride, 16, above, left); D117Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D117Predictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D117Predictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
D117Predictor(dst, stride, 32, above, left); D117Predictor(dst, stride, 32, above, left);
} }
@@ -205,17 +205,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void D135Predictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D135Predictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
D135Predictor(dst, stride, 8, above, left); D135Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D135Predictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D135Predictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
D135Predictor(dst, stride, 16, above, left); D135Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D135Predictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D135Predictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
D135Predictor(dst, stride, 32, above, left); D135Predictor(dst, stride, 32, above, left);
} }
@@ -245,17 +245,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void D153Predictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void D153Predictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
D153Predictor(dst, stride, 8, above, left); D153Predictor(dst, stride, 8, above, left);
} }
public static unsafe void D153Predictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void D153Predictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
D153Predictor(dst, stride, 16, above, left); D153Predictor(dst, stride, 16, above, left);
} }
public static unsafe void D153Predictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void D153Predictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
D153Predictor(dst, stride, 32, above, left); D153Predictor(dst, stride, 32, above, left);
} }
@@ -297,22 +297,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void VPredictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void VPredictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
VPredictor(dst, stride, 4, above, left); VPredictor(dst, stride, 4, above, left);
} }
public static unsafe void VPredictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void VPredictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
VPredictor(dst, stride, 8, above, left); VPredictor(dst, stride, 8, above, left);
} }
public static unsafe void VPredictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void VPredictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
VPredictor(dst, stride, 16, above, left); VPredictor(dst, stride, 16, above, left);
} }
public static unsafe void VPredictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void VPredictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
VPredictor(dst, stride, 32, above, left); VPredictor(dst, stride, 32, above, left);
} }
@@ -326,22 +326,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HPredictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void HPredictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
HPredictor(dst, stride, 4, above, left); HPredictor(dst, stride, 4, above, left);
} }
public static unsafe void HPredictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void HPredictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
HPredictor(dst, stride, 8, above, left); HPredictor(dst, stride, 8, above, left);
} }
public static unsafe void HPredictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void HPredictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
HPredictor(dst, stride, 16, above, left); HPredictor(dst, stride, 16, above, left);
} }
public static unsafe void HPredictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void HPredictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
HPredictor(dst, stride, 32, above, left); HPredictor(dst, stride, 32, above, left);
} }
@@ -355,22 +355,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void TmPredictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void TmPredictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
TmPredictor(dst, stride, 4, above, left); TmPredictor(dst, stride, 4, above, left);
} }
public static unsafe void TmPredictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void TmPredictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
TmPredictor(dst, stride, 8, above, left); TmPredictor(dst, stride, 8, above, left);
} }
public static unsafe void TmPredictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void TmPredictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
TmPredictor(dst, stride, 16, above, left); TmPredictor(dst, stride, 16, above, left);
} }
public static unsafe void TmPredictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void TmPredictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
TmPredictor(dst, stride, 32, above, left); TmPredictor(dst, stride, 32, above, left);
} }
@@ -390,22 +390,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void Dc128Predictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void Dc128Predictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
Dc128Predictor(dst, stride, 4, above, left); Dc128Predictor(dst, stride, 4, above, left);
} }
public static unsafe void Dc128Predictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void Dc128Predictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
Dc128Predictor(dst, stride, 8, above, left); Dc128Predictor(dst, stride, 8, above, left);
} }
public static unsafe void Dc128Predictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void Dc128Predictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
Dc128Predictor(dst, stride, 16, above, left); Dc128Predictor(dst, stride, 16, above, left);
} }
public static unsafe void Dc128Predictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void Dc128Predictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
Dc128Predictor(dst, stride, 32, above, left); Dc128Predictor(dst, stride, 32, above, left);
} }
@@ -419,36 +419,36 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void DcLeftPredictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcLeftPredictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
DcLeftPredictor(dst, stride, 4, above, left); DcLeftPredictor(dst, stride, 4, above, left);
} }
public static unsafe void DcLeftPredictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcLeftPredictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
DcLeftPredictor(dst, stride, 8, above, left); DcLeftPredictor(dst, stride, 8, above, left);
} }
public static unsafe void DcLeftPredictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcLeftPredictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
DcLeftPredictor(dst, stride, 16, above, left); DcLeftPredictor(dst, stride, 16, above, left);
} }
public static unsafe void DcLeftPredictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcLeftPredictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
DcLeftPredictor(dst, stride, 32, above, left); DcLeftPredictor(dst, stride, 32, above, left);
} }
private static unsafe void DcLeftPredictor(byte* dst, int stride, int bs, byte* above, byte* left) private static unsafe void DcLeftPredictor(byte* dst, int stride, int bs, byte* above, byte* left)
{ {
int sum = 0; int expectedDc, sum = 0;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
{ {
sum += left[i]; sum += left[i];
} }
int expectedDc = (sum + (bs >> 1)) / bs; expectedDc = (sum + (bs >> 1)) / bs;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -457,36 +457,36 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void DcTopPredictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcTopPredictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
DcTopPredictor(dst, stride, 4, above, left); DcTopPredictor(dst, stride, 4, above, left);
} }
public static unsafe void DcTopPredictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcTopPredictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
DcTopPredictor(dst, stride, 8, above, left); DcTopPredictor(dst, stride, 8, above, left);
} }
public static unsafe void DcTopPredictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcTopPredictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
DcTopPredictor(dst, stride, 16, above, left); DcTopPredictor(dst, stride, 16, above, left);
} }
public static unsafe void DcTopPredictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcTopPredictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
DcTopPredictor(dst, stride, 32, above, left); DcTopPredictor(dst, stride, 32, above, left);
} }
private static unsafe void DcTopPredictor(byte* dst, int stride, int bs, byte* above, byte* left) private static unsafe void DcTopPredictor(byte* dst, int stride, int bs, byte* above, byte* left)
{ {
int sum = 0; int expectedDc, sum = 0;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
{ {
sum += above[i]; sum += above[i];
} }
int expectedDc = (sum + (bs >> 1)) / bs; expectedDc = (sum + (bs >> 1)) / bs;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -495,29 +495,29 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void DcPredictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcPredictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
DcPredictor(dst, stride, 4, above, left); DcPredictor(dst, stride, 4, above, left);
} }
public static unsafe void DcPredictor8X8(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcPredictor8x8(byte* dst, int stride, byte* above, byte* left)
{ {
DcPredictor(dst, stride, 8, above, left); DcPredictor(dst, stride, 8, above, left);
} }
public static unsafe void DcPredictor16X16(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcPredictor16x16(byte* dst, int stride, byte* above, byte* left)
{ {
DcPredictor(dst, stride, 16, above, left); DcPredictor(dst, stride, 16, above, left);
} }
public static unsafe void DcPredictor32X32(byte* dst, int stride, byte* above, byte* left) public static unsafe void DcPredictor32x32(byte* dst, int stride, byte* above, byte* left)
{ {
DcPredictor(dst, stride, 32, above, left); DcPredictor(dst, stride, 32, above, left);
} }
private static unsafe void DcPredictor(byte* dst, int stride, int bs, byte* above, byte* left) private static unsafe void DcPredictor(byte* dst, int stride, int bs, byte* above, byte* left)
{ {
int sum = 0; int expectedDc, sum = 0;
int count = 2 * bs; int count = 2 * bs;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
@@ -526,7 +526,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
sum += left[i]; sum += left[i];
} }
int expectedDc = (sum + (count >> 1)) / count; expectedDc = (sum + (count >> 1)) / count;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -535,31 +535,31 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HePredictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void HePredictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
byte h = above[-1]; byte h = above[-1];
byte i = left[0]; byte I = left[0];
byte j = left[1]; byte j = left[1];
byte k = left[2]; byte k = left[2];
byte l = left[3]; byte l = left[3];
MemoryUtil.Fill(dst + (stride * 0), Avg3(h, i, j), 4); MemoryUtil.Fill(dst + (stride * 0), Avg3(h, I, j), 4);
MemoryUtil.Fill(dst + (stride * 1), Avg3(i, j, k), 4); MemoryUtil.Fill(dst + (stride * 1), Avg3(I, j, k), 4);
MemoryUtil.Fill(dst + (stride * 2), Avg3(j, k, l), 4); MemoryUtil.Fill(dst + (stride * 2), Avg3(j, k, l), 4);
MemoryUtil.Fill(dst + (stride * 3), Avg3(k, l, l), 4); MemoryUtil.Fill(dst + (stride * 3), Avg3(k, l, l), 4);
} }
public static unsafe void VePredictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void VePredictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
byte h = above[-1]; byte h = above[-1];
byte i = above[0]; byte I = above[0];
byte j = above[1]; byte j = above[1];
byte k = above[2]; byte k = above[2];
byte l = above[3]; byte l = above[3];
byte m = above[4]; byte m = above[4];
dst[0] = Avg3(h, i, j); dst[0] = Avg3(h, I, j);
dst[1] = Avg3(i, j, k); dst[1] = Avg3(I, j, k);
dst[2] = Avg3(j, k, l); dst[2] = Avg3(j, k, l);
dst[3] = Avg3(k, l, m); dst[3] = Avg3(k, l, m);
MemoryUtil.Copy(dst + (stride * 1), dst, 4); MemoryUtil.Copy(dst + (stride * 1), dst, 4);
@@ -567,23 +567,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
MemoryUtil.Copy(dst + (stride * 3), dst, 4); MemoryUtil.Copy(dst + (stride * 3), dst, 4);
} }
public static unsafe void D207Predictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D207Predictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
byte i = left[0]; byte I = left[0];
byte j = left[1]; byte j = left[1];
byte k = left[2]; byte k = left[2];
byte l = left[3]; byte l = left[3];
Dst(dst, stride, 0, 0) = Avg2(i, j); Dst(dst, stride, 0, 0) = Avg2(I, j);
Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k); Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k);
Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l); Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l);
Dst(dst, stride, 1, 0) = Avg3(i, j, k); Dst(dst, stride, 1, 0) = Avg3(I, j, k);
Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l); Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l);
Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l); Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l);
Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) = Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) =
Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l; Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l;
} }
public static unsafe void D63Predictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D63Predictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
byte a = above[0]; byte a = above[0];
byte b = above[1]; byte b = above[1];
@@ -605,7 +605,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8 Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8
} }
public static unsafe void D63EPredictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D63EPredictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
byte a = above[0]; byte a = above[0];
byte b = above[1]; byte b = above[1];
@@ -628,7 +628,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = Avg3(f, g, h); Dst(dst, stride, 3, 3) = Avg3(f, g, h);
} }
public static unsafe void D45Predictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D45Predictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
byte a = above[0]; byte a = above[0];
byte b = above[1]; byte b = above[1];
@@ -648,7 +648,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = h; // differs from vp8 Dst(dst, stride, 3, 3) = h; // differs from vp8
} }
public static unsafe void D45EPredictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D45EPredictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
byte a = above[0]; byte a = above[0];
byte b = above[1]; byte b = above[1];
@@ -668,9 +668,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = Avg3(g, h, h); Dst(dst, stride, 3, 3) = Avg3(g, h, h);
} }
public static unsafe void D117Predictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D117Predictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
byte i = left[0]; byte I = left[0];
byte j = left[1]; byte j = left[1];
byte k = left[2]; byte k = left[2];
byte x = above[-1]; byte x = above[-1];
@@ -683,17 +683,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c); Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c);
Dst(dst, stride, 3, 0) = Avg2(c, d); Dst(dst, stride, 3, 0) = Avg2(c, d);
Dst(dst, stride, 0, 3) = Avg3(k, j, i); Dst(dst, stride, 0, 3) = Avg3(k, j, I);
Dst(dst, stride, 0, 2) = Avg3(j, i, x); Dst(dst, stride, 0, 2) = Avg3(j, I, x);
Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(i, x, a); Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(I, x, a);
Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b); Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b);
Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c); Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c);
Dst(dst, stride, 3, 1) = Avg3(b, c, d); Dst(dst, stride, 3, 1) = Avg3(b, c, d);
} }
public static unsafe void D135Predictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D135Predictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
byte i = left[0]; byte I = left[0];
byte j = left[1]; byte j = left[1];
byte k = left[2]; byte k = left[2];
byte l = left[3]; byte l = left[3];
@@ -703,18 +703,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
byte c = above[2]; byte c = above[2];
byte d = above[3]; byte d = above[3];
Dst(dst, stride, 0, 3) = Avg3(j, k, l); Dst(dst, stride, 0, 3) = Avg3(j, k, l);
Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(i, j, k); Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(I, j, k);
Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, i, j); Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, I, j);
Dst(dst, stride, 3, 3) = Dst(dst, stride, 3, 3) =
Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, i); Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, I);
Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x); Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x);
Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a); Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a);
Dst(dst, stride, 3, 0) = Avg3(d, c, b); Dst(dst, stride, 3, 0) = Avg3(d, c, b);
} }
public static unsafe void D153Predictor4X4(byte* dst, int stride, byte* above, byte* left) public static unsafe void D153Predictor4x4(byte* dst, int stride, byte* above, byte* left)
{ {
byte i = left[0]; byte I = left[0];
byte j = left[1]; byte j = left[1];
byte k = left[2]; byte k = left[2];
byte l = left[3]; byte l = left[3];
@@ -722,30 +722,30 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
byte a = above[0]; byte a = above[0];
byte b = above[1]; byte b = above[1];
byte c = above[2]; byte c = above[2];
Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(i, x); Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(I, x);
Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, i); Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, I);
Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j); Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j);
Dst(dst, stride, 0, 3) = Avg2(l, k); Dst(dst, stride, 0, 3) = Avg2(l, k);
Dst(dst, stride, 3, 0) = Avg3(a, b, c); Dst(dst, stride, 3, 0) = Avg3(a, b, c);
Dst(dst, stride, 2, 0) = Avg3(x, a, b); Dst(dst, stride, 2, 0) = Avg3(x, a, b);
Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(i, x, a); Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(I, x, a);
Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, i, x); Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, I, x);
Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, i); Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, I);
Dst(dst, stride, 1, 3) = Avg3(l, k, j); Dst(dst, stride, 1, 3) = Avg3(l, k, j);
} }
public static unsafe void HighbdD207Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD207Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD207Predictor(dst, stride, 8, above, left, bd); HighbdD207Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD207Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD207Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD207Predictor(dst, stride, 16, above, left, bd); HighbdD207Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD207Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD207Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD207Predictor(dst, stride, 32, above, left, bd); HighbdD207Predictor(dst, stride, 32, above, left, bd);
} }
@@ -787,17 +787,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD63Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD63Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD63Predictor(dst, stride, 8, above, left, bd); HighbdD63Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD63Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD63Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD63Predictor(dst, stride, 16, above, left, bd); HighbdD63Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD63Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD63Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD63Predictor(dst, stride, 32, above, left, bd); HighbdD63Predictor(dst, stride, 32, above, left, bd);
} }
@@ -820,17 +820,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD45Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD45Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD45Predictor(dst, stride, 8, above, left, bd); HighbdD45Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD45Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD45Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD45Predictor(dst, stride, 16, above, left, bd); HighbdD45Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD45Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD45Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD45Predictor(dst, stride, 32, above, left, bd); HighbdD45Predictor(dst, stride, 32, above, left, bd);
} }
@@ -856,17 +856,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD117Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD117Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD117Predictor(dst, stride, 8, above, left, bd); HighbdD117Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD117Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD117Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD117Predictor(dst, stride, 16, above, left, bd); HighbdD117Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD117Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD117Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD117Predictor(dst, stride, 32, above, left, bd); HighbdD117Predictor(dst, stride, 32, above, left, bd);
} }
@@ -910,17 +910,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD135Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD135Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD135Predictor(dst, stride, 8, above, left, bd); HighbdD135Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD135Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD135Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD135Predictor(dst, stride, 16, above, left, bd); HighbdD135Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD135Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD135Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD135Predictor(dst, stride, 32, above, left, bd); HighbdD135Predictor(dst, stride, 32, above, left, bd);
} }
@@ -951,17 +951,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD153Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD153Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD153Predictor(dst, stride, 8, above, left, bd); HighbdD153Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdD153Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD153Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD153Predictor(dst, stride, 16, above, left, bd); HighbdD153Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdD153Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD153Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdD153Predictor(dst, stride, 32, above, left, bd); HighbdD153Predictor(dst, stride, 32, above, left, bd);
} }
@@ -1004,22 +1004,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdVPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdVPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdVPredictor(dst, stride, 4, above, left, bd); HighbdVPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdVPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdVPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdVPredictor(dst, stride, 8, above, left, bd); HighbdVPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdVPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdVPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdVPredictor(dst, stride, 16, above, left, bd); HighbdVPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdVPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdVPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdVPredictor(dst, stride, 32, above, left, bd); HighbdVPredictor(dst, stride, 32, above, left, bd);
} }
@@ -1034,22 +1034,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdHPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdHPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdHPredictor(dst, stride, 4, above, left, bd); HighbdHPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdHPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdHPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdHPredictor(dst, stride, 8, above, left, bd); HighbdHPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdHPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdHPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdHPredictor(dst, stride, 16, above, left, bd); HighbdHPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdHPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdHPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdHPredictor(dst, stride, 32, above, left, bd); HighbdHPredictor(dst, stride, 32, above, left, bd);
} }
@@ -1064,22 +1064,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdTmPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdTmPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdTmPredictor(dst, stride, 4, above, left, bd); HighbdTmPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdTmPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdTmPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdTmPredictor(dst, stride, 8, above, left, bd); HighbdTmPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdTmPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdTmPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdTmPredictor(dst, stride, 16, above, left, bd); HighbdTmPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdTmPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdTmPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdTmPredictor(dst, stride, 32, above, left, bd); HighbdTmPredictor(dst, stride, 32, above, left, bd);
} }
@@ -1100,23 +1100,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdDc128Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDc128Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDc128Predictor(dst, stride, 4, above, left, bd); HighbdDc128Predictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdDc128Predictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDc128Predictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDc128Predictor(dst, stride, 8, above, left, bd); HighbdDc128Predictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdDc128Predictor16X16(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDc128Predictor16x16(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDc128Predictor(dst, stride, 16, above, left, bd); HighbdDc128Predictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdDc128Predictor32X32(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDc128Predictor32x32(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDc128Predictor(dst, stride, 32, above, left, bd); HighbdDc128Predictor(dst, stride, 32, above, left, bd);
@@ -1132,23 +1132,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdDcLeftPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcLeftPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcLeftPredictor(dst, stride, 4, above, left, bd); HighbdDcLeftPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdDcLeftPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcLeftPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcLeftPredictor(dst, stride, 8, above, left, bd); HighbdDcLeftPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdDcLeftPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDcLeftPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDcLeftPredictor(dst, stride, 16, above, left, bd); HighbdDcLeftPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdDcLeftPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDcLeftPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDcLeftPredictor(dst, stride, 32, above, left, bd); HighbdDcLeftPredictor(dst, stride, 32, above, left, bd);
@@ -1157,14 +1157,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
private static unsafe void HighbdDcLeftPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, private static unsafe void HighbdDcLeftPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left,
int bd) int bd)
{ {
int sum = 0; int expectedDc, sum = 0;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
{ {
sum += left[i]; sum += left[i];
} }
int expectedDc = (sum + (bs >> 1)) / bs; expectedDc = (sum + (bs >> 1)) / bs;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -1173,23 +1173,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdDcTopPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcTopPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcTopPredictor(dst, stride, 4, above, left, bd); HighbdDcTopPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdDcTopPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcTopPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcTopPredictor(dst, stride, 8, above, left, bd); HighbdDcTopPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdDcTopPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDcTopPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDcTopPredictor(dst, stride, 16, above, left, bd); HighbdDcTopPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdDcTopPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, public static unsafe void HighbdDcTopPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left,
int bd) int bd)
{ {
HighbdDcTopPredictor(dst, stride, 32, above, left, bd); HighbdDcTopPredictor(dst, stride, 32, above, left, bd);
@@ -1198,14 +1198,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
private static unsafe void HighbdDcTopPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, private static unsafe void HighbdDcTopPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left,
int bd) int bd)
{ {
int sum = 0; int expectedDc, sum = 0;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
{ {
sum += above[i]; sum += above[i];
} }
int expectedDc = (sum + (bs >> 1)) / bs; expectedDc = (sum + (bs >> 1)) / bs;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -1214,22 +1214,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdDcPredictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcPredictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcPredictor(dst, stride, 4, above, left, bd); HighbdDcPredictor(dst, stride, 4, above, left, bd);
} }
public static unsafe void HighbdDcPredictor8X8(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcPredictor8x8(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcPredictor(dst, stride, 8, above, left, bd); HighbdDcPredictor(dst, stride, 8, above, left, bd);
} }
public static unsafe void HighbdDcPredictor16X16(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcPredictor16x16(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcPredictor(dst, stride, 16, above, left, bd); HighbdDcPredictor(dst, stride, 16, above, left, bd);
} }
public static unsafe void HighbdDcPredictor32X32(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdDcPredictor32x32(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
HighbdDcPredictor(dst, stride, 32, above, left, bd); HighbdDcPredictor(dst, stride, 32, above, left, bd);
} }
@@ -1237,7 +1237,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
private static unsafe void HighbdDcPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left, private static unsafe void HighbdDcPredictor(ushort* dst, int stride, int bs, ushort* above, ushort* left,
int bd) int bd)
{ {
int sum = 0; int expectedDc, sum = 0;
int count = 2 * bs; int count = 2 * bs;
for (int i = 0; i < bs; i++) for (int i = 0; i < bs; i++)
@@ -1246,7 +1246,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
sum += left[i]; sum += left[i];
} }
int expectedDc = (sum + (count >> 1)) / count; expectedDc = (sum + (count >> 1)) / count;
for (int r = 0; r < bs; r++) for (int r = 0; r < bs; r++)
{ {
@@ -1255,23 +1255,23 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static unsafe void HighbdD207Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD207Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort i = left[0]; ushort I = left[0];
ushort j = left[1]; ushort j = left[1];
ushort k = left[2]; ushort k = left[2];
ushort l = left[3]; ushort l = left[3];
Dst(dst, stride, 0, 0) = Avg2(i, j); Dst(dst, stride, 0, 0) = Avg2(I, j);
Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k); Dst(dst, stride, 2, 0) = Dst(dst, stride, 0, 1) = Avg2(j, k);
Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l); Dst(dst, stride, 2, 1) = Dst(dst, stride, 0, 2) = Avg2(k, l);
Dst(dst, stride, 1, 0) = Avg3(i, j, k); Dst(dst, stride, 1, 0) = Avg3(I, j, k);
Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l); Dst(dst, stride, 3, 0) = Dst(dst, stride, 1, 1) = Avg3(j, k, l);
Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l); Dst(dst, stride, 3, 1) = Dst(dst, stride, 1, 2) = Avg3(k, l, l);
Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) = Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 2) = Dst(dst, stride, 0, 3) =
Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l; Dst(dst, stride, 1, 3) = Dst(dst, stride, 2, 3) = Dst(dst, stride, 3, 3) = l;
} }
public static unsafe void HighbdD63Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD63Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort a = above[0]; ushort a = above[0];
ushort b = above[1]; ushort b = above[1];
@@ -1293,7 +1293,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8 Dst(dst, stride, 3, 3) = Avg3(e, f, g); // Differs from vp8
} }
public static unsafe void HighbdD45Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD45Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort a = above[0]; ushort a = above[0];
ushort b = above[1]; ushort b = above[1];
@@ -1313,9 +1313,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 3, 3) = h; // Differs from vp8 Dst(dst, stride, 3, 3) = h; // Differs from vp8
} }
public static unsafe void HighbdD117Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD117Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort i = left[0]; ushort I = left[0];
ushort j = left[1]; ushort j = left[1];
ushort k = left[2]; ushort k = left[2];
ushort x = above[-1]; ushort x = above[-1];
@@ -1328,17 +1328,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c); Dst(dst, stride, 2, 0) = Dst(dst, stride, 3, 2) = Avg2(b, c);
Dst(dst, stride, 3, 0) = Avg2(c, d); Dst(dst, stride, 3, 0) = Avg2(c, d);
Dst(dst, stride, 0, 3) = Avg3(k, j, i); Dst(dst, stride, 0, 3) = Avg3(k, j, I);
Dst(dst, stride, 0, 2) = Avg3(j, i, x); Dst(dst, stride, 0, 2) = Avg3(j, I, x);
Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(i, x, a); Dst(dst, stride, 0, 1) = Dst(dst, stride, 1, 3) = Avg3(I, x, a);
Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b); Dst(dst, stride, 1, 1) = Dst(dst, stride, 2, 3) = Avg3(x, a, b);
Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c); Dst(dst, stride, 2, 1) = Dst(dst, stride, 3, 3) = Avg3(a, b, c);
Dst(dst, stride, 3, 1) = Avg3(b, c, d); Dst(dst, stride, 3, 1) = Avg3(b, c, d);
} }
public static unsafe void HighbdD135Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD135Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort i = left[0]; ushort I = left[0];
ushort j = left[1]; ushort j = left[1];
ushort k = left[2]; ushort k = left[2];
ushort l = left[3]; ushort l = left[3];
@@ -1348,18 +1348,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
ushort c = above[2]; ushort c = above[2];
ushort d = above[3]; ushort d = above[3];
Dst(dst, stride, 0, 3) = Avg3(j, k, l); Dst(dst, stride, 0, 3) = Avg3(j, k, l);
Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(i, j, k); Dst(dst, stride, 1, 3) = Dst(dst, stride, 0, 2) = Avg3(I, j, k);
Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, i, j); Dst(dst, stride, 2, 3) = Dst(dst, stride, 1, 2) = Dst(dst, stride, 0, 1) = Avg3(x, I, j);
Dst(dst, stride, 3, 3) = Dst(dst, stride, 3, 3) =
Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, i); Dst(dst, stride, 2, 2) = Dst(dst, stride, 1, 1) = Dst(dst, stride, 0, 0) = Avg3(a, x, I);
Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x); Dst(dst, stride, 3, 2) = Dst(dst, stride, 2, 1) = Dst(dst, stride, 1, 0) = Avg3(b, a, x);
Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a); Dst(dst, stride, 3, 1) = Dst(dst, stride, 2, 0) = Avg3(c, b, a);
Dst(dst, stride, 3, 0) = Avg3(d, c, b); Dst(dst, stride, 3, 0) = Avg3(d, c, b);
} }
public static unsafe void HighbdD153Predictor4X4(ushort* dst, int stride, ushort* above, ushort* left, int bd) public static unsafe void HighbdD153Predictor4x4(ushort* dst, int stride, ushort* above, ushort* left, int bd)
{ {
ushort i = left[0]; ushort I = left[0];
ushort j = left[1]; ushort j = left[1];
ushort k = left[2]; ushort k = left[2];
ushort l = left[3]; ushort l = left[3];
@@ -1368,17 +1368,17 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
ushort b = above[1]; ushort b = above[1];
ushort c = above[2]; ushort c = above[2];
Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(i, x); Dst(dst, stride, 0, 0) = Dst(dst, stride, 2, 1) = Avg2(I, x);
Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, i); Dst(dst, stride, 0, 1) = Dst(dst, stride, 2, 2) = Avg2(j, I);
Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j); Dst(dst, stride, 0, 2) = Dst(dst, stride, 2, 3) = Avg2(k, j);
Dst(dst, stride, 0, 3) = Avg2(l, k); Dst(dst, stride, 0, 3) = Avg2(l, k);
Dst(dst, stride, 3, 0) = Avg3(a, b, c); Dst(dst, stride, 3, 0) = Avg3(a, b, c);
Dst(dst, stride, 2, 0) = Avg3(x, a, b); Dst(dst, stride, 2, 0) = Avg3(x, a, b);
Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(i, x, a); Dst(dst, stride, 1, 0) = Dst(dst, stride, 3, 1) = Avg3(I, x, a);
Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, i, x); Dst(dst, stride, 1, 1) = Dst(dst, stride, 3, 2) = Avg3(j, I, x);
Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, i); Dst(dst, stride, 1, 2) = Dst(dst, stride, 3, 3) = Avg3(k, j, I);
Dst(dst, stride, 1, 3) = Avg3(l, k, j); Dst(dst, stride, 1, 3) = Avg3(l, k, j);
} }
} }
} }

View File

@@ -87,7 +87,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Iwht4X416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Iwht4x416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
/* 4-point reversible, orthonormal inverse Walsh-Hadamard in 3.5 adds, /* 4-point reversible, orthonormal inverse Walsh-Hadamard in 3.5 adds,
0.5 shifts per pixel. */ 0.5 shifts per pixel. */
@@ -143,7 +143,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Iwht4X41Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Iwht4x41Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
long a1, e1; long a1, e1;
Span<int> tmp = stackalloc int[4]; Span<int> tmp = stackalloc int[4];
@@ -233,7 +233,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct4X416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct4x416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[4 * 4]; Span<int> output = stackalloc int[4 * 4];
Span<int> outptr = output; Span<int> outptr = output;
@@ -265,7 +265,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void Idct4X41Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct4x41Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
long a1; long a1;
int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664));
@@ -419,7 +419,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct8X864Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct8x864Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
@@ -452,7 +452,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct8X812Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct8x812Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
@@ -487,7 +487,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void Idct8X81Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct8x81Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
long a1; long a1;
int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664));
@@ -843,7 +843,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct16X16256Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct16x16256Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -876,7 +876,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct16X1638Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct16x1638Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -912,7 +912,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct16X1610Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct16x1610Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -947,7 +947,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void Idct16X161Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct16x161Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
long a1; long a1;
int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664));
@@ -1336,7 +1336,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct32X321024Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct32x321024Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1383,7 +1383,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct32X32135Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct32x32135Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1419,7 +1419,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void Idct32X3234Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct32x3234Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1454,7 +1454,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void Idct32X321Add(ReadOnlySpan<int> input, Span<byte> dest, int stride) public static void Idct32x321Add(ReadOnlySpan<int> input, Span<byte> dest, int stride)
{ {
long a1; long a1;
int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664)); int output = WrapLow(DctConstRoundShift((short)input[0] * CosPi1664));
@@ -1474,7 +1474,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIwht4X416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIwht4x416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
/* 4-point reversible, orthonormal inverse Walsh-Hadamard in 3.5 adds, /* 4-point reversible, orthonormal inverse Walsh-Hadamard in 3.5 adds,
0.5 shifts per pixel. */ 0.5 shifts per pixel. */
@@ -1530,7 +1530,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIwht4X41Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIwht4x41Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
long a1, e1; long a1, e1;
Span<int> tmp = stackalloc int[4]; Span<int> tmp = stackalloc int[4];
@@ -1633,7 +1633,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct4X416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct4x416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[4 * 4]; Span<int> output = stackalloc int[4 * 4];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1665,7 +1665,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void HighbdIdct4X41Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct4x41Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
long a1; long a1;
int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd);
@@ -1824,7 +1824,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct8X864Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct8x864Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1857,7 +1857,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct8X812Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct8x812Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
@@ -1892,7 +1892,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void VpxHighbdidct8X81AddC(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void VpxHighbdidct8x81AddC(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
long a1; long a1;
int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd);
@@ -2261,7 +2261,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct16X16256Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct16x16256Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2294,7 +2294,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct16X1638Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct16x1638Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2331,7 +2331,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct16X1610Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct16x1610Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2366,7 +2366,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void HighbdIdct16X161Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct16x161Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
long a1; long a1;
int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd);
@@ -2762,7 +2762,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct32X321024Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct32x321024Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2809,7 +2809,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct32X32135Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct32x32135Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2846,7 +2846,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
[SkipLocalsInit] [SkipLocalsInit]
public static void HighbdIdct32X3234Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct32x3234Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
Span<int> output = stackalloc int[32 * 32]; Span<int> output = stackalloc int[32 * 32];
Span<int> outptr = output; Span<int> outptr = output;
@@ -2881,7 +2881,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
public static void HighbdIdct32X321Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd) public static void HighbdIdct32x321Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int bd)
{ {
int a1; int a1;
int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd); int output = HighbdWrapLow(DctConstRoundShift(input[0] * (long)CosPi1664), bd);

View File

@@ -1553,7 +1553,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
} }
private static unsafe void Transpose8X16( private static unsafe void Transpose8x16(
ArrayPtr<byte> in0, ArrayPtr<byte> in0,
ArrayPtr<byte> in1, ArrayPtr<byte> in1,
int inP, int inP,
@@ -1633,15 +1633,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
int inP, int inP,
ReadOnlySpan<ArrayPtr<byte>> dst, ReadOnlySpan<ArrayPtr<byte>> dst,
int outP, int outP,
int num8X8ToTranspose) int num8x8ToTranspose)
{ {
int idx8X8 = 0; int idx8x8 = 0;
Vector128<byte> x0, x1, x2, x3, x4, x5, x6, x7; Vector128<byte> x0, x1, x2, x3, x4, x5, x6, x7;
do do
{ {
ArrayPtr<byte> input = src[idx8X8]; ArrayPtr<byte> input = src[idx8x8];
ArrayPtr<byte> output = dst[idx8X8]; ArrayPtr<byte> output = dst[idx8x8];
x0 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (0 * inP))) x0 = Sse2.LoadScalarVector128((long*)(input.ToPointer() + (0 * inP)))
.AsByte(); // 00 01 02 03 04 05 06 07 .AsByte(); // 00 01 02 03 04 05 06 07
@@ -1697,7 +1697,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Sse2.StoreScalar((long*)(output.ToPointer() + (6 * outP)), x7.AsInt64()); // 06 16 26 36 46 56 66 76 Sse2.StoreScalar((long*)(output.ToPointer() + (6 * outP)), x7.AsInt64()); // 06 16 26 36 46 56 66 76
Sse2.StoreHigh((double*)(output.ToPointer() + (7 * outP)), x7.AsDouble()); // 07 17 27 37 47 57 67 77 Sse2.StoreHigh((double*)(output.ToPointer() + (7 * outP)), x7.AsDouble()); // 07 17 27 37 47 57 67 77
} while (++idx8X8 < num8X8ToTranspose); } while (++idx8x8 < num8x8ToTranspose);
} }
public static unsafe void LpfVertical4Dual( public static unsafe void LpfVertical4Dual(
@@ -1716,7 +1716,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Span<ArrayPtr<byte>> dst = stackalloc ArrayPtr<byte>[2]; Span<ArrayPtr<byte>> dst = stackalloc ArrayPtr<byte>[2];
// Transpose 8x16 // Transpose 8x16
Transpose8X16(s.Slice(-4), s.Slice(-4 + (pitch * 8)), pitch, tDst, 16); Transpose8x16(s.Slice(-4), s.Slice(-4 + (pitch * 8)), pitch, tDst, 16);
// Loop filtering // Loop filtering
LpfHorizontal4Dual(tDst.Slice(4 * 16), 16, blimit0, limit0, thresh0, blimit1, limit1, thresh1); LpfHorizontal4Dual(tDst.Slice(4 * 16), 16, blimit0, limit0, thresh0, blimit1, limit1, thresh1);
@@ -1770,7 +1770,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
Span<ArrayPtr<byte>> dst = stackalloc ArrayPtr<byte>[2]; Span<ArrayPtr<byte>> dst = stackalloc ArrayPtr<byte>[2];
// Transpose 8x16 // Transpose 8x16
Transpose8X16(s.Slice(-4), s.Slice(-4 + (pitch * 8)), pitch, tDst, 16); Transpose8x16(s.Slice(-4), s.Slice(-4 + (pitch * 8)), pitch, tDst, 16);
// Loop filtering // Loop filtering
LpfHorizontal8Dual(tDst.Slice(4 * 16), 16, blimit0, limit0, thresh0, blimit1, limit1, thresh1); LpfHorizontal8Dual(tDst.Slice(4 * 16), 16, blimit0, limit0, thresh0, blimit1, limit1, thresh1);
@@ -1823,15 +1823,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
ArrayPtr<byte> tDst = new((byte*)tDstStorage, 256); ArrayPtr<byte> tDst = new((byte*)tDstStorage, 256);
// Transpose 16x16 // Transpose 16x16
Transpose8X16(s.Slice(-8), s.Slice(-8 + (8 * pitch)), pitch, tDst, 16); Transpose8x16(s.Slice(-8), s.Slice(-8 + (8 * pitch)), pitch, tDst, 16);
Transpose8X16(s, s.Slice(8 * pitch), pitch, tDst.Slice(8 * 16), 16); Transpose8x16(s, s.Slice(8 * pitch), pitch, tDst.Slice(8 * 16), 16);
// Loop filtering // Loop filtering
LpfHorizontal16Dual(tDst.Slice(8 * 16), 16, blimit, limit, thresh); LpfHorizontal16Dual(tDst.Slice(8 * 16), 16, blimit, limit, thresh);
// Transpose back // Transpose back
Transpose8X16(tDst, tDst.Slice(8 * 16), 16, s.Slice(-8), pitch); Transpose8x16(tDst, tDst.Slice(8 * 16), 16, s.Slice(-8), pitch);
Transpose8X16(tDst.Slice(8), tDst.Slice(8 + (8 * 16)), 16, s.Slice(-8 + (8 * pitch)), pitch); Transpose8x16(tDst.Slice(8), tDst.Slice(8 + (8 * 16)), 16, s.Slice(-8 + (8 * pitch)), pitch);
} }
} }
} }

View File

@@ -26,10 +26,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
// MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT; // MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT;
private static readonly uint[] _countToUpdateFactor = private static readonly uint[] CountToUpdateFactor =
[ {
0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, 70, 76, 83, 89, 96, 102, 108, 115, 121, 128 0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, 70, 76, 83, 89, 96, 102, 108, 115, 121, 128
]; };
private const int ModeMvCountSat = 20; private const int ModeMvCountSat = 20;
@@ -42,7 +42,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
uint count = Math.Min(den, ModeMvCountSat); uint count = Math.Min(den, ModeMvCountSat);
uint factor = _countToUpdateFactor[(int)count]; uint factor = CountToUpdateFactor[(int)count];
byte prob = GetProb(ct0, den); byte prob = GetProb(ct0, den);
return WeightedProb(preProb, prob, (int)factor); return WeightedProb(preProb, prob, (int)factor);
} }

View File

@@ -7,8 +7,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
{ {
internal struct Reader internal struct Reader
{ {
private static readonly byte[] _norm = private static readonly byte[] Norm =
[ {
0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 0, 7, 6, 6, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -17,7 +17,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
]; };
private const int BdValueSize = sizeof(ulong) * 8; private const int BdValueSize = sizeof(ulong) * 8;
@@ -144,7 +144,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
} }
{ {
int shift = _norm[range]; int shift = Norm[range];
range <<= shift; range <<= shift;
value <<= shift; value <<= shift;
count -= shift; count -= shift;
@@ -203,7 +203,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
range = range - split; range = range - split;
value = value - bigsplit; value = value - bigsplit;
{ {
int shift = _norm[range]; int shift = Norm[range];
range <<= shift; range <<= shift;
value <<= shift; value <<= shift;
count -= shift; count -= shift;
@@ -213,7 +213,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
range = split; range = split;
{ {
int shift = _norm[range]; int shift = Norm[range];
range <<= shift; range <<= shift;
value <<= shift; value <<= shift;
count -= shift; count -= shift;
@@ -235,10 +235,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
private int DecodeUniform() private int DecodeUniform()
{ {
const int L = 8; const int l = 8;
const int M = (1 << L) - 191; const int m = (1 << l) - 191;
int v = ReadLiteral(L - 1); int v = ReadLiteral(l - 1);
return v < M ? v : (v << 1) - M + ReadBit(); return v < m ? v : (v << 1) - m + ReadBit();
} }
public int DecodeTermSubexp() public int DecodeTermSubexp()
@@ -264,7 +264,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9.Dsp
public TxMode ReadTxMode() public TxMode ReadTxMode()
{ {
TxMode txMode = (TxMode)ReadLiteral(2); TxMode txMode = (TxMode)ReadLiteral(2);
if (txMode == TxMode.Allow32X32) if (txMode == TxMode.Allow32x32)
{ {
txMode += ReadBit(); txMode += ReadBit();
} }

View File

@@ -64,26 +64,26 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
public const int Cat5MinVal = 35; public const int Cat5MinVal = 35;
public const int Cat6MinVal = 67; public const int Cat6MinVal = 67;
public static readonly byte[] Cat1Prob = [159]; public static readonly byte[] Cat1Prob = { 159 };
public static readonly byte[] Cat2Prob = [165, 145]; public static readonly byte[] Cat2Prob = { 165, 145 };
public static readonly byte[] Cat3Prob = [173, 148, 140]; public static readonly byte[] Cat3Prob = { 173, 148, 140 };
public static readonly byte[] Cat4Prob = [176, 155, 140, 135]; public static readonly byte[] Cat4Prob = { 176, 155, 140, 135 };
public static readonly byte[] Cat5Prob = [180, 157, 141, 134, 130]; public static readonly byte[] Cat5Prob = { 180, 157, 141, 134, 130 };
public static readonly byte[] Cat6Prob = public static readonly byte[] Cat6Prob =
[ {
254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 254, 254, 254, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129
]; };
public static readonly byte[] Cat6ProbHigh12 = public static readonly byte[] Cat6ProbHigh12 =
[ {
255, 255, 255, 255, 254, 254, 54, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129 255, 255, 255, 255, 254, 254, 54, 252, 249, 243, 230, 196, 177, 153, 140, 133, 130, 129
]; };
public const int EobModelToken = 3; public const int EobModelToken = 3;
private static readonly byte[] _coefbandTrans8X8Plus = private static readonly byte[] CoefbandTrans8x8Plus =
[ {
0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5,
// beyond MAXBAND_INDEX+1 all values are filled as 5 // beyond MAXBAND_INDEX+1 all values are filled as 5
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
@@ -114,260 +114,260 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5
]; };
private static readonly byte[] _coefbandTrans4X4 = [0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5]; private static readonly byte[] CoefbandTrans4x4 = { 0, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5 };
public static readonly byte[][] Pareto8Full = public static readonly byte[][] Pareto8Full =
[ {
[3, 86, 128, 6, 86, 23, 88, 29], [6, 86, 128, 11, 87, 42, 91, 52], new byte[] { 3, 86, 128, 6, 86, 23, 88, 29 }, new byte[] { 6, 86, 128, 11, 87, 42, 91, 52 },
[9, 86, 129, 17, 88, 61, 94, 76], [12, 86, 129, 22, 88, 77, 97, 93], new byte[] { 9, 86, 129, 17, 88, 61, 94, 76 }, new byte[] { 12, 86, 129, 22, 88, 77, 97, 93 },
[15, 87, 129, 28, 89, 93, 100, 110], [17, 87, 129, 33, 90, 105, 103, 123], new byte[] { 15, 87, 129, 28, 89, 93, 100, 110 }, new byte[] { 17, 87, 129, 33, 90, 105, 103, 123 },
[20, 88, 130, 38, 91, 118, 106, 136], [23, 88, 130, 43, 91, 128, 108, 146], new byte[] { 20, 88, 130, 38, 91, 118, 106, 136 }, new byte[] { 23, 88, 130, 43, 91, 128, 108, 146 },
[26, 89, 131, 48, 92, 139, 111, 156], [28, 89, 131, 53, 93, 147, 114, 163], new byte[] { 26, 89, 131, 48, 92, 139, 111, 156 }, new byte[] { 28, 89, 131, 53, 93, 147, 114, 163 },
[31, 90, 131, 58, 94, 156, 117, 171], [34, 90, 131, 62, 94, 163, 119, 177], new byte[] { 31, 90, 131, 58, 94, 156, 117, 171 }, new byte[] { 34, 90, 131, 62, 94, 163, 119, 177 },
[37, 90, 132, 66, 95, 171, 122, 184], [39, 90, 132, 70, 96, 177, 124, 189], new byte[] { 37, 90, 132, 66, 95, 171, 122, 184 }, new byte[] { 39, 90, 132, 70, 96, 177, 124, 189 },
[42, 91, 132, 75, 97, 183, 127, 194], [44, 91, 132, 79, 97, 188, 129, 198], new byte[] { 42, 91, 132, 75, 97, 183, 127, 194 }, new byte[] { 44, 91, 132, 79, 97, 188, 129, 198 },
[47, 92, 133, 83, 98, 193, 132, 202], [49, 92, 133, 86, 99, 197, 134, 205], new byte[] { 47, 92, 133, 83, 98, 193, 132, 202 }, new byte[] { 49, 92, 133, 86, 99, 197, 134, 205 },
[52, 93, 133, 90, 100, 201, 137, 208], [54, 93, 133, 94, 100, 204, 139, 211], new byte[] { 52, 93, 133, 90, 100, 201, 137, 208 }, new byte[] { 54, 93, 133, 94, 100, 204, 139, 211 },
[57, 94, 134, 98, 101, 208, 142, 214], [59, 94, 134, 101, 102, 211, 144, 216], new byte[] { 57, 94, 134, 98, 101, 208, 142, 214 }, new byte[] { 59, 94, 134, 101, 102, 211, 144, 216 },
[62, 94, 135, 105, 103, 214, 146, 218], new byte[] { 62, 94, 135, 105, 103, 214, 146, 218 },
[64, 94, 135, 108, 103, 216, 148, 220], new byte[] { 64, 94, 135, 108, 103, 216, 148, 220 },
[66, 95, 135, 111, 104, 219, 151, 222], new byte[] { 66, 95, 135, 111, 104, 219, 151, 222 },
[68, 95, 135, 114, 105, 221, 153, 223], new byte[] { 68, 95, 135, 114, 105, 221, 153, 223 },
[71, 96, 136, 117, 106, 224, 155, 225], new byte[] { 71, 96, 136, 117, 106, 224, 155, 225 },
[73, 96, 136, 120, 106, 225, 157, 226], new byte[] { 73, 96, 136, 120, 106, 225, 157, 226 },
[76, 97, 136, 123, 107, 227, 159, 228], new byte[] { 76, 97, 136, 123, 107, 227, 159, 228 },
[78, 97, 136, 126, 108, 229, 160, 229], new byte[] { 78, 97, 136, 126, 108, 229, 160, 229 },
[80, 98, 137, 129, 109, 231, 162, 231], new byte[] { 80, 98, 137, 129, 109, 231, 162, 231 },
[82, 98, 137, 131, 109, 232, 164, 232], new byte[] { 82, 98, 137, 131, 109, 232, 164, 232 },
[84, 98, 138, 134, 110, 234, 166, 233], new byte[] { 84, 98, 138, 134, 110, 234, 166, 233 },
[86, 98, 138, 137, 111, 235, 168, 234], new byte[] { 86, 98, 138, 137, 111, 235, 168, 234 },
[89, 99, 138, 140, 112, 236, 170, 235], new byte[] { 89, 99, 138, 140, 112, 236, 170, 235 },
[91, 99, 138, 142, 112, 237, 171, 235], new byte[] { 91, 99, 138, 142, 112, 237, 171, 235 },
[93, 100, 139, 145, 113, 238, 173, 236], new byte[] { 93, 100, 139, 145, 113, 238, 173, 236 },
[95, 100, 139, 147, 114, 239, 174, 237], new byte[] { 95, 100, 139, 147, 114, 239, 174, 237 },
[97, 101, 140, 149, 115, 240, 176, 238], new byte[] { 97, 101, 140, 149, 115, 240, 176, 238 },
[99, 101, 140, 151, 115, 241, 177, 238], new byte[] { 99, 101, 140, 151, 115, 241, 177, 238 },
[101, 102, 140, 154, 116, 242, 179, 239], new byte[] { 101, 102, 140, 154, 116, 242, 179, 239 },
[103, 102, 140, 156, 117, 242, 180, 239], new byte[] { 103, 102, 140, 156, 117, 242, 180, 239 },
[105, 103, 141, 158, 118, 243, 182, 240], new byte[] { 105, 103, 141, 158, 118, 243, 182, 240 },
[107, 103, 141, 160, 118, 243, 183, 240], new byte[] { 107, 103, 141, 160, 118, 243, 183, 240 },
[109, 104, 141, 162, 119, 244, 185, 241], new byte[] { 109, 104, 141, 162, 119, 244, 185, 241 },
[111, 104, 141, 164, 119, 244, 186, 241], new byte[] { 111, 104, 141, 164, 119, 244, 186, 241 },
[113, 104, 142, 166, 120, 245, 187, 242], new byte[] { 113, 104, 142, 166, 120, 245, 187, 242 },
[114, 104, 142, 168, 121, 245, 188, 242], new byte[] { 114, 104, 142, 168, 121, 245, 188, 242 },
[116, 105, 143, 170, 122, 246, 190, 243], new byte[] { 116, 105, 143, 170, 122, 246, 190, 243 },
[118, 105, 143, 171, 122, 246, 191, 243], new byte[] { 118, 105, 143, 171, 122, 246, 191, 243 },
[120, 106, 143, 173, 123, 247, 192, 244], new byte[] { 120, 106, 143, 173, 123, 247, 192, 244 },
[121, 106, 143, 175, 124, 247, 193, 244], new byte[] { 121, 106, 143, 175, 124, 247, 193, 244 },
[123, 107, 144, 177, 125, 248, 195, 244], new byte[] { 123, 107, 144, 177, 125, 248, 195, 244 },
[125, 107, 144, 178, 125, 248, 196, 244], new byte[] { 125, 107, 144, 178, 125, 248, 196, 244 },
[127, 108, 145, 180, 126, 249, 197, 245], new byte[] { 127, 108, 145, 180, 126, 249, 197, 245 },
[128, 108, 145, 181, 127, 249, 198, 245], new byte[] { 128, 108, 145, 181, 127, 249, 198, 245 },
[130, 109, 145, 183, 128, 249, 199, 245], new byte[] { 130, 109, 145, 183, 128, 249, 199, 245 },
[132, 109, 145, 184, 128, 249, 200, 245], new byte[] { 132, 109, 145, 184, 128, 249, 200, 245 },
[134, 110, 146, 186, 129, 250, 201, 246], new byte[] { 134, 110, 146, 186, 129, 250, 201, 246 },
[135, 110, 146, 187, 130, 250, 202, 246], new byte[] { 135, 110, 146, 187, 130, 250, 202, 246 },
[137, 111, 147, 189, 131, 251, 203, 246], new byte[] { 137, 111, 147, 189, 131, 251, 203, 246 },
[138, 111, 147, 190, 131, 251, 204, 246], new byte[] { 138, 111, 147, 190, 131, 251, 204, 246 },
[140, 112, 147, 192, 132, 251, 205, 247], new byte[] { 140, 112, 147, 192, 132, 251, 205, 247 },
[141, 112, 147, 193, 132, 251, 206, 247], new byte[] { 141, 112, 147, 193, 132, 251, 206, 247 },
[143, 113, 148, 194, 133, 251, 207, 247], new byte[] { 143, 113, 148, 194, 133, 251, 207, 247 },
[144, 113, 148, 195, 134, 251, 207, 247], new byte[] { 144, 113, 148, 195, 134, 251, 207, 247 },
[146, 114, 149, 197, 135, 252, 208, 248], new byte[] { 146, 114, 149, 197, 135, 252, 208, 248 },
[147, 114, 149, 198, 135, 252, 209, 248], new byte[] { 147, 114, 149, 198, 135, 252, 209, 248 },
[149, 115, 149, 199, 136, 252, 210, 248], new byte[] { 149, 115, 149, 199, 136, 252, 210, 248 },
[150, 115, 149, 200, 137, 252, 210, 248], new byte[] { 150, 115, 149, 200, 137, 252, 210, 248 },
[152, 115, 150, 201, 138, 252, 211, 248], new byte[] { 152, 115, 150, 201, 138, 252, 211, 248 },
[153, 115, 150, 202, 138, 252, 212, 248], new byte[] { 153, 115, 150, 202, 138, 252, 212, 248 },
[155, 116, 151, 204, 139, 253, 213, 249], new byte[] { 155, 116, 151, 204, 139, 253, 213, 249 },
[156, 116, 151, 205, 139, 253, 213, 249], new byte[] { 156, 116, 151, 205, 139, 253, 213, 249 },
[158, 117, 151, 206, 140, 253, 214, 249], new byte[] { 158, 117, 151, 206, 140, 253, 214, 249 },
[159, 117, 151, 207, 141, 253, 215, 249], new byte[] { 159, 117, 151, 207, 141, 253, 215, 249 },
[161, 118, 152, 208, 142, 253, 216, 249], new byte[] { 161, 118, 152, 208, 142, 253, 216, 249 },
[162, 118, 152, 209, 142, 253, 216, 249], new byte[] { 162, 118, 152, 209, 142, 253, 216, 249 },
[163, 119, 153, 210, 143, 253, 217, 249], new byte[] { 163, 119, 153, 210, 143, 253, 217, 249 },
[164, 119, 153, 211, 143, 253, 217, 249], new byte[] { 164, 119, 153, 211, 143, 253, 217, 249 },
[166, 120, 153, 212, 144, 254, 218, 250], new byte[] { 166, 120, 153, 212, 144, 254, 218, 250 },
[167, 120, 153, 212, 145, 254, 219, 250], new byte[] { 167, 120, 153, 212, 145, 254, 219, 250 },
[168, 121, 154, 213, 146, 254, 220, 250], new byte[] { 168, 121, 154, 213, 146, 254, 220, 250 },
[169, 121, 154, 214, 146, 254, 220, 250], new byte[] { 169, 121, 154, 214, 146, 254, 220, 250 },
[171, 122, 155, 215, 147, 254, 221, 250], new byte[] { 171, 122, 155, 215, 147, 254, 221, 250 },
[172, 122, 155, 216, 147, 254, 221, 250], new byte[] { 172, 122, 155, 216, 147, 254, 221, 250 },
[173, 123, 155, 217, 148, 254, 222, 250], new byte[] { 173, 123, 155, 217, 148, 254, 222, 250 },
[174, 123, 155, 217, 149, 254, 222, 250], new byte[] { 174, 123, 155, 217, 149, 254, 222, 250 },
[176, 124, 156, 218, 150, 254, 223, 250], new byte[] { 176, 124, 156, 218, 150, 254, 223, 250 },
[177, 124, 156, 219, 150, 254, 223, 250], new byte[] { 177, 124, 156, 219, 150, 254, 223, 250 },
[178, 125, 157, 220, 151, 254, 224, 251], new byte[] { 178, 125, 157, 220, 151, 254, 224, 251 },
[179, 125, 157, 220, 151, 254, 224, 251], new byte[] { 179, 125, 157, 220, 151, 254, 224, 251 },
[180, 126, 157, 221, 152, 254, 225, 251], new byte[] { 180, 126, 157, 221, 152, 254, 225, 251 },
[181, 126, 157, 221, 152, 254, 225, 251], new byte[] { 181, 126, 157, 221, 152, 254, 225, 251 },
[183, 127, 158, 222, 153, 254, 226, 251], new byte[] { 183, 127, 158, 222, 153, 254, 226, 251 },
[184, 127, 158, 223, 154, 254, 226, 251], new byte[] { 184, 127, 158, 223, 154, 254, 226, 251 },
[185, 128, 159, 224, 155, 255, 227, 251], new byte[] { 185, 128, 159, 224, 155, 255, 227, 251 },
[186, 128, 159, 224, 155, 255, 227, 251], new byte[] { 186, 128, 159, 224, 155, 255, 227, 251 },
[187, 129, 160, 225, 156, 255, 228, 251], new byte[] { 187, 129, 160, 225, 156, 255, 228, 251 },
[188, 130, 160, 225, 156, 255, 228, 251], new byte[] { 188, 130, 160, 225, 156, 255, 228, 251 },
[189, 131, 160, 226, 157, 255, 228, 251], new byte[] { 189, 131, 160, 226, 157, 255, 228, 251 },
[190, 131, 160, 226, 158, 255, 228, 251], new byte[] { 190, 131, 160, 226, 158, 255, 228, 251 },
[191, 132, 161, 227, 159, 255, 229, 251], new byte[] { 191, 132, 161, 227, 159, 255, 229, 251 },
[192, 132, 161, 227, 159, 255, 229, 251], new byte[] { 192, 132, 161, 227, 159, 255, 229, 251 },
[193, 133, 162, 228, 160, 255, 230, 252], new byte[] { 193, 133, 162, 228, 160, 255, 230, 252 },
[194, 133, 162, 229, 160, 255, 230, 252], new byte[] { 194, 133, 162, 229, 160, 255, 230, 252 },
[195, 134, 163, 230, 161, 255, 231, 252], new byte[] { 195, 134, 163, 230, 161, 255, 231, 252 },
[196, 134, 163, 230, 161, 255, 231, 252], new byte[] { 196, 134, 163, 230, 161, 255, 231, 252 },
[197, 135, 163, 231, 162, 255, 231, 252], new byte[] { 197, 135, 163, 231, 162, 255, 231, 252 },
[198, 135, 163, 231, 162, 255, 231, 252], new byte[] { 198, 135, 163, 231, 162, 255, 231, 252 },
[199, 136, 164, 232, 163, 255, 232, 252], new byte[] { 199, 136, 164, 232, 163, 255, 232, 252 },
[200, 136, 164, 232, 164, 255, 232, 252], new byte[] { 200, 136, 164, 232, 164, 255, 232, 252 },
[201, 137, 165, 233, 165, 255, 233, 252], new byte[] { 201, 137, 165, 233, 165, 255, 233, 252 },
[201, 137, 165, 233, 165, 255, 233, 252], new byte[] { 201, 137, 165, 233, 165, 255, 233, 252 },
[202, 138, 166, 233, 166, 255, 233, 252], new byte[] { 202, 138, 166, 233, 166, 255, 233, 252 },
[203, 138, 166, 233, 166, 255, 233, 252], new byte[] { 203, 138, 166, 233, 166, 255, 233, 252 },
[204, 139, 166, 234, 167, 255, 234, 252], new byte[] { 204, 139, 166, 234, 167, 255, 234, 252 },
[205, 139, 166, 234, 167, 255, 234, 252], new byte[] { 205, 139, 166, 234, 167, 255, 234, 252 },
[206, 140, 167, 235, 168, 255, 235, 252], new byte[] { 206, 140, 167, 235, 168, 255, 235, 252 },
[206, 140, 167, 235, 168, 255, 235, 252], new byte[] { 206, 140, 167, 235, 168, 255, 235, 252 },
[207, 141, 168, 236, 169, 255, 235, 252], new byte[] { 207, 141, 168, 236, 169, 255, 235, 252 },
[208, 141, 168, 236, 170, 255, 235, 252], new byte[] { 208, 141, 168, 236, 170, 255, 235, 252 },
[209, 142, 169, 237, 171, 255, 236, 252], new byte[] { 209, 142, 169, 237, 171, 255, 236, 252 },
[209, 143, 169, 237, 171, 255, 236, 252], new byte[] { 209, 143, 169, 237, 171, 255, 236, 252 },
[210, 144, 169, 237, 172, 255, 236, 252], new byte[] { 210, 144, 169, 237, 172, 255, 236, 252 },
[211, 144, 169, 237, 172, 255, 236, 252], new byte[] { 211, 144, 169, 237, 172, 255, 236, 252 },
[212, 145, 170, 238, 173, 255, 237, 252], new byte[] { 212, 145, 170, 238, 173, 255, 237, 252 },
[213, 145, 170, 238, 173, 255, 237, 252], new byte[] { 213, 145, 170, 238, 173, 255, 237, 252 },
[214, 146, 171, 239, 174, 255, 237, 253], new byte[] { 214, 146, 171, 239, 174, 255, 237, 253 },
[214, 146, 171, 239, 174, 255, 237, 253], new byte[] { 214, 146, 171, 239, 174, 255, 237, 253 },
[215, 147, 172, 240, 175, 255, 238, 253], new byte[] { 215, 147, 172, 240, 175, 255, 238, 253 },
[215, 147, 172, 240, 175, 255, 238, 253], new byte[] { 215, 147, 172, 240, 175, 255, 238, 253 },
[216, 148, 173, 240, 176, 255, 238, 253], new byte[] { 216, 148, 173, 240, 176, 255, 238, 253 },
[217, 148, 173, 240, 176, 255, 238, 253], new byte[] { 217, 148, 173, 240, 176, 255, 238, 253 },
[218, 149, 173, 241, 177, 255, 239, 253], new byte[] { 218, 149, 173, 241, 177, 255, 239, 253 },
[218, 149, 173, 241, 178, 255, 239, 253], new byte[] { 218, 149, 173, 241, 178, 255, 239, 253 },
[219, 150, 174, 241, 179, 255, 239, 253], new byte[] { 219, 150, 174, 241, 179, 255, 239, 253 },
[219, 151, 174, 241, 179, 255, 239, 253], new byte[] { 219, 151, 174, 241, 179, 255, 239, 253 },
[220, 152, 175, 242, 180, 255, 240, 253], new byte[] { 220, 152, 175, 242, 180, 255, 240, 253 },
[221, 152, 175, 242, 180, 255, 240, 253], new byte[] { 221, 152, 175, 242, 180, 255, 240, 253 },
[222, 153, 176, 242, 181, 255, 240, 253], new byte[] { 222, 153, 176, 242, 181, 255, 240, 253 },
[222, 153, 176, 242, 181, 255, 240, 253], new byte[] { 222, 153, 176, 242, 181, 255, 240, 253 },
[223, 154, 177, 243, 182, 255, 240, 253], new byte[] { 223, 154, 177, 243, 182, 255, 240, 253 },
[223, 154, 177, 243, 182, 255, 240, 253], new byte[] { 223, 154, 177, 243, 182, 255, 240, 253 },
[224, 155, 178, 244, 183, 255, 241, 253], new byte[] { 224, 155, 178, 244, 183, 255, 241, 253 },
[224, 155, 178, 244, 183, 255, 241, 253], new byte[] { 224, 155, 178, 244, 183, 255, 241, 253 },
[225, 156, 178, 244, 184, 255, 241, 253], new byte[] { 225, 156, 178, 244, 184, 255, 241, 253 },
[225, 157, 178, 244, 184, 255, 241, 253], new byte[] { 225, 157, 178, 244, 184, 255, 241, 253 },
[226, 158, 179, 244, 185, 255, 242, 253], new byte[] { 226, 158, 179, 244, 185, 255, 242, 253 },
[227, 158, 179, 244, 185, 255, 242, 253], new byte[] { 227, 158, 179, 244, 185, 255, 242, 253 },
[228, 159, 180, 245, 186, 255, 242, 253], new byte[] { 228, 159, 180, 245, 186, 255, 242, 253 },
[228, 159, 180, 245, 186, 255, 242, 253], new byte[] { 228, 159, 180, 245, 186, 255, 242, 253 },
[229, 160, 181, 245, 187, 255, 242, 253], new byte[] { 229, 160, 181, 245, 187, 255, 242, 253 },
[229, 160, 181, 245, 187, 255, 242, 253], new byte[] { 229, 160, 181, 245, 187, 255, 242, 253 },
[230, 161, 182, 246, 188, 255, 243, 253], new byte[] { 230, 161, 182, 246, 188, 255, 243, 253 },
[230, 162, 182, 246, 188, 255, 243, 253], new byte[] { 230, 162, 182, 246, 188, 255, 243, 253 },
[231, 163, 183, 246, 189, 255, 243, 253], new byte[] { 231, 163, 183, 246, 189, 255, 243, 253 },
[231, 163, 183, 246, 189, 255, 243, 253], new byte[] { 231, 163, 183, 246, 189, 255, 243, 253 },
[232, 164, 184, 247, 190, 255, 243, 253], new byte[] { 232, 164, 184, 247, 190, 255, 243, 253 },
[232, 164, 184, 247, 190, 255, 243, 253], new byte[] { 232, 164, 184, 247, 190, 255, 243, 253 },
[233, 165, 185, 247, 191, 255, 244, 253], new byte[] { 233, 165, 185, 247, 191, 255, 244, 253 },
[233, 165, 185, 247, 191, 255, 244, 253], new byte[] { 233, 165, 185, 247, 191, 255, 244, 253 },
[234, 166, 185, 247, 192, 255, 244, 253], new byte[] { 234, 166, 185, 247, 192, 255, 244, 253 },
[234, 167, 185, 247, 192, 255, 244, 253], new byte[] { 234, 167, 185, 247, 192, 255, 244, 253 },
[235, 168, 186, 248, 193, 255, 244, 253], new byte[] { 235, 168, 186, 248, 193, 255, 244, 253 },
[235, 168, 186, 248, 193, 255, 244, 253], new byte[] { 235, 168, 186, 248, 193, 255, 244, 253 },
[236, 169, 187, 248, 194, 255, 244, 253], new byte[] { 236, 169, 187, 248, 194, 255, 244, 253 },
[236, 169, 187, 248, 194, 255, 244, 253], new byte[] { 236, 169, 187, 248, 194, 255, 244, 253 },
[236, 170, 188, 248, 195, 255, 245, 253], new byte[] { 236, 170, 188, 248, 195, 255, 245, 253 },
[236, 170, 188, 248, 195, 255, 245, 253], new byte[] { 236, 170, 188, 248, 195, 255, 245, 253 },
[237, 171, 189, 249, 196, 255, 245, 254], new byte[] { 237, 171, 189, 249, 196, 255, 245, 254 },
[237, 172, 189, 249, 196, 255, 245, 254], new byte[] { 237, 172, 189, 249, 196, 255, 245, 254 },
[238, 173, 190, 249, 197, 255, 245, 254], new byte[] { 238, 173, 190, 249, 197, 255, 245, 254 },
[238, 173, 190, 249, 197, 255, 245, 254], new byte[] { 238, 173, 190, 249, 197, 255, 245, 254 },
[239, 174, 191, 249, 198, 255, 245, 254], new byte[] { 239, 174, 191, 249, 198, 255, 245, 254 },
[239, 174, 191, 249, 198, 255, 245, 254], new byte[] { 239, 174, 191, 249, 198, 255, 245, 254 },
[240, 175, 192, 249, 199, 255, 246, 254], new byte[] { 240, 175, 192, 249, 199, 255, 246, 254 },
[240, 176, 192, 249, 199, 255, 246, 254], new byte[] { 240, 176, 192, 249, 199, 255, 246, 254 },
[240, 177, 193, 250, 200, 255, 246, 254], new byte[] { 240, 177, 193, 250, 200, 255, 246, 254 },
[240, 177, 193, 250, 200, 255, 246, 254], new byte[] { 240, 177, 193, 250, 200, 255, 246, 254 },
[241, 178, 194, 250, 201, 255, 246, 254], new byte[] { 241, 178, 194, 250, 201, 255, 246, 254 },
[241, 178, 194, 250, 201, 255, 246, 254], new byte[] { 241, 178, 194, 250, 201, 255, 246, 254 },
[242, 179, 195, 250, 202, 255, 246, 254], new byte[] { 242, 179, 195, 250, 202, 255, 246, 254 },
[242, 180, 195, 250, 202, 255, 246, 254], new byte[] { 242, 180, 195, 250, 202, 255, 246, 254 },
[242, 181, 196, 250, 203, 255, 247, 254], new byte[] { 242, 181, 196, 250, 203, 255, 247, 254 },
[242, 181, 196, 250, 203, 255, 247, 254], new byte[] { 242, 181, 196, 250, 203, 255, 247, 254 },
[243, 182, 197, 251, 204, 255, 247, 254], new byte[] { 243, 182, 197, 251, 204, 255, 247, 254 },
[243, 183, 197, 251, 204, 255, 247, 254], new byte[] { 243, 183, 197, 251, 204, 255, 247, 254 },
[244, 184, 198, 251, 205, 255, 247, 254], new byte[] { 244, 184, 198, 251, 205, 255, 247, 254 },
[244, 184, 198, 251, 205, 255, 247, 254], new byte[] { 244, 184, 198, 251, 205, 255, 247, 254 },
[244, 185, 199, 251, 206, 255, 247, 254], new byte[] { 244, 185, 199, 251, 206, 255, 247, 254 },
[244, 185, 199, 251, 206, 255, 247, 254], new byte[] { 244, 185, 199, 251, 206, 255, 247, 254 },
[245, 186, 200, 251, 207, 255, 247, 254], new byte[] { 245, 186, 200, 251, 207, 255, 247, 254 },
[245, 187, 200, 251, 207, 255, 247, 254], new byte[] { 245, 187, 200, 251, 207, 255, 247, 254 },
[246, 188, 201, 252, 207, 255, 248, 254], new byte[] { 246, 188, 201, 252, 207, 255, 248, 254 },
[246, 188, 201, 252, 207, 255, 248, 254], new byte[] { 246, 188, 201, 252, 207, 255, 248, 254 },
[246, 189, 202, 252, 208, 255, 248, 254], new byte[] { 246, 189, 202, 252, 208, 255, 248, 254 },
[246, 190, 202, 252, 208, 255, 248, 254], new byte[] { 246, 190, 202, 252, 208, 255, 248, 254 },
[247, 191, 203, 252, 209, 255, 248, 254], new byte[] { 247, 191, 203, 252, 209, 255, 248, 254 },
[247, 191, 203, 252, 209, 255, 248, 254], new byte[] { 247, 191, 203, 252, 209, 255, 248, 254 },
[247, 192, 204, 252, 210, 255, 248, 254], new byte[] { 247, 192, 204, 252, 210, 255, 248, 254 },
[247, 193, 204, 252, 210, 255, 248, 254], new byte[] { 247, 193, 204, 252, 210, 255, 248, 254 },
[248, 194, 205, 252, 211, 255, 248, 254], new byte[] { 248, 194, 205, 252, 211, 255, 248, 254 },
[248, 194, 205, 252, 211, 255, 248, 254], new byte[] { 248, 194, 205, 252, 211, 255, 248, 254 },
[248, 195, 206, 252, 212, 255, 249, 254], new byte[] { 248, 195, 206, 252, 212, 255, 249, 254 },
[248, 196, 206, 252, 212, 255, 249, 254], new byte[] { 248, 196, 206, 252, 212, 255, 249, 254 },
[249, 197, 207, 253, 213, 255, 249, 254], new byte[] { 249, 197, 207, 253, 213, 255, 249, 254 },
[249, 197, 207, 253, 213, 255, 249, 254], new byte[] { 249, 197, 207, 253, 213, 255, 249, 254 },
[249, 198, 208, 253, 214, 255, 249, 254], new byte[] { 249, 198, 208, 253, 214, 255, 249, 254 },
[249, 199, 209, 253, 214, 255, 249, 254], new byte[] { 249, 199, 209, 253, 214, 255, 249, 254 },
[250, 200, 210, 253, 215, 255, 249, 254], new byte[] { 250, 200, 210, 253, 215, 255, 249, 254 },
[250, 200, 210, 253, 215, 255, 249, 254], new byte[] { 250, 200, 210, 253, 215, 255, 249, 254 },
[250, 201, 211, 253, 215, 255, 249, 254], new byte[] { 250, 201, 211, 253, 215, 255, 249, 254 },
[250, 202, 211, 253, 215, 255, 249, 254], new byte[] { 250, 202, 211, 253, 215, 255, 249, 254 },
[250, 203, 212, 253, 216, 255, 249, 254], new byte[] { 250, 203, 212, 253, 216, 255, 249, 254 },
[250, 203, 212, 253, 216, 255, 249, 254], new byte[] { 250, 203, 212, 253, 216, 255, 249, 254 },
[251, 204, 213, 253, 217, 255, 250, 254], new byte[] { 251, 204, 213, 253, 217, 255, 250, 254 },
[251, 205, 213, 253, 217, 255, 250, 254], new byte[] { 251, 205, 213, 253, 217, 255, 250, 254 },
[251, 206, 214, 254, 218, 255, 250, 254], new byte[] { 251, 206, 214, 254, 218, 255, 250, 254 },
[251, 206, 215, 254, 218, 255, 250, 254], new byte[] { 251, 206, 215, 254, 218, 255, 250, 254 },
[252, 207, 216, 254, 219, 255, 250, 254], new byte[] { 252, 207, 216, 254, 219, 255, 250, 254 },
[252, 208, 216, 254, 219, 255, 250, 254], new byte[] { 252, 208, 216, 254, 219, 255, 250, 254 },
[252, 209, 217, 254, 220, 255, 250, 254], new byte[] { 252, 209, 217, 254, 220, 255, 250, 254 },
[252, 210, 217, 254, 220, 255, 250, 254], new byte[] { 252, 210, 217, 254, 220, 255, 250, 254 },
[252, 211, 218, 254, 221, 255, 250, 254], new byte[] { 252, 211, 218, 254, 221, 255, 250, 254 },
[252, 212, 218, 254, 221, 255, 250, 254], new byte[] { 252, 212, 218, 254, 221, 255, 250, 254 },
[253, 213, 219, 254, 222, 255, 250, 254], new byte[] { 253, 213, 219, 254, 222, 255, 250, 254 },
[253, 213, 220, 254, 222, 255, 250, 254], new byte[] { 253, 213, 220, 254, 222, 255, 250, 254 },
[253, 214, 221, 254, 223, 255, 250, 254], new byte[] { 253, 214, 221, 254, 223, 255, 250, 254 },
[253, 215, 221, 254, 223, 255, 250, 254], new byte[] { 253, 215, 221, 254, 223, 255, 250, 254 },
[253, 216, 222, 254, 224, 255, 251, 254], new byte[] { 253, 216, 222, 254, 224, 255, 251, 254 },
[253, 217, 223, 254, 224, 255, 251, 254], new byte[] { 253, 217, 223, 254, 224, 255, 251, 254 },
[253, 218, 224, 254, 225, 255, 251, 254], new byte[] { 253, 218, 224, 254, 225, 255, 251, 254 },
[253, 219, 224, 254, 225, 255, 251, 254], new byte[] { 253, 219, 224, 254, 225, 255, 251, 254 },
[254, 220, 225, 254, 225, 255, 251, 254], new byte[] { 254, 220, 225, 254, 225, 255, 251, 254 },
[254, 221, 226, 254, 225, 255, 251, 254], new byte[] { 254, 221, 226, 254, 225, 255, 251, 254 },
[254, 222, 227, 255, 226, 255, 251, 254], new byte[] { 254, 222, 227, 255, 226, 255, 251, 254 },
[254, 223, 227, 255, 226, 255, 251, 254], new byte[] { 254, 223, 227, 255, 226, 255, 251, 254 },
[254, 224, 228, 255, 227, 255, 251, 254], new byte[] { 254, 224, 228, 255, 227, 255, 251, 254 },
[254, 225, 229, 255, 227, 255, 251, 254], new byte[] { 254, 225, 229, 255, 227, 255, 251, 254 },
[254, 226, 230, 255, 228, 255, 251, 254], new byte[] { 254, 226, 230, 255, 228, 255, 251, 254 },
[254, 227, 230, 255, 229, 255, 251, 254], new byte[] { 254, 227, 230, 255, 229, 255, 251, 254 },
[255, 228, 231, 255, 230, 255, 251, 254], new byte[] { 255, 228, 231, 255, 230, 255, 251, 254 },
[255, 229, 232, 255, 230, 255, 251, 254], new byte[] { 255, 229, 232, 255, 230, 255, 251, 254 },
[255, 230, 233, 255, 231, 255, 252, 254], new byte[] { 255, 230, 233, 255, 231, 255, 252, 254 },
[255, 231, 234, 255, 231, 255, 252, 254], new byte[] { 255, 231, 234, 255, 231, 255, 252, 254 },
[255, 232, 235, 255, 232, 255, 252, 254], new byte[] { 255, 232, 235, 255, 232, 255, 252, 254 },
[255, 233, 236, 255, 232, 255, 252, 254], new byte[] { 255, 233, 236, 255, 232, 255, 252, 254 },
[255, 235, 237, 255, 233, 255, 252, 254], new byte[] { 255, 235, 237, 255, 233, 255, 252, 254 },
[255, 236, 238, 255, 234, 255, 252, 254], new byte[] { 255, 236, 238, 255, 234, 255, 252, 254 },
[255, 238, 240, 255, 235, 255, 252, 255], new byte[] { 255, 238, 240, 255, 235, 255, 252, 255 },
[255, 239, 241, 255, 235, 255, 252, 254], new byte[] { 255, 239, 241, 255, 235, 255, 252, 254 },
[255, 241, 243, 255, 236, 255, 252, 254], new byte[] { 255, 241, 243, 255, 236, 255, 252, 254 },
[255, 243, 245, 255, 237, 255, 252, 254], new byte[] { 255, 243, 245, 255, 237, 255, 252, 254 },
[255, 246, 247, 255, 239, 255, 253, 255] new byte[] { 255, 246, 247, 255, 239, 255, 253, 255 }
]; };
internal static readonly byte[] DefaultCoefProbs4X4 = internal static readonly byte[] DefaultCoefProbs4x4 =
[ {
// Y plane // Y plane
// Intra // Intra
// Band 0 // Band 0
@@ -422,10 +422,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
127, 145, 243, 71, 129, 228, 17, 93, 177, 3, 61, 124, 1, 41, 84, 1, 21, 52, 127, 145, 243, 71, 129, 228, 17, 93, 177, 3, 61, 124, 1, 41, 84, 1, 21, 52,
// Band 5 // Band 5
157, 78, 244, 140, 72, 231, 69, 58, 184, 31, 44, 137, 14, 38, 105, 8, 23, 61 157, 78, 244, 140, 72, 231, 69, 58, 184, 31, 44, 137, 14, 38, 105, 8, 23, 61
]; };
internal static readonly byte[] DefaultCoefProbs8X8 = internal static readonly byte[] DefaultCoefProbs8x8 =
[ {
// Y plane // Y plane
// Intra // Intra
// Band 0 // Band 0
@@ -480,10 +480,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
62, 190, 238, 21, 159, 222, 2, 107, 172, 1, 72, 122, 1, 40, 71, 1, 18, 32, 62, 190, 238, 21, 159, 222, 2, 107, 172, 1, 72, 122, 1, 40, 71, 1, 18, 32,
// Band 5 // Band 5
61, 199, 240, 27, 161, 226, 4, 113, 180, 1, 76, 129, 1, 46, 80, 1, 23, 41 61, 199, 240, 27, 161, 226, 4, 113, 180, 1, 76, 129, 1, 46, 80, 1, 23, 41
]; };
internal static readonly byte[] DefaultCoefProbs16X16 = internal static readonly byte[] DefaultCoefProbs16x16 =
[ {
// Y plane // Y plane
// Intra // Intra
// Band 0 // Band 0
@@ -538,10 +538,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
40, 194, 227, 8, 147, 204, 1, 94, 155, 1, 65, 112, 1, 39, 66, 1, 14, 26, 40, 194, 227, 8, 147, 204, 1, 94, 155, 1, 65, 112, 1, 39, 66, 1, 14, 26,
// Band 5 // Band 5
16, 208, 228, 3, 151, 207, 1, 98, 160, 1, 67, 117, 1, 41, 74, 1, 17, 31 16, 208, 228, 3, 151, 207, 1, 98, 160, 1, 67, 117, 1, 41, 74, 1, 17, 31
]; };
internal static readonly byte[] DefaultCoefProbs32X32 = internal static readonly byte[] DefaultCoefProbs32x32 =
[ {
// Y plane // Y plane
// Intra // Intra
// Band 0 // Band 0
@@ -596,11 +596,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
84, 220, 246, 31, 177, 231, 2, 115, 180, 1, 79, 134, 1, 55, 77, 1, 60, 79, 84, 220, 246, 31, 177, 231, 2, 115, 180, 1, 79, 134, 1, 55, 77, 1, 60, 79,
// Band 5 // Band 5
43, 243, 240, 8, 180, 217, 1, 115, 166, 1, 84, 121, 1, 51, 67, 1, 16, 6 43, 243, 240, 8, 180, 217, 1, 115, 166, 1, 84, 121, 1, 51, 67, 1, 16, 6
]; };
public static byte[] GetBandTranslate(int txSize) public static byte[] GetBandTranslate(int txSize)
{ {
return txSize == (int)TxSize.Tx4X4 ? _coefbandTrans4X4 : _coefbandTrans8X8Plus; return txSize == (int)TxSize.Tx4x4 ? CoefbandTrans4x4 : CoefbandTrans8x8Plus;
} }
public static void CopyProbs<T>(ref T dest, ReadOnlySpan<byte> probs) where T : unmanaged public static void CopyProbs<T>(ref T dest, ReadOnlySpan<byte> probs) where T : unmanaged

View File

@@ -13,163 +13,173 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
public const int TxSizeContexts = 2; public const int TxSizeContexts = 2;
public static readonly byte[][][] KfYModeProb = public static readonly byte[][][] KfYModeProb =
[ {
[ new[]
{
// above = dc // above = dc
[137, 30, 42, 148, 151, 207, 70, 52, 91], // left = dc new byte[] { 137, 30, 42, 148, 151, 207, 70, 52, 91 }, // left = dc
[92, 45, 102, 136, 116, 180, 74, 90, 100], // left = v new byte[] { 92, 45, 102, 136, 116, 180, 74, 90, 100 }, // left = v
[73, 32, 19, 187, 222, 215, 46, 34, 100], // left = h new byte[] { 73, 32, 19, 187, 222, 215, 46, 34, 100 }, // left = h
[91, 30, 32, 116, 121, 186, 93, 86, 94], // left = d45 new byte[] { 91, 30, 32, 116, 121, 186, 93, 86, 94 }, // left = d45
[72, 35, 36, 149, 68, 206, 68, 63, 105], // left = d135 new byte[] { 72, 35, 36, 149, 68, 206, 68, 63, 105 }, // left = d135
[73, 31, 28, 138, 57, 124, 55, 122, 151], // left = d117 new byte[] { 73, 31, 28, 138, 57, 124, 55, 122, 151 }, // left = d117
[67, 23, 21, 140, 126, 197, 40, 37, 171], // left = d153 new byte[] { 67, 23, 21, 140, 126, 197, 40, 37, 171 }, // left = d153
[86, 27, 28, 128, 154, 212, 45, 43, 53], // left = d207 new byte[] { 86, 27, 28, 128, 154, 212, 45, 43, 53 }, // left = d207
[74, 32, 27, 107, 86, 160, 63, 134, 102], // left = d63 new byte[] { 74, 32, 27, 107, 86, 160, 63, 134, 102 }, // left = d63
[59, 67, 44, 140, 161, 202, 78, 67, 119] // left = tm new byte[] { 59, 67, 44, 140, 161, 202, 78, 67, 119 } // left = tm
], },
[ new[]
{
// above = v // above = v
[63, 36, 126, 146, 123, 158, 60, 90, 96], // left = dc new byte[] { 63, 36, 126, 146, 123, 158, 60, 90, 96 }, // left = dc
[43, 46, 168, 134, 107, 128, 69, 142, 92], // left = v new byte[] { 43, 46, 168, 134, 107, 128, 69, 142, 92 }, // left = v
[44, 29, 68, 159, 201, 177, 50, 57, 77], // left = h new byte[] { 44, 29, 68, 159, 201, 177, 50, 57, 77 }, // left = h
[58, 38, 76, 114, 97, 172, 78, 133, 92], // left = d45 new byte[] { 58, 38, 76, 114, 97, 172, 78, 133, 92 }, // left = d45
[46, 41, 76, 140, 63, 184, 69, 112, 57], // left = d135 new byte[] { 46, 41, 76, 140, 63, 184, 69, 112, 57 }, // left = d135
[38, 32, 85, 140, 46, 112, 54, 151, 133], // left = d117 new byte[] { 38, 32, 85, 140, 46, 112, 54, 151, 133 }, // left = d117
[39, 27, 61, 131, 110, 175, 44, 75, 136], // left = d153 new byte[] { 39, 27, 61, 131, 110, 175, 44, 75, 136 }, // left = d153
[52, 30, 74, 113, 130, 175, 51, 64, 58], // left = d207 new byte[] { 52, 30, 74, 113, 130, 175, 51, 64, 58 }, // left = d207
[47, 35, 80, 100, 74, 143, 64, 163, 74], // left = d63 new byte[] { 47, 35, 80, 100, 74, 143, 64, 163, 74 }, // left = d63
[36, 61, 116, 114, 128, 162, 80, 125, 82] // left = tm new byte[] { 36, 61, 116, 114, 128, 162, 80, 125, 82 } // left = tm
], },
[ new[]
{
// above = h // above = h
[82, 26, 26, 171, 208, 204, 44, 32, 105], // left = dc new byte[] { 82, 26, 26, 171, 208, 204, 44, 32, 105 }, // left = dc
[55, 44, 68, 166, 179, 192, 57, 57, 108], // left = v new byte[] { 55, 44, 68, 166, 179, 192, 57, 57, 108 }, // left = v
[42, 26, 11, 199, 241, 228, 23, 15, 85], // left = h new byte[] { 42, 26, 11, 199, 241, 228, 23, 15, 85 }, // left = h
[68, 42, 19, 131, 160, 199, 55, 52, 83], // left = d45 new byte[] { 68, 42, 19, 131, 160, 199, 55, 52, 83 }, // left = d45
[58, 50, 25, 139, 115, 232, 39, 52, 118], // left = d135 new byte[] { 58, 50, 25, 139, 115, 232, 39, 52, 118 }, // left = d135
[50, 35, 33, 153, 104, 162, 64, 59, 131], // left = d117 new byte[] { 50, 35, 33, 153, 104, 162, 64, 59, 131 }, // left = d117
[44, 24, 16, 150, 177, 202, 33, 19, 156], // left = d153 new byte[] { 44, 24, 16, 150, 177, 202, 33, 19, 156 }, // left = d153
[55, 27, 12, 153, 203, 218, 26, 27, 49], // left = d207 new byte[] { 55, 27, 12, 153, 203, 218, 26, 27, 49 }, // left = d207
[53, 49, 21, 110, 116, 168, 59, 80, 76], // left = d63 new byte[] { 53, 49, 21, 110, 116, 168, 59, 80, 76 }, // left = d63
[38, 72, 19, 168, 203, 212, 50, 50, 107] // left = tm new byte[] { 38, 72, 19, 168, 203, 212, 50, 50, 107 } // left = tm
], },
[ new[]
{
// above = d45 // above = d45
[103, 26, 36, 129, 132, 201, 83, 80, 93], // left = dc new byte[] { 103, 26, 36, 129, 132, 201, 83, 80, 93 }, // left = dc
[59, 38, 83, 112, 103, 162, 98, 136, 90], // left = v new byte[] { 59, 38, 83, 112, 103, 162, 98, 136, 90 }, // left = v
[62, 30, 23, 158, 200, 207, 59, 57, 50], // left = h new byte[] { 62, 30, 23, 158, 200, 207, 59, 57, 50 }, // left = h
[67, 30, 29, 84, 86, 191, 102, 91, 59], // left = d45 new byte[] { 67, 30, 29, 84, 86, 191, 102, 91, 59 }, // left = d45
[60, 32, 33, 112, 71, 220, 64, 89, 104], // left = d135 new byte[] { 60, 32, 33, 112, 71, 220, 64, 89, 104 }, // left = d135
[53, 26, 34, 130, 56, 149, 84, 120, 103], // left = d117 new byte[] { 53, 26, 34, 130, 56, 149, 84, 120, 103 }, // left = d117
[53, 21, 23, 133, 109, 210, 56, 77, 172], // left = d153 new byte[] { 53, 21, 23, 133, 109, 210, 56, 77, 172 }, // left = d153
[77, 19, 29, 112, 142, 228, 55, 66, 36], // left = d207 new byte[] { 77, 19, 29, 112, 142, 228, 55, 66, 36 }, // left = d207
[61, 29, 29, 93, 97, 165, 83, 175, 162], // left = d63 new byte[] { 61, 29, 29, 93, 97, 165, 83, 175, 162 }, // left = d63
[47, 47, 43, 114, 137, 181, 100, 99, 95] // left = tm new byte[] { 47, 47, 43, 114, 137, 181, 100, 99, 95 } // left = tm
], },
[ new[]
{
// above = d135 // above = d135
[69, 23, 29, 128, 83, 199, 46, 44, 101], // left = dc new byte[] { 69, 23, 29, 128, 83, 199, 46, 44, 101 }, // left = dc
[53, 40, 55, 139, 69, 183, 61, 80, 110], // left = v new byte[] { 53, 40, 55, 139, 69, 183, 61, 80, 110 }, // left = v
[40, 29, 19, 161, 180, 207, 43, 24, 91], // left = h new byte[] { 40, 29, 19, 161, 180, 207, 43, 24, 91 }, // left = h
[60, 34, 19, 105, 61, 198, 53, 64, 89], // left = d45 new byte[] { 60, 34, 19, 105, 61, 198, 53, 64, 89 }, // left = d45
[52, 31, 22, 158, 40, 209, 58, 62, 89], // left = d135 new byte[] { 52, 31, 22, 158, 40, 209, 58, 62, 89 }, // left = d135
[44, 31, 29, 147, 46, 158, 56, 102, 198], // left = d117 new byte[] { 44, 31, 29, 147, 46, 158, 56, 102, 198 }, // left = d117
[35, 19, 12, 135, 87, 209, 41, 45, 167], // left = d153 new byte[] { 35, 19, 12, 135, 87, 209, 41, 45, 167 }, // left = d153
[55, 25, 21, 118, 95, 215, 38, 39, 66], // left = d207 new byte[] { 55, 25, 21, 118, 95, 215, 38, 39, 66 }, // left = d207
[51, 38, 25, 113, 58, 164, 70, 93, 97], // left = d63 new byte[] { 51, 38, 25, 113, 58, 164, 70, 93, 97 }, // left = d63
[47, 54, 34, 146, 108, 203, 72, 103, 151] // left = tm new byte[] { 47, 54, 34, 146, 108, 203, 72, 103, 151 } // left = tm
], },
[ new[]
{
// above = d117 // above = d117
[64, 19, 37, 156, 66, 138, 49, 95, 133], // left = dc new byte[] { 64, 19, 37, 156, 66, 138, 49, 95, 133 }, // left = dc
[46, 27, 80, 150, 55, 124, 55, 121, 135], // left = v new byte[] { 46, 27, 80, 150, 55, 124, 55, 121, 135 }, // left = v
[36, 23, 27, 165, 149, 166, 54, 64, 118], // left = h new byte[] { 36, 23, 27, 165, 149, 166, 54, 64, 118 }, // left = h
[53, 21, 36, 131, 63, 163, 60, 109, 81], // left = d45 new byte[] { 53, 21, 36, 131, 63, 163, 60, 109, 81 }, // left = d45
[40, 26, 35, 154, 40, 185, 51, 97, 123], // left = d135 new byte[] { 40, 26, 35, 154, 40, 185, 51, 97, 123 }, // left = d135
[35, 19, 34, 179, 19, 97, 48, 129, 124], // left = d117 new byte[] { 35, 19, 34, 179, 19, 97, 48, 129, 124 }, // left = d117
[36, 20, 26, 136, 62, 164, 33, 77, 154], // left = d153 new byte[] { 36, 20, 26, 136, 62, 164, 33, 77, 154 }, // left = d153
[45, 18, 32, 130, 90, 157, 40, 79, 91], // left = d207 new byte[] { 45, 18, 32, 130, 90, 157, 40, 79, 91 }, // left = d207
[45, 26, 28, 129, 45, 129, 49, 147, 123], // left = d63 new byte[] { 45, 26, 28, 129, 45, 129, 49, 147, 123 }, // left = d63
[38, 44, 51, 136, 74, 162, 57, 97, 121] // left = tm new byte[] { 38, 44, 51, 136, 74, 162, 57, 97, 121 } // left = tm
], },
[ new[]
{
// above = d153 // above = d153
[75, 17, 22, 136, 138, 185, 32, 34, 166], // left = dc new byte[] { 75, 17, 22, 136, 138, 185, 32, 34, 166 }, // left = dc
[56, 39, 58, 133, 117, 173, 48, 53, 187], // left = v new byte[] { 56, 39, 58, 133, 117, 173, 48, 53, 187 }, // left = v
[35, 21, 12, 161, 212, 207, 20, 23, 145], // left = h new byte[] { 35, 21, 12, 161, 212, 207, 20, 23, 145 }, // left = h
[56, 29, 19, 117, 109, 181, 55, 68, 112], // left = d45 new byte[] { 56, 29, 19, 117, 109, 181, 55, 68, 112 }, // left = d45
[47, 29, 17, 153, 64, 220, 59, 51, 114], // left = d135 new byte[] { 47, 29, 17, 153, 64, 220, 59, 51, 114 }, // left = d135
[46, 16, 24, 136, 76, 147, 41, 64, 172], // left = d117 new byte[] { 46, 16, 24, 136, 76, 147, 41, 64, 172 }, // left = d117
[34, 17, 11, 108, 152, 187, 13, 15, 209], // left = d153 new byte[] { 34, 17, 11, 108, 152, 187, 13, 15, 209 }, // left = d153
[51, 24, 14, 115, 133, 209, 32, 26, 104], // left = d207 new byte[] { 51, 24, 14, 115, 133, 209, 32, 26, 104 }, // left = d207
[55, 30, 18, 122, 79, 179, 44, 88, 116], // left = d63 new byte[] { 55, 30, 18, 122, 79, 179, 44, 88, 116 }, // left = d63
[37, 49, 25, 129, 168, 164, 41, 54, 148] // left = tm new byte[] { 37, 49, 25, 129, 168, 164, 41, 54, 148 } // left = tm
], },
[ new[]
{
// above = d207 // above = d207
[82, 22, 32, 127, 143, 213, 39, 41, 70], // left = dc new byte[] { 82, 22, 32, 127, 143, 213, 39, 41, 70 }, // left = dc
[62, 44, 61, 123, 105, 189, 48, 57, 64], // left = v new byte[] { 62, 44, 61, 123, 105, 189, 48, 57, 64 }, // left = v
[47, 25, 17, 175, 222, 220, 24, 30, 86], // left = h new byte[] { 47, 25, 17, 175, 222, 220, 24, 30, 86 }, // left = h
[68, 36, 17, 106, 102, 206, 59, 74, 74], // left = d45 new byte[] { 68, 36, 17, 106, 102, 206, 59, 74, 74 }, // left = d45
[57, 39, 23, 151, 68, 216, 55, 63, 58], // left = d135 new byte[] { 57, 39, 23, 151, 68, 216, 55, 63, 58 }, // left = d135
[49, 30, 35, 141, 70, 168, 82, 40, 115], // left = d117 new byte[] { 49, 30, 35, 141, 70, 168, 82, 40, 115 }, // left = d117
[51, 25, 15, 136, 129, 202, 38, 35, 139], // left = d153 new byte[] { 51, 25, 15, 136, 129, 202, 38, 35, 139 }, // left = d153
[68, 26, 16, 111, 141, 215, 29, 28, 28], // left = d207 new byte[] { 68, 26, 16, 111, 141, 215, 29, 28, 28 }, // left = d207
[59, 39, 19, 114, 75, 180, 77, 104, 42], // left = d63 new byte[] { 59, 39, 19, 114, 75, 180, 77, 104, 42 }, // left = d63
[40, 61, 26, 126, 152, 206, 61, 59, 93] // left = tm new byte[] { 40, 61, 26, 126, 152, 206, 61, 59, 93 } // left = tm
], },
[ new[]
{
// above = d63 // above = d63
[78, 23, 39, 111, 117, 170, 74, 124, 94], // left = dc new byte[] { 78, 23, 39, 111, 117, 170, 74, 124, 94 }, // left = dc
[48, 34, 86, 101, 92, 146, 78, 179, 134], // left = v new byte[] { 48, 34, 86, 101, 92, 146, 78, 179, 134 }, // left = v
[47, 22, 24, 138, 187, 178, 68, 69, 59], // left = h new byte[] { 47, 22, 24, 138, 187, 178, 68, 69, 59 }, // left = h
[56, 25, 33, 105, 112, 187, 95, 177, 129], // left = d45 new byte[] { 56, 25, 33, 105, 112, 187, 95, 177, 129 }, // left = d45
[48, 31, 27, 114, 63, 183, 82, 116, 56], // left = d135 new byte[] { 48, 31, 27, 114, 63, 183, 82, 116, 56 }, // left = d135
[43, 28, 37, 121, 63, 123, 61, 192, 169], // left = d117 new byte[] { 43, 28, 37, 121, 63, 123, 61, 192, 169 }, // left = d117
[42, 17, 24, 109, 97, 177, 56, 76, 122], // left = d153 new byte[] { 42, 17, 24, 109, 97, 177, 56, 76, 122 }, // left = d153
[58, 18, 28, 105, 139, 182, 70, 92, 63], // left = d207 new byte[] { 58, 18, 28, 105, 139, 182, 70, 92, 63 }, // left = d207
[46, 23, 32, 74, 86, 150, 67, 183, 88], // left = d63 new byte[] { 46, 23, 32, 74, 86, 150, 67, 183, 88 }, // left = d63
[36, 38, 48, 92, 122, 165, 88, 137, 91] // left = tm new byte[] { 36, 38, 48, 92, 122, 165, 88, 137, 91 } // left = tm
], },
[ new[]
{
// above = tm // above = tm
[65, 70, 60, 155, 159, 199, 61, 60, 81], // left = dc new byte[] { 65, 70, 60, 155, 159, 199, 61, 60, 81 }, // left = dc
[44, 78, 115, 132, 119, 173, 71, 112, 93], // left = v new byte[] { 44, 78, 115, 132, 119, 173, 71, 112, 93 }, // left = v
[39, 38, 21, 184, 227, 206, 42, 32, 64], // left = h new byte[] { 39, 38, 21, 184, 227, 206, 42, 32, 64 }, // left = h
[58, 47, 36, 124, 137, 193, 80, 82, 78], // left = d45 new byte[] { 58, 47, 36, 124, 137, 193, 80, 82, 78 }, // left = d45
[49, 50, 35, 144, 95, 205, 63, 78, 59], // left = d135 new byte[] { 49, 50, 35, 144, 95, 205, 63, 78, 59 }, // left = d135
[41, 53, 52, 148, 71, 142, 65, 128, 51], // left = d117 new byte[] { 41, 53, 52, 148, 71, 142, 65, 128, 51 }, // left = d117
[40, 36, 28, 143, 143, 202, 40, 55, 137], // left = d153 new byte[] { 40, 36, 28, 143, 143, 202, 40, 55, 137 }, // left = d153
[52, 34, 29, 129, 183, 227, 42, 35, 43], // left = d207 new byte[] { 52, 34, 29, 129, 183, 227, 42, 35, 43 }, // left = d207
[42, 44, 44, 104, 105, 164, 64, 130, 80], // left = d63 new byte[] { 42, 44, 44, 104, 105, 164, 64, 130, 80 }, // left = d63
[43, 81, 53, 140, 169, 204, 68, 84, 72] // left = tm new byte[] { 43, 81, 53, 140, 169, 204, 68, 84, 72 } // left = tm
] }
]; };
public static readonly byte[][] KfUvModeProb = public static readonly byte[][] KfUvModeProb =
[ {
[144, 11, 54, 157, 195, 130, 46, 58, 108], // y = dc new byte[] { 144, 11, 54, 157, 195, 130, 46, 58, 108 }, // y = dc
[118, 15, 123, 148, 131, 101, 44, 93, 131], // y = v new byte[] { 118, 15, 123, 148, 131, 101, 44, 93, 131 }, // y = v
[113, 12, 23, 188, 226, 142, 26, 32, 125], // y = h new byte[] { 113, 12, 23, 188, 226, 142, 26, 32, 125 }, // y = h
[120, 11, 50, 123, 163, 135, 64, 77, 103], // y = d45 new byte[] { 120, 11, 50, 123, 163, 135, 64, 77, 103 }, // y = d45
[113, 9, 36, 155, 111, 157, 32, 44, 161], // y = d135 new byte[] { 113, 9, 36, 155, 111, 157, 32, 44, 161 }, // y = d135
[116, 9, 55, 176, 76, 96, 37, 61, 149], // y = d117 new byte[] { 116, 9, 55, 176, 76, 96, 37, 61, 149 }, // y = d117
[115, 9, 28, 141, 161, 167, 21, 25, 193], // y = d153 new byte[] { 115, 9, 28, 141, 161, 167, 21, 25, 193 }, // y = d153
[120, 12, 32, 145, 195, 142, 32, 38, 86], // y = d207 new byte[] { 120, 12, 32, 145, 195, 142, 32, 38, 86 }, // y = d207
[116, 12, 64, 120, 140, 125, 49, 115, 121], // y = d63 new byte[] { 116, 12, 64, 120, 140, 125, 49, 115, 121 }, // y = d63
[102, 19, 66, 162, 182, 122, 35, 59, 128] // y = tm new byte[] { 102, 19, 66, 162, 182, 122, 35, 59, 128 } // y = tm
]; };
private static readonly byte[] _defaultIfYProbs = private static readonly byte[] DefaultIfYProbs =
[ {
65, 32, 18, 144, 162, 194, 41, 51, 98, // block_size < 8x8 65, 32, 18, 144, 162, 194, 41, 51, 98, // block_size < 8x8
132, 68, 18, 165, 217, 196, 45, 40, 78, // block_size < 16x16 132, 68, 18, 165, 217, 196, 45, 40, 78, // block_size < 16x16
173, 80, 19, 176, 240, 193, 64, 35, 46, // block_size < 32x32 173, 80, 19, 176, 240, 193, 64, 35, 46, // block_size < 32x32
221, 135, 38, 194, 248, 121, 96, 85, 29 // block_size >= 32x32 221, 135, 38, 194, 248, 121, 96, 85, 29 // block_size >= 32x32
]; };
private static readonly byte[] _defaultIfUvProbs = private static readonly byte[] DefaultIfUvProbs =
[ {
120, 7, 76, 176, 208, 126, 28, 54, 103, // y = dc 120, 7, 76, 176, 208, 126, 28, 54, 103, // y = dc
48, 12, 154, 155, 139, 90, 34, 117, 119, // y = v 48, 12, 154, 155, 139, 90, 34, 117, 119, // y = v
67, 6, 25, 204, 243, 158, 13, 21, 96, // y = h 67, 6, 25, 204, 243, 158, 13, 21, 96, // y = h
@@ -180,10 +190,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
85, 5, 32, 156, 216, 148, 19, 29, 73, // y = d207 85, 5, 32, 156, 216, 148, 19, 29, 73, // y = d207
77, 7, 64, 116, 132, 122, 37, 126, 120, // y = d63 77, 7, 64, 116, 132, 122, 37, 126, 120, // y = d63
101, 21, 107, 181, 192, 103, 19, 67, 125 // y = tm 101, 21, 107, 181, 192, 103, 19, 67, 125 // y = tm
]; };
private static readonly byte[] _defaultPartitionProbs = private static readonly byte[] DefaultPartitionProbs =
[ {
// 8x8 . 4x4 // 8x8 . 4x4
199, 122, 141, // a/l both not split 199, 122, 141, // a/l both not split
147, 63, 159, // a split, l not split 147, 63, 159, // a split, l not split
@@ -204,10 +214,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
72, 16, 44, // a split, l not split 72, 16, 44, // a split, l not split
58, 32, 12, // l split, a not split 58, 32, 12, // l split, a not split
10, 7, 6 // a/l both split 10, 7, 6 // a/l both split
]; };
private static readonly byte[] _defaultInterModeProbs = private static readonly byte[] DefaultInterModeProbs =
[ {
2, 173, 34, // 0 = both zero mv 2, 173, 34, // 0 = both zero mv
7, 145, 85, // 1 = one zero mv + one a predicted mv 7, 145, 85, // 1 = one zero mv + one a predicted mv
7, 166, 63, // 2 = two predicted mvs 7, 166, 63, // 2 = two predicted mvs
@@ -215,120 +225,120 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
8, 64, 46, // 4 = two new mvs 8, 64, 46, // 4 = two new mvs
17, 81, 31, // 5 = one intra neighbour + x 17, 81, 31, // 5 = one intra neighbour + x
25, 29, 30 // 6 = two intra neighbours 25, 29, 30 // 6 = two intra neighbours
]; };
/* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */ /* Array indices are identical to previously-existing INTRAMODECONTEXTNODES. */
public static readonly sbyte[] IntraModeTree = public static readonly sbyte[] IntraModeTree =
[ {
-(int)PredictionMode.DcPred, 2, /* 0 = DC_NODE */ -(int)PredictionMode.TmPred, 4, /* 1 = TM_NODE */ -(int)PredictionMode.DcPred, 2, /* 0 = DC_NODE */ -(int)PredictionMode.TmPred, 4, /* 1 = TM_NODE */
-(int)PredictionMode.VPred, 6, /* 2 = V_NODE */ 8, 12, /* 3 = COM_NODE */ -(int)PredictionMode.HPred, -(int)PredictionMode.VPred, 6, /* 2 = V_NODE */ 8, 12, /* 3 = COM_NODE */ -(int)PredictionMode.HPred,
10, /* 4 = H_NODE */ -(int)PredictionMode.D135Pred, -(int)PredictionMode.D117Pred, /* 5 = D135_NODE */ 10, /* 4 = H_NODE */ -(int)PredictionMode.D135Pred, -(int)PredictionMode.D117Pred, /* 5 = D135_NODE */
-(int)PredictionMode.D45Pred, 14, /* 6 = D45_NODE */ -(int)PredictionMode.D63Pred, -(int)PredictionMode.D45Pred, 14, /* 6 = D45_NODE */ -(int)PredictionMode.D63Pred,
16, /* 7 = D63_NODE */ -(int)PredictionMode.D153Pred, -(int)PredictionMode.D207Pred /* 8 = D153_NODE */ 16, /* 7 = D63_NODE */ -(int)PredictionMode.D153Pred, -(int)PredictionMode.D207Pred /* 8 = D153_NODE */
]; };
public static readonly sbyte[] InterModeTree = public static readonly sbyte[] InterModeTree =
[ {
-((int)PredictionMode.ZeroMv - (int)PredictionMode.NearestMv), 2, -((int)PredictionMode.ZeroMv - (int)PredictionMode.NearestMv), 2,
-((int)PredictionMode.NearestMv - (int)PredictionMode.NearestMv), 4, -((int)PredictionMode.NearestMv - (int)PredictionMode.NearestMv), 4,
-((int)PredictionMode.NearMv - (int)PredictionMode.NearestMv), -((int)PredictionMode.NearMv - (int)PredictionMode.NearestMv),
-((int)PredictionMode.NewMv - (int)PredictionMode.NearestMv) -((int)PredictionMode.NewMv - (int)PredictionMode.NearestMv)
]; };
public static readonly sbyte[] PartitionTree = public static readonly sbyte[] PartitionTree =
[ {
-(sbyte)PartitionType.PartitionNone, 2, -(sbyte)PartitionType.PartitionHorz, 4, -(sbyte)PartitionType.PartitionNone, 2, -(sbyte)PartitionType.PartitionHorz, 4,
-(sbyte)PartitionType.PartitionVert, -(sbyte)PartitionType.PartitionSplit -(sbyte)PartitionType.PartitionVert, -(sbyte)PartitionType.PartitionSplit
]; };
public static readonly sbyte[] SwitchableInterpTree = public static readonly sbyte[] SwitchableInterpTree =
[ {
-Constants.EightTap, 2, -Constants.EightTapSmooth, -Constants.EightTapSharp -Constants.EightTap, 2, -Constants.EightTapSmooth, -Constants.EightTapSharp
]; };
private static readonly byte[] _defaultIntraInterP = [9, 102, 187, 225]; private static readonly byte[] DefaultIntraInterP = { 9, 102, 187, 225 };
private static readonly byte[] _defaultCompInterP = [239, 183, 119, 96, 41]; private static readonly byte[] DefaultCompInterP = { 239, 183, 119, 96, 41 };
private static readonly byte[] _defaultCompRefP = [50, 126, 123, 221, 226]; private static readonly byte[] DefaultCompRefP = { 50, 126, 123, 221, 226 };
private static readonly byte[] _defaultSingleRefP = [33, 16, 77, 74, 142, 142, 172, 170, 238, 247]; private static readonly byte[] DefaultSingleRefP = { 33, 16, 77, 74, 142, 142, 172, 170, 238, 247 };
private static readonly byte[] _defaultTxProbs = [3, 136, 37, 5, 52, 13, 20, 152, 15, 101, 100, 66]; private static readonly byte[] DefaultTxProbs = { 3, 136, 37, 5, 52, 13, 20, 152, 15, 101, 100, 66 };
static EntropyMode() static EntropyMode()
{ {
byte[][] kfPartitionProbs = byte[][] KfPartitionProbs =
[ {
// 8x8 . 4x4 // 8x8 . 4x4
[158, 97, 94], // a/l both not split new byte[] { 158, 97, 94 }, // a/l both not split
[93, 24, 99], // a split, l not split new byte[] { 93, 24, 99 }, // a split, l not split
[85, 119, 44], // l split, a not split new byte[] { 85, 119, 44 }, // l split, a not split
[62, 59, 67], // a/l both split new byte[] { 62, 59, 67 }, // a/l both split
// 16x16 . 8x8 // 16x16 . 8x8
[149, 53, 53], // a/l both not split new byte[] { 149, 53, 53 }, // a/l both not split
[94, 20, 48], // a split, l not split new byte[] { 94, 20, 48 }, // a split, l not split
[83, 53, 24], // l split, a not split new byte[] { 83, 53, 24 }, // l split, a not split
[52, 18, 18], // a/l both split new byte[] { 52, 18, 18 }, // a/l both split
// 32x32 . 16x16 // 32x32 . 16x16
[150, 40, 39], // a/l both not split new byte[] { 150, 40, 39 }, // a/l both not split
[78, 12, 26], // a split, l not split new byte[] { 78, 12, 26 }, // a split, l not split
[67, 33, 11], // l split, a not split new byte[] { 67, 33, 11 }, // l split, a not split
[24, 7, 5], // a/l both split new byte[] { 24, 7, 5 }, // a/l both split
// 64x64 . 32x32 // 64x64 . 32x32
[174, 35, 49], // a/l both not split new byte[] { 174, 35, 49 }, // a/l both not split
[68, 11, 27], // a split, l not split new byte[] { 68, 11, 27 }, // a split, l not split
[57, 15, 9], // l split, a not split new byte[] { 57, 15, 9 }, // l split, a not split
[12, 3, 3] // a/l both split new byte[] { 12, 3, 3 } // a/l both split
]; };
} }
private static readonly byte[] _defaultSkipProbs = [192, 128, 64]; private static readonly byte[] DefaultSkipProbs = { 192, 128, 64 };
private static readonly byte[] _defaultSwitchableInterpProb = [235, 162, 36, 255, 34, 3, 149, 144]; private static readonly byte[] DefaultSwitchableInterpProb = { 235, 162, 36, 255, 34, 3, 149, 144 };
private static void InitModeProbs(ref Vp9EntropyProbs fc) private static void InitModeProbs(ref Vp9EntropyProbs fc)
{ {
Entropy.CopyProbs(ref fc.UvModeProb, _defaultIfUvProbs); Entropy.CopyProbs(ref fc.UvModeProb, DefaultIfUvProbs);
Entropy.CopyProbs(ref fc.YModeProb, _defaultIfYProbs); Entropy.CopyProbs(ref fc.YModeProb, DefaultIfYProbs);
Entropy.CopyProbs(ref fc.SwitchableInterpProb, _defaultSwitchableInterpProb); Entropy.CopyProbs(ref fc.SwitchableInterpProb, DefaultSwitchableInterpProb);
Entropy.CopyProbs(ref fc.PartitionProb, _defaultPartitionProbs); Entropy.CopyProbs(ref fc.PartitionProb, DefaultPartitionProbs);
Entropy.CopyProbs(ref fc.IntraInterProb, _defaultIntraInterP); Entropy.CopyProbs(ref fc.IntraInterProb, DefaultIntraInterP);
Entropy.CopyProbs(ref fc.CompInterProb, _defaultCompInterP); Entropy.CopyProbs(ref fc.CompInterProb, DefaultCompInterP);
Entropy.CopyProbs(ref fc.CompRefProb, _defaultCompRefP); Entropy.CopyProbs(ref fc.CompRefProb, DefaultCompRefP);
Entropy.CopyProbs(ref fc.SingleRefProb, _defaultSingleRefP); Entropy.CopyProbs(ref fc.SingleRefProb, DefaultSingleRefP);
Entropy.CopyProbs(ref fc.Tx32x32Prob, _defaultTxProbs.AsSpan().Slice(0, 6)); Entropy.CopyProbs(ref fc.Tx32x32Prob, DefaultTxProbs.AsSpan().Slice(0, 6));
Entropy.CopyProbs(ref fc.Tx16x16Prob, _defaultTxProbs.AsSpan().Slice(6, 4)); Entropy.CopyProbs(ref fc.Tx16x16Prob, DefaultTxProbs.AsSpan().Slice(6, 4));
Entropy.CopyProbs(ref fc.Tx8x8Prob, _defaultTxProbs.AsSpan().Slice(10, 2)); Entropy.CopyProbs(ref fc.Tx8x8Prob, DefaultTxProbs.AsSpan().Slice(10, 2));
Entropy.CopyProbs(ref fc.SkipProb, _defaultSkipProbs); Entropy.CopyProbs(ref fc.SkipProb, DefaultSkipProbs);
Entropy.CopyProbs(ref fc.InterModeProb, _defaultInterModeProbs); Entropy.CopyProbs(ref fc.InterModeProb, DefaultInterModeProbs);
} }
internal static void TxCountsToBranchCounts32X32(ReadOnlySpan<uint> txCount32X32P, internal static void TxCountsToBranchCounts32x32(ReadOnlySpan<uint> txCount32x32P,
ref Array3<Array2<uint>> ct32X32P) ref Array3<Array2<uint>> ct32x32P)
{ {
ct32X32P[0][0] = txCount32X32P[(int)TxSize.Tx4X4]; ct32x32P[0][0] = txCount32x32P[(int)TxSize.Tx4x4];
ct32X32P[0][1] = txCount32X32P[(int)TxSize.Tx8X8] + txCount32X32P[(int)TxSize.Tx16X16] + ct32x32P[0][1] = txCount32x32P[(int)TxSize.Tx8x8] + txCount32x32P[(int)TxSize.Tx16x16] +
txCount32X32P[(int)TxSize.Tx32X32]; txCount32x32P[(int)TxSize.Tx32x32];
ct32X32P[1][0] = txCount32X32P[(int)TxSize.Tx8X8]; ct32x32P[1][0] = txCount32x32P[(int)TxSize.Tx8x8];
ct32X32P[1][1] = txCount32X32P[(int)TxSize.Tx16X16] + txCount32X32P[(int)TxSize.Tx32X32]; ct32x32P[1][1] = txCount32x32P[(int)TxSize.Tx16x16] + txCount32x32P[(int)TxSize.Tx32x32];
ct32X32P[2][0] = txCount32X32P[(int)TxSize.Tx16X16]; ct32x32P[2][0] = txCount32x32P[(int)TxSize.Tx16x16];
ct32X32P[2][1] = txCount32X32P[(int)TxSize.Tx32X32]; ct32x32P[2][1] = txCount32x32P[(int)TxSize.Tx32x32];
} }
internal static void TxCountsToBranchCounts16X16(ReadOnlySpan<uint> txCount16X16P, internal static void TxCountsToBranchCounts16x16(ReadOnlySpan<uint> txCount16x16P,
ref Array2<Array2<uint>> ct16X16P) ref Array2<Array2<uint>> ct16x16P)
{ {
ct16X16P[0][0] = txCount16X16P[(int)TxSize.Tx4X4]; ct16x16P[0][0] = txCount16x16P[(int)TxSize.Tx4x4];
ct16X16P[0][1] = txCount16X16P[(int)TxSize.Tx8X8] + txCount16X16P[(int)TxSize.Tx16X16]; ct16x16P[0][1] = txCount16x16P[(int)TxSize.Tx8x8] + txCount16x16P[(int)TxSize.Tx16x16];
ct16X16P[1][0] = txCount16X16P[(int)TxSize.Tx8X8]; ct16x16P[1][0] = txCount16x16P[(int)TxSize.Tx8x8];
ct16X16P[1][1] = txCount16X16P[(int)TxSize.Tx16X16]; ct16x16P[1][1] = txCount16x16P[(int)TxSize.Tx16x16];
} }
internal static void TxCountsToBranchCounts8X8(ReadOnlySpan<uint> txCount8X8P, internal static void TxCountsToBranchCounts8x8(ReadOnlySpan<uint> txCount8x8P,
ref Array1<Array2<uint>> ct8X8P) ref Array1<Array2<uint>> ct8x8P)
{ {
ct8X8P[0][0] = txCount8X8P[(int)TxSize.Tx4X4]; ct8x8P[0][0] = txCount8x8P[(int)TxSize.Tx4x4];
ct8X8P[0][1] = txCount8X8P[(int)TxSize.Tx8X8]; ct8x8P[0][1] = txCount8x8P[(int)TxSize.Tx8x8];
} }
public static unsafe void SetupPastIndependence(ref Vp9Common cm) public static unsafe void SetupPastIndependence(ref Vp9Common cm)

View File

@@ -14,22 +14,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
public static readonly sbyte[] JointTree = public static readonly sbyte[] JointTree =
[ {
-(sbyte)MvJointType.Zero, 2, -(sbyte)MvJointType.Hnzvz, 4, -(sbyte)MvJointType.Zero, 2, -(sbyte)MvJointType.Hnzvz, 4,
-(sbyte)MvJointType.Hzvnz, -(sbyte)MvJointType.Hnzvnz -(sbyte)MvJointType.Hzvnz, -(sbyte)MvJointType.Hnzvnz
]; };
public static readonly sbyte[] ClassTree = public static readonly sbyte[] ClassTree =
[ {
-(sbyte)MvClassType.Class0, 2, -(sbyte)MvClassType.Class1, 4, 6, 8, -(sbyte)MvClassType.Class2, -(sbyte)MvClassType.Class0, 2, -(sbyte)MvClassType.Class1, 4, 6, 8, -(sbyte)MvClassType.Class2,
-(sbyte)MvClassType.Class3, 10, 12, -(sbyte)MvClassType.Class4, -(sbyte)MvClassType.Class5, -(sbyte)MvClassType.Class3, 10, 12, -(sbyte)MvClassType.Class4, -(sbyte)MvClassType.Class5,
-(sbyte)MvClassType.Class6, 14, 16, 18, -(sbyte)MvClassType.Class7, -(sbyte)MvClassType.Class8, -(sbyte)MvClassType.Class6, 14, 16, 18, -(sbyte)MvClassType.Class7, -(sbyte)MvClassType.Class8,
-(sbyte)MvClassType.Class9, -(sbyte)MvClassType.Class10 -(sbyte)MvClassType.Class9, -(sbyte)MvClassType.Class10
]; };
public static readonly sbyte[] Class0Tree = [-0, -1]; public static readonly sbyte[] Class0Tree = { -0, -1 };
public static readonly sbyte[] FpTree = [-0, 2, -1, 4, -2, -3]; public static readonly sbyte[] FpTree = { -0, 2, -1, 4, -2, -3 };
private static bool JointVertical(MvJointType type) private static bool JointVertical(MvJointType type)
{ {
@@ -41,8 +41,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return type == MvJointType.Hnzvz || type == MvJointType.Hnzvnz; return type == MvJointType.Hnzvz || type == MvJointType.Hnzvnz;
} }
private static readonly byte[] _logInBase2 = private static readonly byte[] LogInBase2 =
[ {
0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 0, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6,
6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
@@ -73,7 +73,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
9, 9, 9, 9, 9, 9, 9, 9, 9, 10 9, 9, 9, 9, 9, 9, 9, 9, 9, 10
]; };
private static int ClassBase(MvClassType c) private static int ClassBase(MvClassType c)
{ {
@@ -84,7 +84,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
MvClassType c = z >= Class0Size * 4096 MvClassType c = z >= Class0Size * 4096
? MvClassType.Class10 ? MvClassType.Class10
: (MvClassType)_logInBase2[z >> 3]; : (MvClassType)LogInBase2[z >> 3];
if (!offset.IsNull) if (!offset.IsNull)
{ {
offset.Value = z - ClassBase(c); offset.Value = z - ClassBase(c);
@@ -95,18 +95,18 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
private static void IncComponent(int v, ref Vp9BackwardUpdates compCounts, int compIndex, int incr, int usehp) private static void IncComponent(int v, ref Vp9BackwardUpdates compCounts, int compIndex, int incr, int usehp)
{ {
int o = 0; int s, z, c, o = 0, d, e, f;
Debug.Assert(v != 0); /* should not be zero */ Debug.Assert(v != 0); /* should not be zero */
int s = v < 0 ? 1 : 0; s = v < 0 ? 1 : 0;
compCounts.Sign[compIndex][s] += (uint)incr; compCounts.Sign[compIndex][s] += (uint)incr;
int z = (s != 0 ? -v : v) - 1 /* magnitude - 1 */; z = (s != 0 ? -v : v) - 1; /* magnitude - 1 */
int c = (int)GetClass(z, new Ptr<int>(ref o)); c = (int)GetClass(z, new Ptr<int>(ref o));
compCounts.Classes[compIndex][c] += (uint)incr; compCounts.Classes[compIndex][c] += (uint)incr;
int d = o >> 3 /* int mv data */; d = o >> 3; /* int mv data */
int f = (o >> 1) & 3 /* fractional pel mv data */; f = (o >> 1) & 3; /* fractional pel mv data */
int e = o & 1 /* high precision mv data */; e = o & 1; /* high precision mv data */
if (c == (int)MvClassType.Class0) if (c == (int)MvClassType.Class0)
{ {
@@ -162,4 +162,4 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
public const int Upp = (1 << InUseBits) - 1; public const int Upp = (1 << InUseBits) - 1;
public const int Low = -(1 << InUseBits); public const int Low = -(1 << InUseBits);
} }
} }

View File

@@ -21,47 +21,48 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
ref VpxCodecFrameBuffer fb) ref VpxCodecFrameBuffer fb)
{ {
int i; int i;
if (cbPriv.IsNull) Ptr<InternalFrameBufferList> intFbList = cbPriv;
if (intFbList.IsNull)
{ {
return -1; return -1;
} }
// Find a free frame buffer. // Find a free frame buffer.
for (i = 0; i < cbPriv.Value.IntFb.Length; ++i) for (i = 0; i < intFbList.Value.IntFb.Length; ++i)
{ {
if (!cbPriv.Value.IntFb[i].InUse) if (!intFbList.Value.IntFb[i].InUse)
{ {
break; break;
} }
} }
if (i == cbPriv.Value.IntFb.Length) if (i == intFbList.Value.IntFb.Length)
{ {
return -1; return -1;
} }
if ((ulong)cbPriv.Value.IntFb[i].Data.Length < minSize) if ((ulong)intFbList.Value.IntFb[i].Data.Length < minSize)
{ {
if (!cbPriv.Value.IntFb[i].Data.IsNull) if (!intFbList.Value.IntFb[i].Data.IsNull)
{ {
allocator.Free(cbPriv.Value.IntFb[i].Data); allocator.Free(intFbList.Value.IntFb[i].Data);
} }
// The data must be zeroed to fix a valgrind error from the C loop filter // The data must be zeroed to fix a valgrind error from the C loop filter
// due to access uninitialized memory in frame border. It could be // due to access uninitialized memory in frame border. It could be
// skipped if border were totally removed. // skipped if border were totally removed.
cbPriv.Value.IntFb[i].Data = allocator.Allocate<byte>((int)minSize); intFbList.Value.IntFb[i].Data = allocator.Allocate<byte>((int)minSize);
if (cbPriv.Value.IntFb[i].Data.IsNull) if (intFbList.Value.IntFb[i].Data.IsNull)
{ {
return -1; return -1;
} }
} }
fb.Data = cbPriv.Value.IntFb[i].Data; fb.Data = intFbList.Value.IntFb[i].Data;
cbPriv.Value.IntFb[i].InUse = true; intFbList.Value.IntFb[i].InUse = true;
// Set the frame buffer's private data to point at the internal frame buffer. // Set the frame buffer's private data to point at the internal frame buffer.
fb.Priv = new Ptr<InternalFrameBuffer>(ref cbPriv.Value.IntFb[i]); fb.Priv = new Ptr<InternalFrameBuffer>(ref intFbList.Value.IntFb[i]);
return 0; return 0;
} }
@@ -75,4 +76,4 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
return 0; return 0;
} }
} }
} }

View File

@@ -35,15 +35,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
private static readonly Transform2D[] _iht4 = private static readonly Transform2D[] Iht4 =
[ {
new(Idct4, Idct4), // DCT_DCT = 0 new(Idct4, Idct4), // DCT_DCT = 0
new(Iadst4, Idct4), // ADST_DCT = 1 new(Iadst4, Idct4), // ADST_DCT = 1
new(Idct4, Iadst4), // DCT_ADST = 2 new(Idct4, Iadst4), // DCT_ADST = 2
new(Iadst4, Iadst4) // ADST_ADST = 3 new(Iadst4, Iadst4) // ADST_ADST = 3
]; };
public static void Iht4X416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType) public static void Iht4x416Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType)
{ {
Span<int> output = stackalloc int[4 * 4]; Span<int> output = stackalloc int[4 * 4];
Span<int> outptr = output; Span<int> outptr = output;
@@ -53,7 +53,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
// Inverse transform row vectors // Inverse transform row vectors
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
_iht4[txType].Rows(input, outptr); Iht4[txType].Rows(input, outptr);
input = input.Slice(4); input = input.Slice(4);
outptr = outptr.Slice(4); outptr = outptr.Slice(4);
} }
@@ -66,7 +66,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
tempIn[j] = output[(j * 4) + i]; tempIn[j] = output[(j * 4) + i];
} }
_iht4[txType].Cols(tempIn, tempOut); Iht4[txType].Cols(tempIn, tempOut);
for (int j = 0; j < 4; ++j) for (int j = 0; j < 4; ++j)
{ {
dest[(j * stride) + i] = dest[(j * stride) + i] =
@@ -75,21 +75,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
private static readonly Transform2D[] _iht8 = private static readonly Transform2D[] Iht8 =
[ {
new(Idct8, Idct8), // DCT_DCT = 0 new(Idct8, Idct8), // DCT_DCT = 0
new(Iadst8, Idct8), // ADST_DCT = 1 new(Iadst8, Idct8), // ADST_DCT = 1
new(Idct8, Iadst8), // DCT_ADST = 2 new(Idct8, Iadst8), // DCT_ADST = 2
new(Iadst8, Iadst8) // ADST_ADST = 3 new(Iadst8, Iadst8) // ADST_ADST = 3
]; };
public static void Iht8X864Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType) public static void Iht8x864Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
Span<int> tempIn = stackalloc int[8]; Span<int> tempIn = stackalloc int[8];
Span<int> tempOut = stackalloc int[8]; Span<int> tempOut = stackalloc int[8];
Transform2D ht = _iht8[txType]; Transform2D ht = Iht8[txType];
// Inverse transform row vectors // Inverse transform row vectors
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
@@ -116,21 +116,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
private static readonly Transform2D[] _iht16 = private static readonly Transform2D[] Iht16 =
[ {
new(Idct16, Idct16), // DCT_DCT = 0 new(Idct16, Idct16), // DCT_DCT = 0
new(Iadst16, Idct16), // ADST_DCT = 1 new(Iadst16, Idct16), // ADST_DCT = 1
new(Idct16, Iadst16), // DCT_ADST = 2 new(Idct16, Iadst16), // DCT_ADST = 2
new(Iadst16, Iadst16) // ADST_ADST = 3 new(Iadst16, Iadst16) // ADST_ADST = 3
]; };
public static void Iht16X16256Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType) public static void Iht16x16256Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int txType)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
Span<int> tempIn = stackalloc int[16]; Span<int> tempIn = stackalloc int[16];
Span<int> tempOut = stackalloc int[16]; Span<int> tempOut = stackalloc int[16];
Transform2D ht = _iht16[txType]; Transform2D ht = Iht16[txType];
// Rows // Rows
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
@@ -158,31 +158,31 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
// Idct // Idct
public static void Idct4X4Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Idct4x4Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
if (eob > 1) if (eob > 1)
{ {
Idct4X416Add(input, dest, stride); Idct4x416Add(input, dest, stride);
} }
else else
{ {
Idct4X41Add(input, dest, stride); Idct4x41Add(input, dest, stride);
} }
} }
public static void Iwht4X4Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Iwht4x4Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
if (eob > 1) if (eob > 1)
{ {
Iwht4X416Add(input, dest, stride); Iwht4x416Add(input, dest, stride);
} }
else else
{ {
Iwht4X41Add(input, dest, stride); Iwht4x41Add(input, dest, stride);
} }
} }
public static void Idct8X8Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Idct8x8Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
// If dc is 1, then input[0] is the reconstructed value, do not need // If dc is 1, then input[0] is the reconstructed value, do not need
// dequantization. Also, when dc is 1, dc is counted in eobs, namely eobs >=1. // dequantization. Also, when dc is 1, dc is counted in eobs, namely eobs >=1.
@@ -192,109 +192,109 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
if (eob == 1) if (eob == 1)
{ {
// DC only DCT coefficient // DC only DCT coefficient
Idct8X81Add(input, dest, stride); Idct8x81Add(input, dest, stride);
} }
else if (eob <= 12) else if (eob <= 12)
{ {
Idct8X812Add(input, dest, stride); Idct8x812Add(input, dest, stride);
} }
else else
{ {
Idct8X864Add(input, dest, stride); Idct8x864Add(input, dest, stride);
} }
} }
public static void Idct16X16Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Idct16x16Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
/* The calculation can be simplified if there are not many non-zero dct /* The calculation can be simplified if there are not many non-zero dct
* coefficients. Use eobs to separate different cases. */ * coefficients. Use eobs to separate different cases. */
if (eob == 1) /* DC only DCT coefficient. */ if (eob == 1) /* DC only DCT coefficient. */
{ {
Idct16X161Add(input, dest, stride); Idct16x161Add(input, dest, stride);
} }
else if (eob <= 10) else if (eob <= 10)
{ {
Idct16X1610Add(input, dest, stride); Idct16x1610Add(input, dest, stride);
} }
else if (eob <= 38) else if (eob <= 38)
{ {
Idct16X1638Add(input, dest, stride); Idct16x1638Add(input, dest, stride);
} }
else else
{ {
Idct16X16256Add(input, dest, stride); Idct16x16256Add(input, dest, stride);
} }
} }
public static void Idct32X32Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Idct32x32Add(ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
if (eob == 1) if (eob == 1)
{ {
Idct32X321Add(input, dest, stride); Idct32x321Add(input, dest, stride);
} }
else if (eob <= 34) else if (eob <= 34)
{ {
// Non-zero coeff only in upper-left 8x8 // Non-zero coeff only in upper-left 8x8
Idct32X3234Add(input, dest, stride); Idct32x3234Add(input, dest, stride);
} }
else if (eob <= 135) else if (eob <= 135)
{ {
// Non-zero coeff only in upper-left 16x16 // Non-zero coeff only in upper-left 16x16
Idct32X32135Add(input, dest, stride); Idct32x32135Add(input, dest, stride);
} }
else else
{ {
Idct32X321024Add(input, dest, stride); Idct32x321024Add(input, dest, stride);
} }
} }
// Iht // Iht
public static void Iht4X4Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Iht4x4Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
Idct4X4Add(input, dest, stride, eob); Idct4x4Add(input, dest, stride, eob);
} }
else else
{ {
Iht4X416Add(input, dest, stride, (int)txType); Iht4x416Add(input, dest, stride, (int)txType);
} }
} }
public static void Iht8X8Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob) public static void Iht8x8Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest, int stride, int eob)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
Idct8X8Add(input, dest, stride, eob); Idct8x8Add(input, dest, stride, eob);
} }
else else
{ {
Iht8X864Add(input, dest, stride, (int)txType); Iht8x864Add(input, dest, stride, (int)txType);
} }
} }
public static void Iht16X16Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest, public static void Iht16x16Add(TxType txType, ReadOnlySpan<int> input, Span<byte> dest,
int stride, int eob) int stride, int eob)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
Idct16X16Add(input, dest, stride, eob); Idct16x16Add(input, dest, stride, eob);
} }
else else
{ {
Iht16X16256Add(input, dest, stride, (int)txType); Iht16x16256Add(input, dest, stride, (int)txType);
} }
} }
private static readonly HighbdTransform2D[] _highbdIht4 = private static readonly HighbdTransform2D[] HighbdIht4 =
[ {
new(HighbdIdct4, HighbdIdct4), // DCT_DCT = 0 new(HighbdIdct4, HighbdIdct4), // DCT_DCT = 0
new(HighbdIadst4, HighbdIdct4), // ADST_DCT = 1 new(HighbdIadst4, HighbdIdct4), // ADST_DCT = 1
new(HighbdIdct4, HighbdIadst4), // DCT_ADST = 2 new(HighbdIdct4, HighbdIadst4), // DCT_ADST = 2
new(HighbdIadst4, HighbdIadst4) // ADST_ADST = 3 new(HighbdIadst4, HighbdIadst4) // ADST_ADST = 3
]; };
public static void HighbdIht4X416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType, int bd) public static void HighbdIht4x416Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType, int bd)
{ {
Span<int> output = stackalloc int[4 * 4]; Span<int> output = stackalloc int[4 * 4];
Span<int> outptr = output; Span<int> outptr = output;
@@ -304,7 +304,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
// Inverse transform row vectors. // Inverse transform row vectors.
for (int i = 0; i < 4; ++i) for (int i = 0; i < 4; ++i)
{ {
_highbdIht4[txType].Rows(input, outptr, bd); HighbdIht4[txType].Rows(input, outptr, bd);
input = input.Slice(4); input = input.Slice(4);
outptr = outptr.Slice(4); outptr = outptr.Slice(4);
} }
@@ -317,7 +317,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
tempIn[j] = output[(j * 4) + i]; tempIn[j] = output[(j * 4) + i];
} }
_highbdIht4[txType].Cols(tempIn, tempOut, bd); HighbdIht4[txType].Cols(tempIn, tempOut, bd);
for (int j = 0; j < 4; ++j) for (int j = 0; j < 4; ++j)
{ {
dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i], dest[(j * stride) + i] = HighbdClipPixelAdd(dest[(j * stride) + i],
@@ -326,21 +326,21 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
private static readonly HighbdTransform2D[] _highIht8 = private static readonly HighbdTransform2D[] HighIht8 =
[ {
new(HighbdIdct8, HighbdIdct8), // DCT_DCT = 0 new(HighbdIdct8, HighbdIdct8), // DCT_DCT = 0
new(HighbdIadst8, HighbdIdct8), // ADST_DCT = 1 new(HighbdIadst8, HighbdIdct8), // ADST_DCT = 1
new(HighbdIdct8, HighbdIadst8), // DCT_ADST = 2 new(HighbdIdct8, HighbdIadst8), // DCT_ADST = 2
new(HighbdIadst8, HighbdIadst8) // ADST_ADST = 3 new(HighbdIadst8, HighbdIadst8) // ADST_ADST = 3
]; };
public static void HighbdIht8X864Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType, int bd) public static void HighbdIht8x864Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType, int bd)
{ {
Span<int> output = stackalloc int[8 * 8]; Span<int> output = stackalloc int[8 * 8];
Span<int> outptr = output; Span<int> outptr = output;
Span<int> tempIn = stackalloc int[8]; Span<int> tempIn = stackalloc int[8];
Span<int> tempOut = stackalloc int[8]; Span<int> tempOut = stackalloc int[8];
HighbdTransform2D ht = _highIht8[txType]; HighbdTransform2D ht = HighIht8[txType];
// Inverse transform row vectors. // Inverse transform row vectors.
for (int i = 0; i < 8; ++i) for (int i = 0; i < 8; ++i)
@@ -367,22 +367,22 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
} }
private static readonly HighbdTransform2D[] _highIht16 = private static readonly HighbdTransform2D[] HighIht16 =
[ {
new(HighbdIdct16, HighbdIdct16), // DCT_DCT = 0 new(HighbdIdct16, HighbdIdct16), // DCT_DCT = 0
new(HighbdIadst16, HighbdIdct16), // ADST_DCT = 1 new(HighbdIadst16, HighbdIdct16), // ADST_DCT = 1
new(HighbdIdct16, HighbdIadst16), // DCT_ADST = 2 new(HighbdIdct16, HighbdIadst16), // DCT_ADST = 2
new(HighbdIadst16, HighbdIadst16) // ADST_ADST = 3 new(HighbdIadst16, HighbdIadst16) // ADST_ADST = 3
]; };
public static void HighbdIht16X16256Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType, public static void HighbdIht16x16256Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int txType,
int bd) int bd)
{ {
Span<int> output = stackalloc int[16 * 16]; Span<int> output = stackalloc int[16 * 16];
Span<int> outptr = output; Span<int> outptr = output;
Span<int> tempIn = stackalloc int[16]; Span<int> tempIn = stackalloc int[16];
Span<int> tempOut = stackalloc int[16]; Span<int> tempOut = stackalloc int[16];
HighbdTransform2D ht = _highIht16[txType]; HighbdTransform2D ht = HighIht16[txType];
// Rows // Rows
for (int i = 0; i < 16; ++i) for (int i = 0; i < 16; ++i)
@@ -410,31 +410,31 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
// Idct // Idct
public static void HighbdIdct4X4Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd) public static void HighbdIdct4x4Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd)
{ {
if (eob > 1) if (eob > 1)
{ {
HighbdIdct4X416Add(input, dest, stride, bd); HighbdIdct4x416Add(input, dest, stride, bd);
} }
else else
{ {
HighbdIdct4X41Add(input, dest, stride, bd); HighbdIdct4x41Add(input, dest, stride, bd);
} }
} }
public static void HighbdIwht4X4Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd) public static void HighbdIwht4x4Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd)
{ {
if (eob > 1) if (eob > 1)
{ {
HighbdIwht4X416Add(input, dest, stride, bd); HighbdIwht4x416Add(input, dest, stride, bd);
} }
else else
{ {
HighbdIwht4X41Add(input, dest, stride, bd); HighbdIwht4x41Add(input, dest, stride, bd);
} }
} }
public static void HighbdIdct8X8Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd) public static void HighbdIdct8x8Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd)
{ {
// If dc is 1, then input[0] is the reconstructed value, do not need // If dc is 1, then input[0] is the reconstructed value, do not need
// dequantization. Also, when dc is 1, dc is counted in eobs, namely eobs >=1. // dequantization. Also, when dc is 1, dc is counted in eobs, namely eobs >=1.
@@ -444,99 +444,99 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
// DC only DCT coefficient // DC only DCT coefficient
if (eob == 1) if (eob == 1)
{ {
VpxHighbdidct8X81AddC(input, dest, stride, bd); VpxHighbdidct8x81AddC(input, dest, stride, bd);
} }
else if (eob <= 12) else if (eob <= 12)
{ {
HighbdIdct8X812Add(input, dest, stride, bd); HighbdIdct8x812Add(input, dest, stride, bd);
} }
else else
{ {
HighbdIdct8X864Add(input, dest, stride, bd); HighbdIdct8x864Add(input, dest, stride, bd);
} }
} }
public static void HighbdIdct16X16Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd) public static void HighbdIdct16x16Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd)
{ {
// The calculation can be simplified if there are not many non-zero dct // The calculation can be simplified if there are not many non-zero dct
// coefficients. Use eobs to separate different cases. // coefficients. Use eobs to separate different cases.
// DC only DCT coefficient. // DC only DCT coefficient.
if (eob == 1) if (eob == 1)
{ {
HighbdIdct16X161Add(input, dest, stride, bd); HighbdIdct16x161Add(input, dest, stride, bd);
} }
else if (eob <= 10) else if (eob <= 10)
{ {
HighbdIdct16X1610Add(input, dest, stride, bd); HighbdIdct16x1610Add(input, dest, stride, bd);
} }
else if (eob <= 38) else if (eob <= 38)
{ {
HighbdIdct16X1638Add(input, dest, stride, bd); HighbdIdct16x1638Add(input, dest, stride, bd);
} }
else else
{ {
HighbdIdct16X16256Add(input, dest, stride, bd); HighbdIdct16x16256Add(input, dest, stride, bd);
} }
} }
public static void HighbdIdct32X32Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd) public static void HighbdIdct32x32Add(ReadOnlySpan<int> input, Span<ushort> dest, int stride, int eob, int bd)
{ {
// Non-zero coeff only in upper-left 8x8 // Non-zero coeff only in upper-left 8x8
if (eob == 1) if (eob == 1)
{ {
HighbdIdct32X321Add(input, dest, stride, bd); HighbdIdct32x321Add(input, dest, stride, bd);
} }
else if (eob <= 34) else if (eob <= 34)
{ {
HighbdIdct32X3234Add(input, dest, stride, bd); HighbdIdct32x3234Add(input, dest, stride, bd);
} }
else if (eob <= 135) else if (eob <= 135)
{ {
HighbdIdct32X32135Add(input, dest, stride, bd); HighbdIdct32x32135Add(input, dest, stride, bd);
} }
else else
{ {
HighbdIdct32X321024Add(input, dest, stride, bd); HighbdIdct32x321024Add(input, dest, stride, bd);
} }
} }
// Iht // Iht
public static void HighbdIht4X4Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride, public static void HighbdIht4x4Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride,
int eob, int bd) int eob, int bd)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
HighbdIdct4X4Add(input, dest, stride, eob, bd); HighbdIdct4x4Add(input, dest, stride, eob, bd);
} }
else else
{ {
HighbdIht4X416Add(input, dest, stride, (int)txType, bd); HighbdIht4x416Add(input, dest, stride, (int)txType, bd);
} }
} }
public static void HighbdIht8X8Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride, public static void HighbdIht8x8Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride,
int eob, int bd) int eob, int bd)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
HighbdIdct8X8Add(input, dest, stride, eob, bd); HighbdIdct8x8Add(input, dest, stride, eob, bd);
} }
else else
{ {
HighbdIht8X864Add(input, dest, stride, (int)txType, bd); HighbdIht8x864Add(input, dest, stride, (int)txType, bd);
} }
} }
public static void HighbdIht16X16Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride, public static void HighbdIht16x16Add(TxType txType, ReadOnlySpan<int> input, Span<ushort> dest, int stride,
int eob, int bd) int eob, int bd)
{ {
if (txType == TxType.DctDct) if (txType == TxType.DctDct)
{ {
HighbdIdct16X16Add(input, dest, stride, eob, bd); HighbdIdct16x16Add(input, dest, stride, eob, bd);
} }
else else
{ {
HighbdIht16X16256Add(input, dest, stride, (int)txType, bd); HighbdIht16x16256Add(input, dest, stride, (int)txType, bd);
} }
} }
} }

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -46,10 +46,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
// MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT; // MODE_MV_MAX_UPDATE_FACTOR (128) * count / MODE_MV_COUNT_SAT;
private static readonly uint[] _countToUpdateFactor = private static readonly uint[] CountToUpdateFactor =
[ {
0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, 70, 76, 83, 89, 96, 102, 108, 115, 121, 128 0, 6, 12, 19, 25, 32, 38, 44, 51, 57, 64, 70, 76, 83, 89, 96, 102, 108, 115, 121, 128
]; };
private const int ModeMvCountSat = 20; private const int ModeMvCountSat = 20;
@@ -62,7 +62,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
} }
uint count = Math.Min(den, ModeMvCountSat); uint count = Math.Min(den, ModeMvCountSat);
uint factor = _countToUpdateFactor[(int)count]; uint factor = CountToUpdateFactor[(int)count];
byte prob = GetProb(ct[0], den); byte prob = GetProb(ct[0], den);
return WeightedProb(preProb, prob, (int)factor); return WeightedProb(preProb, prob, (int)factor);
} }

View File

@@ -8,8 +8,8 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
public const int MaxQ = 255; public const int MaxQ = 255;
public const int QindexBits = 8; public const int QindexBits = 8;
private static readonly short[] _dcQlookup = private static readonly short[] DcQlookup =
[ {
4, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29, 4, 8, 8, 9, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 26, 27, 28, 29,
30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 30, 31, 32, 32, 33, 34, 35, 36, 37, 38, 38, 39, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51,
52, 53, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 70, 71, 72, 52, 53, 53, 54, 55, 56, 57, 57, 58, 59, 60, 61, 62, 62, 63, 64, 65, 66, 66, 67, 68, 69, 70, 70, 71, 72,
@@ -22,10 +22,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
447, 454, 461, 467, 475, 482, 489, 497, 505, 513, 522, 530, 539, 549, 559, 569, 579, 590, 602, 614, 626, 447, 454, 461, 467, 475, 482, 489, 497, 505, 513, 522, 530, 539, 549, 559, 569, 579, 590, 602, 614, 626,
640, 654, 668, 684, 700, 717, 736, 755, 775, 796, 819, 843, 869, 896, 925, 955, 988, 1022, 1058, 1098, 640, 654, 668, 684, 700, 717, 736, 755, 775, 796, 819, 843, 869, 896, 925, 955, 988, 1022, 1058, 1098,
1139, 1184, 1232, 1282, 1336 1139, 1184, 1232, 1282, 1336
]; };
private static readonly short[] _dcQlookup10 = private static readonly short[] DcQlookup10 =
[ {
4, 9, 10, 13, 15, 17, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 50, 53, 57, 60, 64, 68, 71, 75, 78, 82, 4, 9, 10, 13, 15, 17, 20, 22, 25, 28, 31, 34, 37, 40, 43, 47, 50, 53, 57, 60, 64, 68, 71, 75, 78, 82,
86, 90, 93, 97, 101, 105, 109, 113, 116, 120, 124, 128, 132, 136, 140, 143, 147, 151, 155, 159, 163, 86, 90, 93, 97, 101, 105, 109, 113, 116, 120, 124, 128, 132, 136, 140, 143, 147, 151, 155, 159, 163,
166, 170, 174, 178, 182, 185, 189, 193, 197, 200, 204, 208, 212, 215, 219, 223, 226, 230, 233, 237, 241, 166, 170, 174, 178, 182, 185, 189, 193, 197, 200, 204, 208, 212, 215, 219, 223, 226, 230, 233, 237, 241,
@@ -39,10 +39,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
1692, 1717, 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929, 1958, 1990, 2021, 2054, 2088, 2123, 2159, 1692, 1717, 1741, 1766, 1791, 1817, 1844, 1871, 1900, 1929, 1958, 1990, 2021, 2054, 2088, 2123, 2159,
2197, 2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561, 2616, 2675, 2737, 2802, 2871, 2944, 3020, 3102, 2197, 2236, 2276, 2319, 2363, 2410, 2458, 2508, 2561, 2616, 2675, 2737, 2802, 2871, 2944, 3020, 3102,
3188, 3280, 3375, 3478, 3586, 3702, 3823, 3953, 4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347 3188, 3280, 3375, 3478, 3586, 3702, 3823, 3953, 4089, 4236, 4394, 4559, 4737, 4929, 5130, 5347
]; };
private static readonly short[] _dcQlookup12 = private static readonly short[] DcQlookup12 =
[ {
4, 12, 18, 25, 33, 41, 50, 60, 70, 80, 91, 103, 115, 127, 140, 153, 166, 180, 194, 208, 222, 237, 251, 4, 12, 18, 25, 33, 41, 50, 60, 70, 80, 91, 103, 115, 127, 140, 153, 166, 180, 194, 208, 222, 237, 251,
266, 281, 296, 312, 327, 343, 358, 374, 390, 405, 421, 437, 453, 469, 484, 500, 516, 532, 548, 564, 580, 266, 281, 296, 312, 327, 343, 358, 374, 390, 405, 421, 437, 453, 469, 484, 500, 516, 532, 548, 564, 580,
596, 611, 627, 643, 659, 674, 690, 706, 721, 737, 752, 768, 783, 798, 814, 829, 844, 859, 874, 889, 904, 596, 611, 627, 643, 659, 674, 690, 706, 721, 737, 752, 768, 783, 798, 814, 829, 844, 859, 874, 889, 904,
@@ -58,10 +58,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
8214, 8352, 8492, 8635, 8788, 8945, 9104, 9275, 9450, 9639, 9832, 10031, 10245, 10465, 10702, 10946, 8214, 8352, 8492, 8635, 8788, 8945, 9104, 9275, 9450, 9639, 9832, 10031, 10245, 10465, 10702, 10946,
11210, 11482, 11776, 12081, 12409, 12750, 13118, 13501, 13913, 14343, 14807, 15290, 15812, 16356, 16943, 11210, 11482, 11776, 12081, 12409, 12750, 13118, 13501, 13913, 14343, 14807, 15290, 15812, 16356, 16943,
17575, 18237, 18949, 19718, 20521, 21387 17575, 18237, 18949, 19718, 20521, 21387
]; };
private static readonly short[] _acQlookup = private static readonly short[] AcQlookup =
[ {
4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 4, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
@@ -74,10 +74,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
729, 743, 757, 771, 786, 801, 816, 832, 848, 864, 881, 898, 915, 933, 951, 969, 988, 1007, 1026, 1046, 729, 743, 757, 771, 786, 801, 816, 832, 848, 864, 881, 898, 915, 933, 951, 969, 988, 1007, 1026, 1046,
1066, 1087, 1108, 1129, 1151, 1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343, 1369, 1396, 1423, 1451, 1066, 1087, 1108, 1129, 1151, 1173, 1196, 1219, 1243, 1267, 1292, 1317, 1343, 1369, 1396, 1423, 1451,
1479, 1508, 1537, 1567, 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828 1479, 1508, 1537, 1567, 1597, 1628, 1660, 1692, 1725, 1759, 1793, 1828
]; };
private static readonly short[] _acQlookup10 = private static readonly short[] AcQlookup10 =
[ {
4, 9, 11, 13, 16, 18, 21, 24, 27, 30, 33, 37, 40, 44, 48, 51, 55, 59, 63, 67, 71, 75, 79, 83, 88, 92, 4, 9, 11, 13, 16, 18, 21, 24, 27, 30, 33, 37, 40, 44, 48, 51, 55, 59, 63, 67, 71, 75, 79, 83, 88, 92,
96, 100, 105, 109, 114, 118, 122, 127, 131, 136, 140, 145, 149, 154, 158, 163, 168, 172, 177, 181, 186, 96, 100, 105, 109, 114, 118, 122, 127, 131, 136, 140, 145, 149, 154, 158, 163, 168, 172, 177, 181, 186,
190, 195, 199, 204, 208, 213, 217, 222, 226, 231, 235, 240, 244, 249, 253, 258, 262, 267, 271, 275, 280, 190, 195, 199, 204, 208, 213, 217, 222, 226, 231, 235, 240, 244, 249, 253, 258, 262, 267, 271, 275, 280,
@@ -92,10 +92,10 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
3659, 3731, 3803, 3876, 3952, 4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604, 4692, 4784, 4876, 4972, 3659, 3731, 3803, 3876, 3952, 4028, 4104, 4184, 4264, 4348, 4432, 4516, 4604, 4692, 4784, 4876, 4972,
5068, 5168, 5268, 5372, 5476, 5584, 5692, 5804, 5916, 6032, 6148, 6268, 6388, 6512, 6640, 6768, 6900, 5068, 5168, 5268, 5372, 5476, 5584, 5692, 5804, 5916, 6032, 6148, 6268, 6388, 6512, 6640, 6768, 6900,
7036, 7172, 7312 7036, 7172, 7312
]; };
private static readonly short[] _acQlookup12 = private static readonly short[] AcQlookup12 =
[ {
4, 13, 19, 27, 35, 44, 54, 64, 75, 87, 99, 112, 126, 139, 154, 168, 183, 199, 214, 230, 247, 263, 280, 4, 13, 19, 27, 35, 44, 54, 64, 75, 87, 99, 112, 126, 139, 154, 168, 183, 199, 214, 230, 247, 263, 280,
297, 314, 331, 349, 366, 384, 402, 420, 438, 456, 475, 493, 511, 530, 548, 567, 586, 604, 623, 642, 660, 297, 314, 331, 349, 366, 384, 402, 420, 438, 456, 475, 493, 511, 530, 548, 567, 586, 604, 623, 642, 660,
679, 698, 716, 735, 753, 772, 791, 809, 828, 846, 865, 884, 902, 920, 939, 957, 976, 994, 1012, 1030, 679, 698, 716, 735, 753, 772, 791, 809, 828, 846, 865, 884, 902, 920, 939, 957, 976, 994, 1012, 1030,
@@ -111,15 +111,15 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
13565, 13821, 14093, 14365, 14637, 14925, 15213, 15502, 15806, 16110, 16414, 16734, 17054, 17390, 17726, 13565, 13821, 14093, 14365, 14637, 14925, 15213, 15502, 15806, 16110, 16414, 16734, 17054, 17390, 17726,
18062, 18414, 18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486, 21902, 22334, 22766, 23214, 23662, 18062, 18414, 18766, 19134, 19502, 19886, 20270, 20670, 21070, 21486, 21902, 22334, 22766, 23214, 23662,
24126, 24590, 25070, 25551, 26047, 26559, 27071, 27599, 28143, 28687, 29247 24126, 24590, 25070, 25551, 26047, 26559, 27071, 27599, 28143, 28687, 29247
]; };
public static short DcQuant(int qindex, int delta, BitDepth bitDepth) public static short DcQuant(int qindex, int delta, BitDepth bitDepth)
{ {
switch (bitDepth) switch (bitDepth)
{ {
case BitDepth.Bits8: return _dcQlookup[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits8: return DcQlookup[Math.Clamp(qindex + delta, 0, MaxQ)];
case BitDepth.Bits10: return _dcQlookup10[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits10: return DcQlookup10[Math.Clamp(qindex + delta, 0, MaxQ)];
case BitDepth.Bits12: return _dcQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits12: return DcQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)];
default: default:
Debug.Assert(false, "bitDepth should be Bits8, Bits10 or Bits12"); Debug.Assert(false, "bitDepth should be Bits8, Bits10 or Bits12");
return -1; return -1;
@@ -130,9 +130,9 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
{ {
switch (bitDepth) switch (bitDepth)
{ {
case BitDepth.Bits8: return _acQlookup[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits8: return AcQlookup[Math.Clamp(qindex + delta, 0, MaxQ)];
case BitDepth.Bits10: return _acQlookup10[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits10: return AcQlookup10[Math.Clamp(qindex + delta, 0, MaxQ)];
case BitDepth.Bits12: return _acQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)]; case BitDepth.Bits12: return AcQlookup12[Math.Clamp(qindex + delta, 0, MaxQ)];
default: default:
Debug.Assert(false, "bitDepth should be Bits8, Bits10 or Bits12"); Debug.Assert(false, "bitDepth should be Bits8, Bits10 or Bits12");
return -1; return -1;

View File

@@ -8,7 +8,7 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
internal static class ReconIntra internal static class ReconIntra
{ {
public static readonly TxType[] IntraModeToTxTypeLookup = public static readonly TxType[] IntraModeToTxTypeLookup =
[ {
TxType.DctDct, // DC TxType.DctDct, // DC
TxType.AdstDct, // V TxType.AdstDct, // V
TxType.DctAdst, // H TxType.DctAdst, // H
@@ -19,14 +19,14 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
TxType.DctAdst, // D207 TxType.DctAdst, // D207
TxType.AdstDct, // D63 TxType.AdstDct, // D63
TxType.AdstAdst // TM TxType.AdstAdst // TM
]; };
private const int NeedLeft = 1 << 1; private const int NeedLeft = 1 << 1;
private const int NeedAbove = 1 << 2; private const int NeedAbove = 1 << 2;
private const int NeedAboveRight = 1 << 3; private const int NeedAboveRight = 1 << 3;
private static ReadOnlySpan<byte> ExtendModes => private static ReadOnlySpan<byte> ExtendModes => new byte[]
[ {
NeedAbove | NeedLeft, // DC NeedAbove | NeedLeft, // DC
NeedAbove, // V NeedAbove, // V
NeedLeft, // H NeedLeft, // H
@@ -37,103 +37,123 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
NeedLeft, // D207 NeedLeft, // D207
NeedAboveRight, // D63 NeedAboveRight, // D63
NeedLeft | NeedAbove // TM NeedLeft | NeedAbove // TM
]; };
private unsafe delegate void IntraPredFn(byte* dst, int stride, byte* above, byte* left); private unsafe delegate void IntraPredFn(byte* dst, int stride, byte* above, byte* left);
private static readonly unsafe IntraPredFn[][] _pred = private static readonly unsafe IntraPredFn[][] Pred =
[ {
[null, null, null, null], new IntraPredFn[] { null, null, null, null },
[VPredictor4X4, VPredictor8X8, VPredictor16X16, VPredictor32X32], new IntraPredFn[] { VPredictor4x4, VPredictor8x8, VPredictor16x16, VPredictor32x32 },
[HPredictor4X4, HPredictor8X8, HPredictor16X16, HPredictor32X32], new IntraPredFn[] { HPredictor4x4, HPredictor8x8, HPredictor16x16, HPredictor32x32 },
[D45Predictor4X4, D45Predictor8X8, D45Predictor16X16, D45Predictor32X32], new IntraPredFn[] { D45Predictor4x4, D45Predictor8x8, D45Predictor16x16, D45Predictor32x32 },
[D135Predictor4X4, D135Predictor8X8, D135Predictor16X16, D135Predictor32X32], new IntraPredFn[] { D135Predictor4x4, D135Predictor8x8, D135Predictor16x16, D135Predictor32x32 },
[D117Predictor4X4, D117Predictor8X8, D117Predictor16X16, D117Predictor32X32], new IntraPredFn[] { D117Predictor4x4, D117Predictor8x8, D117Predictor16x16, D117Predictor32x32 },
[D153Predictor4X4, D153Predictor8X8, D153Predictor16X16, D153Predictor32X32], new IntraPredFn[] { D153Predictor4x4, D153Predictor8x8, D153Predictor16x16, D153Predictor32x32 },
[D207Predictor4X4, D207Predictor8X8, D207Predictor16X16, D207Predictor32X32], new IntraPredFn[] { D207Predictor4x4, D207Predictor8x8, D207Predictor16x16, D207Predictor32x32 },
[D63Predictor4X4, D63Predictor8X8, D63Predictor16X16, D63Predictor32X32], new IntraPredFn[] { D63Predictor4x4, D63Predictor8x8, D63Predictor16x16, D63Predictor32x32 },
[TmPredictor4X4, TmPredictor8X8, TmPredictor16X16, TmPredictor32X32] new IntraPredFn[] { TmPredictor4x4, TmPredictor8x8, TmPredictor16x16, TmPredictor32x32 }
]; };
private static readonly unsafe IntraPredFn[][][] _dcPred = private static readonly unsafe IntraPredFn[][][] DcPred =
[ {
[ new[]
[ {
Dc128Predictor4X4, Dc128Predictor8X8, Dc128Predictor16X16, Dc128Predictor32X32 new IntraPredFn[]
], {
[ Dc128Predictor4x4, Dc128Predictor8x8, Dc128Predictor16x16, Dc128Predictor32x32
DcTopPredictor4X4, DcTopPredictor8X8, DcTopPredictor16X16, DcTopPredictor32X32 },
] new IntraPredFn[]
], {
[ DcTopPredictor4x4, DcTopPredictor8x8, DcTopPredictor16x16, DcTopPredictor32x32
[ }
DcLeftPredictor4X4, DcLeftPredictor8X8, DcLeftPredictor16X16, DcLeftPredictor32X32 },
], new[]
[DcPredictor4X4, DcPredictor8X8, DcPredictor16X16, DcPredictor32X32] {
] new IntraPredFn[]
]; {
DcLeftPredictor4x4, DcLeftPredictor8x8, DcLeftPredictor16x16, DcLeftPredictor32x32
},
new IntraPredFn[] { DcPredictor4x4, DcPredictor8x8, DcPredictor16x16, DcPredictor32x32 }
}
};
private unsafe delegate void IntraHighPredFn(ushort* dst, int stride, ushort* above, ushort* left, int bd); private unsafe delegate void IntraHighPredFn(ushort* dst, int stride, ushort* above, ushort* left, int bd);
private static readonly unsafe IntraHighPredFn[][] _predHigh = private static readonly unsafe IntraHighPredFn[][] PredHigh =
[ {
[null, null, null, null], new IntraHighPredFn[] { null, null, null, null },
[ new IntraHighPredFn[]
HighbdVPredictor4X4, HighbdVPredictor8X8, HighbdVPredictor16X16, HighbdVPredictor32X32 {
], HighbdVPredictor4x4, HighbdVPredictor8x8, HighbdVPredictor16x16, HighbdVPredictor32x32
[ },
HighbdHPredictor4X4, HighbdHPredictor8X8, HighbdHPredictor16X16, HighbdHPredictor32X32 new IntraHighPredFn[]
], {
[ HighbdHPredictor4x4, HighbdHPredictor8x8, HighbdHPredictor16x16, HighbdHPredictor32x32
HighbdD45Predictor4X4, HighbdD45Predictor8X8, HighbdD45Predictor16X16, HighbdD45Predictor32X32 },
], new IntraHighPredFn[]
[ {
HighbdD135Predictor4X4, HighbdD135Predictor8X8, HighbdD135Predictor16X16, HighbdD45Predictor4x4, HighbdD45Predictor8x8, HighbdD45Predictor16x16, HighbdD45Predictor32x32
HighbdD135Predictor32X32 },
], new IntraHighPredFn[]
[ {
HighbdD117Predictor4X4, HighbdD117Predictor8X8, HighbdD117Predictor16X16, HighbdD135Predictor4x4, HighbdD135Predictor8x8, HighbdD135Predictor16x16,
HighbdD117Predictor32X32 HighbdD135Predictor32x32
], },
[ new IntraHighPredFn[]
HighbdD153Predictor4X4, HighbdD153Predictor8X8, HighbdD153Predictor16X16, {
HighbdD153Predictor32X32 HighbdD117Predictor4x4, HighbdD117Predictor8x8, HighbdD117Predictor16x16,
], HighbdD117Predictor32x32
[ },
HighbdD207Predictor4X4, HighbdD207Predictor8X8, HighbdD207Predictor16X16, new IntraHighPredFn[]
HighbdD207Predictor32X32 {
], HighbdD153Predictor4x4, HighbdD153Predictor8x8, HighbdD153Predictor16x16,
[ HighbdD153Predictor32x32
HighbdD63Predictor4X4, HighbdD63Predictor8X8, HighbdD63Predictor16X16, HighbdD63Predictor32X32 },
], new IntraHighPredFn[]
[ {
HighbdTmPredictor4X4, HighbdTmPredictor8X8, HighbdTmPredictor16X16, HighbdTmPredictor32X32 HighbdD207Predictor4x4, HighbdD207Predictor8x8, HighbdD207Predictor16x16,
] HighbdD207Predictor32x32
]; },
new IntraHighPredFn[]
{
HighbdD63Predictor4x4, HighbdD63Predictor8x8, HighbdD63Predictor16x16, HighbdD63Predictor32x32
},
new IntraHighPredFn[]
{
HighbdTmPredictor4x4, HighbdTmPredictor8x8, HighbdTmPredictor16x16, HighbdTmPredictor32x32
}
};
private static readonly unsafe IntraHighPredFn[][][] _dcPredHigh = private static readonly unsafe IntraHighPredFn[][][] DcPredHigh =
[ {
[ new[]
[ {
HighbdDc128Predictor4X4, HighbdDc128Predictor8X8, HighbdDc128Predictor16X16, new IntraHighPredFn[]
HighbdDc128Predictor32X32 {
], HighbdDc128Predictor4x4, HighbdDc128Predictor8x8, HighbdDc128Predictor16x16,
[ HighbdDc128Predictor32x32
HighbdDcTopPredictor4X4, HighbdDcTopPredictor8X8, HighbdDcTopPredictor16X16, },
HighbdDcTopPredictor32X32 new IntraHighPredFn[]
] {
], HighbdDcTopPredictor4x4, HighbdDcTopPredictor8x8, HighbdDcTopPredictor16x16,
[ HighbdDcTopPredictor32x32
[ }
HighbdDcLeftPredictor4X4, HighbdDcLeftPredictor8X8, HighbdDcLeftPredictor16X16, },
HighbdDcLeftPredictor32X32 new[]
], {
[ new IntraHighPredFn[]
HighbdDcPredictor4X4, HighbdDcPredictor8X8, HighbdDcPredictor16X16, {
HighbdDcPredictor32X32 HighbdDcLeftPredictor4x4, HighbdDcLeftPredictor8x8, HighbdDcLeftPredictor16x16,
] HighbdDcLeftPredictor32x32
] },
]; new IntraHighPredFn[]
{
HighbdDcPredictor4x4, HighbdDcPredictor8x8, HighbdDcPredictor16x16,
HighbdDcPredictor32x32
}
}
};
private static unsafe void BuildIntraPredictorsHigh( private static unsafe void BuildIntraPredictorsHigh(
ref MacroBlockD xd, ref MacroBlockD xd,
@@ -351,11 +371,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
// Predict // Predict
if (mode == PredictionMode.DcPred) if (mode == PredictionMode.DcPred)
{ {
_dcPredHigh[leftAvailable][upAvailable][(int)txSize](dst, dstStride, constAboveRow, leftCol, xd.Bd); DcPredHigh[leftAvailable][upAvailable][(int)txSize](dst, dstStride, constAboveRow, leftCol, xd.Bd);
} }
else else
{ {
_predHigh[(int)mode][(int)txSize](dst, dstStride, constAboveRow, leftCol, xd.Bd); PredHigh[(int)mode][(int)txSize](dst, dstStride, constAboveRow, leftCol, xd.Bd);
} }
} }
@@ -568,11 +588,11 @@ namespace Ryujinx.Graphics.Nvdec.Vp9
// Predict // Predict
if (mode == PredictionMode.DcPred) if (mode == PredictionMode.DcPred)
{ {
_dcPred[leftAvailable][upAvailable][(int)txSize](dst, dstStride, constAboveRow, leftCol); DcPred[leftAvailable][upAvailable][(int)txSize](dst, dstStride, constAboveRow, leftCol);
} }
else else
{ {
_pred[(int)mode][(int)txSize](dst, dstStride, constAboveRow, leftCol); Pred[(int)mode][(int)txSize](dst, dstStride, constAboveRow, leftCol);
} }
} }

Some files were not shown because too many files have changed in this diff Show More