Compare commits
52 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9899df462b | |||
| 2ac0594179 | |||
| c050387ed1 | |||
| bf195a6001 | |||
| 100ea80254 | |||
| 8f1afd60af | |||
| 0246862149 | |||
| 9f4ea7ab67 | |||
| 8d4229e885 | |||
| 67ceae2a2e | |||
| d325019c31 | |||
| 27d8018003 | |||
| fa60e44e64 | |||
| e30f098721 | |||
| bcc59fe725 | |||
| 793ff9b8f2 | |||
| 01c34abcfa | |||
| bc323e7c18 | |||
| 159a57adb8 | |||
| 810cd610cd | |||
| 1c9452dfb7 | |||
| f237d8872c | |||
| d71f65e3b7 | |||
| a51cb04e4d | |||
| 1ade89723d | |||
| 1047b1bd9a | |||
| e90376a800 | |||
| 21272091e1 | |||
| 330c91d024 | |||
| fce18f0ccf | |||
| 3d145e2d71 | |||
| f65a9be6b4 | |||
| 92cd2b90c6 | |||
| acf425611e | |||
| 7604f9789d | |||
| cd36bdbd59 | |||
| acb551d21d | |||
| e17685f906 | |||
| ec60999e02 | |||
| 4b8b453cf8 | |||
| 5c069c7abe | |||
| b3c1b4558f | |||
| 80546108b9 | |||
| b785f93a4e | |||
| c930f6a2c8 | |||
| 147533ea45 | |||
| ce4321dcea | |||
| 41ef46b284 | |||
| cc97608bb7 | |||
| 425dbf4eb5 | |||
| 365752e128 | |||
| f297929e49 |
@@ -4,7 +4,7 @@ on: [push, pull_request]
|
||||
|
||||
jobs:
|
||||
Linux:
|
||||
runs-on: ubuntu-20.04
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
@@ -14,8 +14,7 @@ jobs:
|
||||
key: Linux
|
||||
- name: Install Packages
|
||||
run: |
|
||||
sudo add-apt-repository ppa:okirby/qt6-backports --yes
|
||||
sudo apt-get -y install cmake ninja-build libhidapi-dev libsamplerate0-dev libspeex-dev libminizip-dev libsdl2-dev libfreetype6-dev libgl1-mesa-dev libglu1-mesa-dev pkg-config zlib1g-dev binutils-dev libspeexdsp-dev qt6-base-dev libqt6svg6-dev libvulkan-dev build-essential nasm git zip appstream
|
||||
sudo apt-get -y install cmake ninja-build libhidapi-dev libsamplerate0-dev libspeex-dev libminizip-dev libsdl2-dev libfreetype6-dev libgl1-mesa-dev libglu1-mesa-dev pkg-config zlib1g-dev binutils-dev libspeexdsp-dev qt6-base-dev libqt6svg6-dev libvulkan-dev libgtk-3-dev build-essential nasm git zip appstream
|
||||
- name: Prepare Environment
|
||||
run: |
|
||||
echo "GIT_REVISION=$(git describe --tags --always)" >> $GITHUB_ENV
|
||||
|
||||
@@ -223,6 +223,9 @@ install(FILES ${MUPEN64PLUS_PLUGIN_GFX_PARALLEL}
|
||||
DESTINATION ${PLUGIN_INSTALL_PATH}/GFX
|
||||
PERMISSIONS ${LIB_PERMISSIONS}
|
||||
)
|
||||
install(FILES ${MUPEN64PLUS_PLUGIN_GFX_RT64}
|
||||
DESTINATION ${PLUGIN_INSTALL_PATH}/GFX
|
||||
)
|
||||
|
||||
if (INSTALL_DESKTOP_FILE)
|
||||
install(FILES Package/com.github.Rosalie241.RMG.desktop
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Maintainer: Rosalie Wanders <rosalie@mailbox.org>
|
||||
pkgname=rmg
|
||||
pkgver=0.6.4
|
||||
pkgver=0.6.5
|
||||
pkgrel=1
|
||||
pkgdesc="Rosalie's Mupen GUI"
|
||||
arch=('x86_64' 'aarch64')
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
Name: RMG
|
||||
Version: 0.6.4
|
||||
Version: 0.6.5
|
||||
Release: %autorelease
|
||||
Summary: Rosalie's Mupen GUI
|
||||
|
||||
|
||||
@@ -29,6 +29,23 @@
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
<releases>
|
||||
<release version="v0.6.5" date="2024-07-04" type="stable">
|
||||
<description>
|
||||
<p>Changes:</p>
|
||||
<ul>
|
||||
<li>Fix not showing an error when per-game plugin settings are invalid</li>
|
||||
<li>Fix settings dialog behavior for plugins not being the same for per-game plugin settings</li>
|
||||
<li>Add 'restore defaults' button to configuration GUI of paraLLEl and angrylion-rdp-plus</li>
|
||||
<li>Add 'OpenGL type' option to the settings dialog which allows choosing OpenGL ES</li>
|
||||
<li>Add dynamic OpenGL ES detection to angrylion-rdp-plus</li>
|
||||
<li>Improve screen size selection by making it editable in the configuration GUI of paraLLEl and angrylion-rdp-plus</li>
|
||||
<li>Improve letter casing in settings dialog, RMG-Input and RMG-Audio</li>
|
||||
<li>Improve about dialog</li>
|
||||
<li>Change 'Miscellaneous' tab name to 'General' and change position in settings dialog</li>
|
||||
<li>Update GLideN64 and SDL_GameControllerDB</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
<release version="v0.6.4" date="2024-06-25" type="stable">
|
||||
<description>
|
||||
<p>Changes:</p>
|
||||
|
||||
@@ -230,6 +230,19 @@ ExternalProject_Add(mupen64plus-video-parallel
|
||||
BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/mupen64plus-video-parallel/mupen64plus-video-parallel.${SO_EXT}
|
||||
)
|
||||
|
||||
ExternalProject_Add(mupen64plus-video-rt64
|
||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/rt64
|
||||
|
||||
INSTALL_COMMAND ""
|
||||
|
||||
BUILD_IN_SOURCE False
|
||||
BUILD_ALWAYS True
|
||||
CMAKE_ARGS ${CMAKE_CONFIGURE_ARGS} -DRT64_BUILD_PLUGIN=ON
|
||||
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/rt64
|
||||
|
||||
BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/rt64/rt64.${SO_EXT}
|
||||
)
|
||||
|
||||
if (DISCORD_RPC)
|
||||
ExternalProject_Add(discord-rpc
|
||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/discord-rpc
|
||||
@@ -326,6 +339,9 @@ set(MUPEN64PLUS_PLUGIN_GFX_GLIDEN64_DATA ${GLIDENUI_TRANSLATIONS} ${GLIDEN64_CUS
|
||||
ExternalProject_Get_property(mupen64plus-video-parallel BUILD_BYPRODUCTS)
|
||||
set(MUPEN64PLUS_PLUGIN_GFX_PARALLEL ${BUILD_BYPRODUCTS} PARENT_SCOPE)
|
||||
|
||||
ExternalProject_Get_property(mupen64plus-video-rt64 BUILD_BYPRODUCTS)
|
||||
set(MUPEN64PLUS_PLUGIN_GFX_RT64 ${BUILD_BYPRODUCTS} PARENT_SCOPE)
|
||||
|
||||
if (DISCORD_RPC)
|
||||
ExternalProject_Get_property(discord-rpc BUILD_BYPRODUCTS)
|
||||
set(DISCORD_RPC_LIB ${BUILD_BYPRODUCTS} PARENT_SCOPE)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
[subrepo]
|
||||
remote = git@github.com:/gabomdq/SDL_GameControllerDB.git
|
||||
branch = master
|
||||
commit = 74186d44bb99771860399b220cdb41db4ff67d7e
|
||||
parent = a4f993b424687730ca8128dd9ef21b09adeac61d
|
||||
commit = b1759cf84028aab89caa1c395e198c340b8dfd89
|
||||
parent = 1047b1bd9ac49f8a1291ef671eae6e57c303fdd5
|
||||
method = merge
|
||||
cmdver = 0.4.6
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
03000000830500000160000000000000,Arcade,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b4,platform:Windows,
|
||||
03000000120c0000100e000000000000,Armor 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000490b00004406000000000000,ASCII Seamic Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b9,x:b3,y:b4,platform:Windows,
|
||||
03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000869800002500000000000000,Astro C40 TR PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000a30c00002700000000000000,Astro City Mini,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
|
||||
03000000a30c00002800000000000000,Astro City Mini,a:b2,b:b1,back:b8,leftx:a3,lefty:a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
|
||||
03000000050b00000579000000000000,ASUS ROG Kunai 3,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||
@@ -124,7 +124,7 @@
|
||||
03000000c01100001352000000000000,Battalife Joystick,a:b6,b:b7,back:b2,leftshoulder:b0,leftx:a0,lefty:a1,rightshoulder:b1,start:b3,x:b4,y:b5,platform:Windows,
|
||||
030000006f0e00003201000000000000,Battlefield 4 PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000ad1b000001f9000000000000,BB 070,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||
03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000d62000002a79000000000000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000bc2000005250000000000000,Beitong G3,a:b0,b:b1,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b5,righttrigger:b9,rightx:a3,righty:a4,start:b15,x:b3,y:b4,platform:Windows,
|
||||
030000000d0500000208000000000000,Belkin Nostromo N40,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Windows,
|
||||
03000000bc2000006012000000000000,Betop 2126F,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
||||
@@ -141,8 +141,8 @@
|
||||
030000006b1400000209000000000000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000006b1400000055000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
||||
030000006b1400000103000000000000,Bigben PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,
|
||||
03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000200e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000210e000000000000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f10e000000000000,Brook PS2 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000310c000000000000,Brook Super Converter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
|
||||
03000000d81d00000b00000000000000,Buffalo BSGP1601 Series,a:b5,b:b3,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b9,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b4,y:b2,platform:Windows,
|
||||
@@ -224,7 +224,7 @@
|
||||
030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows,
|
||||
030000000d0f00001110000000000000,GameStick Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
|
||||
0300000047530000616d000000000000,GameStop,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
||||
03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000c01100000140000000000000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000b62500000100000000000000,Gametel GT004 01,a:b3,b:b0,dpdown:b10,dpleft:b9,dpright:b8,dpup:b11,leftshoulder:b4,rightshoulder:b5,start:b7,x:b1,y:b2,platform:Windows,
|
||||
030000008f0e00001411000000000000,Gamo2 Divaller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000a857000000000000,Gator Claw,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
@@ -258,7 +258,7 @@
|
||||
030000000d0f00002500000000000000,Hori Fighting Commander 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00002d00000000000000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00008400000000000000,Hori Fighting Commander 5,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00006201000000000000,Hori Fighting Commander Octa,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00006401000000000000,Hori Fighting Commander Octa,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,start:b7,x:b2,y:b3,platform:Windows,
|
||||
@@ -266,7 +266,7 @@
|
||||
030000000d0f00008600000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||
030000000d0f0000ba00000000000000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||
030000000d0f00008800000000000000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b8,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00008700000000000000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00008700000000000000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00001000000000000000,Hori Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00003200000000000000,Hori Fightstick 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f0000c000000000000000,Hori Fightstick 4,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||
@@ -276,8 +276,8 @@
|
||||
030000000d0f00002100000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00002700000000000000,Hori Fightstick V3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f0000a000000000000000,Hori Grip TAC4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b13,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f0000a500000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f0000a600000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f0000a500000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f0000a600000000000000,Hori Miku Project Diva X HD PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00000101000000000000,Hori Mini Hatsune Miku FT,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00005400000000000000,Hori Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00000900000000000000,Hori Pad 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
@@ -311,7 +311,7 @@
|
||||
030000000d0f00001300000000000000,Horipad 3W,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00005500000000000000,Horipad 4 FPS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00006e00000000000000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00006600000000000000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00006600000000000000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000000d0f00004200000000000000,Horipad A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000ad1b000001f5000000000000,Horipad EXT2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||
030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
@@ -377,22 +377,22 @@
|
||||
03000000380700006352000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700006652000000000000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700005032000000000000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700005082000000000000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700005082000000000000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008031000000000000,Mad Catz FightStick Alpha PS3 ,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000003807000038b7000000000000,Mad Catz Fightstick TE,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,
|
||||
03000000380700008433000000000000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008483000000000000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008483000000000000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008134000000000000,Mad Catz Fightstick TE2 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b7,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b4,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008184000000000000,Mad Catz Fightstick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008184000000000000,Mad Catz Fightstick TE2 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,leftstick:b10,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000380700006252000000000000,Mad Catz Micro CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008232000000000000,Mad Catz PlayStation Brawlpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008731000000000000,Mad Catz PlayStation Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000003807000056a8000000000000,Mad Catz PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700001888000000000000,Mad Catz SFIV Fightstick PS3,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
||||
03000000380700008081000000000000,Mad Catz SFV Arcade Fightstick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008081000000000000,Mad Catz SFV Arcade Fightstick Alpha PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000380700001847000000000000,Mad Catz Street Fighter 4 Xbox 360 FightStick,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b8,rightshoulder:b5,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows,
|
||||
03000000380700008034000000000000,Mad Catz TE2 PS3 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000380700008084000000000000,Mad Catz TE2 PS4 Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,
|
||||
030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,
|
||||
03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows,
|
||||
@@ -438,10 +438,10 @@
|
||||
03000000f70600000100000000000000,N64 Adaptoid,+rightx:b2,+righty:b1,-rightx:b4,-righty:b5,a:b0,b:b3,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b7,start:b8,platform:Windows,
|
||||
030000006f0e00001311000000000000,N64 Controller,+rightx:b10,+righty:b3,-rightx:b0,-righty:b11,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,platform:Windows,
|
||||
030000006b140000010c000000000000,Nacon GC 400ES,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows,
|
||||
030000006b1400001106000000000000,Nacon Revolution 3 PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000006b1400001106000000000000,Nacon Revolution 3 PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
0300000085320000170d000000000000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
0300000085320000190d000000000000,Nacon Revolution 5 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000006b140000100d000000000000,Nacon Revolution Infinity PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000006b140000100d000000000000,Nacon Revolution Infinity PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000006b140000080d000000000000,Nacon Revolution Unlimited Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000bd12000001c0000000000000,Nebular,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows,
|
||||
03000000eb0300000000000000000000,NeGcon Adapter,a:a2,b:b13,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,lefttrigger:a4,leftx:a1,righttrigger:b11,start:b3,x:a3,y:b12,platform:Windows,
|
||||
@@ -522,28 +522,28 @@
|
||||
030000008f0e00000300000000000000,PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,
|
||||
030000008f0e00001431000000000000,PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000ba2200002010000000000000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Windows,
|
||||
03000000120c00000807000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000111e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000121e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000130e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000150e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000180e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000181e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000191e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f51c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f70e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000160e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000001a1e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c00000807000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000111e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000121e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000130e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000150e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000180e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000181e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000191e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c00001e0e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000a957000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000aa57000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f21c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f31c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f41c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f51c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000f70e000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000120e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000160e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000001a1e0000120c000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000004c0500005f0e000000000000,PS5 Access Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000004c050000f20d000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
@@ -558,7 +558,7 @@
|
||||
03000000300f00001210000000000000,Qanba Joystick Plus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b2,y:b3,platform:Windows,
|
||||
03000000341a00000104000000000000,Qanba Joystick Q4RAF,a:b5,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b1,y:b2,platform:Windows,
|
||||
03000000222c00000223000000000000,Qanba Obsidian Arcade Stick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000222c00000023000000000000,Qanba Obsidian Arcade Stick PS4,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000008a2400006682000000000000,R1 Mobile Controller,a:b3,b:b1,back:b7,leftx:a0,lefty:a1,start:b6,x:b4,y:b0,platform:Windows,
|
||||
03000000086700006626000000000000,RadioShack,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b3,y:b0,platform:Windows,
|
||||
03000000ff1100004733000000000000,Ramox FPS Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b3,y:b0,platform:Windows,
|
||||
@@ -590,7 +590,7 @@
|
||||
03000000321500000003000000000000,Razer Hydra,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||
03000000f8270000bf0b000000000000,Razer Kishi,a:b6,b:b7,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b18,leftshoulder:b12,leftstick:b19,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b13,rightstick:b20,righttrigger:b15,rightx:a3,righty:a4,start:b17,x:b9,y:b10,platform:Windows,
|
||||
03000000321500000204000000000000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000321500000104000000000000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000321500000010000000000000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000321500000507000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||
03000000321500000707000000000000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||
@@ -598,7 +598,7 @@
|
||||
03000000321500000a10000000000000,Razer Raiju TE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000321500000410000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000321500000910000000000000,Razer Raiju UE,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000321500000011000000000000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000321500000009000000000000,Razer Serval,+lefty:+a2,-lefty:-a1,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,leftx:a0,rightshoulder:b5,rightstick:b9,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||
03000000921200004547000000000000,Retro Bit Sega Genesis Controller Adapter,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b6,x:b3,y:b4,platform:Windows,
|
||||
03000000790000001100000000000000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
@@ -655,7 +655,7 @@
|
||||
03000000830500006120000000000000,Sanwa Smart Grip II,a:b0,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,x:b1,y:b3,platform:Windows,
|
||||
03000000c01100000051000000000000,Satechi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows,
|
||||
030000004f04000028b3000000000000,Score A,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000952e00002577000000000000,Scuf PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000a30c00002500000000000000,Sega Genesis Mini 3B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,righttrigger:b5,start:b9,platform:Windows,
|
||||
03000000a30c00002400000000000000,Sega Mega Drive Mini 6B Controller,a:b2,b:b1,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,rightshoulder:b4,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows,
|
||||
03000000d804000086e6000000000000,Sega Multi Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,
|
||||
@@ -665,7 +665,7 @@
|
||||
03000000b40400000a01000000000000,Sega Saturn Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b3,y:b4,platform:Windows,
|
||||
030000003b07000004a1000000000000,SFX,a:b0,b:b2,back:b7,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b5,start:b8,x:b1,y:b3,platform:Windows,
|
||||
03000000f82100001900000000000000,Shogun Bros Chameleon X1,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows,
|
||||
03000000120c00001c1e000000000000,SnakeByte 4S PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c00001c1e000000000000,SnakeByte 4S PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000140300000918000000000000,SNES Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Windows,
|
||||
0300000081170000960a000000000000,SNES Controller,a:b4,b:b0,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b5,y:b1,platform:Windows,
|
||||
03000000811700009d0a000000000000,SNES Controller,a:b0,b:b4,back:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Windows,
|
||||
@@ -680,7 +680,7 @@
|
||||
03000000d11800000094000000000000,Stadia Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b11,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows,
|
||||
03000000de280000fc11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||
03000000de280000ff11000000000000,Steam Virtual Gamepad,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:-a2,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows,
|
||||
03000000120c0000160e000000000000,Steel Play Metaltech PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000120c0000160e000000000000,Steel Play Metaltech PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
03000000110100001914000000000000,SteelSeries,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftstick:b13,lefttrigger:b6,leftx:a0,lefty:a1,rightstick:b14,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||
03000000381000001214000000000000,SteelSeries Free,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows,
|
||||
03000000110100003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows,
|
||||
@@ -742,8 +742,8 @@
|
||||
03000000632500002305000000000000,USB Vibration Joystick,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows,
|
||||
03000000790000001a18000000000000,Venom,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows,
|
||||
03000000790000001b18000000000000,Venom Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000006f0e00000302000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000006f0e00000702000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000006f0e00000302000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
030000006f0e00000702000000000000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows,
|
||||
0300000034120000adbe000000000000,vJoy Device,a:b0,b:b1,back:b15,dpdown:b6,dpleft:b7,dpright:b8,dpup:b5,guide:b16,leftshoulder:b9,leftstick:b13,lefttrigger:b11,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b14,righttrigger:b12,rightx:a3,righty:a4,start:b4,x:b2,y:b3,platform:Windows,
|
||||
03000000120c0000ab57000000000000,Warrior Joypad JS083,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows,
|
||||
030000007e0500003003000000000000,Wii U Pro,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b6,leftstick:b11,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b12,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows,
|
||||
@@ -873,6 +873,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000050b00000045000031000000,ASUS Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
||||
03000000050b00000579000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b42,paddle1:b9,paddle2:b11,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,
|
||||
03000000050b00000679000000010000,ASUS ROG Kunai 3,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b23,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,
|
||||
03000000503200000110000045010000,Atari VCS Classic,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:MacOSX
|
||||
03000000503200000110000047010000,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b3,start:b2,platform:Mac OS X,
|
||||
03000000503200000210000047010000,Atari VCS Modern Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a4,rightx:a2,righty:a3,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||
030000008a3500000102000000010000,Backbone One,a:b0,b:b1,back:b16,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b17,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b15,x:b2,y:b3,platform:Mac OS X,
|
||||
@@ -882,9 +883,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000008a3500000302000000010000,Backbone One PlayStationÆ Edition,a:b0,b:b1,back:b16,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b17,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b15,x:b2,y:b3,platform:Mac OS X,
|
||||
03000000c62400001a89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b12,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b14,leftshoulder:b6,leftstick:b15,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b16,righttrigger:a4,rightx:a2,righty:a3,start:b13,x:b3,y:b4,platform:Mac OS X,
|
||||
03000000c62400001b89000000010000,BDA MOGA XP5-X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000120c0000200e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000120c0000210e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000d62000002a79000000010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000120c0000200e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000120c0000210e000000010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000008305000031b0000000000000,Cideko AK08b,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000d8140000cecf000000000000,Cthulhu,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000260900008888000088020000,Cyber Gadget GameCube Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:a5,rightx:a2,righty:a3~,start:b7,x:b2,y:b3,platform:Mac OS X,
|
||||
@@ -899,7 +900,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000ac0500001a06000002020000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||
0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X,
|
||||
03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000006f0e00000102000000000000,GameStop Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||
03000000ff1100003133000007010000,GameWare PC Control Pad,a:b2,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Mac OS X,
|
||||
030000007d0400000540000001010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
@@ -908,13 +909,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000000d0f00002d00000000100000,Hori Fighting Commander 3 Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00005f00000000000000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00005f00000000010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00005e00000000000000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00005e00000000010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00008400000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00008500000000010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000341a00000302000014010000,Hori Fighting Stick Mini,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00008800000000010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00008700000000010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00008700000000010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X,
|
||||
030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
@@ -922,7 +923,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000000d0f00000002000017010000,Hori Split Pad Fit,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00000002000015010000,Hori Switch Split Pad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f00006600000000000000,Horipad FPS Plus 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000000d0f0000c100000072050000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
@@ -945,8 +946,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000006d04000018c2000000010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000380700005032000000010000,Mad Catz PS3 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X,
|
||||
030000008f0e00001330000011010000,Mayflash Controller Adapter,a:b2,b:b4,back:b16,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b12,lefttrigger:b16,leftx:a0,lefty:a2,rightshoulder:b14,rightx:a6~,righty:a4,start:b18,x:b0,y:b6,platform:Mac OS X,
|
||||
03000000790000004318000000010000,Mayflash GameCube Adapter,a:b4,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X,
|
||||
@@ -990,10 +991,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000004c0500006802000000000000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,
|
||||
030000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,
|
||||
030000004c0500006802000072050000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Mac OS X,
|
||||
030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000a00b000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
0300004b4c0500005f0e000000010000,PS5 Access Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
@@ -1006,10 +1007,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000009b2800008000000022020000,Raphnet Wii Classic Adapter,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,guide:b10,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a3,righty:a4,start:b3,x:b0,y:b5,platform:Mac OS X,
|
||||
030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||
03000000321500000204000000010000,Razer Panthera PS3 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000321500000104000000010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000321500000104000000010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000321500000010000000010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000321500000507000001010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
03000000321500000011000000010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000321500000011000000010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000321500000009000000020000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,
|
||||
030000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,
|
||||
0300000032150000030a000000000000,Razer Wildcat,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||
@@ -1033,8 +1034,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000b40400000a01000000000000,Sega Saturn,a:b0,b:b1,back:b5,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b2,leftshoulder:b6,rightshoulder:b7,start:b8,x:b3,y:b4,platform:Mac OS X,
|
||||
030000003512000021ab000000000000,SFC30 Joystick,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X,
|
||||
0300000000f00000f100000000000000,SNES RetroPort,a:b2,b:b3,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,rightshoulder:b7,start:b6,x:b0,y:b1,platform:Mac OS X,
|
||||
030000004c050000a00b000000000000,Sony DualShock 4 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000a00b000000000000,Sony DualShock 4 Adapter,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000004c050000cc09000000000000,Sony DualShock 4 V2,a:b1,b:b2,back:b13,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
03000000d11800000094000000010000,Stadia Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Mac OS X,
|
||||
030000005e0400008e02000001000000,Steam Virtual Gamepad,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||
03000000110100002014000000000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X,
|
||||
@@ -1064,8 +1065,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X,
|
||||
03000000632500002605000000010000,Uberwith Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
03000000151900005678000010010000,Uniplay U6,a:b3,b:b6,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,leftstick:b31,lefttrigger:b21,leftx:a1,lefty:a3,rightshoulder:b19,rightstick:b33,righttrigger:b23,rightx:a4,righty:a5,start:b27,x:b11,y:b13,platform:Mac OS X,
|
||||
030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X,
|
||||
030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X,
|
||||
050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X,
|
||||
050000005769696d6f74652028313800,Wii U Pro Controller,a:b16,b:b15,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b8,leftshoulder:b19,leftstick:b23,lefttrigger:b21,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b24,righttrigger:b22,rightx:a2,righty:a3,start:b6,x:b18,y:b17,platform:Mac OS X,
|
||||
030000005e0400008e02000000000000,Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X,
|
||||
@@ -1090,6 +1091,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
030000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
030000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
030000005e040000130b000007050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
030000005e040000130b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
030000005e040000220b000017050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
03000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X,
|
||||
@@ -1109,6 +1111,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000c82d00000151000000010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000c82d00000650000011010000,8BitDo M30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
05000000c82d00005106000000010000,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b8,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000c82d00000a20000000020000,8BitDo M30 Xbox,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000c82d00002090000011010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||
05000000c82d00002090000000010000,8BitDo Micro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux,
|
||||
03000000c82d00000451000000010000,8BitDo N30,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b11,platform:Linux,
|
||||
@@ -1204,7 +1207,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000008a3500000302000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
030000008a3500000402000011010000,Backbone One,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000c62400001b89000011010000,BDA MOGA XP5X Plus,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000d62000002a79000011010000,BDA PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000c21100000791000011010000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
||||
03000000c31100000791000011010000,Be1 GC101 Controller 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
030000005e0400008e02000003030000,Be1 GC101 Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
@@ -1212,8 +1215,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
05000000bc2000000055000001000000,Betop AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b30,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
||||
030000006b1400000209000011010000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000120c0000f70e000011010000,Brook Universal Fighting Board,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000e82000006058000001010000,Cideko AK08b,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
||||
03000000af1e00002400000010010000,Clockwork Pi DevTerm,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b9,x:b3,y:b0,platform:Linux,
|
||||
@@ -1266,13 +1269,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000000d0f00006d00000020010000,Hori EDGE 301,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:+a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000000d0f00008400000011010000,Hori Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00005f00000011010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00005e00000011010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00005e00000011010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00005001000009040000,Hori Fighting Commander OCTA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000000d0f00008500000010010000,Hori Fighting Commander PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00008600000002010000,Hori Fighting Commander Xbox 360,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||
030000000d0f00003701000013010000,Hori Fighting Stick Mini,a:b1,b:b0,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b3,y:b2,platform:Linux,
|
||||
030000000d0f00008800000011010000,Hori Fighting Stick mini 4 (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00008700000011010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00008700000011010000,Hori Fighting Stick mini 4 (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,rightstick:b11,righttrigger:a4,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00001000000011010000,Hori Fightstick 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000ad1b000003f5000033050000,Hori Fightstick VX,+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b1,back:b8,guide:b10,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b2,y:b3,platform:Linux,
|
||||
030000000d0f00004d00000011010000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
@@ -1288,7 +1291,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000000d0f00008501000017010000,Hori Split Pad Fit,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000000d0f00008501000015010000,Hori Switch Split Pad Pro,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000000d0f00006e00000011010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00006600000011010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f0000ee00000011010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f0000c100000011010000,Horipad Nintendo Switch Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000000d0f00006700000001010000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
@@ -1339,12 +1342,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
05000000380700006652000025010000,Mad Catz CTRLR,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700008532000010010000,Mad Catz Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b5,rightshoulder:b6,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700005032000011010000,Mad Catz Fightpad Pro PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700005082000011010000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700005082000011010000,Mad Catz Fightpad Pro PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000ad1b00002ef0000090040000,Mad Catz Fightpad SFxT,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,lefttrigger:a2,rightshoulder:b5,righttrigger:a5,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000380700008034000011010000,Mad Catz Fightstick PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700008084000011010000,Mad Catz Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700008084000011010000,Mad Catz Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000380700008433000011010000,Mad Catz Fightstick TE S PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700008483000011010000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700008483000011010000,Mad Catz Fightstick TE S PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000380700001888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700003888000010010000,Mad Catz Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:a0,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000380700001647000010040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
@@ -1387,6 +1390,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
050000005e040000050b000003090000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
050000005e0400008e02000030110000,Microsoft Xbox One Elite 2,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,paddle1:b11,paddle2:b13,paddle3:b12,paddle4:b14,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000005e040000120b00000b050000,Microsoft Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
060000005e040000120b000001050000,Microsoft Xbox Series X Controller,a:b0,b:b1,x:b2,y:b3,back:b6,start:b7,guide:b8,leftshoulder:b4,rightshoulder:b5,leftstick:b9,rightstick:b10,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:a2,righttrigger:a5,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,platform:Linux,
|
||||
03000000030000000300000002000000,Miroof,a:b1,b:b0,back:b6,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux,
|
||||
03000000790000001c18000010010000,Mobapad Chitu HD,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
050000004d4f435554452d3035335800,Mocute 053X,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||
@@ -1496,18 +1500,18 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
050000004c0500006802000000810000,PS3 Controller,a:b0,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
|
||||
05000000504c415953544154494f4e00,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,
|
||||
060000004c0500006802000000010000,PS3 Controller,a:b14,b:b13,back:b0,dpdown:b6,dpleft:b7,dpright:b5,dpup:b4,guide:b16,leftshoulder:b10,leftstick:b1,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b11,rightstick:b2,righttrigger:b9,rightx:a2,righty:a3,start:b3,x:b15,y:b12,platform:Linux,
|
||||
030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000004c050000a00b000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
030000004c050000a00b000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
|
||||
030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000004c050000c405000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
030000004c050000c405000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
|
||||
030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
030000004c050000cc09000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
030000004c050000cc09000011810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
|
||||
03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000c01100000140000011010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
050000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
050000004c050000c405000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
|
||||
050000004c050000c405000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
|
||||
050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
|
||||
050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux,
|
||||
0300004b4c0500005f0e000011010000,PS5 Access Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
@@ -1519,11 +1523,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux,
|
||||
03000000222c00000225000011010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000222c00000025000011010000,Qanba Dragon Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000222c00000020000011010000,Qanba Drone Arcade PS4 Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000222c00000025000011010000,Qanba Dragon Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000222c00000020000011010000,Qanba Drone Arcade PS4 Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,rightshoulder:b5,righttrigger:a4,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000300f00001210000010010000,Qanba Joystick Plus,a:b0,b:b1,back:b8,leftshoulder:b5,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b4,righttrigger:b6,start:b9,x:b2,y:b3,platform:Linux,
|
||||
03000000222c00000223000011010000,Qanba Obsidian Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000222c00000023000011010000,Qanba Obsidian Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
030000009b2800000300000001010000,Raphnet 4nes4snes,a:b0,b:b4,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b1,y:b5,platform:Linux,
|
||||
030000009b2800004200000001010000,Raphnet Dual NES Adapter,a:b0,b:b1,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b3,platform:Linux,
|
||||
0300132d9b2800006500000000000000,Raphnet GameCube Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux,
|
||||
@@ -1534,12 +1538,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000f8270000bf0b000011010000,Razer Kishi,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000321500000010000011010000,Razer Raiju,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000321500000507000000010000,Razer Raiju Mobile,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b21,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
05000000321500000a10000001000000,Razer Raiju Tournament Edition,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000321500000011000011010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
03000000321500000011000011010000,Razer Raion PS4 Fightpad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
030000008916000000fe000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000c6240000045d000024010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000c6240000045d000025010000,Razer Sabertooth,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
@@ -1587,7 +1591,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000bc2000000055000010010000,Shanwan Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
03000000f025000021c1000010010000,Shanwan Gioteck PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux,
|
||||
03000000341a00000908000010010000,SL6566,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||
050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
050000004c050000cc09000001000000,Sony DualShock 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
03000000ff000000cb01000010010000,Sony PlayStation Portable,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Linux,
|
||||
03000000250900000500000000010000,Sony PS2 pad with SmartJoy Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux,
|
||||
030000005e0400008e02000073050000,Speedlink Torid,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
@@ -1657,8 +1661,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000100800000300000010010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux,
|
||||
03000000790000000600000007010000,USB gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b3,y:b0,platform:Linux,
|
||||
03000000790000001100000000010000,USB Gamepad,a:b2,b:b1,back:b8,dpdown:a0,dpleft:a1,dpright:a2,dpup:a4,start:b9,platform:Linux,
|
||||
030000006f0e00000302000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000006f0e00000702000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux,
|
||||
030000006f0e00000302000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
030000006f0e00000702000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux,
|
||||
05000000ac0500003232000001000000,VR Box Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux,
|
||||
05000000434f4d4d414e440000000000,VX Gaming Command Series,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux,
|
||||
0000000058626f782033363020576900,Xbox 360 Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux,
|
||||
@@ -1693,7 +1697,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
030000005e040000120b000007050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000005e040000120b000009050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000005e040000120b00000d050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000005e040000120b00000f050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000005e040000120b000015050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux,
|
||||
030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
050000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
050000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux,
|
||||
@@ -1721,180 +1726,180 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
03000000120c0000101e000011010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux,
|
||||
|
||||
# Android
|
||||
38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
36666264316630653965636634386234,8BitDo Adapter 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38653964633230666463343334313533,8BitDo Adapter,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
36666264316630653965636634386234,8BitDo Adapter 2,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38426974446f20417263616465205374,8BitDo Arcade Stick,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b5,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
61393962646434393836356631636132,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
|
||||
64323139346131306233636562663738,8BitDo Arcade Stick,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,
|
||||
64643565386136613265663236636564,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
|
||||
33313433353539306634656436353432,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38426974446f20446f67626f6e65204d,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||
34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android,
|
||||
38426974446f2038426974446f204c69,8BitDo Lite,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
30643332373663313263316637356631,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f204c6974652032000000,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
62656331626461363634633735353032,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38393936616436383062666232653338,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f204c6974652053450000,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
39356430616562366466646636643435,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
61393962646434393836356631636132,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
|
||||
64323139346131306233636562663738,8BitDo Arcade Stick,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,
|
||||
64643565386136613265663236636564,8BitDo Arcade Stick,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
|
||||
33313433353539306634656436353432,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38426974446f20446f67626f6e65204d,8BitDo Dogbone,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||
34343439373236623466343934376233,8BitDo FC30 Pro,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b28,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b4,rightstick:b29,righttrigger:b7,start:b5,x:b30,y:b2,platform:Android,
|
||||
38426974446f2038426974446f204c69,8BitDo Lite,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
30643332373663313263316637356631,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f204c6974652032000000,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
62656331626461363634633735353032,8BitDo Lite 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38393936616436383062666232653338,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f204c6974652053450000,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
39356430616562366466646636643435,8BitDo Lite SE,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
05000000c82d000006500000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a5,rightshoulder:b10,righttrigger:a4,start:b6,x:b3,y:b2,platform:Android,
|
||||
05000000c82d000051060000ffff3f00,8BitDo M30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,guide:b17,leftshoulder:b9,lefttrigger:a4,rightshoulder:b10,righttrigger:a5,start:b6,x:b3,y:b2,platform:Android,
|
||||
32323161363037623637326438643634,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android,
|
||||
38426974446f204d3330204d6f646b69,8BitDo M30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android,
|
||||
64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android,
|
||||
66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android,
|
||||
66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||
38426974446f204d6963726f2067616d,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,
|
||||
61653365323561356263373333643266,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,
|
||||
62613137616239666338343866326336,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,
|
||||
33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||
38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||
32323161363037623637326438643634,8BitDo M30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
33656266353630643966653238646264,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:a5,start:b10,x:b19,y:b2,platform:Android,
|
||||
38426974446f204d3330204d6f646b69,8BitDo M30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
39366630663062373237616566353437,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,start:b6,x:b2,y:b3,platform:Android,
|
||||
64653533313537373934323436343563,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,start:b6,x:b2,y:b3,platform:Android,
|
||||
66356438346136366337386437653934,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,start:b18,x:b19,y:b2,platform:Android,
|
||||
66393064393162303732356665666366,8BitDo M30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||
38426974446f204d6963726f2067616d,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,
|
||||
61653365323561356263373333643266,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,
|
||||
62613137616239666338343866326336,8BitDo Micro,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:a4,leftx:b0,lefty:b1,rightshoulder:b10,righttrigger:a5,rightx:b2,righty:b3,start:b6,x:b3,y:b2,platform:Android,
|
||||
33663431326134333366393233616633,8BitDo N30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||
38426974446f204e3330204d6f646b69,8BitDo N30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||
05000000c82d000015900000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
05000000c82d000065280000ffff3f00,8BitDo N30 Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38323035343766666239373834336637,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||
38426974446f204e3634204d6f646b69,8BitDo N64,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||
32363135613966656338666638666237,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35363534633333373639386466346631,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38426974446f204e454f47454f204750,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
39383963623932353561633733306334,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38323035343766666239373834336637,8BitDo N64,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||
38426974446f204e3634204d6f646b69,8BitDo N64,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,platform:Android,
|
||||
32363135613966656338666638666237,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35363534633333373639386466346631,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38426974446f204e454f47454f204750,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
39383963623932353561633733306334,8BitDo NEOGEO,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000000220000000900000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
050000002038000009000000ffff3f00,8BitDo NES30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38326536643339353865323063616339,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38426974446f2050333020636c617373,8BitDo P30,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35376664343164386333616535333434,8BitDo Pro 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,start:b10,x:b19,y:b2,platform:Android,
|
||||
38426974446f2038426974446f205072,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f2050726f203200000000,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
61333362366131643730353063616330,8BitDo Pro 2,a:b1,b:b0,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
62373739366537363166326238653463,8BitDo Pro 2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b3,y:b2,platform:Android,
|
||||
38386464613034326435626130396565,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f2038426974446f205265,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
66303230343038613365623964393766,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f20533330204d6f646b69,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
66316462353561376330346462316137,8BitDo S30,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38313433643131656262306631373166,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38326536643339353865323063616339,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38426974446f2050333020636c617373,8BitDo P30,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35376664343164386333616535333434,8BitDo Pro 2,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,start:b10,x:b19,y:b2,platform:Android,
|
||||
38426974446f2038426974446f205072,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f2050726f203200000000,8BitDo Pro 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
61333362366131643730353063616330,8BitDo Pro 2,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
62373739366537363166326238653463,8BitDo Pro 2,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b3,y:b2,platform:Android,
|
||||
38386464613034326435626130396565,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f2038426974446f205265,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
66303230343038613365623964393766,8BitDo Receiver,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f20533330204d6f646b69,8BitDo S30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
66316462353561376330346462316137,8BitDo S30,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:a4,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b9,righttrigger:b10,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
05000000c82d000000600000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
05000000c82d000000610000ffff3f00,8BitDo SF30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android,
|
||||
38426974646f20534633302050726f00,8BitDo SF30 Pro,a:b1,b:b0,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b17,platform:Android,
|
||||
61623334636338643233383735326439,8BitDo SFC30,a:b0,b:b1,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b31,start:b5,x:b30,y:b2,platform:Android,
|
||||
05000000c82d000012900000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
|
||||
05000000c82d000062280000ffff3f00,8BitDo SN30,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
|
||||
38316230613931613964356666353839,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f20534e3330204d6f646b,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38316230613931613964356666353839,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f20534e3330204d6f646b,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
05000000c82d000002600000ffff0f00,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,
|
||||
38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
|
||||
38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f20534e33302050726f2b,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
536f6e7920436f6d707574657220456e,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,
|
||||
38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
|
||||
38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38426974446f20534e33302050726f2b,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
536f6e7920436f6d707574657220456e,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
050000002028000009000000ffff3f00,8BitDo SNES30,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
050000003512000020ab000000780f00,8BitDo SNES30,a:b21,b:b20,back:b30,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b26,rightshoulder:b27,start:b31,x:b24,y:b23,platform:Android,
|
||||
33666663316164653937326237613331,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,
|
||||
38426974646f205a65726f2047616d65,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,
|
||||
05000000c82d000018900000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
|
||||
05000000c82d000030320000ffff0f00,8BitDo Zero 2,a:b1,b:b0,back:b4,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
|
||||
33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,
|
||||
63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
|
||||
63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,
|
||||
32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,
|
||||
4c696e757820342e31392e3137322077,Anbernic Gamepad,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
33663434393362303033616630346337,8BitDo Zero 2,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
34656330626361666438323266633963,8BitDo Zero 2,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,
|
||||
63396666386564393334393236386630,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
|
||||
63633435623263373466343461646430,8BitDo Zero 2,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,
|
||||
32333634613735616163326165323731,Amazon Luna Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,
|
||||
4c696e757820342e31392e3137322077,Anbernic Gamepad,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
417374726f2063697479206d696e6920,Astro City Mini,a:b23,b:b22,back:b29,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android,
|
||||
35643263313264386134376362363435,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,start:b6,platform:Android,
|
||||
32353831643566306563643065356239,Atari VCS Modern Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35643263313264386134376362363435,Atari VCS Classic Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,start:b6,platform:Android,
|
||||
32353831643566306563643065356239,Atari VCS Modern Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4f64696e20436f6e74726f6c6c657200,AYN Odin,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b14,dpright:b13,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:+a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:+a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
32303165626138343962363666346165,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
38383337343564366131323064613561,Brook Mars PS4 Controller,a:b1,b:b19,back:b17,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,
|
||||
4875694a6961204a432d573031550000,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,
|
||||
30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android,
|
||||
34313430343161653665353737323365,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,
|
||||
4875694a6961204a432d573031550000,Elecom JC-W01U,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,
|
||||
30363230653635633863366338623265,Evo VR,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftx:a0,lefty:a1,x:b2,y:b3,platform:Android,
|
||||
05000000b404000011240000dfff3f00,Flydigi Vader 2,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
05000000bc20000000550000ffff3f00,GameSir G3w,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||
05000000d6020000e5890000dfff3f80,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||
66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
484f524920434f2e2c4c544420205041,Hori Gem Pad 3,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android,
|
||||
65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b18,platform:Android,
|
||||
31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
32656664353964393561366362333636,Hori Switch Split Pad Pro,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,
|
||||
66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
484f524920434f2e2c4c544420205041,Hori Gem Pad 3,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android,
|
||||
65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b18,platform:Android,
|
||||
31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
32656664353964393561366362333636,Hori Switch Split Pad Pro,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,
|
||||
48797065726b696e2050616400000000,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android,
|
||||
62333331353131353034386136626636,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android,
|
||||
31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
||||
5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
||||
31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
||||
5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
||||
0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android,
|
||||
5553422c322d6178697320382d627574,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b3,y:b2,platform:Android,
|
||||
5553422c322d6178697320382d627574,iBuffalo Super Famicom Controller,a:b1,b:b0,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,rightshoulder:b18,start:b10,x:b3,y:b2,platform:Android,
|
||||
64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android,
|
||||
532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android,
|
||||
65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android,
|
||||
33346566643039343630376565326335,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,
|
||||
35313531613435623366313835326238,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,
|
||||
4a6f792d436f6e20284c290000000000,Joy-Con (L),a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,
|
||||
38383665633039363066383334653465,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
39363561613936303237333537383931,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
4a6f792d436f6e202852290000000000,Joy-Con (R),a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android,
|
||||
64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android,
|
||||
6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android,
|
||||
436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
||||
65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
||||
37316565396364386635383230353365,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,
|
||||
4875694a696120205553422047616d65,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,
|
||||
535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,
|
||||
30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,
|
||||
39346131396233376535393665363161,Mayflash Wii U Pro Adapter,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftstick:b31,lefttrigger:b27,rightshoulder:b26,rightstick:b0,righttrigger:b28,rightx:a0,righty:a1,start:b30,x:b21,y:b24,platform:Android,
|
||||
532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android,
|
||||
65346535636333663931613264643164,Joy-Con,a:b21,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b23,y:b24,platform:Android,
|
||||
33346566643039343630376565326335,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,
|
||||
35313531613435623366313835326238,Joy-Con (L),a:b0,b:b1,back:b7,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,
|
||||
4a6f792d436f6e20284c290000000000,Joy-Con (L),a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b17,x:b19,y:b2,platform:Android,
|
||||
38383665633039363066383334653465,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
39363561613936303237333537383931,Joy-Con (R),a:b0,b:b1,back:b5,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
4a6f792d436f6e202852290000000000,Joy-Con (R),a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
39656136363638323036303865326464,JYS Aapter,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
63316564383539663166353034616434,JYS Adapter,a:b1,b:b3,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android,
|
||||
64623163333561643339623235373232,Logitech F310,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
31353762393935386662336365626334,Magic NS,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
39623565346366623931666633323530,Magic NS,a:b1,b:b3,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b0,y:b2,platform:Android,
|
||||
6d6179666c617368206c696d69746564,Mayflash GameCube Adapter,a:b22,b:b21,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a5,righty:a2,start:b30,x:b23,y:b24,platform:Android,
|
||||
436f6e74726f6c6c6572000000000000,Mayflash N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
||||
65666330633838383061313633326461,Mayflash N64 Adapter,a:b1,b:b19,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android,
|
||||
37316565396364386635383230353365,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,
|
||||
4875694a696120205553422047616d65,Mayflash Saturn Adapter,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,
|
||||
535a4d792d706f776572204c54442043,Mayflash Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b31,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,
|
||||
30653962643666303631376438373532,Mayflash Wii DolphinBar,a:b23,b:b24,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b0,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b22,platform:Android,
|
||||
39346131396233376535393665363161,Mayflash Wii U Pro Adapter,a:b22,b:b23,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,leftstick:b31,lefttrigger:b27,rightshoulder:b26,rightstick:b0,righttrigger:b28,rightx:a0,righty:a1,start:b30,x:b21,y:b24,platform:Android,
|
||||
31323564663862633234646330373138,Mega Drive,a:b23,b:b22,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,rightshoulder:b25,righttrigger:b26,start:b30,x:b24,y:b21,platform:Android,
|
||||
37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,
|
||||
64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,x:b2,y:b3,platform:Android,
|
||||
33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android,
|
||||
37333564393261653735306132613061,Mega Drive,a:b21,b:b22,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,lefttrigger:b28,rightshoulder:b27,righttrigger:b23,start:b30,x:b24,y:b25,platform:Android,
|
||||
64363363336633363736393038313464,Mega Drive,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b9,x:b2,y:b3,platform:Android,
|
||||
33323763323132376537376266393366,Microsoft Dual Strike,a:b24,b:b23,back:b25,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b29,rightshoulder:b78,rightx:a0,righty:a1~,start:b26,x:b22,y:b21,platform:Android,
|
||||
30306461613834333439303734316539,Microsoft SideWinder Pro,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b20,lefttrigger:b9,rightshoulder:b19,righttrigger:b10,start:b17,x:b2,y:b3,platform:Android,
|
||||
32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4d4f42415041442050726f2d48440000,Mobapad Chitu HD,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4d4f435554452d303533582d4d35312d,Mocute 053X,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
32386235353630393033393135613831,Microsoft Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4d4f42415041442050726f2d48440000,Mobapad Chitu HD,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4d4f435554452d303533582d4d35312d,Mocute 053X,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
33343361376163623438613466616531,Mocute M053,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
39306635663061636563316166303966,Mocute M053,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
7573622067616d657061642020202020,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Android,
|
||||
050000007e05000009200000ffff0f00,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b17,y:b2,platform:Android,
|
||||
34323437396534643531326161633738,Nintendo Switch Pro Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,misc1:b5,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
50726f20436f6e74726f6c6c65720000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b2,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,rightx:a2,righty:a3,start:b18,y:b3,platform:Android,
|
||||
36326533353166323965623661303933,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android,
|
||||
4e363420436f6e74726f6c6c65720000,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android,
|
||||
534e455320436f6e74726f6c6c657200,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
64623863346133633561626136366634,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
50726f20436f6e74726f6c6c65720000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b2,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b10,rightx:a2,righty:a3,start:b18,y:b3,platform:Android,
|
||||
36326533353166323965623661303933,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android,
|
||||
4e363420436f6e74726f6c6c65720000,NSO N64 Controller,+rightx:b17,+righty:b10,-rightx:b2,-righty:b19,a:b1,b:b0,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,righttrigger:b15,start:b18,platform:Android,
|
||||
534e455320436f6e74726f6c6c657200,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
64623863346133633561626136366634,NSO SNES Controller,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,rightshoulder:b20,start:b18,x:b19,y:b2,platform:Android,
|
||||
050000005509000003720000cf7f3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005509000010720000ffff3f00,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005509000014720000df7f3f00,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005509000014720000df7f3f80,NVIDIA Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a3,rightx:a4,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||
37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
37336435666338653565313731303834,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4e564944494120436f72706f72617469,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
61363931656135336130663561616264,NVIDIA Controller,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
39383335313438623439373538343266,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b16,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:b7,rightx:a3,righty:a4,x:b1,y:b19,platform:Android,
|
||||
4f5559412047616d6520436f6e74726f,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b6,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b19,platform:Android,
|
||||
506572666f726d616e63652044657369,PDP PS3 Rock Candy Controller,a:b1,b:b17,back:h0.2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android,
|
||||
506572666f726d616e63652044657369,PDP PS3 Rock Candy Controller,a:b1,b:b17,back:h0.2,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android,
|
||||
62653335326261303663356263626339,PlayStation Classic Controller,a:b19,b:b1,back:b17,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b3,rightshoulder:b10,righttrigger:b20,start:b18,x:b2,y:b0,platform:Android,
|
||||
536f6e7920496e746572616374697665,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
576972656c65737320436f6e74726f6c,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android,
|
||||
32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android,
|
||||
536f6e7920496e746572616374697665,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
576972656c65737320436f6e74726f6c,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android,
|
||||
32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android,
|
||||
050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
536f6e7920504c415953544154494f4e,PS3 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
61363034663839376638653463633865,PS3 Controller,a:b0,b:b1,back:b15,dpdown:a14,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
@@ -1906,89 +1911,89 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
050000004c050000c4050000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000004c050000cc090000fffe3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000004c050000cc090000ffff3f00,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
30303839663330346632363232623138,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||
31326235383662333266633463653332,PS4 Controller,a:b1,b:b16,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android,
|
||||
31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
31663838336334393132303338353963,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
34613139376634626133336530386430,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||
37626233336235343937333961353732,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
37626464343430636562316661643863,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38393161636261653636653532386639,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
63313733393535663339656564343962,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
63393662363836383439353064663939,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||
30303839663330346632363232623138,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||
31326235383662333266633463653332,PS4 Controller,a:b1,b:b16,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b17,x:b0,y:b2,platform:Android,
|
||||
31373231336561636235613666323035,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
31663838336334393132303338353963,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
34613139376634626133336530386430,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||
37626233336235343937333961353732,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
37626464343430636562316661643863,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38393161636261653636653532386639,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
63313733393535663339656564343962,PS4 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
63393662363836383439353064663939,PS4 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||
050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||
050000004c050000e60c0000fffe3f80,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a3,rightx:a4,righty:a5,start:b16,x:b0,y:b2,platform:Android,
|
||||
050000004c050000e60c0000ffff3f00,PS5 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||
37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||
61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||
64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,
|
||||
36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||
37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||
61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android,
|
||||
64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android,
|
||||
36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
05000000f8270000bf0b0000ffff3f00,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000003215000000090000bf7f3f00,Razer Serval,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,
|
||||
5a6869587520526574726f2042697420,Retro Bit Saturn Controller,a:b21,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b26,rightshoulder:b27,righttrigger:b28,start:b30,x:b23,y:b24,platform:Android,
|
||||
5a6869587520526574726f2042697420,Retro Bit Saturn Controller,a:b21,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b26,rightshoulder:b27,righttrigger:b28,start:b30,x:b23,y:b24,platform:Android,
|
||||
32417865732031314b6579732047616d,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,
|
||||
36313938306539326233393732613361,Retro Bit SNES Controller,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android,
|
||||
526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android,
|
||||
61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android,
|
||||
526574726f696420506f636b65742043,Retroid Pocket,a:b1,b:b0,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
582d426f7820436f6e74726f6c6c6572,Retroid Pocket,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b6,platform:Android,
|
||||
526574726f466c616720576972656420,Retro Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,rightshoulder:b18,start:b10,x:b2,y:b3,platform:Android,
|
||||
61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android,
|
||||
526574726f696420506f636b65742043,Retroid Pocket,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
582d426f7820436f6e74726f6c6c6572,Retroid Pocket,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b17,paddle2:b18,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,start:b6,platform:Android,
|
||||
37393234373533633333323633646531,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,
|
||||
5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android,
|
||||
526574726f5553422e636f6d20534e45,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android,
|
||||
64643037633038386238303966376137,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android,
|
||||
37656564346533643138636436356230,Rock Candy Switch Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android,
|
||||
36363537303435333566386638366333,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
53616d73756e672047616d6520506164,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
37656564346533643138636436356230,Rock Candy Switch Controller,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b7,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android,
|
||||
33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android,
|
||||
36363537303435333566386638366333,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
53616d73756e672047616d6520506164,Samsung EIGP20,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
66386565396238363534313863353065,Sanwa PlayOnline Mobile,a:b21,b:b22,back:b23,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b24,platform:Android,
|
||||
32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android,
|
||||
32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android,
|
||||
38613865396530353338373763623431,Saturn,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b10,rightshoulder:b20,righttrigger:b19,start:b17,x:b2,y:b3,platform:Android,
|
||||
61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android,
|
||||
30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
|
||||
66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,
|
||||
66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
|
||||
62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
61316232336262373631343137633631,Saturn,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android,
|
||||
30353835333338613130373363646337,SG H510,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
|
||||
66386262366536653765333235343634,SG H510,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,x:b2,y:b3,platform:Android,
|
||||
66633132393363353531373465633064,SG H510,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android,
|
||||
62653761636366393366613135366338,SN30 PP,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android,
|
||||
38376662666661636265313264613039,SNES,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,
|
||||
5346432f555342205061640000000000,SNES Adapter,a:b0,b:b1,back:b9,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b3,rightshoulder:b20,start:b10,x:b19,y:b2,platform:Android,
|
||||
5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
|
||||
63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android,
|
||||
63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android,
|
||||
476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
5553422047616d657061642000000000,SNES Controller,a:b1,b:b0,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,rightshoulder:b10,start:b6,x:b3,y:b2,platform:Android,
|
||||
63303964303462366136616266653561,Sony PSP,a:b21,b:b22,back:b27,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b23,y:b24,platform:Android,
|
||||
63376637643462343766333462383235,Sony Vita,a:b1,b:b19,back:b17,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a3,righty:a4,start:b18,x:b0,y:b2,platform:Android,
|
||||
476f6f676c65204c4c43205374616469,Stadia Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
5374616469614e3848532d6532633400,Stadia Controller,a:b0,b:b1,back:b15,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
05000000de2800000511000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android,
|
||||
05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android,
|
||||
0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android,
|
||||
0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android,
|
||||
35306436396437373135383665646464,SteelSeries Nimbus Plus,a:b0,b:b1,leftshoulder:b3,leftstick:b17,lefttrigger:b9,leftx:a0,rightshoulder:b20,rightstick:b18,righttrigger:b10,rightx:a2,x:b19,y:b2,platform:Android,
|
||||
33313930373536613937326534303931,Taito Egret II Mini Control Panel,a:b25,b:b23,back:b27,guide:b30,leftx:a0,lefty:a1,rightshoulder:b21,righttrigger:b22,start:b28,x:b29,y:b24,platform:Android,
|
||||
54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
37323236633763666465316365313236,THEC64 Joystick,a:b21,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b27,x:b23,y:b24,platform:Android,
|
||||
38346162326232346533316164363336,THEGamepad,a:b23,b:b22,back:b27,leftshoulder:b25,leftx:a0,lefty:a1,rightshoulder:b26,start:b28,x:b24,y:b21,platform:Android,
|
||||
050000004f0400000ed00000fffe3f00,ThrustMaster eSwap Pro Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android,
|
||||
30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
30386438313564306161393537333663,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,
|
||||
33333034646336346339646538643633,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,
|
||||
5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android,
|
||||
30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
31643365666432386133346639383937,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
30386438313564306161393537333663,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,
|
||||
33333034646336346339646538643633,Wii Classic Adapter,a:b23,b:b22,back:b29,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a2,righty:a3,start:b30,x:b24,y:b21,platform:Android,
|
||||
050000005e0400008e02000000783f00,Xbox 360 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
30396232393162346330326334636566,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
38313038323730383864666463383533,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
58626f782033363020576972656c6573,Xbox 360 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
58626f782033363020576972656c6573,Xbox 360 Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
65353331386662343338643939643636,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
65613532386633373963616462363038,Xbox 360 Controller,a:b0,b:b1,back:b4,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
47656e6572696320582d426f78207061,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
47656e6572696320582d426f78207061,Xbox Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
4d6963726f736f667420582d426f7820,Xbox Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
64633436313965656664373634323364,Xbox Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005e04000091020000ff073f00,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005e04000091020000ff073f80,Xbox One Controller,a:b0,b:b1,back:b4,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005e040000e00200000ffe3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android,
|
||||
@@ -1996,11 +2001,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
050000005e040000e0020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b17,y:b2,platform:Android,
|
||||
050000005e040000e0020000ffff3f80,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b4,leftshoulder:b3,leftstick:b8,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b7,righttrigger:a5,rightx:a2,righty:a3,start:b10,x:b17,y:b2,platform:Android,
|
||||
050000005e040000fd020000ffff3f00,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android,
|
||||
35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
33356661323266333733373865656366,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
34356136633366613530316338376136,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b3,leftstick:b15,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b16,righttrigger:a5,rightx:a3,righty:a4,x:b17,y:b2,platform:Android,
|
||||
35623965373264386238353433656138,Xbox One Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
36616131643361333337396261666433,Xbox One Controller,a:b0,b:b1,back:b15,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
58626f7820576972656c65737320436f,Xbox One Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005e040000000b000000783f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005e040000000b000000783f80,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005e040000050b0000ffff3f00,Xbox One Elite 2 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
@@ -2009,8 +2014,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,
|
||||
050000005e040000fd020000ff7f3f00,Xbox One S Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005e040000120b000000783f00,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005e040000120b000000783f80,Xbox Series Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000005e040000130b0000ffff3f00,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
65633038363832353634653836396239,Xbox Series Controller,a:b0,b:b1,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android,
|
||||
050000001727000044310000ffff3f00,XiaoMi Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a6,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android,
|
||||
|
||||
# iOS
|
||||
|
||||
@@ -169,6 +169,8 @@ EXPORT m64p_error CALL CoreDoCommand(m64p_command Command, int ParamInt, void *P
|
||||
{
|
||||
m64p_error rval;
|
||||
int keysym, keymod;
|
||||
int x, y;
|
||||
int left, right;
|
||||
|
||||
if (!l_CoreInit)
|
||||
return M64ERR_NOT_INIT;
|
||||
@@ -315,6 +317,20 @@ EXPORT m64p_error CALL CoreDoCommand(m64p_command Command, int ParamInt, void *P
|
||||
keymod = (ParamInt >> 16) & 0xffff;
|
||||
event_sdl_keyup(keysym, keymod);
|
||||
return M64ERR_SUCCESS;
|
||||
case M64CMD_SET_MOUSE_MOVE:
|
||||
if (!g_EmulatorRunning)
|
||||
return M64ERR_INVALID_STATE;
|
||||
x = ParamInt & 0xffff;
|
||||
y = (ParamInt >> 16) & 0xffff;
|
||||
event_mouse_move(x, y);
|
||||
return M64ERR_SUCCESS;
|
||||
case M64CMD_SET_MOUSE_BUTTON:
|
||||
if (!g_EmulatorRunning)
|
||||
return M64ERR_INVALID_STATE;
|
||||
left = ParamInt & 0xffff;
|
||||
right = (ParamInt >> 16) & 0xffff;
|
||||
event_mouse_button(left, right);
|
||||
return M64ERR_SUCCESS;
|
||||
case M64CMD_SET_FRAME_CALLBACK:
|
||||
*(void**)&g_FrameCallback = ParamPtr;
|
||||
return M64ERR_SUCCESS;
|
||||
|
||||
@@ -199,6 +199,8 @@ typedef void (*ptr_ViWidthChanged)(void);
|
||||
typedef void (*ptr_ReadScreen2)(void *dest, int *width, int *height, int front);
|
||||
typedef void (*ptr_SetRenderingCallback)(void (*callback)(int));
|
||||
typedef void (*ptr_ResizeVideoOutput)(int width, int height);
|
||||
typedef void (*ptr_MouseMove)(int x, int y);
|
||||
typedef void (*ptr_MouseButton)(int left, int right);
|
||||
#if defined(M64P_PLUGIN_PROTOTYPES)
|
||||
EXPORT void CALL ChangeWindow(void);
|
||||
EXPORT int CALL InitiateGFX(GFX_INFO Gfx_Info);
|
||||
@@ -212,6 +214,8 @@ EXPORT void CALL ViWidthChanged(void);
|
||||
EXPORT void CALL ReadScreen2(void *dest, int *width, int *height, int front);
|
||||
EXPORT void CALL SetRenderingCallback(void (*callback)(int));
|
||||
EXPORT void CALL ResizeVideoOutput(int width, int height);
|
||||
EXPORT void CALL MouseMove(int x, int y);
|
||||
EXPORT void CALL MouseButton(int left, int right);
|
||||
#endif
|
||||
|
||||
/* frame buffer plugin spec extension */
|
||||
|
||||
@@ -171,7 +171,9 @@ typedef enum {
|
||||
M64CMD_PIF_OPEN,
|
||||
M64CMD_ROM_SET_SETTINGS,
|
||||
M64CMD_DISK_OPEN,
|
||||
M64CMD_DISK_CLOSE
|
||||
M64CMD_DISK_CLOSE,
|
||||
M64CMD_SET_MOUSE_MOVE,
|
||||
M64CMD_SET_MOUSE_BUTTON,
|
||||
} m64p_command;
|
||||
|
||||
typedef struct {
|
||||
|
||||
@@ -676,8 +676,9 @@ void event_sdl_keydown(int keysym, int keymod)
|
||||
else
|
||||
#endif /* NO_KEYBINDINGS */
|
||||
{
|
||||
/* pass all other keypresses to the input plugin */
|
||||
/* pass all other keypresses to the input and graphics plugin */
|
||||
input.keyDown(keymod, keysym);
|
||||
gfx.keyDown(keymod, keysym);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -701,6 +702,23 @@ void event_sdl_keyup(int keysym, int keymod)
|
||||
#endif /* NO_KEYBINDINGS */
|
||||
{
|
||||
input.keyUp(keymod, keysym);
|
||||
gfx.keyUp(keymod, keysym);
|
||||
}
|
||||
}
|
||||
|
||||
void event_mouse_move(int x, int y)
|
||||
{
|
||||
if (gfx.mouseMove != NULL)
|
||||
{
|
||||
gfx.mouseMove(x, y);
|
||||
}
|
||||
}
|
||||
|
||||
void event_mouse_button(int left, int right)
|
||||
{
|
||||
if (gfx.mouseButton != NULL)
|
||||
{
|
||||
gfx.mouseButton(left, right);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,8 @@ extern int event_set_core_defaults(void);
|
||||
extern void event_initialize(void);
|
||||
extern void event_sdl_keydown(int keysym, int keymod);
|
||||
extern void event_sdl_keyup(int keysym, int keymod);
|
||||
extern void event_mouse_move(int x, int y);
|
||||
extern void event_mouse_button(int left, int right);
|
||||
extern int event_gameshark_active(void);
|
||||
extern void event_set_gameshark(int active);
|
||||
|
||||
|
||||
@@ -1493,6 +1493,7 @@ static void savestates_save_m64p_work(struct work_struct *work)
|
||||
{
|
||||
main_message(M64MSG_STATUS, OSD_BOTTOM_LEFT, "Could not open state file: %s", save->filepath);
|
||||
free(save->data);
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1502,6 +1503,7 @@ static void savestates_save_m64p_work(struct work_struct *work)
|
||||
main_message(M64MSG_STATUS, OSD_BOTTOM_LEFT, "Could not write data to state file: %s", save->filepath);
|
||||
gzclose(f);
|
||||
free(save->data);
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1512,6 +1514,7 @@ static void savestates_save_m64p_work(struct work_struct *work)
|
||||
free(save);
|
||||
|
||||
SDL_UnlockMutex(savestates_lock);
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, 1);
|
||||
}
|
||||
|
||||
static int savestates_save_m64p(const struct device* dev, char *filepath)
|
||||
@@ -1530,6 +1533,7 @@ static int savestates_save_m64p(const struct device* dev, char *filepath)
|
||||
save = malloc(sizeof(*save));
|
||||
if (!save) {
|
||||
main_message(M64MSG_STATUS, OSD_BOTTOM_LEFT, "Insufficient memory to save state.");
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1548,6 +1552,7 @@ static int savestates_save_m64p(const struct device* dev, char *filepath)
|
||||
free(save->filepath);
|
||||
free(save);
|
||||
main_message(M64MSG_STATUS, OSD_BOTTOM_LEFT, "Insufficient memory to save state.");
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2121,6 +2126,7 @@ static int savestates_save_pj64_zip(const struct device* dev, char *filepath)
|
||||
zipCloseFileInZip(zipfile); // This may fail, but we don't care
|
||||
zipClose(zipfile, "");
|
||||
}
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -2137,17 +2143,20 @@ static int savestates_save_pj64_unc(const struct device* dev, char *filepath)
|
||||
if (f == NULL)
|
||||
{
|
||||
main_message(M64MSG_STATUS, OSD_BOTTOM_LEFT, "Could not create PJ64 state file: %s", filepath);
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!savestates_save_pj64(dev, filepath, f, write_data_to_file))
|
||||
{
|
||||
fclose(f);
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, 0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
main_message(M64MSG_STATUS, OSD_BOTTOM_LEFT, "Saved state to: %s", namefrompath(filepath));
|
||||
fclose(f);
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, 1);
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -2177,13 +2186,14 @@ int savestates_save(void)
|
||||
case savestates_type_m64p: ret = savestates_save_m64p(dev, filepath); break;
|
||||
case savestates_type_pj64_zip: ret = savestates_save_pj64_zip(dev, filepath); break;
|
||||
case savestates_type_pj64_unc: ret = savestates_save_pj64_unc(dev, filepath); break;
|
||||
default: ret = 0; break;
|
||||
default: ret = 0; StateChanged(M64CORE_STATE_SAVECOMPLETE, ret); break;
|
||||
}
|
||||
free(filepath);
|
||||
}
|
||||
|
||||
// deliver callback to indicate completion of state saving operation
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, ret);
|
||||
else
|
||||
{
|
||||
StateChanged(M64CORE_STATE_SAVECOMPLETE, ret);
|
||||
}
|
||||
|
||||
savestates_clear_job();
|
||||
return ret;
|
||||
|
||||
@@ -62,6 +62,10 @@ static const gfx_plugin_functions dummy_gfx = {
|
||||
dummyvideo_ProcessRDPList,
|
||||
dummyvideo_RomClosed,
|
||||
dummyvideo_RomOpen,
|
||||
dummyinput_SDL_KeyDown,
|
||||
dummyinput_SDL_KeyUp,
|
||||
NULL,
|
||||
NULL,
|
||||
dummyvideo_ShowCFB,
|
||||
dummyvideo_UpdateScreen,
|
||||
dummyvideo_ViStatusChanged,
|
||||
@@ -191,6 +195,20 @@ static m64p_error plugin_connect_gfx(m64p_dynlib_handle plugin_handle)
|
||||
return M64ERR_INPUT_INVALID;
|
||||
}
|
||||
|
||||
if (!GET_FUNC(ptr_SDL_KeyDown, gfx.keyDown, "SDL_KeyDown") ||
|
||||
!GET_FUNC(ptr_SDL_KeyUp, gfx.keyUp, "SDL_KeyUp"))
|
||||
{
|
||||
gfx.keyDown = dummyinput_SDL_KeyDown;
|
||||
gfx.keyUp = dummyinput_SDL_KeyUp;
|
||||
DebugMessage(M64MSG_WARNING, "abc");
|
||||
}
|
||||
|
||||
if (!GET_FUNC(ptr_MouseMove, gfx.mouseMove, "MouseMove") ||
|
||||
!GET_FUNC(ptr_MouseButton, gfx.mouseButton, "MouseButton"))
|
||||
{
|
||||
DebugMessage(M64MSG_WARNING, "gfx plugin does not contain n64 mouse support.");
|
||||
}
|
||||
|
||||
/* set function pointers for optional functions */
|
||||
gfx.resizeVideoOutput = (ptr_ResizeVideoOutput)osal_dynlib_getproc(plugin_handle, "ResizeVideoOutput");
|
||||
|
||||
|
||||
@@ -51,6 +51,10 @@ typedef struct _gfx_plugin_functions
|
||||
ptr_ProcessRDPList processRDPList;
|
||||
ptr_RomClosed romClosed;
|
||||
ptr_RomOpen romOpen;
|
||||
ptr_SDL_KeyDown keyDown;
|
||||
ptr_SDL_KeyUp keyUp;
|
||||
ptr_MouseMove mouseMove;
|
||||
ptr_MouseButton mouseButton;
|
||||
ptr_ShowCFB showCFB;
|
||||
ptr_UpdateScreen updateScreen;
|
||||
ptr_ViStatusChanged viStatusChanged;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
[subrepo]
|
||||
remote = git@github.com:/gonetz/GLideN64.git
|
||||
branch = master
|
||||
commit = 4972e76aea6b327959d1761c786077fd96b6cb30
|
||||
parent = 8ce42a52ce5ab9e71eef061f8db04114b96e08d1
|
||||
commit = b36c4409ebe6d30e02c33a7bb3e2255fdc59b5c5
|
||||
parent = b785f93a4ed519af6d7dce1b87d1dd857c762e14
|
||||
method = merge
|
||||
cmdver = 0.4.6
|
||||
|
||||
@@ -394,6 +394,7 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)")</Command>
|
||||
<ClCompile Include="..\..\src\uCodes\F3DEX2.cpp" />
|
||||
<ClCompile Include="..\..\src\uCodes\F3DEX2ACCLAIM.cpp" />
|
||||
<ClCompile Include="..\..\src\uCodes\F3DEX2CBFD.cpp" />
|
||||
<ClCompile Include="..\..\src\uCodes\F3DEX3.cpp" />
|
||||
<ClCompile Include="..\..\src\uCodes\F3DZEX2.cpp" />
|
||||
<ClCompile Include="..\..\src\uCodes\F3DFLX2.cpp" />
|
||||
<ClCompile Include="..\..\src\uCodes\F3DGOLDEN.cpp" />
|
||||
@@ -542,6 +543,7 @@ copy /Y "$(OutDir)$(TargetName).*" "$(Mupen64PluginsDir_x64)")</Command>
|
||||
<ClInclude Include="..\..\src\uCodes\F3DEX2.h" />
|
||||
<ClInclude Include="..\..\src\uCodes\F3DEX2ACCLAIM.h" />
|
||||
<ClInclude Include="..\..\src\uCodes\F3DEX2CBFD.h" />
|
||||
<ClInclude Include="..\..\src\uCodes\F3DEX3.h" />
|
||||
<ClInclude Include="..\..\src\uCodes\F3DZEX2.h" />
|
||||
<ClInclude Include="..\..\src\uCodes\F3DFLX2.h" />
|
||||
<ClInclude Include="..\..\src\uCodes\F3DGOLDEN.h" />
|
||||
|
||||
@@ -440,6 +440,9 @@
|
||||
<ClCompile Include="..\..\src\Graphics\OpenGLContext\GLSL\glsl_CombinerProgramUniformFactoryFast.cpp">
|
||||
<Filter>Source Files\Graphics\OpenGL\GLSL</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\uCodes\F3DEX3.cpp">
|
||||
<Filter>Source Files\uCodes</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\src\3DMath.h">
|
||||
@@ -817,6 +820,9 @@
|
||||
<ClInclude Include="..\..\src\GLideNHQ\TxFilterExport.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\src\uCodes\F3DEX3.h">
|
||||
<Filter>Header Files\uCodes</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ResourceCompile Include="..\..\src\GLideN64.rc">
|
||||
|
||||
@@ -122,6 +122,7 @@ set(GLideN64_SOURCES
|
||||
uCodes/F3DEX.cpp
|
||||
uCodes/F3DAM.cpp
|
||||
uCodes/F3DEX2.cpp
|
||||
uCodes/F3DEX3.cpp
|
||||
uCodes/F3DEX2ACCLAIM.cpp
|
||||
uCodes/F3DEX2CBFD.cpp
|
||||
uCodes/F3DZEX2.cpp
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
#include "uCodes/F3D.h"
|
||||
#include "uCodes/F3DEX.h"
|
||||
#include "uCodes/F3DEX2.h"
|
||||
#include "uCodes/F3DEX3.h"
|
||||
#include "uCodes/L3D.h"
|
||||
#include "uCodes/L3DEX.h"
|
||||
#include "uCodes/L3DEX2.h"
|
||||
@@ -39,6 +40,9 @@
|
||||
#include "Graphics/Context.h"
|
||||
#include "Graphics/Parameters.h"
|
||||
|
||||
#include <set>
|
||||
#include <sstream>
|
||||
|
||||
u32 last_good_ucode = (u32) -1;
|
||||
|
||||
struct SpecialMicrocodeInfo
|
||||
@@ -114,6 +118,7 @@ u32 G_OBJ_LOADTXTR, G_OBJ_LDTX_SPRITE, G_OBJ_LDTX_RECT, G_OBJ_LDTX_RECT_R;
|
||||
u32 G_RDPHALF_0;
|
||||
u32 G_PERSPNORM;
|
||||
u32 G_ZOBJ, G_ZRDPCMD, G_ZWAITSIGNAL, G_ZMTXCAT, G_ZMULT_MPMTX, G_ZLIGHTING;
|
||||
u32 G_TRISTRIP, G_TRIFAN, G_LIGHTTORDP, G_RELSEGMENT;
|
||||
|
||||
|
||||
u32 G_MTX_STACKSIZE;
|
||||
@@ -290,6 +295,10 @@ void GBIInfo::_makeCurrent(MicrocodeInfo * _pCurrent)
|
||||
m_hwlSupported = false;
|
||||
gSP.clipRatio = 2U;
|
||||
break;
|
||||
case F3DEX3:
|
||||
F3DEX3_Init();
|
||||
m_hwlSupported = false;
|
||||
break;
|
||||
case F3DTEXA:
|
||||
F3DTEXA_Init();
|
||||
m_hwlSupported = true;
|
||||
@@ -352,6 +361,18 @@ bool GBIInfo::_makeExistingMicrocodeCurrent(u32 uc_start, u32 uc_dstart, u32 uc_
|
||||
return true;
|
||||
}
|
||||
|
||||
// based on musl libc
|
||||
static inline int ascii_isupper(int c)
|
||||
{
|
||||
return (unsigned)c - 'A' < 26;
|
||||
}
|
||||
|
||||
static inline int ascii_tolower(int c)
|
||||
{
|
||||
if (isupper(c)) return c | 32;
|
||||
return c;
|
||||
}
|
||||
|
||||
void GBIInfo::loadMicrocode(u32 uc_start, u32 uc_dstart, u16 uc_dsize)
|
||||
{
|
||||
if (_makeExistingMicrocodeCurrent(uc_start, uc_dstart, uc_dsize))
|
||||
@@ -387,6 +408,47 @@ void GBIInfo::loadMicrocode(u32 uc_start, u32 uc_dstart, u16 uc_dsize)
|
||||
char uc_str[256];
|
||||
strcpy(uc_str, "Not Found");
|
||||
|
||||
// Check for F3DEX3 microcode
|
||||
{
|
||||
static const char F3DEX3_NAME[] = "f3dex3";
|
||||
const char* probe = &uc_data[0x138];
|
||||
char name_buffer[sizeof(F3DEX3_NAME) - 1];
|
||||
memcpy(name_buffer, probe, sizeof(F3DEX3_NAME) - 1);
|
||||
std::transform(name_buffer, name_buffer + sizeof(F3DEX3_NAME) - 1, name_buffer, ascii_tolower);
|
||||
if (0 == memcmp(name_buffer, F3DEX3_NAME, sizeof(F3DEX3_NAME) - 1))
|
||||
{
|
||||
current.type = F3DEX3;
|
||||
current.NoN = true;
|
||||
current.negativeY = false;
|
||||
current.fast3DPersp = false;
|
||||
current.combineMatrices = false;
|
||||
|
||||
std::set<std::string> features;
|
||||
{
|
||||
// 0x180 is absolutely an overkill but it is ok for now
|
||||
const char* name_end = (const char*)memchr(probe, ' ', 0x180);
|
||||
size_t name_len = name_end - probe;
|
||||
// It will look like F3DEX3_LVP_BrZ_NOC
|
||||
std::string feature;
|
||||
std::string name = std::string(probe, name_len);
|
||||
std::transform(name.begin(), name.end(), name.begin(), ascii_tolower);
|
||||
std::stringstream name_stream(name);
|
||||
while (std::getline(name_stream, feature, '_'))
|
||||
{
|
||||
features.emplace(std::move(feature));
|
||||
}
|
||||
}
|
||||
|
||||
current.f3dex3.legacyVertexPipeline = features.find("lvp") != features.end();
|
||||
current.f3dex3.noOcclusionPlane = features.find("noc") != features.end();
|
||||
current.f3dex3.branchOnZ = features.find("brz") != features.end();
|
||||
|
||||
LOG(LOG_VERBOSE, "Load microcode (%s) type: %d crc: 0x%08x romname: %s\n", uc_str, current.type, uc_crc, RSP.romname);
|
||||
_makeCurrent(¤t);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
for (u32 i = 0; i < 2046; ++i) {
|
||||
if ((uc_data[i] == 'R') && (uc_data[i+1] == 'S') && (uc_data[i+2] == 'P')) {
|
||||
u32 j = 0;
|
||||
|
||||
@@ -35,7 +35,8 @@
|
||||
#define F5Indi_Naboo 26
|
||||
#define S2DEX_1_03 27
|
||||
#define S2DEX_1_05 28
|
||||
#define NONE 29
|
||||
#define F3DEX3 29
|
||||
#define NONE 30
|
||||
|
||||
// Fixed point conversion factors
|
||||
#define FIXED2FLOATRECIP1 0.5f
|
||||
@@ -401,6 +402,7 @@ extern u32 G_OBJ_LOADTXTR, G_OBJ_LDTX_SPRITE, G_OBJ_LDTX_RECT, G_OBJ_LDTX_RECT_R
|
||||
extern u32 G_RDPHALF_0;
|
||||
extern u32 G_PERSPNORM;
|
||||
extern u32 G_ZOBJ, G_ZRDPCMD, G_ZWAITSIGNAL, G_ZMTXCAT, G_ZMULT_MPMTX, G_ZLIGHTING;
|
||||
extern u32 G_TRISTRIP, G_TRIFAN, G_LIGHTTORDP, G_RELSEGMENT;
|
||||
|
||||
#define LIGHT_1 1
|
||||
#define LIGHT_2 2
|
||||
@@ -468,7 +470,7 @@ typedef struct
|
||||
|
||||
struct Light
|
||||
{
|
||||
u8 pad0, b, g, r;
|
||||
u8 type, b, g, r;
|
||||
u8 pad1, b2, g2, r2;
|
||||
s8 pad2, z, y, x;
|
||||
};
|
||||
@@ -489,6 +491,13 @@ struct MicrocodeInfo
|
||||
bool fast3DPersp = false;
|
||||
bool texturePersp = true;
|
||||
bool combineMatrices = false;
|
||||
struct
|
||||
{
|
||||
// LVP is how microcodes other than F3DEX3 function
|
||||
bool legacyVertexPipeline = true;
|
||||
bool noOcclusionPlane = false;
|
||||
bool branchOnZ = false;
|
||||
} f3dex3;
|
||||
};
|
||||
|
||||
struct GBIInfo
|
||||
@@ -509,6 +518,9 @@ struct GBIInfo
|
||||
bool isNegativeY() const { return m_pCurrent != nullptr ? m_pCurrent->negativeY : true; }
|
||||
bool isTexturePersp() const { return m_pCurrent != nullptr ? m_pCurrent->texturePersp: true; }
|
||||
bool isCombineMatrices() const { return m_pCurrent != nullptr ? m_pCurrent->combineMatrices: false; }
|
||||
bool isLegacyVertexPipeline() const { return m_pCurrent != nullptr ? m_pCurrent->f3dex3.legacyVertexPipeline : true; }
|
||||
bool isNoOcclusionPlane() const { return m_pCurrent != nullptr ? m_pCurrent->f3dex3.noOcclusionPlane : false; }
|
||||
bool isBranchOnZ() const { return m_pCurrent != nullptr ? m_pCurrent->f3dex3.branchOnZ : false; }
|
||||
|
||||
private:
|
||||
void _flushCommands();
|
||||
|
||||
@@ -1004,11 +1004,11 @@ public:
|
||||
ShaderNoise(const opengl::GLInfo & _glinfo)
|
||||
{
|
||||
m_part =
|
||||
"uniform float uNoiseSeed; \n"
|
||||
"uniform mediump float uNoiseSeed; \n"
|
||||
"lowp float snoise() \n"
|
||||
"{ \n"
|
||||
" mediump vec2 coord = floor(gl_FragCoord.xy/uScreenScale); \n"
|
||||
" mediump vec3 p3 = vec3(uNoiseSeed, coord); \n"
|
||||
" highp vec2 coord = floor(gl_FragCoord.xy/uScreenScale); \n"
|
||||
" highp vec3 p3 = vec3(uNoiseSeed, coord); \n"
|
||||
// hash13 from https://www.shadertoy.com/view/4djSRW
|
||||
" p3 = fract(p3 * .1031); \n"
|
||||
" p3 += dot(p3, p3.zyx + 31.32); \n"
|
||||
@@ -1068,8 +1068,8 @@ public:
|
||||
m_part +=
|
||||
" lowp float mult = 1.0; \n";
|
||||
m_part +=
|
||||
" mediump vec2 coord = floor(mult * (gl_FragCoord.xy/uScreenScale)); \n"
|
||||
" mediump vec3 p3 = vec3(uNoiseSeed, coord); \n"
|
||||
" highp vec2 coord = floor(mult * (gl_FragCoord.xy/uScreenScale)); \n"
|
||||
" highp vec3 p3 = vec3(uNoiseSeed, coord); \n"
|
||||
// hash33 from https://www.shadertoy.com/view/4djSRW
|
||||
" p3 = fract(p3 * vec3(.1031, .1030, .0973)); \n"
|
||||
" p3 += dot(p3, p3.yxz+33.33); \n"
|
||||
@@ -1087,8 +1087,8 @@ public:
|
||||
" lowp float mult = 1.0; \n";
|
||||
m_part +=
|
||||
" \n"
|
||||
" mediump vec2 coord = floor(mult * (gl_FragCoord.xy/uScreenScale)); \n"
|
||||
" mediump vec3 p3 = vec3(uNoiseSeed, coord); \n"
|
||||
" highp vec2 coord = floor(mult * (gl_FragCoord.xy/uScreenScale)); \n"
|
||||
" highp vec3 p3 = vec3(uNoiseSeed, coord); \n"
|
||||
// hash13 from https://www.shadertoy.com/view/4djSRW
|
||||
" p3 = fract(p3 * .1031); \n"
|
||||
" p3 += dot(p3, p3.zyx + 31.32); \n"
|
||||
|
||||
@@ -224,10 +224,10 @@ void GraphicsDrawer::updateScissor(FrameBuffer * _pBuffer) const
|
||||
|
||||
void GraphicsDrawer::_updateViewport(const FrameBuffer* _pBuffer, const f32 scale) const
|
||||
{
|
||||
s32 X, Y, WIDTH, HEIGHT;
|
||||
s32 X = 0, Y = 0, WIDTH, HEIGHT;
|
||||
f32 scaleX, scaleY;
|
||||
const FrameBuffer* pCurrentBuffer = _pBuffer != nullptr ? _pBuffer : frameBufferList().getCurrent();
|
||||
if (scale == 0.0f) {
|
||||
const FrameBuffer* pCurrentBuffer = _pBuffer != nullptr ? _pBuffer : frameBufferList().getCurrent();
|
||||
if (pCurrentBuffer != nullptr) {
|
||||
scaleX = scaleY = pCurrentBuffer->m_scale;
|
||||
} else {
|
||||
@@ -237,8 +237,10 @@ void GraphicsDrawer::_updateViewport(const FrameBuffer* _pBuffer, const f32 scal
|
||||
} else {
|
||||
scaleX = scaleY = scale;
|
||||
}
|
||||
X = 0;
|
||||
Y = 0;
|
||||
if (pCurrentBuffer != nullptr) {
|
||||
X = roundup(pCurrentBuffer->m_originX, scaleX);
|
||||
Y = roundup(pCurrentBuffer->m_originY, scaleY);
|
||||
}
|
||||
WIDTH = roundup(SCREEN_SIZE_DIM, scaleX);
|
||||
HEIGHT = roundup(SCREEN_SIZE_DIM, scaleY);
|
||||
gfxContext.setViewport(X, Y, WIDTH, HEIGHT);
|
||||
|
||||
@@ -1179,8 +1179,8 @@ bool TextureCache::_loadHiresTexture(u32 _tile, CachedTexture *_pTexture, u64 &
|
||||
height--;
|
||||
} else {
|
||||
const gDPTile * pTile = gSP.textureTile[_tile];
|
||||
int tile_width = pTile->lrs - pTile->uls + 1;
|
||||
int tile_height = pTile->lrt - pTile->ult + 1;
|
||||
int tile_width = ((pTile->lrs - pTile->uls) & 0x03FF) + 1;
|
||||
int tile_height = ((pTile->lrt - pTile->ult) & 0x03FF) + 1;
|
||||
|
||||
int mask_width = (pTile->masks == 0) ? (tile_width) : (1 << pTile->masks);
|
||||
int mask_height = (pTile->maskt == 0) ? (tile_height) : (1 << pTile->maskt);
|
||||
@@ -1226,8 +1226,10 @@ bool TextureCache::_loadHiresTexture(u32 _tile, CachedTexture *_pTexture, u64 &
|
||||
GHQTexInfo ghqTexInfo;
|
||||
// TODO: fix problem with zero texture dimensions on GLideNHQ side.
|
||||
auto hirestexFound = txfilter_hirestex(_pTexture->crc, _ricecrc, palette, N64FormatSize(_pTexture->format, _pTexture->size), &ghqTexInfo);
|
||||
if (!hirestexFound && _strongcrc != 0U) {
|
||||
if (!hirestexFound) {
|
||||
// Texture with RiceCRC was not found. Try alternative CRC.
|
||||
if (_strongcrc == 0U)
|
||||
_strongcrc = txfilter_checksum_strong(addr, width, height, _pTexture->size, bpl, paladdr);
|
||||
hirestexFound = txfilter_hirestex(_pTexture->crc, _strongcrc, palette, N64FormatSize(_pTexture->format, _pTexture->size), &ghqTexInfo);
|
||||
}
|
||||
if (hirestexFound && ghqTexInfo.width != 0 && ghqTexInfo.height != 0) {
|
||||
|
||||
@@ -314,7 +314,7 @@ void gSPLight( u32 l, s32 n )
|
||||
|
||||
Light *light = (Light*)&RDRAM[addrByte];
|
||||
|
||||
if (n < 8) {
|
||||
if (n < 9) {
|
||||
gSP.lights.rgb[n][R] = _FIXED2FLOATCOLOR(light->r,8);
|
||||
gSP.lights.rgb[n][G] = _FIXED2FLOATCOLOR(light->g,8);
|
||||
gSP.lights.rgb[n][B] = _FIXED2FLOATCOLOR(light->b,8);
|
||||
@@ -326,6 +326,8 @@ void gSPLight( u32 l, s32 n )
|
||||
gSP.lights.xyz[n][Y] = light->y;
|
||||
gSP.lights.xyz[n][Z] = light->z;
|
||||
|
||||
gSP.lights.is_point[n] = 0 != light->type;
|
||||
|
||||
Normalize( gSP.lights.xyz[n] );
|
||||
u32 addrShort = addrByte >> 1;
|
||||
gSP.lights.pos_xyzw[n][X] = (float)(((short*)RDRAM)[(addrShort+4)^1]);
|
||||
@@ -483,6 +485,17 @@ void gSPInverseTransformVector_default(float vec[3], float mtx[4][4])
|
||||
vec[2] = mtx[2][0] * x + mtx[2][1] * y + mtx[2][2] * z;
|
||||
}
|
||||
|
||||
static void processDirectionalLight(const bool useFirstColor, u32 i, SPVertex& vtx)
|
||||
{
|
||||
const f32 intensity = DotProduct( &vtx.nx, gSP.lights.i_xyz[i] );
|
||||
if (intensity > 0.0f) {
|
||||
const float* pColor = useFirstColor ? gSP.lights.rgb[i] : gSP.lights.rgb2[i];
|
||||
vtx.r += pColor[R] * intensity;
|
||||
vtx.g += pColor[G] * intensity;
|
||||
vtx.b += pColor[B] * intensity;
|
||||
}
|
||||
}
|
||||
|
||||
template <u32 VNUM>
|
||||
void gSPLightVertexStandard(u32 v, SPVertex * spVtx)
|
||||
{
|
||||
@@ -498,13 +511,7 @@ void gSPLightVertexStandard(u32 v, SPVertex * spVtx)
|
||||
vtx.HWLight = 0;
|
||||
|
||||
for (u32 i = 0; i < gSP.numLights; ++i) {
|
||||
const f32 intensity = DotProduct( &vtx.nx, gSP.lights.i_xyz[i] );
|
||||
if (intensity > 0.0f) {
|
||||
pColor = useFirstColor ? gSP.lights.rgb[i] : gSP.lights.rgb2[i];
|
||||
vtx.r += pColor[R] * intensity;
|
||||
vtx.g += pColor[G] * intensity;
|
||||
vtx.b += pColor[B] * intensity;
|
||||
}
|
||||
processDirectionalLight(useFirstColor, i, vtx);
|
||||
}
|
||||
vtx.r = min(1.0f, vtx.r);
|
||||
vtx.g = min(1.0f, vtx.g);
|
||||
@@ -632,10 +639,53 @@ void gSPLightVertex(SPVertex & _vtx)
|
||||
gSPLightVertex<1>(0, &_vtx);
|
||||
}
|
||||
|
||||
static void processPointLight(u32 l, const float* vecPos, SPVertex& vtx)
|
||||
{
|
||||
f32 intensity;
|
||||
if (gSP.lights.ca[l] != 0.0f) {
|
||||
f32 recip = FIXED2FLOATRECIP16;
|
||||
// Point lighting
|
||||
f32 lvec[3] = { gSP.lights.pos_xyzw[l][X], gSP.lights.pos_xyzw[l][Y], gSP.lights.pos_xyzw[l][Z] };
|
||||
lvec[0] -= vecPos[0];
|
||||
lvec[1] -= vecPos[1];
|
||||
lvec[2] -= vecPos[2];
|
||||
|
||||
const f32 K = lvec[0] * lvec[0] + lvec[1] * lvec[1] + lvec[2] * lvec[2] * 2.0f;
|
||||
const f32 KS = sqrtf(K);
|
||||
|
||||
gSPInverseTransformVector(lvec, gSP.matrix.modelView[gSP.matrix.modelViewi]);
|
||||
|
||||
for (u32 i = 0; i < 3; ++i) {
|
||||
lvec[i] = (4.0f * lvec[i] / KS);
|
||||
if (lvec[i] < -1.0f)
|
||||
lvec[i] = -1.0f;
|
||||
if (lvec[i] > 1.0f)
|
||||
lvec[i] = 1.0f;
|
||||
}
|
||||
|
||||
f32 V = lvec[0] * vtx.nx + lvec[1] * vtx.ny + lvec[2] * vtx.nz;
|
||||
if (V < -1.0f)
|
||||
V = -1.0f;
|
||||
if (V > 1.0f)
|
||||
V = 1.0f;
|
||||
|
||||
const f32 KSF = floorf(KS);
|
||||
const f32 D = (KSF * gSP.lights.la[l] * 2.0f + KSF * KSF * gSP.lights.qa[l] / 8.0f) * recip + 1.0f;
|
||||
intensity = V / D;
|
||||
} else {
|
||||
// Standard lighting
|
||||
intensity = DotProduct(&vtx.nx, gSP.lights.i_xyz[l]);
|
||||
}
|
||||
if (intensity > 0.0f) {
|
||||
vtx.r += gSP.lights.rgb[l][R] * intensity;
|
||||
vtx.g += gSP.lights.rgb[l][G] * intensity;
|
||||
vtx.b += gSP.lights.rgb[l][B] * intensity;
|
||||
}
|
||||
}
|
||||
|
||||
template <u32 VNUM>
|
||||
void gSPPointLightVertexZeldaMM(u32 v, float _vecPos[VNUM][4], SPVertex * spVtx)
|
||||
{
|
||||
f32 intensity = 0.0f;
|
||||
for (int j = 0; j < VNUM; ++j) {
|
||||
SPVertex & vtx = spVtx[v + j];
|
||||
vtx.HWLight = 0;
|
||||
@@ -645,45 +695,7 @@ void gSPPointLightVertexZeldaMM(u32 v, float _vecPos[VNUM][4], SPVertex * spVtx)
|
||||
gSPTransformVector(_vecPos[j], gSP.matrix.modelView[gSP.matrix.modelViewi]);
|
||||
|
||||
for (u32 l = 0; l < gSP.numLights; ++l) {
|
||||
if (gSP.lights.ca[l] != 0.0f) {
|
||||
f32 recip = FIXED2FLOATRECIP16;
|
||||
// Point lighting
|
||||
f32 lvec[3] = { gSP.lights.pos_xyzw[l][X], gSP.lights.pos_xyzw[l][Y], gSP.lights.pos_xyzw[l][Z] };
|
||||
lvec[0] -= _vecPos[j][0];
|
||||
lvec[1] -= _vecPos[j][1];
|
||||
lvec[2] -= _vecPos[j][2];
|
||||
|
||||
const f32 K = lvec[0] * lvec[0] + lvec[1] * lvec[1] + lvec[2] * lvec[2] * 2.0f;
|
||||
const f32 KS = sqrtf(K);
|
||||
|
||||
gSPInverseTransformVector(lvec, gSP.matrix.modelView[gSP.matrix.modelViewi]);
|
||||
|
||||
for (u32 i = 0; i < 3; ++i) {
|
||||
lvec[i] = (4.0f * lvec[i] / KS);
|
||||
if (lvec[i] < -1.0f)
|
||||
lvec[i] = -1.0f;
|
||||
if (lvec[i] > 1.0f)
|
||||
lvec[i] = 1.0f;
|
||||
}
|
||||
|
||||
f32 V = lvec[0] * vtx.nx + lvec[1] * vtx.ny + lvec[2] * vtx.nz;
|
||||
if (V < -1.0f)
|
||||
V = -1.0f;
|
||||
if (V > 1.0f)
|
||||
V = 1.0f;
|
||||
|
||||
const f32 KSF = floorf(KS);
|
||||
const f32 D = (KSF * gSP.lights.la[l] * 2.0f + KSF * KSF * gSP.lights.qa[l] / 8.0f) * recip + 1.0f;
|
||||
intensity = V / D;
|
||||
} else {
|
||||
// Standard lighting
|
||||
intensity = DotProduct(&vtx.nx, gSP.lights.i_xyz[l]);
|
||||
}
|
||||
if (intensity > 0.0f) {
|
||||
vtx.r += gSP.lights.rgb[l][R] * intensity;
|
||||
vtx.g += gSP.lights.rgb[l][G] * intensity;
|
||||
vtx.b += gSP.lights.rgb[l][B] * intensity;
|
||||
}
|
||||
processPointLight(l, _vecPos[j], vtx);
|
||||
}
|
||||
if (vtx.r > 1.0f) vtx.r = 1.0f;
|
||||
if (vtx.g > 1.0f) vtx.g = 1.0f;
|
||||
@@ -733,6 +745,30 @@ void gSPPointLightVertexAcclaim(u32 v, SPVertex * spVtx)
|
||||
}
|
||||
}
|
||||
|
||||
template <u32 VNUM>
|
||||
void gSPLightVertexF3DEX3(u32 v, float _vecPos[VNUM][4], SPVertex* spVtx)
|
||||
{
|
||||
for (int j = 0; j < VNUM; ++j) {
|
||||
const bool useFirstColor = ((v + j) & 1) == 0;
|
||||
SPVertex& vtx = spVtx[v + j];
|
||||
vtx.HWLight = 0;
|
||||
vtx.r = gSP.lights.rgb[gSP.numLights][R];
|
||||
vtx.g = gSP.lights.rgb[gSP.numLights][G];
|
||||
vtx.b = gSP.lights.rgb[gSP.numLights][B];
|
||||
gSPTransformVector(_vecPos[j], gSP.matrix.modelView[gSP.matrix.modelViewi]);
|
||||
|
||||
for (u32 l = 0; l < gSP.numLights; ++l) {
|
||||
if (gSP.lights.is_point[l])
|
||||
processPointLight(l, _vecPos[j], vtx);
|
||||
else
|
||||
processDirectionalLight(useFirstColor, l, vtx);
|
||||
}
|
||||
if (vtx.r > 1.0f) vtx.r = 1.0f;
|
||||
if (vtx.g > 1.0f) vtx.g = 1.0f;
|
||||
if (vtx.b > 1.0f) vtx.b = 1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
template <u32 VNUM>
|
||||
void gSPBillboardVertex(u32 v, SPVertex * spVtx)
|
||||
{
|
||||
@@ -825,10 +861,17 @@ void gSPProcessVertex(u32 v, SPVertex * spVtx)
|
||||
gSPClipVertex<VNUM>(v, spVtx);
|
||||
|
||||
if (gSP.geometryMode & G_LIGHTING) {
|
||||
if (gSP.geometryMode & G_POINT_LIGHTING)
|
||||
gSPPointLightVertex<VNUM>(v, vPos, spVtx);
|
||||
if (GBI.isLegacyVertexPipeline())
|
||||
{
|
||||
if (gSP.geometryMode & G_POINT_LIGHTING)
|
||||
gSPPointLightVertex<VNUM>(v, vPos, spVtx);
|
||||
else
|
||||
gSPLightVertex<VNUM>(v, spVtx);
|
||||
}
|
||||
else
|
||||
gSPLightVertex<VNUM>(v, spVtx);
|
||||
{
|
||||
gSPLightVertexF3DEX3<VNUM>(v, vPos, spVtx);
|
||||
}
|
||||
|
||||
if (gSP.geometryMode & G_ACCLAIM_LIGHTING)
|
||||
gSPPointLightVertexAcclaim<VNUM>(v, spVtx);
|
||||
@@ -1581,6 +1624,16 @@ void gSPSegment( s32 seg, s32 base )
|
||||
DebugMsg(DEBUG_NORMAL, "gSPSegment( %s, 0x%08X );\n", SegmentText[seg], base );
|
||||
}
|
||||
|
||||
void gSPRelSegment(s32 seg, s32 base)
|
||||
{
|
||||
// extract rel offset like 0x0?123456
|
||||
const s32 offset = base & 0x00FFFFFF;
|
||||
const s32 rel = (base >> 24) & 0xf;
|
||||
gSP.segment[seg] = offset + gSP.segment[rel];
|
||||
|
||||
DebugMsg(DEBUG_NORMAL, "gSPRelSegment( %s, 0x%08X ) -> rel=0x%08X;\n", SegmentText[seg], base, gSP.segment[seg]);
|
||||
}
|
||||
|
||||
void gSPClipRatio(u32 ratio)
|
||||
{
|
||||
gSP.clipRatio = std::abs(static_cast<s16>(ratio & 0xFFFF));
|
||||
@@ -1696,7 +1749,7 @@ void gSPLightColor( u32 lightNum, u32 packedColor )
|
||||
{
|
||||
--lightNum;
|
||||
|
||||
if (lightNum < 8)
|
||||
if (lightNum < 9)
|
||||
{
|
||||
gSP.lights.rgb[lightNum][R] = _FIXED2FLOATCOLOR(_SHIFTR( packedColor, 24, 8 ),8);
|
||||
gSP.lights.rgb[lightNum][G] = _FIXED2FLOATCOLOR(_SHIFTR( packedColor, 16, 8 ),8);
|
||||
|
||||
@@ -72,6 +72,7 @@ struct gSPInfo
|
||||
f32 i_xyz[12][3];
|
||||
f32 pos_xyzw[12][4];
|
||||
f32 ca[12], la[12], qa[12];
|
||||
bool is_point[12];
|
||||
} lights;
|
||||
|
||||
struct
|
||||
@@ -179,6 +180,7 @@ void gSPCullDisplayList( u32 v0, u32 vn );
|
||||
void gSPPopMatrix( u32 param );
|
||||
void gSPPopMatrixN( u32 param, u32 num );
|
||||
void gSPSegment( s32 seg, s32 base );
|
||||
void gSPRelSegment(s32 seg, s32 base);
|
||||
void gSPClipRatio( u32 ratio );
|
||||
void gSPInsertMatrix( u32 where, u32 num );
|
||||
void gSPModifyVertex(u32 _vtx, u32 _where, u32 _val );
|
||||
|
||||
@@ -0,0 +1,294 @@
|
||||
#include "GLideN64.h"
|
||||
#include "F3D.h"
|
||||
#include "F3DEX.h"
|
||||
#include "F3DEX2.h"
|
||||
#include "F3DZEX2.h"
|
||||
#include "F3DEX3.h"
|
||||
#include "gSP.h"
|
||||
|
||||
#define F3DEX3_BRANCH_WZ 0x04
|
||||
|
||||
#define F3DEX3_TRISTRIP 0x08
|
||||
#define F3DEX3_TRIFAN 0x09
|
||||
#define F3DEX3_LIGHTTORDP 0x0A
|
||||
#define F3DEX3_RELSEGMENT 0x0B
|
||||
|
||||
#define F3DEX3_G_MW_FX 0x00
|
||||
#define F3DEX3_G_MW_LIGHTCOL 0x0A
|
||||
|
||||
#define F3DEX3_G_MV_MMTX 2
|
||||
|
||||
#define F3DEX3_G_MW_HALFWORD_FLAG 0x8000
|
||||
|
||||
#define F3DEX3_G_MWO_AO_AMBIENT 0x00
|
||||
#define F3DEX3_G_MWO_AO_DIRECTIONAL 0x02
|
||||
#define F3DEX3_G_MWO_AO_POINT 0x04
|
||||
#define F3DEX3_G_MWO_PERSPNORM 0x06
|
||||
#define F3DEX3_G_MWO_FRESNEL_SCALE 0x0C
|
||||
#define F3DEX3_G_MWO_FRESNEL_OFFSET 0x0E
|
||||
#define F3DEX3_G_MWO_ATTR_OFFSET_S 0x10
|
||||
#define F3DEX3_G_MWO_ATTR_OFFSET_T 0x12
|
||||
#define F3DEX3_G_MWO_ATTR_OFFSET_Z 0x14
|
||||
#define F3DEX3_G_MWO_ALPHA_COMPARE_CULL 0x16
|
||||
#define F3DEX3_G_MWO_NORMALS_MODE 0x18
|
||||
#define F3DEX3_G_MWO_LAST_MAT_DL_ADDR 0x1A
|
||||
|
||||
#define F3DEX3_G_MAX_LIGHTS 9
|
||||
|
||||
struct F3DEX3_Ambient
|
||||
{
|
||||
u8 pad0, b, g, r;
|
||||
u8 pad1, b2, g2, r2;
|
||||
};
|
||||
|
||||
struct F3DEX3_Light
|
||||
{
|
||||
u8 pad0, b, g, r;
|
||||
u8 pad1, b2, g2, r2;
|
||||
s8 pad2, z, y, x;
|
||||
u8 size, pad3[3];
|
||||
};
|
||||
|
||||
// Notice how it looks like F3DEX3_Light but the ending so there are 8 bytes of difference
|
||||
struct F3DEX3_LookAt
|
||||
{
|
||||
s8 pad, z, y, x;
|
||||
};
|
||||
|
||||
struct F3DEX3_LookAtOld
|
||||
{
|
||||
u8 pad0, b, g, r;
|
||||
u8 pad1, b2, g2, r2;
|
||||
s8 pad2, z, y, x;
|
||||
};
|
||||
|
||||
// TODO: This seems incorrect to me?
|
||||
static void F3DZEX3_Branch_W(u32 w0, u32 w1)
|
||||
{
|
||||
gSPBranchLessW(gDP.half_1, _SHIFTR(w0, 1, 7), w1);
|
||||
}
|
||||
|
||||
#define _LIGHT_TO_OFFSET(n) (((n) - 1) * 0x10 + 0x10) /* The + 0x10 skips cam pos and lookat */
|
||||
|
||||
static void writeLight(int off, u32 w)
|
||||
{
|
||||
if (0 == off)
|
||||
{
|
||||
// CameraWorld not supported
|
||||
}
|
||||
if (0x8 == off)
|
||||
{
|
||||
// gSPLookAt would like to have a F3DEX3_LookAtOld struct, so we need to do some math magic
|
||||
gSPLookAt(w - (sizeof(F3DEX3_LookAtOld) - sizeof(F3DEX3_LookAt)), 0);
|
||||
gSPLookAt(w - (sizeof(F3DEX3_LookAtOld) - sizeof(F3DEX3_LookAt)) + sizeof(F3DEX3_LookAt), 1);
|
||||
}
|
||||
|
||||
for (int i = 1; i <= gSP.numLights; i++)
|
||||
{
|
||||
if (_LIGHT_TO_OFFSET(i) == off)
|
||||
{
|
||||
gSPLight(w, i);
|
||||
}
|
||||
}
|
||||
|
||||
if (_LIGHT_TO_OFFSET(gSP.numLights + 1) == off)
|
||||
{
|
||||
// TODO: Write ambient lights
|
||||
}
|
||||
if ((F3DEX3_G_MAX_LIGHTS * 0x10) + 0x18 == off)
|
||||
{
|
||||
// TODO: OcclusionPlane not supported
|
||||
}
|
||||
}
|
||||
|
||||
void F3DEX3_MoveMem(u32 w0, u32 w1)
|
||||
{
|
||||
switch (_SHIFTR(w0, 0, 8))
|
||||
{
|
||||
case F3DEX3_G_MV_MMTX:
|
||||
// TODO: Not supported!
|
||||
break;
|
||||
case F3DEX2_MV_VIEWPORT:
|
||||
gSPViewport(w1);
|
||||
break;
|
||||
case G_MV_LIGHT:
|
||||
{
|
||||
const u32 ofs = _SHIFTR(w0, 8, 8) * 8;
|
||||
const u32 len = (1 + _SHIFTR(w0, 19, 5)) * 8;
|
||||
for (int i = 0; i < len; i += 4)
|
||||
{
|
||||
writeLight(ofs + i, w1 + i);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void F3DEX3_MoveWord(u32 w0, u32 w1)
|
||||
{
|
||||
switch (_SHIFTR(w0, 16, 8))
|
||||
{
|
||||
case F3DEX3_G_MW_FX:
|
||||
{
|
||||
const u32 value = _SHIFTR(w0, 0, 16);
|
||||
u32 what = w1;
|
||||
if (value & F3DEX3_G_MW_HALFWORD_FLAG)
|
||||
what &= 0xffff;
|
||||
|
||||
switch (value & ~F3DEX3_G_MW_HALFWORD_FLAG)
|
||||
{
|
||||
case F3DEX3_G_MWO_AO_AMBIENT:
|
||||
break;
|
||||
case F3DEX3_G_MWO_AO_DIRECTIONAL:
|
||||
break;
|
||||
case F3DEX3_G_MWO_AO_POINT:
|
||||
break;
|
||||
case F3DEX3_G_MWO_PERSPNORM:
|
||||
gSPPerspNormalize(what);
|
||||
break;
|
||||
case F3DEX3_G_MWO_FRESNEL_SCALE:
|
||||
break;
|
||||
case F3DEX3_G_MWO_FRESNEL_OFFSET:
|
||||
break;
|
||||
case F3DEX3_G_MWO_ATTR_OFFSET_S:
|
||||
break;
|
||||
case F3DEX3_G_MWO_ATTR_OFFSET_T:
|
||||
break;
|
||||
case F3DEX3_G_MWO_ATTR_OFFSET_Z:
|
||||
break;
|
||||
case F3DEX3_G_MWO_ALPHA_COMPARE_CULL:
|
||||
break;
|
||||
case F3DEX3_G_MWO_NORMALS_MODE:
|
||||
break;
|
||||
case F3DEX3_G_MWO_LAST_MAT_DL_ADDR:
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case G_MW_NUMLIGHT:
|
||||
gSPNumLights(w1 / 0x10);
|
||||
break;
|
||||
case G_MW_SEGMENT:
|
||||
gSPSegment(_SHIFTR(w0, 2, 4), w1 & 0x00FFFFFF);
|
||||
break;
|
||||
case G_MW_FOG:
|
||||
gSPFogFactor((s16)_SHIFTR(w1, 16, 16), (s16)_SHIFTR(w1, 0, 16));
|
||||
break;
|
||||
case G_MW_LIGHTCOL:
|
||||
int off = _SHIFTR(w0, 0, 16);
|
||||
gSPLightColor((off / 0x10) + 1, w1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
struct Vertices7
|
||||
{
|
||||
u8 v[7];
|
||||
|
||||
inline bool valid(u8 i) const
|
||||
{ return v[i] < 64; }
|
||||
};
|
||||
|
||||
static inline Vertices7 unpackVertices7(u32 w0, u32 w1)
|
||||
{
|
||||
Vertices7 v;
|
||||
v.v[0] = _SHIFTR(w0, 17, 7);
|
||||
v.v[1] = _SHIFTR(w0, 9, 7);
|
||||
v.v[2] = _SHIFTR(w0, 1, 7);
|
||||
v.v[3] = _SHIFTR(w1, 25, 7);
|
||||
v.v[4] = _SHIFTR(w1, 17, 7);
|
||||
v.v[5] = _SHIFTR(w1, 9, 7);
|
||||
v.v[6] = _SHIFTR(w1, 1, 7);
|
||||
return v;
|
||||
}
|
||||
|
||||
static void F3DEX3_TriStrip(u32 w0, u32 w1)
|
||||
{
|
||||
Vertices7 vertices = unpackVertices7(w0, w1);
|
||||
// *v1 - v2 - v3, v3 - v2 - v4, v3 - v4 - v5, v5 - v4 - v6, v5 - v6 - v7
|
||||
if (!vertices.valid(0) || !vertices.valid(1) || !vertices.valid(2)) return;
|
||||
gSPTriangle(vertices.v[0], vertices.v[1], vertices.v[2]);
|
||||
|
||||
if (!vertices.valid(3)) return;
|
||||
gSPTriangle(vertices.v[2], vertices.v[1], vertices.v[3]);
|
||||
|
||||
if (!vertices.valid(4)) return;
|
||||
gSPTriangle(vertices.v[2], vertices.v[3], vertices.v[4]);
|
||||
|
||||
if (!vertices.valid(5)) return;
|
||||
gSPTriangle(vertices.v[4], vertices.v[3], vertices.v[5]);
|
||||
|
||||
if (!vertices.valid(6)) return;
|
||||
gSPTriangle(vertices.v[4], vertices.v[5], vertices.v[6]);
|
||||
}
|
||||
|
||||
static void F3DEX3_TriFan(u32 w0, u32 w1)
|
||||
{
|
||||
Vertices7 vertices = unpackVertices7(w0, w1);
|
||||
// *v1 - v2 - v3, v1 - v3 - v4, v1 - v4 - v5, v1 - v5 - v6, v1 - v6 - v7
|
||||
if (!vertices.valid(0) || !vertices.valid(1) || !vertices.valid(2)) return;
|
||||
gSPTriangle(vertices.v[0], vertices.v[1], vertices.v[2]);
|
||||
|
||||
if (!vertices.valid(3)) return;
|
||||
gSPTriangle(vertices.v[0], vertices.v[2], vertices.v[3]);
|
||||
|
||||
if (!vertices.valid(4)) return;
|
||||
gSPTriangle(vertices.v[0], vertices.v[3], vertices.v[4]);
|
||||
|
||||
if (!vertices.valid(5)) return;
|
||||
gSPTriangle(vertices.v[0], vertices.v[3], vertices.v[5]);
|
||||
|
||||
if (!vertices.valid(6)) return;
|
||||
gSPTriangle(vertices.v[0], vertices.v[5], vertices.v[6]);
|
||||
}
|
||||
|
||||
static void F3DEX3_LightToRDP(u32 w0, u32 w1)
|
||||
{
|
||||
// unsupported, i do not know what this is for
|
||||
}
|
||||
|
||||
static void F3DEX3_RelSegment(u32 w0, u32 w1)
|
||||
{
|
||||
gSPRelSegment(_SHIFTR(w0, 2, 4), w1 & 0x00FFFFFF);
|
||||
}
|
||||
|
||||
void F3DEX3_Init()
|
||||
{
|
||||
gSPSetupFunctions();
|
||||
// Set GeometryMode flags
|
||||
GBI_InitFlags(F3DEX2);
|
||||
|
||||
GBI.PCStackSize = 18;
|
||||
|
||||
// GBI Command Command Value Command Function
|
||||
GBI_SetGBI(G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2);
|
||||
GBI_SetGBI(G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H);
|
||||
GBI_SetGBI(G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L);
|
||||
GBI_SetGBI(G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1);
|
||||
GBI_SetGBI(G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp);
|
||||
GBI_SetGBI(G_ENDDL, F3DEX2_ENDDL, F3D_EndDL);
|
||||
GBI_SetGBI(G_DL, F3DEX2_DL, F3D_DList);
|
||||
GBI_SetGBI(G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode);
|
||||
GBI_SetGBI(G_MOVEMEM, F3DEX2_MOVEMEM, F3DEX3_MoveMem);
|
||||
GBI_SetGBI(G_MOVEWORD, F3DEX2_MOVEWORD, F3DEX3_MoveWord);
|
||||
GBI_SetGBI(G_MTX, F3DEX2_MTX, F3DEX2_Mtx);
|
||||
GBI_SetGBI(G_GEOMETRYMODE, F3DEX2_GEOMETRYMODE, F3DEX2_GeometryMode);
|
||||
GBI_SetGBI(G_POPMTX, F3DEX2_POPMTX, F3DEX2_PopMtx);
|
||||
GBI_SetGBI(G_TEXTURE, F3DEX2_TEXTURE, F3DEX2_Texture);
|
||||
GBI_SetGBI(G_DMA_IO, F3DEX2_DMA_IO, F3DEX2_DMAIO);
|
||||
GBI_SetGBI(G_SPECIAL_1, F3DEX2_SPECIAL_1, F3DEX2_Special_1);
|
||||
GBI_SetGBI(G_SPECIAL_2, F3DEX2_SPECIAL_2, F3DEX2_Special_2);
|
||||
GBI_SetGBI(G_SPECIAL_3, F3DEX2_SPECIAL_3, F3DEX2_Special_3);
|
||||
|
||||
GBI_SetGBI(G_VTX, F3DEX2_VTX, F3DEX2_Vtx);
|
||||
GBI_SetGBI(G_MODIFYVTX, F3DEX2_MODIFYVTX, F3DEX_ModifyVtx);
|
||||
GBI_SetGBI(G_CULLDL, F3DEX2_CULLDL, F3DEX_CullDL);
|
||||
GBI_SetGBI(G_BRANCH_W, F3DEX3_BRANCH_WZ, F3DZEX3_Branch_W);
|
||||
GBI_SetGBI(G_TRI1, F3DEX2_TRI1, F3DEX2_Tri1);
|
||||
GBI_SetGBI(G_TRI2, F3DEX2_TRI2, F3DEX_Tri2);
|
||||
GBI_SetGBI(G_QUAD, F3DEX2_QUAD, F3DEX2_Quad);
|
||||
GBI_SetGBI(G_TRISTRIP, F3DEX3_TRISTRIP, F3DEX3_TriStrip);
|
||||
GBI_SetGBI(G_TRIFAN, F3DEX3_TRIFAN, F3DEX3_TriFan);
|
||||
GBI_SetGBI(G_LIGHTTORDP, F3DEX3_LIGHTTORDP, F3DEX3_LightToRDP);
|
||||
GBI_SetGBI(G_RELSEGMENT, F3DEX3_RELSEGMENT, F3DEX3_RelSegment);
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
#ifndef F3DEX3_H
|
||||
#define F3DEX3_H
|
||||
|
||||
void F3DEX3_Init();
|
||||
|
||||
#endif // F3DEX3_H
|
||||
@@ -6,7 +6,7 @@
|
||||
[subrepo]
|
||||
remote = git@github.com:/Rosalie241/angrylion-rdp-plus.git
|
||||
branch = RMG
|
||||
commit = cc7f72699623fc02a08d372b310f0cab3472c4d4
|
||||
parent = 525c7a4b608bc0457e73fbb5daadbb8834e1cd62
|
||||
commit = 46730f4e594f261bd90232f327cfa44d552ec96c
|
||||
parent = 3d145e2d71cb5374f0d45ab351a744691846cf66
|
||||
method = merge
|
||||
cmdver = 0.4.6
|
||||
|
||||
@@ -8,12 +8,13 @@
|
||||
|
||||
#ifdef GLES
|
||||
#include <GLES3/gl3.h>
|
||||
#define SHADER_HEADER "#version 300 es\nprecision lowp float;\n"
|
||||
#else
|
||||
#include "gl_core_3_3.h"
|
||||
#define SHADER_HEADER "#version 330 core\n"
|
||||
#endif
|
||||
|
||||
#define GLES_SHADER_HEADER "#version 300 es\nprecision lowp float;\n"
|
||||
#define GL_SHADER_HEADER "#version 330 core\n"
|
||||
|
||||
#define TEX_FORMAT GL_RGBA
|
||||
#define TEX_TYPE GL_UNSIGNED_BYTE
|
||||
|
||||
@@ -218,29 +219,39 @@ void vdac_init(struct n64video_config* config)
|
||||
ogl_LoadFunctions();
|
||||
#endif
|
||||
|
||||
msg_debug("%s: GL_VERSION='%s'", __FUNCTION__, glGetString(GL_VERSION));
|
||||
const char* gl_version = (const char*)glGetString(GL_VERSION);
|
||||
|
||||
#ifndef GLES
|
||||
const int is_gles = strstr(gl_version, "OpenGL ES") != NULL;
|
||||
#else
|
||||
const int is_gles = 1;
|
||||
#endif
|
||||
|
||||
msg_debug("%s: GL_VERSION='%s'", __FUNCTION__, gl_version);
|
||||
msg_debug("%s: GL_VENDOR='%s'", __FUNCTION__, glGetString(GL_VENDOR));
|
||||
msg_debug("%s: GL_RENDERER='%s'", __FUNCTION__, glGetString(GL_RENDERER));
|
||||
msg_debug("%s: GL_SHADING_LANGUAGE_VERSION='%s'", __FUNCTION__, glGetString(GL_SHADING_LANGUAGE_VERSION));
|
||||
|
||||
// shader sources for drawing a clipped full-screen triangle. the geometry
|
||||
// is defined by the vertex ID, so a VBO is not required.
|
||||
const GLchar* vert_shader =
|
||||
SHADER_HEADER
|
||||
GLchar vert_shader[256];
|
||||
sprintf(vert_shader, "%s%s", (is_gles ? GLES_SHADER_HEADER : GL_SHADER_HEADER),
|
||||
"out vec2 uv;\n"
|
||||
"void main(void) {\n"
|
||||
" uv = vec2((gl_VertexID << 1) & 2, gl_VertexID & 2);\n"
|
||||
" gl_Position = vec4(uv * vec2(2.0, -2.0) + vec2(-1.0, 1.0), 0.0, 1.0);\n"
|
||||
"}\n";
|
||||
"}\n"
|
||||
);
|
||||
|
||||
const GLchar* frag_shader =
|
||||
SHADER_HEADER
|
||||
GLchar frag_shader[256];
|
||||
sprintf(frag_shader, "%s%s", (is_gles ? GLES_SHADER_HEADER : GL_SHADER_HEADER),
|
||||
"in vec2 uv;\n"
|
||||
"layout(location = 0) out vec4 color;\n"
|
||||
"uniform sampler2D tex0;\n"
|
||||
"void main(void) {\n"
|
||||
" color = texture(tex0, uv);\n"
|
||||
"}\n";
|
||||
"}\n"
|
||||
);
|
||||
|
||||
// compile and link OpenGL program
|
||||
GLuint vert = gl_shader_compile(GL_VERTEX_SHADER, vert_shader, "alp_screen.vert");
|
||||
|
||||
@@ -22,6 +22,11 @@ MainDialog::MainDialog(QWidget* parent) : QDialog(parent)
|
||||
int width = ConfigGetParamInt(configVideoAngrylionPlus, KEY_SCREEN_WIDTH);
|
||||
int height = ConfigGetParamInt(configVideoAngrylionPlus, KEY_SCREEN_HEIGHT);
|
||||
|
||||
// taken from GLideN64's GLideNUI
|
||||
QRegularExpression windowedRegExp("([3-9][0-9]{2}|[1-7][0-9]{3}) ?x ?([2-9][0-9]{2}|[1-3][0-9]{3})");
|
||||
QValidator *windowedValidator = new QRegularExpressionValidator(windowedRegExp, this);
|
||||
this->screenSizeComboBox->setValidator(windowedValidator);
|
||||
|
||||
QString resolutionString = QString::number(width) + " x " + QString::number(height);
|
||||
|
||||
// add resolution if it doesnt exist
|
||||
@@ -61,50 +66,67 @@ void MainDialog::on_buttonBox_clicked(QAbstractButton* button)
|
||||
{
|
||||
QPushButton *pushButton = (QPushButton *)button;
|
||||
QPushButton *okButton = this->buttonBox->button(QDialogButtonBox::Ok);
|
||||
QPushButton *defaultButton = this->buttonBox->button(QDialogButtonBox::RestoreDefaults);
|
||||
|
||||
if (pushButton != okButton)
|
||||
if (pushButton == okButton)
|
||||
{
|
||||
return;
|
||||
// screen size
|
||||
QStringList trimmedScreenSize = this->screenSizeComboBox->currentText().remove(' ').split("x");
|
||||
int width = trimmedScreenSize.at(0).toInt();
|
||||
int height = trimmedScreenSize.at(1).toInt();
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_SCREEN_WIDTH, M64TYPE_INT, &width);
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_SCREEN_HEIGHT, M64TYPE_INT, &height);
|
||||
|
||||
// numWorkers
|
||||
int numWorkersValue = this->numWorkersSpinBox->value();
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_NUM_WORKERS, M64TYPE_INT, &numWorkersValue);
|
||||
|
||||
// viMode
|
||||
int viModeValue = this->viModeComboBox->currentIndex();
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_MODE, M64TYPE_INT, &viModeValue);
|
||||
|
||||
// viInterpolation
|
||||
int viInterpolationValue = this->viInterpolationComboBox->currentIndex();
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_INTERP, M64TYPE_INT, &viInterpolationValue);
|
||||
|
||||
// DpCompat
|
||||
int dpCompatValue = this->dpCompatComboBox->currentIndex();
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_DP_COMPAT, M64TYPE_INT, &dpCompatValue);
|
||||
|
||||
// checkboxes
|
||||
int parallelValue = this->parallelCheckBox->isChecked() ? 1 : 0;
|
||||
int busyLoopValue = this->busyLoopCheckBox->isChecked() ? 1 : 0;
|
||||
|
||||
int viWidescreenValue = this->viWidescreenCheckBox->isChecked() ? 1 : 0;
|
||||
int viHideOverscanValue = this->viHideOverscanCheckBox->isChecked() ? 1 : 0;
|
||||
int viIntegerScalingValue = this->viIntegerScalingCheckBox->isChecked() ? 1 : 0;
|
||||
int viVsyncValue = this->viVsyncCheckBox->isChecked() ? 1 : 0;
|
||||
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_PARALLEL, M64TYPE_BOOL, ¶llelValue);
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_BUSY_LOOP, M64TYPE_BOOL, &busyLoopValue);
|
||||
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_WIDESCREEN, M64TYPE_BOOL, &viWidescreenValue);
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_HIDE_OVERSCAN, M64TYPE_BOOL, &viHideOverscanValue);
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_INTEGER_SCALING, M64TYPE_BOOL, &viIntegerScalingValue);
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_VSYNC, M64TYPE_BOOL, &viVsyncValue);
|
||||
|
||||
ConfigSaveSection("Video-AngrylionPlus");
|
||||
}
|
||||
else if (pushButton == defaultButton)
|
||||
{
|
||||
n64video_config config;
|
||||
n64video_config_init(&config);
|
||||
|
||||
// screen size
|
||||
int width = this->screenSizeComboBox->currentText().split(" x ").at(0).toInt();
|
||||
int height = this->screenSizeComboBox->currentText().split(" x ").at(1).toInt();
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_SCREEN_WIDTH, M64TYPE_INT, &width);
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_SCREEN_HEIGHT, M64TYPE_INT, &height);
|
||||
|
||||
// numWorkers
|
||||
int numWorkersValue = this->numWorkersSpinBox->value();
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_NUM_WORKERS, M64TYPE_INT, &numWorkersValue);
|
||||
|
||||
// viMode
|
||||
int viModeValue = this->viModeComboBox->currentIndex();
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_MODE, M64TYPE_INT, &viModeValue);
|
||||
|
||||
// viInterpolation
|
||||
int viInterpolationValue = this->viInterpolationComboBox->currentIndex();
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_INTERP, M64TYPE_INT, &viInterpolationValue);
|
||||
|
||||
// DpCompat
|
||||
int dpCompatValue = this->dpCompatComboBox->currentIndex();
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_DP_COMPAT, M64TYPE_INT, &dpCompatValue);
|
||||
|
||||
// checkboxes
|
||||
int parallelValue = this->parallelCheckBox->isChecked() ? 1 : 0;
|
||||
int busyLoopValue = this->busyLoopCheckBox->isChecked() ? 1 : 0;
|
||||
|
||||
int viWidescreenValue = this->viWidescreenCheckBox->isChecked() ? 1 : 0;
|
||||
int viHideOverscanValue = this->viHideOverscanCheckBox->isChecked() ? 1 : 0;
|
||||
int viIntegerScalingValue = this->viIntegerScalingCheckBox->isChecked() ? 1 : 0;
|
||||
int viVsyncValue = this->viVsyncCheckBox->isChecked() ? 1 : 0;
|
||||
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_PARALLEL, M64TYPE_BOOL, ¶llelValue);
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_BUSY_LOOP, M64TYPE_BOOL, &busyLoopValue);
|
||||
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_WIDESCREEN, M64TYPE_BOOL, &viWidescreenValue);
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_HIDE_OVERSCAN, M64TYPE_BOOL, &viHideOverscanValue);
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_INTEGER_SCALING, M64TYPE_BOOL, &viIntegerScalingValue);
|
||||
ConfigSetParameter(configVideoAngrylionPlus, KEY_VI_VSYNC, M64TYPE_BOOL, &viVsyncValue);
|
||||
|
||||
ConfigSaveSection("Video-AngrylionPlus");
|
||||
this->screenSizeComboBox->setCurrentText("640 x 480");
|
||||
this->numWorkersSpinBox->setValue(config.num_workers);
|
||||
this->viModeComboBox->setCurrentIndex(config.vi.mode);
|
||||
this->viInterpolationComboBox->setCurrentIndex(config.vi.interp);
|
||||
this->dpCompatComboBox->setCurrentIndex(config.dp.compat);
|
||||
this->parallelCheckBox->setChecked(config.parallel);
|
||||
this->busyLoopCheckBox->setChecked(config.busyloop);
|
||||
this->viWidescreenCheckBox->setChecked(config.vi.widescreen);
|
||||
this->viHideOverscanCheckBox->setChecked(config.vi.hide_overscan);
|
||||
this->viIntegerScalingCheckBox->setChecked(config.vi.integer_scaling);
|
||||
this->viVsyncCheckBox->setChecked(config.vi.vsync);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>347</width>
|
||||
<width>374</width>
|
||||
<height>432</height>
|
||||
</rect>
|
||||
</property>
|
||||
@@ -34,6 +34,9 @@
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="screenSizeComboBox">
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>320 x 240</string>
|
||||
@@ -309,7 +312,7 @@
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok</set>
|
||||
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok|QDialogButtonBox::StandardButton::RestoreDefaults</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -12,6 +12,8 @@
|
||||
#include "m64p_config.h"
|
||||
#include "../gfx_m64p.h"
|
||||
|
||||
#include <QRegularExpression>
|
||||
|
||||
using namespace UserInterface;
|
||||
|
||||
MainDialog::MainDialog(QWidget* parent) : QDialog(parent)
|
||||
@@ -22,6 +24,11 @@ MainDialog::MainDialog(QWidget* parent) : QDialog(parent)
|
||||
int width = ConfigGetParamInt(configVideoParallel, KEY_SCREEN_WIDTH);
|
||||
int height = ConfigGetParamInt(configVideoParallel, KEY_SCREEN_HEIGHT);
|
||||
|
||||
// taken from GLideN64's GLideNUI
|
||||
QRegularExpression windowedRegExp("([3-9][0-9]{2}|[1-7][0-9]{3}) ?x ?([2-9][0-9]{2}|[1-3][0-9]{3})");
|
||||
QValidator *windowedValidator = new QRegularExpressionValidator(windowedRegExp, this);
|
||||
this->screenSizeComboBox->setValidator(windowedValidator);
|
||||
|
||||
QString resolutionString = QString::number(width) + " x " + QString::number(height);
|
||||
|
||||
// add resolution if it doesnt exist
|
||||
@@ -89,73 +96,95 @@ void MainDialog::on_buttonBox_clicked(QAbstractButton* button)
|
||||
{
|
||||
QPushButton *pushButton = (QPushButton *)button;
|
||||
QPushButton *okButton = this->buttonBox->button(QDialogButtonBox::Ok);
|
||||
QPushButton *defaultButton = this->buttonBox->button(QDialogButtonBox::RestoreDefaults);
|
||||
|
||||
if (pushButton != okButton)
|
||||
if (pushButton == okButton)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// screen size
|
||||
QStringList trimmedScreenSize = this->screenSizeComboBox->currentText().remove(' ').split("x");
|
||||
int width = trimmedScreenSize.at(0).toInt();
|
||||
int height = trimmedScreenSize.at(1).toInt();
|
||||
ConfigSetParameter(configVideoParallel, KEY_SCREEN_WIDTH, M64TYPE_INT, &width);
|
||||
ConfigSetParameter(configVideoParallel, KEY_SCREEN_HEIGHT, M64TYPE_INT, &height);
|
||||
|
||||
// screen size
|
||||
int width = this->screenSizeComboBox->currentText().split(" x ").at(0).toInt();
|
||||
int height = this->screenSizeComboBox->currentText().split(" x ").at(1).toInt();
|
||||
ConfigSetParameter(configVideoParallel, KEY_SCREEN_WIDTH, M64TYPE_INT, &width);
|
||||
ConfigSetParameter(configVideoParallel, KEY_SCREEN_HEIGHT, M64TYPE_INT, &height);
|
||||
|
||||
// upscaling
|
||||
int upscalingIndex = this->resolutionUpscaleComboBox->currentIndex();
|
||||
int upscalingValue = 0;
|
||||
if (upscalingIndex == 0)
|
||||
{
|
||||
upscalingValue = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
upscalingValue = this->resolutionUpscaleComboBox->currentText().split("x").at(0).toInt();
|
||||
}
|
||||
ConfigSetParameter(configVideoParallel, KEY_UPSCALING, M64TYPE_INT, &upscalingValue);
|
||||
// upscaling
|
||||
int upscalingIndex = this->resolutionUpscaleComboBox->currentIndex();
|
||||
int upscalingValue = 0;
|
||||
if (upscalingIndex == 0)
|
||||
{
|
||||
upscalingValue = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
upscalingValue = this->resolutionUpscaleComboBox->currentText().split("x").at(0).toInt();
|
||||
}
|
||||
ConfigSetParameter(configVideoParallel, KEY_UPSCALING, M64TYPE_INT, &upscalingValue);
|
||||
|
||||
// deinterlacer
|
||||
int deinterlacerValue = this->deinterlacerComboBox->currentIndex();
|
||||
ConfigSetParameter(configVideoParallel, KEY_DEINTERLACE, M64TYPE_BOOL, &deinterlacerValue);
|
||||
// deinterlacer
|
||||
int deinterlacerValue = this->deinterlacerComboBox->currentIndex();
|
||||
ConfigSetParameter(configVideoParallel, KEY_DEINTERLACE, M64TYPE_BOOL, &deinterlacerValue);
|
||||
|
||||
// downscaler
|
||||
int downscalingValue = this->downscalerComboBox->currentIndex();
|
||||
ConfigSetParameter(configVideoParallel, KEY_DOWNSCALE, M64TYPE_INT, &downscalingValue);
|
||||
// downscaler
|
||||
int downscalingValue = this->downscalerComboBox->currentIndex();
|
||||
ConfigSetParameter(configVideoParallel, KEY_DOWNSCALE, M64TYPE_INT, &downscalingValue);
|
||||
|
||||
// cropOverscan
|
||||
int cropOverscanValue = this->cropOverscanSpinBox->value();
|
||||
ConfigSetParameter(configVideoParallel, KEY_OVERSCANCROP, M64TYPE_INT, &cropOverscanValue);
|
||||
// cropOverscan
|
||||
int cropOverscanValue = this->cropOverscanSpinBox->value();
|
||||
ConfigSetParameter(configVideoParallel, KEY_OVERSCANCROP, M64TYPE_INT, &cropOverscanValue);
|
||||
|
||||
// verticalStretch
|
||||
int verticalStretchValue = this->verticalStretchSpinBox->value();
|
||||
ConfigSetParameter(configVideoParallel, KEY_VERTICAL_STRETCH, M64TYPE_INT, &verticalStretchValue);
|
||||
// verticalStretch
|
||||
int verticalStretchValue = this->verticalStretchSpinBox->value();
|
||||
ConfigSetParameter(configVideoParallel, KEY_VERTICAL_STRETCH, M64TYPE_INT, &verticalStretchValue);
|
||||
|
||||
// checkboxes
|
||||
int superSampledDitherValue = this->superSampledDitherCheckBox->isChecked() ? 1 : 0;
|
||||
int viAaValue = this->viAaCheckBox->isChecked() ? 1 : 0;
|
||||
int viDivotFilterValue = this->viDivotFilterCheckBox->isChecked() ? 1 : 0;
|
||||
int viDeDitheringValue = this->viDeDitheringCheckBox->isChecked() ? 1 : 0;
|
||||
int nativeTextureLodValue = this->nativeTextureLodCheckBox->isChecked() ? 1 : 0;
|
||||
int forceWidescreenValue = this->forceWidescreenCheckBox->isChecked() ? 1 : 0;
|
||||
int supersampledRdramReadsValue = this->supersampledRdramReadsCheckBox->isChecked() ? 1 : 0;
|
||||
int viBilinearFilteringValue = this->viBilinearFilteringCheckBox->isChecked() ? 1 : 0;
|
||||
int viGammaDitherValue = this->viGammaDitherCheckBox->isChecked() ? 1 : 0;
|
||||
int nativeTextRectsValue = this->nativeTextRectsCheckBox->isChecked() ? 1 : 0;
|
||||
int verticalSyncValue = this->verticalSyncCheckBox->isChecked() ? 1 : 0;
|
||||
int synchronizeValue = this->synchronizeCheckBox->isChecked() ? 1 : 0;
|
||||
// checkboxes
|
||||
int superSampledDitherValue = this->superSampledDitherCheckBox->isChecked() ? 1 : 0;
|
||||
int viAaValue = this->viAaCheckBox->isChecked() ? 1 : 0;
|
||||
int viDivotFilterValue = this->viDivotFilterCheckBox->isChecked() ? 1 : 0;
|
||||
int viDeDitheringValue = this->viDeDitheringCheckBox->isChecked() ? 1 : 0;
|
||||
int nativeTextureLodValue = this->nativeTextureLodCheckBox->isChecked() ? 1 : 0;
|
||||
int forceWidescreenValue = this->forceWidescreenCheckBox->isChecked() ? 1 : 0;
|
||||
int supersampledRdramReadsValue = this->supersampledRdramReadsCheckBox->isChecked() ? 1 : 0;
|
||||
int viBilinearFilteringValue = this->viBilinearFilteringCheckBox->isChecked() ? 1 : 0;
|
||||
int viGammaDitherValue = this->viGammaDitherCheckBox->isChecked() ? 1 : 0;
|
||||
int nativeTextRectsValue = this->nativeTextRectsCheckBox->isChecked() ? 1 : 0;
|
||||
int verticalSyncValue = this->verticalSyncCheckBox->isChecked() ? 1 : 0;
|
||||
int synchronizeValue = this->synchronizeCheckBox->isChecked() ? 1 : 0;
|
||||
|
||||
ConfigSetParameter(configVideoParallel, KEY_SSDITHER, M64TYPE_BOOL, &superSampledDitherValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_AA, M64TYPE_BOOL, &viAaValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_DIVOT, M64TYPE_BOOL, &viDivotFilterValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_VIDITHER, M64TYPE_BOOL, &viDeDitheringValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_NATIVETEXTLOD, M64TYPE_BOOL, &nativeTextureLodValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_WIDESCREEN, M64TYPE_BOOL, &forceWidescreenValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_SSREADBACKS, M64TYPE_BOOL, &supersampledRdramReadsValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_VIBILERP, M64TYPE_BOOL, &viBilinearFilteringValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_GAMMADITHER, M64TYPE_BOOL, &viGammaDitherValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_NATIVETEXTRECT, M64TYPE_BOOL, &nativeTextRectsValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_VSYNC, M64TYPE_BOOL, &verticalSyncValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_SYNCHRONOUS, M64TYPE_BOOL, &synchronizeValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_SSDITHER, M64TYPE_BOOL, &superSampledDitherValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_AA, M64TYPE_BOOL, &viAaValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_DIVOT, M64TYPE_BOOL, &viDivotFilterValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_VIDITHER, M64TYPE_BOOL, &viDeDitheringValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_NATIVETEXTLOD, M64TYPE_BOOL, &nativeTextureLodValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_WIDESCREEN, M64TYPE_BOOL, &forceWidescreenValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_SSREADBACKS, M64TYPE_BOOL, &supersampledRdramReadsValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_VIBILERP, M64TYPE_BOOL, &viBilinearFilteringValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_GAMMADITHER, M64TYPE_BOOL, &viGammaDitherValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_NATIVETEXTRECT, M64TYPE_BOOL, &nativeTextRectsValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_VSYNC, M64TYPE_BOOL, &verticalSyncValue);
|
||||
ConfigSetParameter(configVideoParallel, KEY_SYNCHRONOUS, M64TYPE_BOOL, &synchronizeValue);
|
||||
|
||||
ConfigSaveSection("Video-Parallel");
|
||||
ConfigSaveSection("Video-Parallel");
|
||||
}
|
||||
else if (pushButton == defaultButton)
|
||||
{
|
||||
this->screenSizeComboBox->setCurrentText("640 x 480");
|
||||
this->resolutionUpscaleComboBox->setCurrentText("None");
|
||||
this->deinterlacerComboBox->setCurrentIndex(0);
|
||||
this->downscalerComboBox->setCurrentIndex(0);
|
||||
this->cropOverscanSpinBox->setValue(0);
|
||||
this->verticalStretchSpinBox->setValue(0);
|
||||
|
||||
this->superSampledDitherCheckBox->setChecked(true);
|
||||
this->viAaCheckBox->setChecked(true);
|
||||
this->viDivotFilterCheckBox->setChecked(true);
|
||||
this->viDeDitheringCheckBox->setChecked(true);
|
||||
this->nativeTextureLodCheckBox->setChecked(false);
|
||||
this->forceWidescreenCheckBox->setChecked(false);
|
||||
this->supersampledRdramReadsCheckBox->setChecked(false);
|
||||
this->viBilinearFilteringCheckBox->setChecked(true);
|
||||
this->viGammaDitherCheckBox->setChecked(true);
|
||||
this->nativeTextRectsCheckBox->setChecked(true);
|
||||
this->verticalSyncCheckBox->setChecked(false);
|
||||
this->synchronizeCheckBox->setChecked(true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>408</width>
|
||||
<height>446</height>
|
||||
<height>514</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@@ -34,6 +34,9 @@
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QComboBox" name="screenSizeComboBox">
|
||||
<property name="editable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<item>
|
||||
<property name="text">
|
||||
<string>320 x 240</string>
|
||||
@@ -339,7 +342,7 @@
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Vertical</enum>
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
@@ -358,10 +361,10 @@
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Horizontal</enum>
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
|
||||
<set>QDialogButtonBox::StandardButton::Cancel|QDialogButtonBox::StandardButton::Ok|QDialogButtonBox::StandardButton::RestoreDefaults</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
name: validate
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
types: [opened, synchronize]
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ${{ matrix.os }}
|
||||
strategy:
|
||||
matrix:
|
||||
type: [ Debug, Release ]
|
||||
os: [ ubuntu-latest, windows-latest]
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
submodules: true
|
||||
- name: ccache
|
||||
uses: hendrikmuhs/ccache-action@v1.2
|
||||
with:
|
||||
key: ${{ runner.os }}-rt64-ccache-${{ matrix.type }}
|
||||
- name: Install Windows Dependencies
|
||||
if: runner.os == 'Windows'
|
||||
run: |
|
||||
choco install ninja
|
||||
Remove-Item -Path "C:\ProgramData\Chocolatey\bin\ccache.exe" -Force -ErrorAction SilentlyContinue
|
||||
- name: Install Linux Dependencies
|
||||
if: runner.os == 'Linux'
|
||||
run: |
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y ninja-build libsdl2-dev libgtk-3-dev
|
||||
|
||||
# Install SDL2
|
||||
echo ::group::install SDL2
|
||||
|
||||
# Enable ccache
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
|
||||
wget https://www.libsdl.org/release/SDL2-2.26.1.tar.gz
|
||||
tar -xzf SDL2-2.26.1.tar.gz
|
||||
cd SDL2-2.26.1
|
||||
./configure
|
||||
make -j 10
|
||||
sudo make install
|
||||
sudo cp -av /usr/local/lib/libSDL* /lib/x86_64-linux-gnu/
|
||||
echo ::endgroup::
|
||||
- name: Configure Developer Command Prompt
|
||||
if: runner.os == 'Windows'
|
||||
uses: ilammy/msvc-dev-cmd@v1
|
||||
- name: Build RT64 (Unix)
|
||||
if: runner.os != 'Windows'
|
||||
run: |-
|
||||
# enable ccache
|
||||
export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"
|
||||
|
||||
cmake -DCMAKE_BUILD_TYPE=${{ matrix.type }} -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_MAKE_PROGRAM=ninja -G Ninja -S . -B cmake-build
|
||||
cmake --build cmake-build --config ${{ matrix.type }} --target rt64 -j $(nproc)
|
||||
- name: Build RT64 (Windows)
|
||||
if: runner.os == 'Windows'
|
||||
run: |-
|
||||
# enable ccache
|
||||
set $env:PATH="$env:USERPROFILE/.cargo/bin;$env:PATH"
|
||||
$cpuCores = (Get-CimInstance -ClassName Win32_Processor).NumberOfLogicalProcessors
|
||||
|
||||
cmake -DCMAKE_BUILD_TYPE=${{ matrix.type }} -DCMAKE_CXX_COMPILER_LAUNCHER=ccache -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_MAKE_PROGRAM=ninja -G Ninja -S . -B cmake-build
|
||||
cmake --build cmake-build --config ${{ matrix.type }} --target rt64 -j $cpuCores
|
||||
@@ -0,0 +1,25 @@
|
||||
*.vs
|
||||
*.db
|
||||
*.log
|
||||
*.dll
|
||||
*.exe
|
||||
*.lib
|
||||
*.exp
|
||||
*.ipdb
|
||||
*.iobj
|
||||
*.tlog
|
||||
*.recipe
|
||||
*.FileListAbsolute.txt
|
||||
*.idb
|
||||
*.hlsl.h
|
||||
*.dxil.h
|
||||
*.spirv.h
|
||||
*.bat
|
||||
*.rw
|
||||
*.rw.h
|
||||
*.obj
|
||||
*.pdb
|
||||
build/
|
||||
.vscode/
|
||||
.idea
|
||||
cmake-build-debug*
|
||||
@@ -0,0 +1,48 @@
|
||||
[submodule "src/contrib/DLSS"]
|
||||
path = src/contrib/DLSS
|
||||
url = https://github.com/NVIDIA/DLSS
|
||||
[submodule "src/contrib/implot"]
|
||||
path = src/contrib/implot
|
||||
url = https://github.com/epezent/implot
|
||||
[submodule "src/contrib/hlslpp"]
|
||||
path = src/contrib/hlslpp
|
||||
url = https://github.com/redorav/hlslpp
|
||||
[submodule "src/contrib/xess"]
|
||||
path = src/contrib/xess
|
||||
url = https://github.com/intel/xess
|
||||
[submodule "src/contrib/mupen64plus-win32-deps"]
|
||||
path = src/contrib/mupen64plus-win32-deps
|
||||
url = https://github.com/mupen64plus/mupen64plus-win32-deps
|
||||
[submodule "src/contrib/mupen64plus-core"]
|
||||
path = src/contrib/mupen64plus-core
|
||||
url = https://github.com/mupen64plus/mupen64plus-core
|
||||
[submodule "src/contrib/xxHash"]
|
||||
path = src/contrib/xxHash
|
||||
url = https://github.com/Cyan4973/xxHash
|
||||
[submodule "src/contrib/volk"]
|
||||
path = src/contrib/volk
|
||||
url = https://github.com/zeux/volk
|
||||
[submodule "src/contrib/Vulkan-Headers"]
|
||||
path = src/contrib/Vulkan-Headers
|
||||
url = https://github.com/KhronosGroup/Vulkan-Headers
|
||||
[submodule "src/contrib/VulkanMemoryAllocator"]
|
||||
path = src/contrib/VulkanMemoryAllocator
|
||||
url = https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator
|
||||
[submodule "src/contrib/imgui"]
|
||||
path = src/contrib/imgui
|
||||
url = https://github.com/ocornut/imgui
|
||||
[submodule "src/contrib/im3d"]
|
||||
path = src/contrib/im3d
|
||||
url = https://github.com/john-chapman/im3d
|
||||
[submodule "src/contrib/D3D12MemoryAllocator"]
|
||||
path = src/contrib/D3D12MemoryAllocator
|
||||
url = https://github.com/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator
|
||||
[submodule "src/contrib/dxc"]
|
||||
path = src/contrib/dxc
|
||||
url = https://github.com/rt64/dxc-bin
|
||||
[submodule "src/contrib/stb"]
|
||||
path = src/contrib/stb
|
||||
url = https://github.com/nothings/stb
|
||||
[submodule "src/contrib/nativefiledialog-extended"]
|
||||
path = src/contrib/nativefiledialog-extended
|
||||
url = https://github.com/btzy/nativefiledialog-extended
|
||||
@@ -0,0 +1,12 @@
|
||||
; DO NOT EDIT (unless you know what you are doing)
|
||||
;
|
||||
; This subdirectory is a git "subrepo", and this file is maintained by the
|
||||
; git-subrepo command. See https://github.com/ingydotnet/git-subrepo#readme
|
||||
;
|
||||
[subrepo]
|
||||
remote = git@github.com:rt64/rt64.git
|
||||
branch = main
|
||||
commit = 1adcbea31a04f2403da729eb5dfed3950dd7ec52
|
||||
parent = e75381242a6e5020e6cf3f8c2ab0185e952b5a56
|
||||
method = merge
|
||||
cmdver = 0.4.6
|
||||
@@ -0,0 +1,450 @@
|
||||
cmake_minimum_required(VERSION 3.20)
|
||||
project(rt64)
|
||||
set(CMAKE_CXX_STANDARD 17)
|
||||
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
|
||||
|
||||
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
|
||||
|
||||
option(RT64_BUILD_PLUGIN "Build plugin version of RT64" OFF)
|
||||
|
||||
option(RT64_BUILD_EXAMPLES "Build examples for RT64" OFF)
|
||||
if (${RT64_BUILD_EXAMPLES})
|
||||
set(RT64_STATIC ON)
|
||||
endif()
|
||||
|
||||
function(preprocess INFILE OUTFILE OPTIONS)
|
||||
if (CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
add_custom_command(OUTPUT ${OUTFILE}
|
||||
COMMAND clang -x c -E -P ${INFILE} -o ${OUTFILE} ${OPTIONS}
|
||||
DEPENDS ${INFILE})
|
||||
else()
|
||||
add_custom_command(OUTPUT ${OUTFILE}
|
||||
COMMAND ${CMAKE_CXX_COMPILER} /Zs /EP ${INFILE} ${OPTIONS} > ${OUTFILE}
|
||||
DEPENDS ${INFILE})
|
||||
endif()
|
||||
else()
|
||||
add_custom_command(OUTPUT ${OUTFILE}
|
||||
COMMAND ${CMAKE_CXX_COMPILER} -x c -E -P ${INFILE} -o ${OUTFILE} ${OPTIONS}
|
||||
DEPENDS ${INFILE})
|
||||
endif()
|
||||
endfunction()
|
||||
|
||||
if (WIN32)
|
||||
set (DXC "${PROJECT_SOURCE_DIR}/src/contrib/dxc/bin/x64/dxc.exe")
|
||||
add_compile_definitions(NOMINMAX)
|
||||
|
||||
# Dependencies that must be next to the DLL.
|
||||
configure_file("${PROJECT_SOURCE_DIR}/src/contrib/dxc/bin/x64/dxcompiler.dll" "dxcompiler.dll" COPYONLY)
|
||||
configure_file("${PROJECT_SOURCE_DIR}/src/contrib/dxc/bin/x64/dxil.dll" "dxil.dll" COPYONLY)
|
||||
else()
|
||||
if (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
|
||||
if (APPLE)
|
||||
set (DXC "DYLD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/src/contrib/dxc/lib/x64" "${PROJECT_SOURCE_DIR}/src/contrib/dxc/bin/x64/dxc")
|
||||
else()
|
||||
set (DXC "LD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/src/contrib/dxc/lib/x64" "${PROJECT_SOURCE_DIR}/src/contrib/dxc/bin/x64/dxc")
|
||||
endif()
|
||||
else()
|
||||
if (APPLE)
|
||||
set (DXC "DYLD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/src/contrib/dxc/lib/arm64" "${PROJECT_SOURCE_DIR}/src/contrib/dxc/bin/arm64/dxc-macos")
|
||||
else()
|
||||
set (DXC "LD_LIBRARY_PATH=${PROJECT_SOURCE_DIR}/src/contrib/dxc/lib/arm64" "${PROJECT_SOURCE_DIR}/src/contrib/dxc/bin/arm64/dxc-linux")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
message(STATUS "DXC: ${DXC}")
|
||||
endif()
|
||||
|
||||
# Build the file_to_c utility for converting binary files into a .c and .h file pair
|
||||
add_executable(file_to_c src/tools/file_to_c.cpp)
|
||||
|
||||
add_subdirectory(src/contrib/nativefiledialog-extended)
|
||||
|
||||
if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
|
||||
add_compile_options(-Wno-nullability-completeness)
|
||||
endif()
|
||||
|
||||
set(ANDROID_PLATFORM android-24)
|
||||
set(ANDROID_ABI arm64-v8a)
|
||||
|
||||
# For DXC
|
||||
set (DXC_COMMON_OPTS "-I${PROJECT_SOURCE_DIR}/src")
|
||||
set (DXC_DXIL_OPTS "-Wno-ignored-attributes")
|
||||
set (DXC_SPV_OPTS "-spirv" "-fspv-target-env=vulkan1.0" "-fvk-use-dx-layout")
|
||||
set (DXC_PS_OPTS "${DXC_COMMON_OPTS}" "-E" "PSMain" "-T ps_6_0")
|
||||
set (DXC_VS_OPTS "${DXC_COMMON_OPTS}" "-E" "VSMain" "-T vs_6_0" "-fvk-invert-y")
|
||||
set (DXC_CS_OPTS "${DXC_COMMON_OPTS}" "-E" "CSMain" "-T cs_6_0")
|
||||
set (DXC_GS_OPTS "${DXC_COMMON_OPTS}" "-E" "GSMain" "-T gs_6_0")
|
||||
set (DXC_RT_OPTS "${DXC_COMMON_OPTS}" "-D" "RT_SHADER" "-T" "lib_6_3" "-fspv-target-env=vulkan1.1spirv1.4" "-fspv-extension=SPV_KHR_ray_tracing" "-fspv-extension=SPV_EXT_descriptor_indexing")
|
||||
|
||||
function(build_shader_spirv_impl TARGETOBJ FILENAME TARGET_NAME OUTNAME)
|
||||
add_custom_command(OUTPUT ${OUTNAME}.spv
|
||||
COMMAND ${DXC} ${DXC_SPV_OPTS} ${ARGN} ${FILENAME} /Fo ${OUTNAME}.spv
|
||||
DEPENDS ${FILENAME})
|
||||
add_custom_command(OUTPUT ${OUTNAME}.spirv.c
|
||||
COMMAND file_to_c ${OUTNAME}.spv ${TARGET_NAME}BlobSPIRV ${OUTNAME}.spirv.c ${OUTNAME}.spirv.h
|
||||
DEPENDS ${OUTNAME}.spv file_to_c
|
||||
BYPRODUCTS ${OUTNAME}.spirv.h)
|
||||
target_sources(${TARGETOBJ} PRIVATE ${OUTNAME}.spirv.c)
|
||||
endfunction()
|
||||
|
||||
function(build_shader_dxil_impl TARGETOBJ FILENAME TARGET_NAME OUTNAME)
|
||||
add_custom_command(OUTPUT ${OUTNAME}.dxil
|
||||
COMMAND ${DXC} ${DXC_DXIL_OPTS} ${ARGN} ${FILENAME} /Fo ${OUTNAME}.dxil
|
||||
DEPENDS ${FILENAME})
|
||||
add_custom_command(OUTPUT ${OUTNAME}.dxil.c
|
||||
COMMAND file_to_c ${OUTNAME}.dxil ${TARGET_NAME}BlobDXIL ${OUTNAME}.dxil.c ${OUTNAME}.dxil.h
|
||||
DEPENDS ${OUTNAME}.dxil file_to_c
|
||||
BYPRODUCTS ${OUTNAME}.dxil.h)
|
||||
target_sources(${TARGETOBJ} PRIVATE ${OUTNAME}.dxil.c)
|
||||
endfunction()
|
||||
|
||||
function(build_shader TARGETOBJ SHADERNAME OPTIONS)
|
||||
set(FILENAME "${PROJECT_SOURCE_DIR}/${SHADERNAME}")
|
||||
if (${ARGC} GREATER 3)
|
||||
set(OUTNAME "${CMAKE_BINARY_DIR}/${ARGV3}")
|
||||
else()
|
||||
set(OUTNAME "${CMAKE_BINARY_DIR}/${SHADERNAME}")
|
||||
endif()
|
||||
# Get any optional compiler args passed to this function
|
||||
if (${ARGC} GREATER 4)
|
||||
set(EXTRA_ARGS "${ARGN}")
|
||||
list(REMOVE_AT EXTRA_ARGS 0)
|
||||
endif()
|
||||
cmake_path(GET OUTNAME STEM TARGET_NAME)
|
||||
cmake_path(GET OUTNAME PARENT_PATH OUTPUT_DIR)
|
||||
file(MAKE_DIRECTORY ${OUTPUT_DIR})
|
||||
# Compile DXIL shader binaries if building on Windows
|
||||
if (WIN32)
|
||||
build_shader_dxil_impl(${TARGETOBJ} ${FILENAME} ${TARGET_NAME} ${OUTNAME} ${OPTIONS} ${EXTRA_ARGS})
|
||||
endif()
|
||||
build_shader_spirv_impl(${TARGETOBJ} ${FILENAME} ${TARGET_NAME} ${OUTNAME} ${OPTIONS} ${EXTRA_ARGS})
|
||||
endfunction()
|
||||
|
||||
function(build_shader_spirv TARGETOBJ SHADERNAME OPTIONS)
|
||||
set(FILENAME "${PROJECT_SOURCE_DIR}/${SHADERNAME}")
|
||||
if (${ARGC} GREATER 3)
|
||||
set(OUTNAME "${CMAKE_BINARY_DIR}/${ARGV3}")
|
||||
else()
|
||||
set(OUTNAME "${CMAKE_BINARY_DIR}/${SHADERNAME}")
|
||||
endif()
|
||||
# Get any optional compiler args passed to this function
|
||||
if (${ARGC} GREATER 4)
|
||||
set(EXTRA_ARGS "${ARGN}")
|
||||
list(REMOVE_AT EXTRA_ARGS 0)
|
||||
endif()
|
||||
cmake_path(GET OUTNAME STEM TARGET_NAME)
|
||||
cmake_path(GET OUTNAME PARENT_PATH OUTPUT_DIR)
|
||||
file(MAKE_DIRECTORY ${OUTPUT_DIR})
|
||||
build_shader_spirv_impl(${TARGETOBJ} ${FILENAME} ${TARGET_NAME} ${OUTNAME} ${OPTIONS} ${EXTRA_ARGS})
|
||||
endfunction()
|
||||
|
||||
function(preprocess_shader TARGETOBJ SHADERNAME)
|
||||
set(FILENAME "${PROJECT_SOURCE_DIR}/${SHADERNAME}")
|
||||
set(OUTNAME "${CMAKE_BINARY_DIR}/${SHADERNAME}")
|
||||
cmake_path(GET SHADERNAME STEM TARGET_NAME)
|
||||
cmake_path(GET OUTNAME PARENT_PATH OUTPUT_DIR)
|
||||
preprocess(${FILENAME} ${OUTNAME}.rw ${DXC_COMMON_OPTS})
|
||||
add_custom_command(OUTPUT ${OUTNAME}.rw.c
|
||||
COMMAND file_to_c ${OUTNAME}.rw ${TARGET_NAME}Text ${OUTNAME}.rw.c ${OUTNAME}.rw.h
|
||||
DEPENDS ${OUTNAME}.rw file_to_c
|
||||
BYPRODUCTS ${OUTNAME}.rw.h)
|
||||
file(MAKE_DIRECTORY ${OUTPUT_DIR})
|
||||
target_sources(${TARGETOBJ} PRIVATE ${OUTNAME}.rw.c)
|
||||
endfunction()
|
||||
|
||||
function(build_pixel_shader TARGETOBJ SHADERNAME)
|
||||
build_shader(${TARGETOBJ} ${SHADERNAME} "${DXC_PS_OPTS}" ${ARGN})
|
||||
endfunction()
|
||||
|
||||
function(build_vertex_shader TARGETOBJ SHADERNAME)
|
||||
build_shader(${TARGETOBJ} ${SHADERNAME} "${DXC_VS_OPTS}" ${ARGN})
|
||||
endfunction()
|
||||
|
||||
function(build_pixel_shader_spirv TARGETOBJ SHADERNAME)
|
||||
build_shader_spirv(${TARGETOBJ} ${SHADERNAME} "${DXC_PS_OPTS}" ${ARGN})
|
||||
endfunction()
|
||||
|
||||
function(build_vertex_shader_spirv TARGETOBJ SHADERNAME)
|
||||
build_shader_spirv(${TARGETOBJ} ${SHADERNAME} "${DXC_VS_OPTS}" ${ARGN})
|
||||
endfunction()
|
||||
|
||||
function(build_compute_shader TARGETOBJ SHADERNAME)
|
||||
build_shader(${TARGETOBJ} ${SHADERNAME} "${DXC_CS_OPTS}" ${ARGN})
|
||||
endfunction()
|
||||
|
||||
function(build_geo_shader TARGETOBJ SHADERNAME)
|
||||
build_shader(${TARGETOBJ} ${SHADERNAME} "${DXC_GS_OPTS}" ${ARGN})
|
||||
endfunction()
|
||||
|
||||
function(build_ray_shader TARGETOBJ SHADERNAME)
|
||||
build_shader(${TARGETOBJ} ${SHADERNAME} "${DXC_RT_OPTS}" ${ARGN})
|
||||
endfunction()
|
||||
|
||||
# Point cmake at src/contrib/mupen64plus-win32-deps/SDL2-2.26.3 for SDL2 on windows, look for an installed package on other systems
|
||||
if (WIN32)
|
||||
set(SDL2_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/src/contrib/mupen64plus-win32-deps/SDL2-2.26.3/include")
|
||||
set(SDL2_LIBRARIES "SDL2" "SDL2main")
|
||||
link_directories("${PROJECT_SOURCE_DIR}/src/contrib/mupen64plus-win32-deps/SDL2-2.26.3/lib/x64")
|
||||
else()
|
||||
find_package(SDL2 REQUIRED)
|
||||
endif()
|
||||
|
||||
message(STATUS "${SDL2_INCLUDE_DIRS} ${SDL2_LIBRARIES}")
|
||||
|
||||
add_compile_definitions(
|
||||
HLSL_CPU
|
||||
FFX_GCC
|
||||
IMGUI_IMPL_VULKAN_NO_PROTOTYPES
|
||||
)
|
||||
|
||||
set (SOURCES
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_common.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_dynamic_libraries.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_elapsed_timer.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_emulator_configuration.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_enhancement_configuration.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_math.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_profiling_timer.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_thread.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_timer.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_user_configuration.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/common/rt64_user_paths.cpp"
|
||||
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_f3d.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_f3dex.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_f3dex2.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_f3dgolden.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_f3dpd.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_f3dwave.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_f3dzex2.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_l3dex2.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_rdp.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_s2dex.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_s2dex2.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gbi/rt64_gbi_extended.cpp"
|
||||
|
||||
"${PROJECT_SOURCE_DIR}/src/gui/rt64_camera_controller.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gui/rt64_debugger_inspector.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gui/rt64_file_dialog.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/gui/rt64_inspector.cpp"
|
||||
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_application.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_application_window.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_color_converter.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_command_warning.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_draw_call.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_framebuffer.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_framebuffer_changes.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_framebuffer_manager.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_framebuffer_pair.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_framebuffer_storage.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_game_frame.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_interpreter.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_light_manager.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_present_queue.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_projection.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_rdp.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_rdp_tmem.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_rigid_body.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_rsp.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_state.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_vi.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_workload.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/hle/rt64_workload_queue.cpp"
|
||||
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_buffer_uploader.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_framebuffer_renderer.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_geometry_mode.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_native_target.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_optimus.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_projection_processor.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_raster_shader.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_raster_shader_cache.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_render_target.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_render_target_manager.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_render_worker.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_rsp_processor.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_shader_common.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_shader_compiler.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_shader_library.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_texture_cache.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_tile_processor.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_transform_processor.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_upscaler.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_vertex_processor.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/render/rt64_vi_renderer.cpp"
|
||||
|
||||
"${PROJECT_SOURCE_DIR}/src/preset/rt64_preset.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/preset/rt64_preset_draw_call.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/preset/rt64_preset_light.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/preset/rt64_preset_material.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/preset/rt64_preset_scene.cpp"
|
||||
|
||||
"${PROJECT_SOURCE_DIR}/src/shared/rt64_hlsl_json.cpp"
|
||||
|
||||
"${PROJECT_SOURCE_DIR}/src/rhi/rt64_render_hooks.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/vulkan/rt64_vulkan.cpp"
|
||||
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui/imgui.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui/imgui_demo.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui/imgui_draw.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui/imgui_tables.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui/imgui_widgets.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui/backends/imgui_impl_vulkan.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/im3d/im3d.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/implot/implot.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/implot/implot_demo.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/implot/implot_items.cpp"
|
||||
)
|
||||
|
||||
include_directories(
|
||||
"${SDL2_INCLUDE_DIRS}"
|
||||
"${PROJECT_SOURCE_DIR}/src"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/D3D12MemoryAllocator/include"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/D3D12MemoryAllocator/src"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/hlslpp/include"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/Vulkan-Headers/include"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/VulkanMemoryAllocator/include"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/mupen64plus-core/src/api"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/nativefiledialog-extended/src/include"
|
||||
)
|
||||
|
||||
if (NOT RT64_BUILD_PLUGIN AND WIN32)
|
||||
# DXC only needs to be included during runtime for Windows.
|
||||
include_directories("${PROJECT_SOURCE_DIR}/src/contrib/dxc/inc")
|
||||
endif()
|
||||
|
||||
option(RT64_STATIC "Build RT64 as a static library" OFF)
|
||||
if (${RT64_STATIC})
|
||||
add_library(rt64 STATIC ${SOURCES})
|
||||
else()
|
||||
add_library(rt64 SHARED ${SOURCES})
|
||||
endif()
|
||||
|
||||
set_target_properties(rt64 PROPERTIES OUTPUT_NAME "rt64")
|
||||
set_target_properties(rt64 PROPERTIES PREFIX "")
|
||||
|
||||
# Add common libraries.
|
||||
target_link_libraries(rt64 nfd)
|
||||
|
||||
# Add any Windows-specific source files and libraries
|
||||
if (NOT RT64_BUILD_PLUGIN AND WIN32)
|
||||
target_sources(rt64 PRIVATE
|
||||
"${PROJECT_SOURCE_DIR}/src/d3d12/rt64_d3d12.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui/backends/imgui_impl_dx12.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui/backends/imgui_impl_win32.cpp"
|
||||
)
|
||||
target_link_libraries(rt64
|
||||
delayimp.lib
|
||||
D3D12
|
||||
DXGI
|
||||
Shcore.lib
|
||||
${PROJECT_SOURCE_DIR}/src/contrib/dxc/lib/x64/dxcompiler.lib)
|
||||
endif()
|
||||
|
||||
if (RT64_BUILD_PLUGIN)
|
||||
target_compile_definitions(rt64 PRIVATE RT64_BUILD_PLUGIN)
|
||||
target_sources(rt64 PRIVATE
|
||||
"${PROJECT_SOURCE_DIR}/src/api/rt64_api_common.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/api/rt64_api_plugin.cpp"
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui/backends/imgui_impl_sdl2.cpp"
|
||||
)
|
||||
if (WIN32)
|
||||
target_sources(rt64 PRIVATE
|
||||
"${PROJECT_SOURCE_DIR}/src/contrib/imgui/backends/imgui_impl_win32.cpp"
|
||||
)
|
||||
target_link_libraries(rt64
|
||||
delayimp.lib
|
||||
Shcore.lib
|
||||
Dwmapi.lib
|
||||
)
|
||||
endif()
|
||||
endif(RT64_BUILD_PLUGIN)
|
||||
|
||||
target_link_directories(rt64 PRIVATE ${PROJECT_SOURCE_DIR}/src/contrib/dxc)
|
||||
|
||||
if (NOT ANDROID)
|
||||
target_link_libraries(rt64 ${SDL2_LIBRARIES})
|
||||
endif()
|
||||
|
||||
if (NOT RT64_BUILD_PLUGIN AND CMAKE_SYSTEM_NAME MATCHES "Linux")
|
||||
find_package(X11 REQUIRED)
|
||||
target_include_directories(rt64 PUBLIC ${X11_INCLUDE_DIR} ${X11_Xrandr_INCLUDE_PATH})
|
||||
target_link_libraries(rt64 ${X11_LIBRARIES} ${X11_Xrandr_LIB})
|
||||
endif()
|
||||
|
||||
preprocess_shader(rt64 "src/shaders/RasterPS.hlsl")
|
||||
preprocess_shader(rt64 "src/shaders/RasterVS.hlsl")
|
||||
|
||||
build_pixel_shader( rt64 "src/shaders/RasterPS.hlsl" "src/shaders/RasterPSDynamic.hlsl" "-D DYNAMIC_RENDER_PARAMS")
|
||||
build_pixel_shader( rt64 "src/shaders/RasterPS.hlsl" "src/shaders/RasterPSDynamicMS.hlsl" "-D DYNAMIC_RENDER_PARAMS" "-D MULTISAMPLING")
|
||||
build_pixel_shader_spirv(rt64 "src/shaders/RasterPS.hlsl" "src/shaders/RasterPSSpecConstant.hlsl" "-D SPEC_CONSTANT_RENDER_PARAMS")
|
||||
build_pixel_shader_spirv(rt64 "src/shaders/RasterPS.hlsl" "src/shaders/RasterPSSpecConstantFlat.hlsl" "-D SPEC_CONSTANT_RENDER_PARAMS" "-D VERTEX_FLAT_COLOR")
|
||||
build_pixel_shader_spirv(rt64 "src/shaders/RasterPS.hlsl" "src/shaders/RasterPSSpecConstantDepth.hlsl" "-D SPEC_CONSTANT_RENDER_PARAMS" "-D OUTPUT_DEPTH")
|
||||
build_pixel_shader_spirv(rt64 "src/shaders/RasterPS.hlsl" "src/shaders/RasterPSSpecConstantDepthMS.hlsl" "-D SPEC_CONSTANT_RENDER_PARAMS" "-D OUTPUT_DEPTH" "-D MULTISAMPLING")
|
||||
build_pixel_shader_spirv(rt64 "src/shaders/RasterPS.hlsl" "src/shaders/RasterPSSpecConstantFlatDepth.hlsl" "-D SPEC_CONSTANT_RENDER_PARAMS" "-D VERTEX_FLAT_COLOR" "-D OUTPUT_DEPTH")
|
||||
build_pixel_shader_spirv(rt64 "src/shaders/RasterPS.hlsl" "src/shaders/RasterPSSpecConstantFlatDepthMS.hlsl" "-D SPEC_CONSTANT_RENDER_PARAMS" "-D VERTEX_FLAT_COLOR" "-D OUTPUT_DEPTH" "-D MULTISAMPLING")
|
||||
build_vertex_shader( rt64 "src/shaders/RasterVS.hlsl" "src/shaders/RasterVSDynamic.hlsl" "-D DYNAMIC_RENDER_PARAMS")
|
||||
build_vertex_shader_spirv( rt64 "src/shaders/RasterVS.hlsl" "src/shaders/RasterVSSpecConstant.hlsl" "-D SPEC_CONSTANT_RENDER_PARAMS")
|
||||
build_vertex_shader_spirv( rt64 "src/shaders/RasterVS.hlsl" "src/shaders/RasterVSSpecConstantFlat.hlsl" "-D SPEC_CONSTANT_RENDER_PARAMS" "-D VERTEX_FLAT_COLOR")
|
||||
build_compute_shader(rt64 "src/shaders/FbChangesClearCS.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/FbChangesDrawColorPS.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/FbChangesDrawDepthPS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/FbReadAnyChangesCS.hlsl" "src/shaders/FbReadAnyChangesCS.hlsl" "-O0")
|
||||
build_compute_shader(rt64 "src/shaders/FbReinterpretCS.hlsl" "src/shaders/FbReinterpretCS.hlsl" "-O0")
|
||||
build_compute_shader(rt64 "src/shaders/FbReadAnyFullCS.hlsl" "src/shaders/FbReadAnyFullCS.hlsl" "-O0")
|
||||
build_compute_shader(rt64 "src/shaders/FbWriteColorCS.hlsl" "src/shaders/FbWriteColorCS.hlsl" "-O0")
|
||||
build_compute_shader(rt64 "src/shaders/FbWriteDepthCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/FbWriteDepthCS.hlsl" "src/shaders/FbWriteDepthCSMS.hlsl" "-D MULTISAMPLING")
|
||||
build_compute_shader(rt64 "src/shaders/GaussianFilterRGB3x3CS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/BoxFilterCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/BicubicScalingCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/HistogramAverageCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/HistogramClearCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/HistogramSetCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/IdleCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/LuminanceHistogramCS.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/PostBlendDitherNoisePS.hlsl" "src/shaders/PostBlendDitherNoiseAddPS.hlsl" "-D ADD_MODE")
|
||||
build_pixel_shader( rt64 "src/shaders/PostBlendDitherNoisePS.hlsl" "src/shaders/PostBlendDitherNoiseSubPS.hlsl" "-D SUB_MODE")
|
||||
build_compute_shader(rt64 "src/shaders/RSPModifyCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/RSPProcessCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/RSPWorldCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/RSPSmoothNormalCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/RSPVertexTestZCS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/RSPVertexTestZCS.hlsl" "src/shaders/RSPVertexTestZCSMS.hlsl" "-D MULTISAMPLING")
|
||||
build_pixel_shader( rt64 "src/shaders/RtCopyColorToDepthPS.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/RtCopyColorToDepthPS.hlsl" "src/shaders/RtCopyColorToDepthPSMS.hlsl" "-D MULTISAMPLING")
|
||||
build_pixel_shader( rt64 "src/shaders/RtCopyDepthToColorPS.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/RtCopyDepthToColorPS.hlsl" "src/shaders/RtCopyDepthToColorPSMS.hlsl" "-D MULTISAMPLING")
|
||||
build_pixel_shader( rt64 "src/shaders/TextureCopyPS.hlsl")
|
||||
build_compute_shader(rt64 "src/shaders/TextureDecodeCS.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/VideoInterfacePS.hlsl" "src/shaders/VideoInterfacePSRegular.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/VideoInterfacePS.hlsl" "src/shaders/VideoInterfacePSPixel.hlsl" "-D PIXEL_ANTIALIASING")
|
||||
build_vertex_shader( rt64 "src/shaders/FullScreenVS.hlsl")
|
||||
build_vertex_shader( rt64 "src/shaders/Im3DVS.hlsl")
|
||||
build_geo_shader( rt64 "src/shaders/Im3DGSPoints.hlsl")
|
||||
build_geo_shader( rt64 "src/shaders/Im3DGSLines.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/ComposePS.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/DebugPS.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/Im3DPS.hlsl")
|
||||
build_pixel_shader( rt64 "src/shaders/PostProcessPS.hlsl")
|
||||
|
||||
target_include_directories(rt64 PRIVATE ${CMAKE_BINARY_DIR}/src)
|
||||
|
||||
if (RT64_BUILD_EXAMPLES)
|
||||
add_executable(rhi_test "examples/rt64_render_interface.cpp" "examples/rhi_test.cpp")
|
||||
target_link_libraries(rhi_test rt64)
|
||||
|
||||
build_pixel_shader( rhi_test "examples/shaders/RenderInterfaceTestPS.hlsl")
|
||||
build_vertex_shader( rhi_test "examples/shaders/RenderInterfaceTestVS.hlsl")
|
||||
build_compute_shader(rhi_test "examples/shaders/RenderInterfaceTestCS.hlsl")
|
||||
build_ray_shader( rhi_test "examples/shaders/RenderInterfaceTestRT.hlsl")
|
||||
build_pixel_shader( rhi_test "examples/shaders/RenderInterfaceTestPostPS.hlsl")
|
||||
build_vertex_shader( rhi_test "examples/shaders/RenderInterfaceTestPostVS.hlsl")
|
||||
|
||||
target_include_directories(rhi_test PRIVATE ${CMAKE_BINARY_DIR}/examples)
|
||||
endif()
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Debug",
|
||||
"generator": "Ninja",
|
||||
"configurationType": "Debug",
|
||||
"inheritEnvironments": [ "msvc_x64_x64" ],
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": ""
|
||||
},
|
||||
{
|
||||
"name": "Release",
|
||||
"generator": "Ninja",
|
||||
"configurationType": "RelWithDebInfo",
|
||||
"buildRoot": "${projectDir}\\out\\build\\${name}",
|
||||
"installRoot": "${projectDir}\\out\\install\\${name}",
|
||||
"cmakeCommandArgs": "",
|
||||
"buildCommandArgs": "",
|
||||
"ctestCommandArgs": "",
|
||||
"inheritEnvironments": [ "msvc_x64_x64" ]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 RT64 Contributors
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -0,0 +1,103 @@
|
||||
# RT64
|
||||
RT64 is an N64 graphics renderer for playing games with enhancements in emulators and native ports.
|
||||
|
||||
# Work in Progress
|
||||
|
||||
### **Emulator Support (Plugin) and Ray Tracing (RT) are not available in this repository yet.**
|
||||
|
||||
This repository has been made public to provide a working implementation to native ports that wish to use RT64 as their renderer.
|
||||
|
||||
**Development of these features is still ongoing and will be added to this repository when they're ready.** Thank you for your patience!
|
||||
|
||||
# Features available
|
||||
* Modern N64 renderer built on the latest APIs (D3D12 and Vulkan).
|
||||
* Uses ubershaders to guarantee no stutters due to pipeline compilation.
|
||||
* Brand new architecture designed around offering novel enhancements.
|
||||
* High level of accuracy and no tolerance for game-specific workarounds to achieve correct rendering.
|
||||
* Input latency reduction options to either skip the game's native buffering or draw as early as possible.
|
||||
* Render with a higher resolution and downsample to a resolution closer to the original game.
|
||||
* Support for Widescreen with arbitrary aspect ratios, including Ultrawide support (limited game support).
|
||||
* Interpolate the game's visuals to 60 FPS or above (HFR) by generating new frames and modifying them in 3D space (limited game support).
|
||||
* Extended command set for better integration of widescreen, interpolation and path tracing features (for use with rom patches, rom hacks, and ports).
|
||||
* Supports Windows 10, Windows 11 and Linux.
|
||||
|
||||
# Features in development (in priority order)
|
||||
* HD texture packs.
|
||||
* Compatibility with texture packs that use the Rice texture format.
|
||||
* Brand new texture pack configuration format for higher levels of control.
|
||||
* Supports both DDS (with mipmaps) and PNG.
|
||||
* Asynchronous streaming.
|
||||
* Game script interpreter.
|
||||
* Support a runtime language for configuring the path traced renderer based on the contents of the game's memory.
|
||||
* Support patching the game's memory to provide various enhancements automatically integrated with the game script.
|
||||
* Fully path traced renderer (RT).
|
||||
* Calculate all lighting in real time and replace the contents of the drawn scene entirely with a path traced version.
|
||||
* Provide support for extra modifications for altering the material properties of the surfaces in the game.
|
||||
* Game support will be limited to a very small selection of games initially.
|
||||
* Emulator integration.
|
||||
* Game compatibility database and feature whitelist.
|
||||
* Configuration screen.
|
||||
* List of supported emulators to be determined.
|
||||
* Model replacements.
|
||||
* Details to be determined.
|
||||
|
||||
|
||||
# Building
|
||||
|
||||
* CMake 3.20 or above.
|
||||
* C++17 compiler.
|
||||
* Known to work with Microsoft Visual C++, Clang or GCC.
|
||||
* Windows 10 or 11 SDK (Windows only).
|
||||
* Make sure to clone submodules correctly when checking out the repository.
|
||||
* Use `git submodule update --init --recursive` if you cloned without using `--recursive`.
|
||||
|
||||
# Architecture
|
||||
|
||||
## Deferred frames
|
||||
Draw calls are never sent right away to the GPU but instead stored on an auxiliary structure that logs the history of an entire frame. A frame's contents can be examined in great detail with the in-game debugger included with RT64. The renderer requires this to be able to optimize the rendering process, perform enhancements, replace assets and even generate new frames entirely.
|
||||
|
||||
## Deferred RDP
|
||||
Any operation related to reading memory and using it as texture information during rendering is completely deferred until the game requires a full synchronization of the RDP. All requests are stored in a list of operations and flushed before it is time to render. This allows RT64 to perform extra optimizations and detect when it is necessary to synchronize the output of the RDP back to memory. It also opens up the ability to detect when direct copies can be made on GPU memory and even detect patterns that can be replaced with equivalent but faster operations.
|
||||
|
||||
## Deferred RSP (Compute)
|
||||
All vertex transformations by the RSP (e.g. position, lighting, texturing, etc.) are performed by a highly parallel compute shader in the GPU. This saves a lot of CPU processing time and allows for much higher vertex and polygon counts. Since all transformations are deferred to this step, it's very easy for RT64 to patch transformations of the objects in the scene and the camera and produce a new frame very quickly. This effectively removes CPU bottlenecks that are critical for reaching very high target framerates.
|
||||
|
||||
## Texture Decoder (Compute)
|
||||
RT64 does not decode textures on the CPU and instead opts for uploading TMEM (4 KB) directly to the GPU. If possible, a RGBA32 version of the texture will be decoded and cached using a compute shader. If the sampling parameters prove to be too troublesome for that (e.g. giant texture masks with no clamp due to bad configuration), then RT64 can sample TMEM directly just like the console with a small performance sacrifice.
|
||||
|
||||
RT64 features one of the most accurate TMEM loaders to date so far which has been directly reverse engineered by observing console behavior with the aid of homebrew test ROMs developed by [Wiseguy](https://github.com/Mr-Wiseguy). All the color conversion formulas for decoding have also been sourced from [Tharo](https://github.com/Thar0)'s excellent RDP research.
|
||||
|
||||
## Dual renderers
|
||||
RT64 takes advantage of the multi-threaded capabilities of modern APIs to run two renderers at the same time with highly different goals. One renderer draws at native resolution (e.g. 240p) and synchronizes back immediately with the game running at its original rate. The other renderer replays all the draw calls detected by the main renderer at higher resolution and even at a different rate when using interpolation. This design guarantees that the game will see the correct data in RAM, which is very important for games that read from these memory regions for gameplay reasons. If it's not required by the game, this native resolution renderer can be turned off completely to save performance.
|
||||
|
||||
## Framebuffer detection
|
||||
RT64 will keep track of any memory addresses used as framebuffers, their dimensions and their matching contents that live in GPU memory. If other operations in the frame load and sample a part of memory owned by a framebuffer, then a direct copy of one of its regions is performed and stored in memory.
|
||||
|
||||
The framebuffer copy mechanic is only used when the load and sample parameters line up correctly and the final result would look no different than if it was sampled from RAM (except for preserving the high precision of the image). As framebuffer detection works at the RDP level, that means all related performance and visual enhancements can apply even in LLE mode.
|
||||
|
||||
## Framebuffer upscaling
|
||||
When framebuffer operations are detected, the renderer is able to upscale these effects by increasing the resolution of all framebuffers and any associated region copies by a scaling factor. The resolution increase is only performed in the high resolution renderer. All texture coordinates are adjusted automatically to account for this change.
|
||||
|
||||
## Framebuffer reinterpretation
|
||||
Games will sometimes draw to a framebuffer using one format and then read it as another format to perform post-processing on the screen. RT64 supports this operation natively at high resolution using per-pixel reinterpretation inside a dedicated compute shader. While this requires adding specific paths encountered on a case-by-case basis (to preserve high precision), the framework can be easily extended to support as many cases as possible. This feature is essential for emulating some of the more infamous effects in higher resolutions such as greyscale filters.
|
||||
|
||||
## Draw call matching
|
||||
Once all information for a particular game frame has been recorded, RT64 will attempt to perform automatic matching of draw calls between frames based on their rendering parameters, the textures in use, their position, orientation, their tracked velocities and much more. Matching is essential to generating interpolated frames and providing motion vector information to the path traced renderer. Draw call matching is still a highly experimental area that is prone to errors and requires a lot of processing to get right. The algorithms behind this feature will be likely to change as more research is done to accommodate as many games as possible.
|
||||
|
||||
## Frame interpolation
|
||||
New frames are generated using the information from the previous draw call matching step. For any calls that match, new 3D transformations will be created via interpolation and uploaded to the GPU for the deferred RSP to do its work again. When possible, transformations are decomposed into their constituent components. Those components are interpolated separately and recomposed into the resultant transform to prevent interpolation artifacts caused by naive transformation interpolation. This interpolation can also be applied to texture scrolling coordinates and even per vertex if vertex velocities are computed. More parameters are planned to be supported in the future as long as they're part of the recorded frame data.
|
||||
|
||||
## Extended command set
|
||||
RT64 offers an extended command set that can be used by native ports, ROM patches, and ROM hacks to provide extra information that the renderer can use to enhance the final result. Using this feature is vital to providing accurate frame interpolation and widescreen enhancements for 2D elements. If you're interested in using this feature, check out the [included header in the repository](https://github.com/rt64/rt64/blob/main/include/rt64_extended_gbi.h). The main activation method is encoded into a NOOP command so it should be safe to run it in real hardware. RT64 will recognize this command and enable the extended command set feature, allowing for an extended repertoire of functions aimed at fixing some common grievances that show up at high framerates or wide aspect ratios.
|
||||
|
||||
For example, objects that rely on pixel depth checks to draw can instead use the `gEXVertexZTest()` command to specify any triangles drawn after the command should only be drawn if the vertex is not covered by something else. This means that effects such as light halos can be replaced with this command and it'll automatically work on widescreen ratios and no longer be delayed by one frame. Instead, RT64 will just flush the depth buffer at the correct step and run a small compute shader that will invalidate the draw call's triangles if the depth test doesn't pass. Though the original effect already works as-is thanks to the native renderer, the extended GBI method can be leveraged to make the experience feel even better.
|
||||
|
||||
## Future texture and asset replacement
|
||||
Texture replacements are easily performed at runtime by using two capabilities that RT64 already supports: bindless textures and texture coordinate scaling. The entire renderer uses only one contiguous array of texture resources and replacing one of these by an HD texture replacement is straightforward. By detecting the difference in sizes between the original texture and the replacement, the texture coordinates can be scaled easily with the same logic that is used for framebuffer tiles.
|
||||
|
||||
Asset replacement, while not currently implemented and more of a long term feature, will leverage the fact that only one contiguous vertex and index array is used by RT64. This allows for highly efficient rendering as it minimizes the amount of times vertex and index buffers must be bound, but it also means the RSP can process the vertices placed in this buffer during rendering time as if they came from the game itself. Therefore, the entire process of model replacement will just consist of allocating chunks of the buffer directly for replacements in a native format, assigning it the correct transforms used by the draw call and letting the RSP compute shader do its job. This will allow the renderer to draw models that have orders of magnitude higher triangle counts with very little additional cost to the CPU.
|
||||
|
||||
## Future path tracing
|
||||
RT64 will attempt to perform scene detection by merging as many draw calls as it can as long as they're inside of the same compatible perspective view point. Since all data remains untransformed, bottom-level acceleration structures (BLAS) can be built by using a compute shader to transform vertices to world space instead of screen space. Once these BLAS are built, a top-level acceleration structure (TLAS) is constructed with all the BLAS that were detected.
|
||||
|
||||
These structures are used directly for path tracing the scene and generating all lighting in real time. Lighting information is derived from various sources (the game itself, scripts, integrated light editor) and will be detailed more in the future as this feature is closer to a final state.
|
||||
@@ -0,0 +1,25 @@
|
||||
buildType:
|
||||
default: debug
|
||||
choices:
|
||||
debug:
|
||||
short: Debug
|
||||
long: Emit debug information
|
||||
buildType: Debug
|
||||
release:
|
||||
short: Release
|
||||
long: Optimize generated code
|
||||
buildType: Release
|
||||
platform:
|
||||
default: native
|
||||
choices:
|
||||
native:
|
||||
short: Native
|
||||
long: Build for the native platform
|
||||
android:
|
||||
short: Android
|
||||
long: Build for Android using the NDK
|
||||
env:
|
||||
CMAKE_TOOLCHAIN_FILE: /opt/android-sdk/ndk/26.0.10792818/build/cmake/android.toolchain.cmake
|
||||
settings:
|
||||
ANDROID_ABI: arm64-v8a
|
||||
ANDROID_PLATFORM: android-24
|
||||
@@ -0,0 +1,21 @@
|
||||
#include "rhi/rt64_render_interface.h"
|
||||
|
||||
namespace RT64 {
|
||||
extern std::unique_ptr<RenderInterface> CreateD3D12Interface();
|
||||
extern std::unique_ptr<RenderInterface> CreateVulkanInterface();
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
std::unique_ptr<RT64::RenderInterface> renderInterface = RT64::CreateVulkanInterface();
|
||||
|
||||
#if defined(_WIN32)
|
||||
// Windows only: Can also use D3D12.
|
||||
const bool useVulkan = true;
|
||||
if (!useVulkan) {
|
||||
renderInterface = RT64::CreateD3D12Interface();
|
||||
}
|
||||
#endif
|
||||
|
||||
// Execute a blocking test that creates a window and draws some geometry to test the render interface.
|
||||
RT64::RenderInterfaceTest(renderInterface.get());
|
||||
}
|
||||
@@ -0,0 +1,796 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rhi/rt64_render_interface.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <cstring>
|
||||
#include <chrono>
|
||||
#include <thread>
|
||||
|
||||
#ifdef _WIN64
|
||||
#include "shaders/RenderInterfaceTestPS.hlsl.dxil.h"
|
||||
#include "shaders/RenderInterfaceTestRT.hlsl.dxil.h"
|
||||
#include "shaders/RenderInterfaceTestVS.hlsl.dxil.h"
|
||||
#include "shaders/RenderInterfaceTestCS.hlsl.dxil.h"
|
||||
#include "shaders/RenderInterfaceTestPostPS.hlsl.dxil.h"
|
||||
#include "shaders/RenderInterfaceTestPostVS.hlsl.dxil.h"
|
||||
#endif
|
||||
#include "shaders/RenderInterfaceTestPS.hlsl.spirv.h"
|
||||
#include "shaders/RenderInterfaceTestRT.hlsl.spirv.h"
|
||||
#include "shaders/RenderInterfaceTestVS.hlsl.spirv.h"
|
||||
#include "shaders/RenderInterfaceTestCS.hlsl.spirv.h"
|
||||
#include "shaders/RenderInterfaceTestPostPS.hlsl.spirv.h"
|
||||
#include "shaders/RenderInterfaceTestPostVS.hlsl.spirv.h"
|
||||
|
||||
#define ENABLE_SWAP_CHAIN 1
|
||||
#define ENABLE_CLEAR 1
|
||||
#define ENABLE_RASTER 1
|
||||
#define ENABLE_TEXTURE 0
|
||||
#define ENABLE_COMPUTE 0
|
||||
#define ENABLE_RT 0
|
||||
|
||||
namespace RT64 {
|
||||
struct RasterDescriptorSet : RenderDescriptorSetBase {
|
||||
uint32_t gSampler;
|
||||
uint32_t gTextures;
|
||||
|
||||
std::unique_ptr<RenderSampler> linearSampler;
|
||||
|
||||
RasterDescriptorSet(RenderDevice *device, uint32_t textureArraySize) {
|
||||
linearSampler = device->createSampler(RenderSamplerDesc());
|
||||
|
||||
const uint32_t TextureArrayUpperRange = 512;
|
||||
builder.begin();
|
||||
gSampler = builder.addImmutableSampler(1, linearSampler.get());
|
||||
gTextures = builder.addTexture(2, TextureArrayUpperRange);
|
||||
builder.end(true, textureArraySize);
|
||||
|
||||
create(device);
|
||||
}
|
||||
};
|
||||
|
||||
struct ComputeDescriptorFirstSet : RenderDescriptorSetBase {
|
||||
uint32_t gBlueNoiseTexture;
|
||||
uint32_t gSampler;
|
||||
uint32_t gTarget;
|
||||
|
||||
std::unique_ptr<RenderSampler> linearSampler;
|
||||
|
||||
ComputeDescriptorFirstSet(RenderDevice *device) {
|
||||
linearSampler = device->createSampler(RenderSamplerDesc());
|
||||
|
||||
builder.begin();
|
||||
gBlueNoiseTexture = builder.addTexture(1);
|
||||
gSampler = builder.addImmutableSampler(2, linearSampler.get());
|
||||
builder.end();
|
||||
|
||||
create(device);
|
||||
}
|
||||
};
|
||||
|
||||
struct ComputeDescriptorSecondSet : RenderDescriptorSetBase {
|
||||
uint32_t gTarget;
|
||||
|
||||
ComputeDescriptorSecondSet(RenderDevice *device) {
|
||||
builder.begin();
|
||||
gTarget = builder.addReadWriteTexture(16);
|
||||
builder.end();
|
||||
|
||||
create(device);
|
||||
}
|
||||
};
|
||||
|
||||
struct RaytracingDescriptorSet : RenderDescriptorSetBase {
|
||||
uint32_t gBVH;
|
||||
uint32_t gOutput;
|
||||
uint32_t gBufferParams;
|
||||
|
||||
RaytracingDescriptorSet(RenderDevice *device) {
|
||||
builder.begin();
|
||||
gBVH = builder.addAccelerationStructure(0);
|
||||
gOutput = builder.addReadWriteTexture(1);
|
||||
gBufferParams = builder.addStructuredBuffer(2);
|
||||
builder.end();
|
||||
|
||||
create(device);
|
||||
}
|
||||
};
|
||||
|
||||
struct TestMembers {
|
||||
static const uint32_t BufferCount = 2;
|
||||
static const uint32_t MSAACount = 4;
|
||||
static const RenderFormat ColorFormat = RenderFormat::R8G8B8A8_UNORM;
|
||||
static const RenderFormat DepthFormat = RenderFormat::D32_FLOAT;
|
||||
#ifdef __ANDROID__
|
||||
static const RenderFormat SwapchainFormat = RenderFormat::R8G8B8A8_UNORM;
|
||||
#else
|
||||
static const RenderFormat SwapchainFormat = RenderFormat::B8G8R8A8_UNORM;
|
||||
#endif
|
||||
const RenderInterface *renderInterface = nullptr;
|
||||
std::unique_ptr<RenderDevice> device;
|
||||
std::unique_ptr<RenderCommandQueue> commandQueue;
|
||||
std::unique_ptr<RenderCommandList> commandList;
|
||||
std::unique_ptr<RenderCommandFence> commandFence;
|
||||
std::unique_ptr<RenderSwapChain> swapChain;
|
||||
std::unique_ptr<RenderFramebuffer> framebuffer;
|
||||
std::vector<std::unique_ptr<RenderFramebuffer>> swapFramebuffers;
|
||||
std::unique_ptr<RenderSampler> linearSampler;
|
||||
std::unique_ptr<RenderSampler> postSampler;
|
||||
std::unique_ptr<RasterDescriptorSet> rasterSet;
|
||||
std::unique_ptr<ComputeDescriptorFirstSet> computeFirstSet;
|
||||
std::unique_ptr<ComputeDescriptorSecondSet> computeSecondSet;
|
||||
std::unique_ptr<RaytracingDescriptorSet> rtSet;
|
||||
std::unique_ptr<RenderDescriptorSet> postSet;
|
||||
std::unique_ptr<RenderPipelineLayout> rasterPipelineLayout;
|
||||
std::unique_ptr<RenderPipelineLayout> computePipelineLayout;
|
||||
std::unique_ptr<RenderPipelineLayout> rtPipelineLayout;
|
||||
std::unique_ptr<RenderPipelineLayout> postPipelineLayout;
|
||||
std::unique_ptr<RenderPipeline> rasterPipeline;
|
||||
std::unique_ptr<RenderPipeline> computePipeline;
|
||||
std::unique_ptr<RenderPipeline> rtPipeline;
|
||||
std::unique_ptr<RenderPipeline> postPipeline;
|
||||
std::unique_ptr<RenderTexture> colorTargetMS;
|
||||
std::unique_ptr<RenderTexture> colorTargetResolved;
|
||||
std::unique_ptr<RenderTexture> depthTarget;
|
||||
std::unique_ptr<RenderBuffer> uploadBuffer;
|
||||
std::unique_ptr<RenderTexture> blueNoiseTexture;
|
||||
std::unique_ptr<RenderBuffer> vertexBuffer;
|
||||
std::unique_ptr<RenderBuffer> indexBuffer;
|
||||
std::unique_ptr<RenderBuffer> rtParamsBuffer;
|
||||
std::unique_ptr<RenderBuffer> rtVertexBuffer;
|
||||
std::unique_ptr<RenderBuffer> rtScratchBuffer;
|
||||
std::unique_ptr<RenderBuffer> rtInstancesBuffer;
|
||||
std::unique_ptr<RenderBuffer> rtBottomLevelASBuffer;
|
||||
std::unique_ptr<RenderAccelerationStructure> rtBottomLevelAS;
|
||||
std::unique_ptr<RenderBuffer> rtTopLevelASBuffer;
|
||||
std::unique_ptr<RenderAccelerationStructure> rtTopLevelAS;
|
||||
std::unique_ptr<RenderBuffer> rtShaderBindingTableBuffer;
|
||||
RenderShaderBindingTableInfo rtShaderBindingTableInfo;
|
||||
RenderVertexBufferView vertexBufferView;
|
||||
RenderIndexBufferView indexBufferView;
|
||||
RenderInputSlot inputSlot;
|
||||
} Test;
|
||||
|
||||
struct RasterPushConstant {
|
||||
float colorAdd[4] = {};
|
||||
uint32_t textureIndex = 0;
|
||||
};
|
||||
|
||||
struct ComputePushConstant {
|
||||
float Multiply[4] = {};
|
||||
uint32_t Resolution[2] = {};
|
||||
};
|
||||
|
||||
void TestInitialize(RenderInterface *renderInterface, RenderWindow window) {
|
||||
Test.renderInterface = renderInterface;
|
||||
Test.device = renderInterface->createDevice();
|
||||
Test.commandQueue = Test.device->createCommandQueue(RenderCommandListType::DIRECT);
|
||||
Test.commandList = Test.device->createCommandList(RenderCommandListType::DIRECT);
|
||||
Test.commandFence = Test.device->createCommandFence();
|
||||
|
||||
# if ENABLE_SWAP_CHAIN
|
||||
Test.swapChain = Test.commandQueue->createSwapChain(window, Test.BufferCount, Test.SwapchainFormat);
|
||||
# endif
|
||||
|
||||
# if ENABLE_RASTER
|
||||
const uint32_t textureArraySize = 3;
|
||||
Test.rasterSet = std::make_unique<RasterDescriptorSet>(Test.device.get(), 3);
|
||||
|
||||
RenderPipelineLayoutBuilder layoutBuilder;
|
||||
layoutBuilder.begin(false, true);
|
||||
layoutBuilder.addPushConstant(0, 0, sizeof(RasterPushConstant), RenderShaderStageFlag::PIXEL);
|
||||
layoutBuilder.addDescriptorSet(Test.rasterSet->builder);
|
||||
layoutBuilder.end();
|
||||
|
||||
Test.rasterPipelineLayout = layoutBuilder.create(Test.device.get());
|
||||
|
||||
// Pick shader format depending on the render interface's requirements.
|
||||
const RenderInterfaceCapabilities &interfaceCapabilities = Test.renderInterface->getCapabilities();
|
||||
const RenderShaderFormat shaderFormat = interfaceCapabilities.shaderFormat;
|
||||
const void *PSBlob = nullptr;
|
||||
const void *VSBlob = nullptr;
|
||||
const void *CSBlob = nullptr;
|
||||
const void *RTBlob = nullptr;
|
||||
const void *PostPSBlob = nullptr;
|
||||
const void *PostVSBlob = nullptr;
|
||||
uint64_t PSBlobSize = 0;
|
||||
uint64_t VSBlobSize = 0;
|
||||
uint64_t CSBlobSize = 0;
|
||||
uint64_t RTBlobSize = 0;
|
||||
uint64_t PostPSBlobSize = 0;
|
||||
uint64_t PostVSBlobSize = 0;
|
||||
switch (shaderFormat) {
|
||||
#ifdef _WIN64
|
||||
case RenderShaderFormat::DXIL:
|
||||
PSBlob = RenderInterfaceTestPSBlobDXIL;
|
||||
PSBlobSize = sizeof(RenderInterfaceTestPSBlobDXIL);
|
||||
VSBlob = RenderInterfaceTestVSBlobDXIL;
|
||||
VSBlobSize = sizeof(RenderInterfaceTestVSBlobDXIL);
|
||||
CSBlob = RenderInterfaceTestCSBlobDXIL;
|
||||
CSBlobSize = sizeof(RenderInterfaceTestCSBlobDXIL);
|
||||
RTBlob = RenderInterfaceTestRTBlobDXIL;
|
||||
RTBlobSize = sizeof(RenderInterfaceTestRTBlobDXIL);
|
||||
PostPSBlob = RenderInterfaceTestPostPSBlobDXIL;
|
||||
PostPSBlobSize = sizeof(RenderInterfaceTestPostPSBlobDXIL);
|
||||
PostVSBlob = RenderInterfaceTestPostVSBlobDXIL;
|
||||
PostVSBlobSize = sizeof(RenderInterfaceTestPostVSBlobDXIL);
|
||||
break;
|
||||
#endif
|
||||
case RenderShaderFormat::SPIRV:
|
||||
PSBlob = RenderInterfaceTestPSBlobSPIRV;
|
||||
PSBlobSize = sizeof(RenderInterfaceTestPSBlobSPIRV);
|
||||
VSBlob = RenderInterfaceTestVSBlobSPIRV;
|
||||
VSBlobSize = sizeof(RenderInterfaceTestVSBlobSPIRV);
|
||||
CSBlob = RenderInterfaceTestCSBlobSPIRV;
|
||||
CSBlobSize = sizeof(RenderInterfaceTestCSBlobSPIRV);
|
||||
RTBlob = RenderInterfaceTestRTBlobSPIRV;
|
||||
RTBlobSize = sizeof(RenderInterfaceTestRTBlobSPIRV);
|
||||
PostPSBlob = RenderInterfaceTestPostPSBlobSPIRV;
|
||||
PostPSBlobSize = sizeof(RenderInterfaceTestPostPSBlobSPIRV);
|
||||
PostVSBlob = RenderInterfaceTestPostVSBlobSPIRV;
|
||||
PostVSBlobSize = sizeof(RenderInterfaceTestPostVSBlobSPIRV);
|
||||
break;
|
||||
default:
|
||||
assert(false && "Unknown shader format.");
|
||||
break;
|
||||
}
|
||||
|
||||
const uint32_t VertexCount = 3;
|
||||
const uint32_t FloatsPerVertex = 4;
|
||||
const float Vertices[VertexCount * FloatsPerVertex] = {
|
||||
-0.5f, -0.25f, 0.0f, 0.0f,
|
||||
0.5f, -0.25f, 1.0f, 0.0f,
|
||||
0.25f, 0.25f, 0.0f, 1.0f
|
||||
};
|
||||
|
||||
const uint32_t Indices[3] = {
|
||||
0, 1, 2
|
||||
};
|
||||
|
||||
Test.inputSlot = RenderInputSlot(0, sizeof(float) * FloatsPerVertex);
|
||||
|
||||
std::vector<RenderInputElement> inputElements;
|
||||
inputElements.emplace_back(RenderInputElement("POSITION", 0, 0, RenderFormat::R32G32_FLOAT, 0, 0));
|
||||
inputElements.emplace_back(RenderInputElement("TEXCOORD", 0, 1, RenderFormat::R32G32_FLOAT, 0, sizeof(float) * 2));
|
||||
|
||||
std::unique_ptr<RenderShader> pixelShader = Test.device->createShader(PSBlob, PSBlobSize, "PSMain", shaderFormat);
|
||||
std::unique_ptr<RenderShader> vertexShader = Test.device->createShader(VSBlob, VSBlobSize, "VSMain", shaderFormat);
|
||||
|
||||
RenderGraphicsPipelineDesc graphicsDesc;
|
||||
graphicsDesc.inputSlots = &Test.inputSlot;
|
||||
graphicsDesc.inputSlotsCount = 1;
|
||||
graphicsDesc.inputElements = inputElements.data();
|
||||
graphicsDesc.inputElementsCount = uint32_t(inputElements.size());
|
||||
graphicsDesc.pipelineLayout = Test.rasterPipelineLayout.get();
|
||||
graphicsDesc.pixelShader = pixelShader.get();
|
||||
graphicsDesc.vertexShader = vertexShader.get();
|
||||
graphicsDesc.renderTargetFormat[0] = Test.ColorFormat;
|
||||
graphicsDesc.renderTargetBlend[0] = RenderBlendDesc::Copy();
|
||||
graphicsDesc.depthTargetFormat = Test.DepthFormat;
|
||||
graphicsDesc.renderTargetCount = 1;
|
||||
graphicsDesc.multisampling.sampleCount = Test.MSAACount;
|
||||
Test.rasterPipeline = Test.device->createGraphicsPipeline(graphicsDesc);
|
||||
|
||||
Test.postSampler = Test.device->createSampler(RenderSamplerDesc());
|
||||
const RenderSampler *postSamplerPtr = Test.postSampler.get();
|
||||
|
||||
// Create the post processing pipeline
|
||||
std::vector<RenderDescriptorRange> postDescriptorRanges = {
|
||||
RenderDescriptorRange(RenderDescriptorRangeType::TEXTURE, 1, 1),
|
||||
RenderDescriptorRange(RenderDescriptorRangeType::SAMPLER, 2, 1, &postSamplerPtr)
|
||||
};
|
||||
|
||||
RenderDescriptorSetDesc postDescriptorSetDesc(postDescriptorRanges.data(), uint32_t(postDescriptorRanges.size()));
|
||||
Test.postSet = Test.device->createDescriptorSet(postDescriptorSetDesc);
|
||||
Test.postPipelineLayout = Test.device->createPipelineLayout(RenderPipelineLayoutDesc(nullptr, 0, &postDescriptorSetDesc, 1, false, true));
|
||||
|
||||
inputElements.clear();
|
||||
inputElements.emplace_back(RenderInputElement("POSITION", 0, 0, RenderFormat::R32G32_FLOAT, 0, 0));
|
||||
|
||||
std::unique_ptr<RenderShader> postPixelShader = Test.device->createShader(PostPSBlob, PostPSBlobSize, "PSMain", shaderFormat);
|
||||
std::unique_ptr<RenderShader> postVertexShader = Test.device->createShader(PostVSBlob, PostVSBlobSize, "VSMain", shaderFormat);
|
||||
|
||||
RenderGraphicsPipelineDesc postDesc;
|
||||
postDesc.inputSlots = nullptr;
|
||||
postDesc.inputSlotsCount = 0;
|
||||
postDesc.inputElements = nullptr;
|
||||
postDesc.inputElementsCount = 0;
|
||||
postDesc.pipelineLayout = Test.postPipelineLayout.get();
|
||||
postDesc.pixelShader = postPixelShader.get();
|
||||
postDesc.vertexShader = postVertexShader.get();
|
||||
postDesc.renderTargetFormat[0] = Test.SwapchainFormat;
|
||||
postDesc.renderTargetBlend[0] = RenderBlendDesc::Copy();
|
||||
postDesc.renderTargetCount = 1;
|
||||
Test.postPipeline = Test.device->createGraphicsPipeline(postDesc);
|
||||
|
||||
# if ENABLE_TEXTURE
|
||||
// Upload a texture.
|
||||
const uint32_t Width = 512;
|
||||
const uint32_t Height = 512;
|
||||
const uint32_t RowLength = Width;
|
||||
const RenderFormat Format = RenderFormat::R8G8B8A8_UNORM;
|
||||
const uint32_t BufferSize = RowLength * Height * RenderFormatSize(Format);
|
||||
Test.uploadBuffer = Test.device->createBuffer(RenderBufferDesc::UploadBuffer(BufferSize));
|
||||
Test.blueNoiseTexture = Test.device->createTexture(RenderTextureDesc::Texture2D(Width, Height, 1, Format));
|
||||
Test.rasterSet->setTexture(Test.rasterSet->gTextures + 2, Test.blueNoiseTexture.get(), RenderTextureLayout::SHADER_READ);
|
||||
|
||||
// Copy to upload buffer.
|
||||
void *bufferData = Test.uploadBuffer->map();
|
||||
memcpy(bufferData, LDR_64_64_64_RGB1_BGRA8, BufferSize);
|
||||
Test.uploadBuffer->unmap();
|
||||
|
||||
// Run command list to copy the upload buffer to the texture.
|
||||
Test.commandList->begin();
|
||||
Test.commandList->barriers(RenderBarrierStage::COPY,
|
||||
RenderBufferBarrier(Test.uploadBuffer.get(), RenderBufferAccess::READ),
|
||||
RenderTextureBarrier(Test.blueNoiseTexture.get(), RenderTextureLayout::COPY_DEST)
|
||||
);
|
||||
|
||||
Test.commandList->copyTextureRegion(
|
||||
RenderTextureCopyLocation::Subresource(Test.blueNoiseTexture.get()),
|
||||
RenderTextureCopyLocation::PlacedFootprint(Test.uploadBuffer.get(), Format, Width, Height, 1, RowLength));
|
||||
|
||||
Test.commandList->barriers(RenderBarrierStage::GRAPHICS_AND_COMPUTE, RenderTextureBarrier(Test.blueNoiseTexture.get(), RenderTextureLayout::SHADER_READ));
|
||||
Test.commandList->end();
|
||||
Test.commandQueue->executeCommandLists(Test.commandList.get(), Test.commandFence.get());
|
||||
Test.commandQueue->waitForCommandFence(Test.commandFence.get());
|
||||
# endif
|
||||
|
||||
Test.vertexBuffer = Test.device->createBuffer(RenderBufferDesc::VertexBuffer(sizeof(Vertices), RenderHeapType::UPLOAD));
|
||||
void *dstData = Test.vertexBuffer->map();
|
||||
memcpy(dstData, Vertices, sizeof(Vertices));
|
||||
Test.vertexBuffer->unmap();
|
||||
Test.vertexBufferView = RenderVertexBufferView(Test.vertexBuffer.get(), sizeof(Vertices));
|
||||
|
||||
Test.indexBuffer = Test.device->createBuffer(RenderBufferDesc::IndexBuffer(sizeof(Indices), RenderHeapType::UPLOAD));
|
||||
dstData = Test.indexBuffer->map();
|
||||
memcpy(dstData, Indices, sizeof(Indices));
|
||||
Test.indexBuffer->unmap();
|
||||
Test.indexBufferView = RenderIndexBufferView(Test.indexBuffer.get(), sizeof(Indices), RenderFormat::R32_UINT);
|
||||
# endif
|
||||
|
||||
# if ENABLE_COMPUTE
|
||||
Test.computeFirstSet = std::make_unique<ComputeDescriptorFirstSet>(Test.device.get());
|
||||
Test.computeSecondSet = std::make_unique<ComputeDescriptorSecondSet>(Test.device.get());
|
||||
Test.computeFirstSet->setTexture(Test.computeFirstSet->gBlueNoiseTexture, Test.blueNoiseTexture.get(), RenderTextureLayout::SHADER_READ);
|
||||
|
||||
layoutBuilder.begin();
|
||||
layoutBuilder.addPushConstant(0, 0, sizeof(ComputePushConstant), RenderShaderStageFlag::COMPUTE);
|
||||
layoutBuilder.addDescriptorSet(Test.computeFirstSet->builder);
|
||||
layoutBuilder.addDescriptorSet(Test.computeSecondSet->builder);
|
||||
layoutBuilder.end();
|
||||
|
||||
Test.computePipelineLayout = layoutBuilder.create(Test.device.get());
|
||||
|
||||
std::unique_ptr<RenderShader> computeShader = Test.device->createShader(CSBlob, CSBlobSize, "CSMain", shaderFormat);
|
||||
RenderComputePipelineDesc computeDesc;
|
||||
computeDesc.computeShader = computeShader.get();
|
||||
computeDesc.pipelineLayout = Test.computePipelineLayout.get();
|
||||
Test.computePipeline = Test.device->createComputePipeline(computeDesc);
|
||||
# endif
|
||||
|
||||
# if ENABLE_RT
|
||||
Test.rtSet = std::make_unique<RaytracingDescriptorSet>(Test.device.get());
|
||||
|
||||
layoutBuilder.begin(true);
|
||||
layoutBuilder.addDescriptorSet(Test.rtSet->builder);
|
||||
layoutBuilder.end();
|
||||
|
||||
Test.rtPipelineLayout = layoutBuilder.create(Test.device.get());
|
||||
|
||||
struct BufferParams {
|
||||
float rgbMultiplier[3];
|
||||
uint32_t pad[3];
|
||||
};
|
||||
|
||||
BufferParams paramsToUpload[2];
|
||||
paramsToUpload[0].rgbMultiplier[0] = 1.0f;
|
||||
paramsToUpload[0].rgbMultiplier[1] = 0.25f;
|
||||
paramsToUpload[0].rgbMultiplier[2] = 0.25f;
|
||||
paramsToUpload[1].rgbMultiplier[0] = 0.25f;
|
||||
paramsToUpload[1].rgbMultiplier[1] = 1.0f;
|
||||
paramsToUpload[1].rgbMultiplier[2] = 0.25f;
|
||||
|
||||
RenderBufferStructuredView paramsView(sizeof(BufferParams));
|
||||
Test.rtParamsBuffer = Test.device->createBuffer(RenderBufferDesc::UploadBuffer(sizeof(paramsToUpload), RenderBufferFlag::STORAGE));
|
||||
Test.rtSet->setBuffer(Test.rtSet->gBufferParams, Test.rtParamsBuffer.get(), sizeof(paramsToUpload), ¶msView);
|
||||
dstData = Test.rtParamsBuffer->map();
|
||||
memcpy(dstData, paramsToUpload, sizeof(paramsToUpload));
|
||||
Test.rtParamsBuffer->unmap();
|
||||
|
||||
RenderRaytracingPipelineLibrarySymbol rtLibrarySymbols[] = {
|
||||
RenderRaytracingPipelineLibrarySymbol("ColorRayGen", RenderRaytracingPipelineLibrarySymbolType::RAYGEN),
|
||||
RenderRaytracingPipelineLibrarySymbol("ColorClosestHit", RenderRaytracingPipelineLibrarySymbolType::CLOSEST_HIT),
|
||||
RenderRaytracingPipelineLibrarySymbol("ColorMiss", RenderRaytracingPipelineLibrarySymbolType::MISS)
|
||||
};
|
||||
|
||||
std::unique_ptr<RenderShader> rtShader = Test.device->createShader(RTBlob, RTBlobSize, nullptr, shaderFormat);
|
||||
RenderRaytracingPipelineLibrary rtLibrary(rtShader.get(), rtLibrarySymbols, uint32_t(std::size(rtLibrarySymbols)));
|
||||
RenderRaytracingPipelineHitGroup rtHitGroup("ColorHitGroup", "ColorClosestHit");
|
||||
RenderRaytracingPipelineDesc rtPsoDesc;
|
||||
rtPsoDesc.libraries = &rtLibrary;
|
||||
rtPsoDesc.librariesCount = 1;
|
||||
rtPsoDesc.hitGroups = &rtHitGroup;
|
||||
rtPsoDesc.hitGroupsCount = 1;
|
||||
rtPsoDesc.pipelineLayout = Test.rtPipelineLayout.get();
|
||||
rtPsoDesc.maxPayloadSize = sizeof(float) * 4;
|
||||
Test.rtPipeline = Test.device->createRaytracingPipeline(rtPsoDesc);
|
||||
|
||||
// Create RT BVH.
|
||||
const float BLASVertices[] = {
|
||||
0.25f, 0.25f, 1.0f,
|
||||
0.75f, 0.25f, 1.0f,
|
||||
0.5f, 0.75f, 1.0f
|
||||
};
|
||||
|
||||
dstData = Test.uploadBuffer->map();
|
||||
memcpy(dstData, BLASVertices, sizeof(BLASVertices));
|
||||
Test.uploadBuffer->unmap();
|
||||
|
||||
Test.rtVertexBuffer = Test.device->createBuffer(RenderBufferDesc::VertexBuffer(sizeof(BLASVertices), RenderHeapType::DEFAULT, RenderBufferFlag::ACCELERATION_STRUCTURE_INPUT));
|
||||
|
||||
RenderBottomLevelASMesh blasMesh;
|
||||
blasMesh.vertexBuffer = Test.rtVertexBuffer.get();
|
||||
blasMesh.vertexFormat = RenderFormat::R32G32B32_FLOAT;
|
||||
blasMesh.vertexCount = 3;
|
||||
blasMesh.vertexStride = sizeof(float) * 3;
|
||||
blasMesh.isOpaque = true;
|
||||
|
||||
RenderBottomLevelASBuildInfo blasBuildInfo;
|
||||
Test.device->setBottomLevelASBuildInfo(blasBuildInfo, &blasMesh, 1);
|
||||
|
||||
Test.rtBottomLevelASBuffer = Test.device->createBuffer(RenderBufferDesc::AccelerationStructureBuffer(blasBuildInfo.accelerationStructureSize));
|
||||
Test.rtBottomLevelAS = Test.device->createAccelerationStructure(RenderAccelerationStructureDesc(RenderAccelerationStructureType::BOTTOM_LEVEL, Test.rtBottomLevelASBuffer.get(), blasBuildInfo.accelerationStructureSize));
|
||||
|
||||
RenderTopLevelASInstance tlasInstance;
|
||||
tlasInstance.bottomLevelAS = Test.rtBottomLevelASBuffer.get();
|
||||
tlasInstance.instanceMask = 0xFF;
|
||||
tlasInstance.cullDisable = true;
|
||||
|
||||
RenderTopLevelASBuildInfo tlasBuildInfo;
|
||||
Test.device->setTopLevelASBuildInfo(tlasBuildInfo, &tlasInstance, 1);
|
||||
|
||||
Test.rtInstancesBuffer = Test.device->createBuffer(RenderBufferDesc::UploadBuffer(tlasBuildInfo.instancesBufferData.size(), RenderBufferFlag::ACCELERATION_STRUCTURE_INPUT));
|
||||
dstData = Test.rtInstancesBuffer->map();
|
||||
memcpy(dstData, tlasBuildInfo.instancesBufferData.data(), tlasBuildInfo.instancesBufferData.size());
|
||||
Test.rtInstancesBuffer->unmap();
|
||||
|
||||
Test.rtScratchBuffer = Test.device->createBuffer(RenderBufferDesc::DefaultBuffer(std::max(blasBuildInfo.scratchSize, tlasBuildInfo.scratchSize), RenderBufferFlag::ACCELERATION_STRUCTURE_SCRATCH));
|
||||
Test.rtTopLevelASBuffer = Test.device->createBuffer(RenderBufferDesc::AccelerationStructureBuffer(tlasBuildInfo.accelerationStructureSize));
|
||||
Test.rtTopLevelAS = Test.device->createAccelerationStructure(RenderAccelerationStructureDesc(RenderAccelerationStructureType::TOP_LEVEL, Test.rtTopLevelASBuffer.get(), tlasBuildInfo.accelerationStructureSize));
|
||||
Test.rtSet->setAccelerationStructure(Test.rtSet->gBVH, Test.rtTopLevelAS.get());
|
||||
|
||||
RenderShaderBindingGroups bindingGroups;
|
||||
RenderPipelineProgram rayGenProgram = Test.rtPipeline->getProgram("ColorRayGen");
|
||||
RenderPipelineProgram missProgram = Test.rtPipeline->getProgram("ColorMiss");
|
||||
RenderPipelineProgram hitGroupProgram = Test.rtPipeline->getProgram("ColorHitGroup");
|
||||
bindingGroups.rayGen = RenderShaderBindingGroup(&rayGenProgram, 1);
|
||||
bindingGroups.miss = RenderShaderBindingGroup(&missProgram, 1);
|
||||
bindingGroups.hitGroup = RenderShaderBindingGroup(&hitGroupProgram, 1);
|
||||
|
||||
RenderDescriptorSet *rtSetPtr = Test.rtSet->get();
|
||||
Test.device->setShaderBindingTableInfo(Test.rtShaderBindingTableInfo, bindingGroups, Test.rtPipeline.get(), &rtSetPtr, 1);
|
||||
|
||||
const std::vector<uint8_t> tableData = Test.rtShaderBindingTableInfo.tableBufferData;
|
||||
Test.rtShaderBindingTableBuffer = Test.device->createBuffer(RenderBufferDesc::UploadBuffer(tableData.size(), RenderBufferFlag::SHADER_BINDING_TABLE));
|
||||
dstData = Test.rtShaderBindingTableBuffer->map();
|
||||
memcpy(dstData, tableData.data(), tableData.size());
|
||||
Test.rtShaderBindingTableBuffer->unmap();
|
||||
|
||||
// Run command list to copy the vertex buffer and build the BLAS/TLAS.
|
||||
Test.commandList->begin();
|
||||
Test.commandList->barriers(RenderBarrierStage::COPY, RenderBufferBarrier(Test.rtVertexBuffer.get(), RenderBufferAccess::WRITE));
|
||||
Test.commandList->copyBufferRegion(Test.rtVertexBuffer.get(), Test.uploadBuffer.get(), sizeof(BLASVertices));
|
||||
Test.commandList->barriers(RenderBarrierStage::COMPUTE, RenderBufferBarrier(Test.rtVertexBuffer.get(), RenderBufferAccess::READ));
|
||||
Test.commandList->buildBottomLevelAS(Test.rtBottomLevelAS.get(), Test.rtScratchBuffer.get(), blasBuildInfo);
|
||||
Test.commandList->barriers(RenderBarrierStage::NONE, RenderBufferBarrier(Test.rtBottomLevelASBuffer.get(), RenderBufferAccess::READ));
|
||||
Test.commandList->buildTopLevelAS(Test.rtTopLevelAS.get(), Test.rtScratchBuffer.get(), Test.rtInstancesBuffer.get(), tlasBuildInfo);
|
||||
Test.commandList->end();
|
||||
Test.commandQueue->executeCommandLists(Test.commandList.get(), Test.commandFence.get());
|
||||
Test.commandQueue->waitForCommandFence(Test.commandFence.get());
|
||||
# endif
|
||||
}
|
||||
|
||||
void TestResize() {
|
||||
// Resize can be called during window creation by Windows.
|
||||
if (Test.swapChain == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
# if ENABLE_SWAP_CHAIN
|
||||
Test.swapFramebuffers.clear();
|
||||
Test.swapChain->resize();
|
||||
Test.swapFramebuffers.resize(Test.swapChain->getTextureCount());
|
||||
for (uint32_t i = 0; i < Test.swapChain->getTextureCount(); i++) {
|
||||
const RenderTexture *curTex = Test.swapChain->getTexture(i);
|
||||
Test.swapFramebuffers[i] = Test.device->createFramebuffer(RenderFramebufferDesc{&curTex, 1});
|
||||
}
|
||||
# endif
|
||||
# if ENABLE_CLEAR
|
||||
Test.colorTargetMS = Test.device->createTexture(RenderTextureDesc::ColorTarget(Test.swapChain->getWidth(), Test.swapChain->getHeight(), Test.ColorFormat, RenderMultisampling(Test.MSAACount), nullptr));
|
||||
Test.colorTargetResolved = Test.device->createTexture(RenderTextureDesc::ColorTarget(Test.swapChain->getWidth(), Test.swapChain->getHeight(), Test.ColorFormat, 1, nullptr, RenderTextureFlag::STORAGE | RenderTextureFlag::UNORDERED_ACCESS));
|
||||
Test.depthTarget = Test.device->createTexture(RenderTextureDesc::DepthTarget(Test.swapChain->getWidth(), Test.swapChain->getHeight(), Test.DepthFormat, RenderMultisampling(Test.MSAACount)));
|
||||
|
||||
const RenderTexture *colorTargetPtr = Test.colorTargetMS.get();
|
||||
Test.framebuffer = Test.device->createFramebuffer(RenderFramebufferDesc(&colorTargetPtr, 1, Test.depthTarget.get()));
|
||||
# endif
|
||||
# if ENABLE_COMPUTE
|
||||
Test.computeSecondSet->setTexture(Test.computeSecondSet->gTarget, Test.colorTarget.get(), RenderTextureLayout::GENERAL);
|
||||
# endif
|
||||
# if ENABLE_RT
|
||||
Test.rtSet->setTexture(Test.rtSet->gOutput, Test.colorTarget.get(), RenderTextureLayout::GENERAL);
|
||||
# endif
|
||||
}
|
||||
|
||||
void TestDraw() {
|
||||
// Begin.
|
||||
Test.commandList->begin();
|
||||
# if ENABLE_CLEAR
|
||||
const uint32_t SyncInterval = 1;
|
||||
const uint32_t width = Test.swapChain->getWidth();
|
||||
const uint32_t height = Test.swapChain->getHeight();
|
||||
const RenderViewport viewport(0.0f, 0.0f, float(width), float(height));
|
||||
const RenderRect scissor(0, 0, width, height);
|
||||
|
||||
// Clear.
|
||||
Test.commandList->setViewports(viewport);
|
||||
Test.commandList->setScissors(scissor);
|
||||
Test.commandList->barriers(RenderBarrierStage::GRAPHICS, RenderTextureBarrier(Test.colorTargetMS.get(), RenderTextureLayout::COLOR_WRITE));
|
||||
Test.commandList->barriers(RenderBarrierStage::GRAPHICS, RenderTextureBarrier(Test.depthTarget.get(), RenderTextureLayout::DEPTH_WRITE));
|
||||
Test.commandList->setFramebuffer(Test.framebuffer.get());
|
||||
Test.commandList->clearColor(0, RenderColor(0.0f, 0.0f, 0.5f));
|
||||
Test.commandList->clearDepth();
|
||||
# endif
|
||||
# if ENABLE_RASTER
|
||||
// Raster.
|
||||
RasterPushConstant pushConstant;
|
||||
pushConstant.colorAdd[0] = 0.5f;
|
||||
pushConstant.colorAdd[1] = 0.25f;
|
||||
pushConstant.colorAdd[2] = 0.0f;
|
||||
pushConstant.colorAdd[3] = 0.0f;
|
||||
pushConstant.textureIndex = 2;
|
||||
Test.commandList->setPipeline(Test.rasterPipeline.get());
|
||||
Test.commandList->setGraphicsPipelineLayout(Test.rasterPipelineLayout.get());
|
||||
Test.commandList->setGraphicsPushConstants(0, &pushConstant);
|
||||
# if ENABLE_TEXTURE
|
||||
Test.commandList->setGraphicsDescriptorSet(Test.rasterSet->get(), 0);
|
||||
# endif
|
||||
Test.commandList->setVertexBuffers(0, &Test.vertexBufferView, 1, &Test.inputSlot);
|
||||
Test.commandList->setIndexBuffer(&Test.indexBufferView);
|
||||
Test.commandList->drawInstanced(3, 1, 0, 0);
|
||||
Test.commandList->barriers(RenderBarrierStage::COPY, RenderTextureBarrier(Test.depthTarget.get(), RenderTextureLayout::DEPTH_READ));
|
||||
# endif
|
||||
# if ENABLE_COMPUTE || ENABLE_RT || ENABLE_CLEAR
|
||||
Test.commandList->barriers(RenderBarrierStage::COPY, RenderTextureBarrier(Test.colorTargetMS.get(), RenderTextureLayout::RESOLVE_SOURCE));
|
||||
Test.commandList->barriers(RenderBarrierStage::COPY, RenderTextureBarrier(Test.colorTargetResolved.get(), RenderTextureLayout::RESOLVE_DEST));
|
||||
Test.commandList->resolveTexture(Test.colorTargetResolved.get(), Test.colorTargetMS.get());
|
||||
# endif
|
||||
# if ENABLE_COMPUTE || ENABLE_RT
|
||||
Test.commandList->barriers(RenderBarrierStage::COMPUTE, RenderTextureBarrier(Test.colorTargetResolved.get(), RenderTextureLayout::GENERAL));
|
||||
# endif
|
||||
# if ENABLE_COMPUTE
|
||||
const uint32_t GroupCount = 8;
|
||||
ComputePushConstant pushCostant;
|
||||
pushCostant.Resolution[0] = width;
|
||||
pushCostant.Resolution[1] = height;
|
||||
pushCostant.Multiply[0] = 0.5f;
|
||||
pushCostant.Multiply[1] = 0.5f;
|
||||
pushCostant.Multiply[2] = 1.0f;
|
||||
pushCostant.Multiply[3] = 1.0f;
|
||||
Test.commandList->setPipeline(Test.computePipeline.get());
|
||||
Test.commandList->setComputePipelineLayout(Test.computePipelineLayout.get());
|
||||
Test.commandList->setComputePushConstants(0, &pushCostant);
|
||||
Test.commandList->setComputeDescriptorSet(Test.computeFirstSet->get(), 0);
|
||||
Test.commandList->setComputeDescriptorSet(Test.computeSecondSet->get(), 1);
|
||||
Test.commandList->dispatch((width + GroupCount - 1) / GroupCount, (height + GroupCount - 1) / GroupCount, 1);
|
||||
# endif
|
||||
# if ENABLE_RT
|
||||
// RT.
|
||||
Test.commandList->barriers(RenderBarrierStage::COMPUTE, RenderTextureBarrier(Test.colorTargetResolved.get(), RenderTextureLayout::GENERAL));
|
||||
Test.commandList->setPipeline(Test.rtPipeline.get());
|
||||
Test.commandList->setRaytracingPipelineLayout(Test.rtPipelineLayout.get());
|
||||
Test.commandList->setRaytracingDescriptorSet(Test.rtSet->get(), 0);
|
||||
Test.commandList->traceRays(width, height, 1, Test.rtShaderBindingTableBuffer.get(), Test.rtShaderBindingTableInfo.groups);
|
||||
# endif
|
||||
# if ENABLE_SWAP_CHAIN
|
||||
const uint32_t swapChainTextureIndex = Test.swapChain->getTextureIndex();
|
||||
RenderTexture *swapChainTexture = Test.swapChain->getTexture(swapChainTextureIndex);
|
||||
RenderFramebuffer *swapFramebuffer = Test.swapFramebuffers[swapChainTextureIndex].get();
|
||||
Test.commandList->setViewports(viewport);
|
||||
Test.commandList->setScissors(scissor);
|
||||
Test.commandList->barriers(RenderBarrierStage::GRAPHICS, RenderTextureBarrier(swapChainTexture, RenderTextureLayout::COLOR_WRITE));
|
||||
Test.commandList->setFramebuffer(swapFramebuffer);
|
||||
# endif
|
||||
# if ENABLE_CLEAR
|
||||
Test.commandList->barriers(RenderBarrierStage::GRAPHICS, RenderTextureBarrier(Test.colorTargetResolved.get(), RenderTextureLayout::SHADER_READ));
|
||||
Test.commandList->clearColor(0, RenderColor(0.0f, 0.0f, 0.0f));
|
||||
Test.commandList->setPipeline(Test.postPipeline.get());
|
||||
Test.commandList->setGraphicsPipelineLayout(Test.postPipelineLayout.get());
|
||||
Test.postSet->setTexture(0, Test.colorTargetResolved.get(), RenderTextureLayout::SHADER_READ);
|
||||
Test.commandList->setGraphicsDescriptorSet(Test.postSet.get(), 0);
|
||||
Test.commandList->drawInstanced(3, 1, 0, 0);
|
||||
# endif
|
||||
# if ENABLE_SWAP_CHAIN
|
||||
Test.commandList->barriers(RenderBarrierStage::NONE, RenderTextureBarrier(swapChainTexture, RenderTextureLayout::PRESENT));
|
||||
# endif
|
||||
// End.
|
||||
Test.commandList->end();
|
||||
Test.commandQueue->executeCommandLists(Test.commandList.get(), Test.commandFence.get());
|
||||
# if ENABLE_SWAP_CHAIN
|
||||
Test.swapChain->present();
|
||||
# endif
|
||||
Test.commandQueue->waitForCommandFence(Test.commandFence.get());
|
||||
}
|
||||
|
||||
void TestShutdown() {
|
||||
Test.rtParamsBuffer.reset(nullptr);
|
||||
Test.rtVertexBuffer.reset(nullptr);
|
||||
Test.rtScratchBuffer.reset(nullptr);
|
||||
Test.rtInstancesBuffer.reset(nullptr);
|
||||
Test.rtBottomLevelASBuffer.reset(nullptr);
|
||||
Test.rtTopLevelASBuffer.reset(nullptr);
|
||||
Test.rtShaderBindingTableBuffer.reset(nullptr);
|
||||
Test.uploadBuffer.reset(nullptr);
|
||||
Test.blueNoiseTexture.reset(nullptr);
|
||||
Test.vertexBuffer.reset(nullptr);
|
||||
Test.indexBuffer.reset(nullptr);
|
||||
Test.rasterPipeline.reset(nullptr);
|
||||
Test.computePipeline.reset(nullptr);
|
||||
Test.rtPipeline.reset(nullptr);
|
||||
Test.postPipeline.reset(nullptr);
|
||||
Test.rasterPipelineLayout.reset(nullptr);
|
||||
Test.computePipelineLayout.reset(nullptr);
|
||||
Test.rtPipelineLayout.reset(nullptr);
|
||||
Test.postPipelineLayout.reset(nullptr);
|
||||
Test.rtSet.reset(nullptr);
|
||||
Test.rasterSet.reset(nullptr);
|
||||
Test.computeFirstSet.reset(nullptr);
|
||||
Test.computeSecondSet.reset(nullptr);
|
||||
Test.postSet.reset(nullptr);
|
||||
Test.linearSampler.reset(nullptr);
|
||||
Test.postSampler.reset(nullptr);
|
||||
Test.colorTargetMS.reset(nullptr);
|
||||
Test.colorTargetResolved.reset(nullptr);
|
||||
Test.framebuffer.reset(nullptr);
|
||||
Test.swapFramebuffers.clear();
|
||||
Test.commandList.reset(nullptr);
|
||||
Test.commandFence.reset(nullptr);
|
||||
Test.swapChain.reset(nullptr);
|
||||
Test.commandQueue.reset(nullptr);
|
||||
Test.device.reset(nullptr);
|
||||
}
|
||||
|
||||
#if defined(_WIN64)
|
||||
static LRESULT CALLBACK TestWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {
|
||||
switch (message) {
|
||||
case WM_CLOSE:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
case WM_SIZE:
|
||||
TestResize();
|
||||
return 0;
|
||||
case WM_PAINT:
|
||||
TestDraw();
|
||||
return 0;
|
||||
default:
|
||||
return DefWindowProc(hWnd, message, wParam, lParam);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static HWND TestCreateWindow() {
|
||||
// Register window class.
|
||||
WNDCLASS wc;
|
||||
memset(&wc, 0, sizeof(WNDCLASS));
|
||||
wc.lpfnWndProc = TestWndProc;
|
||||
wc.hInstance = GetModuleHandle(0);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_BACKGROUND);
|
||||
wc.lpszClassName = "RenderInterfaceTest";
|
||||
RegisterClass(&wc);
|
||||
|
||||
// Create window.
|
||||
const int Width = 1280;
|
||||
const int Height = 720;
|
||||
RECT rect;
|
||||
UINT dwStyle = WS_OVERLAPPEDWINDOW | WS_VISIBLE;
|
||||
rect.left = (GetSystemMetrics(SM_CXSCREEN) - Width) / 2;
|
||||
rect.top = (GetSystemMetrics(SM_CYSCREEN) - Height) / 2;
|
||||
rect.right = rect.left + Width;
|
||||
rect.bottom = rect.top + Height;
|
||||
AdjustWindowRectEx(&rect, dwStyle, 0, 0);
|
||||
|
||||
return CreateWindow(wc.lpszClassName, "Render Interface Test", dwStyle, rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top, 0, 0, wc.hInstance, NULL);
|
||||
}
|
||||
|
||||
void RenderInterfaceTest(RenderInterface *renderInterface) {
|
||||
HWND hwnd = TestCreateWindow();
|
||||
TestInitialize(renderInterface, hwnd);
|
||||
TestResize();
|
||||
|
||||
// Message loop.
|
||||
MSG msg = {};
|
||||
while (msg.message != WM_QUIT) {
|
||||
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
}
|
||||
|
||||
TestShutdown();
|
||||
DestroyWindow(hwnd);
|
||||
}
|
||||
#elif defined(__ANDROID__)
|
||||
void RenderInterfaceTest(RenderInterface* renderInterface) {
|
||||
assert(false);
|
||||
}
|
||||
#elif defined(__linux__)
|
||||
void RenderInterfaceTest(RenderInterface* renderInterface) {
|
||||
Display* display = XOpenDisplay(nullptr);
|
||||
int blackColor = BlackPixel(display, DefaultScreen(display));
|
||||
Window window = XCreateSimpleWindow(display, DefaultRootWindow(display),
|
||||
0, 0, 1280, 720, 0, blackColor, blackColor);
|
||||
|
||||
|
||||
XSelectInput(display, window, StructureNotifyMask);
|
||||
// Map the window and wait for the notify event to come in.
|
||||
XMapWindow(display, window);
|
||||
while (true) {
|
||||
XEvent event;
|
||||
XNextEvent(display, &event);
|
||||
if (event.type == MapNotify) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Set up the delete window protocol.
|
||||
Atom wmDeleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", False);
|
||||
XSetWMProtocols(display, window, &wmDeleteMessage, 1);
|
||||
|
||||
TestInitialize(renderInterface, {display, window});
|
||||
TestResize();
|
||||
TestDraw();
|
||||
|
||||
// Loop until the window is closed.
|
||||
std::chrono::system_clock::time_point prev_frame = std::chrono::system_clock::now();
|
||||
bool running = true;
|
||||
while (running) {
|
||||
if (XPending(display) > 0) {
|
||||
XEvent event;
|
||||
XNextEvent(display, &event);
|
||||
|
||||
switch (event.type) {
|
||||
case Expose:
|
||||
TestDraw();
|
||||
break;
|
||||
|
||||
case ClientMessage:
|
||||
if (event.xclient.data.l[0] == wmDeleteMessage)
|
||||
running = false;
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
using namespace std::chrono_literals;
|
||||
std::this_thread::sleep_for(1ms);
|
||||
auto now_time = std::chrono::system_clock::now();
|
||||
if (now_time - prev_frame > 16666us) {
|
||||
prev_frame = now_time;
|
||||
TestDraw();
|
||||
}
|
||||
}
|
||||
|
||||
TestShutdown();
|
||||
XDestroyWindow(display, window);
|
||||
}
|
||||
#elif defined(__APPLE__)
|
||||
void RenderInterfaceTest(RenderInterface* renderInterface) {
|
||||
assert(false);
|
||||
}
|
||||
#endif
|
||||
};
|
||||
@@ -0,0 +1,26 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
struct Constants {
|
||||
float4 Multiply;
|
||||
uint2 Resolution;
|
||||
};
|
||||
|
||||
[[vk::push_constant]] ConstantBuffer<Constants> gConstants : register(b0);
|
||||
|
||||
Texture2D<float4> gBlueNoiseTexture : register(t1);
|
||||
SamplerState gSampler : register(s2);
|
||||
[[vk::image_format("rgba8")]]
|
||||
RWTexture2D<float4> gTarget : register(u16, space1);
|
||||
|
||||
[numthreads(8, 8, 1)]
|
||||
void CSMain(uint2 coord : SV_DispatchThreadID) {
|
||||
if (any(coord >= gConstants.Resolution)) {
|
||||
return;
|
||||
}
|
||||
|
||||
float2 blueNoiseUV = float2(coord) / float2(gConstants.Resolution);
|
||||
float4 blueNoise = float4(gBlueNoiseTexture.SampleLevel(gSampler, blueNoiseUV, 0).rgb, 1.0f);
|
||||
gTarget[coord] *= (blueNoise * gConstants.Multiply);
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
struct Constants {
|
||||
float4 colorAdd;
|
||||
uint textureIndex;
|
||||
};
|
||||
|
||||
[[vk::push_constant]] ConstantBuffer<Constants> gConstants : register(b0);
|
||||
|
||||
SamplerState gSampler : register(s1);
|
||||
Texture2D<float4> gTexture[] : register(t2);
|
||||
|
||||
float4 PSMain(in float4 pos : SV_Position, in float2 uv : TEXCOORD) : SV_TARGET {
|
||||
float4 result = float4(gTexture[NonUniformResourceIndex(gConstants.textureIndex)].SampleLevel(gSampler, uv, 0).rgb, 1.0f);
|
||||
result += gConstants.colorAdd;
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
Texture2D<float4> gTexture : register(t1);
|
||||
SamplerState gSampler : register(s2);
|
||||
|
||||
float4 PSMain(in float4 pos : SV_Position, in float2 uv : TEXCOORD) : SV_TARGET {
|
||||
float4 result = float4(gTexture.SampleLevel(gSampler, uv, 0).rgb, 1.0f);
|
||||
return result;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
void VSMain(in uint id : SV_VertexID, out float4 pos : SV_Position, out float2 uv : TEXCOORD0) {
|
||||
uv.x = (id == 2) ? 2.0f : 0.0f;
|
||||
uv.y = (id == 1) ? 2.0f : 0.0f;
|
||||
pos = float4(uv * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f), 1.0f, 1.0f);
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
struct Attributes {
|
||||
float2 bary;
|
||||
};
|
||||
|
||||
struct Payload {
|
||||
float4 color;
|
||||
};
|
||||
|
||||
struct BufferParams {
|
||||
float3 rgbMultiplier;
|
||||
uint3 pad;
|
||||
};
|
||||
|
||||
RaytracingAccelerationStructure gBVH : register(t0);
|
||||
RWTexture2D<float4> gOutput : register(u1);
|
||||
StructuredBuffer<BufferParams> gBufferParams : register(t2);
|
||||
|
||||
[shader("raygeneration")]
|
||||
void ColorRayGen() {
|
||||
RayDesc ray;
|
||||
ray.Origin = float3(float2(DispatchRaysIndex().xy) / float2(DispatchRaysDimensions().xy), 0.0f);
|
||||
ray.Direction = float3(0.0f, 0.0f, 1.0f);
|
||||
ray.TMin = 1e-6f;
|
||||
ray.TMax = 1e6f;
|
||||
|
||||
Payload payload;
|
||||
payload.color = float4(0.0f, 0.5f, 0.0f, 1.0f);
|
||||
TraceRay(gBVH, RAY_FLAG_NONE, 0xFF, 0, 0, 0, ray, payload);
|
||||
gOutput[DispatchRaysIndex().xy] = payload.color;
|
||||
}
|
||||
|
||||
[shader("closesthit")]
|
||||
void ColorClosestHit(inout Payload payload, in Attributes attr) {
|
||||
payload.color = float4(1.0f, attr.bary.xy, 1.0f) * float4(gBufferParams[0].rgbMultiplier, 1.0f);
|
||||
}
|
||||
|
||||
[shader("miss")]
|
||||
void ColorMiss(inout Payload payload) {
|
||||
payload.color = float4(0.25f, 0.25f, 0.5f, 1.0f) * float4(gBufferParams[1].rgbMultiplier, 1.0f);
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
void VSMain(in float2 vertexPos : POSITION, in float2 vertexUV : TEXCOORD, out float4 pos : SV_POSITION, out float2 uv : TEXCOORD) {
|
||||
pos = float4(vertexPos, 1.0f, 1.0f);
|
||||
uv = vertexUV;
|
||||
}
|
||||
@@ -0,0 +1,518 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#ifndef RT64_EXTENDED_GBI
|
||||
#define RT64_EXTENDED_GBI
|
||||
|
||||
// G_SPNOOP on F3D and F3DEX2.
|
||||
#ifdef F3DEX_GBI_2
|
||||
# define RT64_HOOK_OPCODE 0xE0
|
||||
#else
|
||||
# define RT64_HOOK_OPCODE 0x00
|
||||
#endif
|
||||
|
||||
#define RT64_HOOK_OP_GETVERSION 0x0
|
||||
#define RT64_HOOK_OP_ENABLE 0x1
|
||||
#define RT64_HOOK_OP_DISABLE 0x2
|
||||
#define RT64_HOOK_OP_DL 0x3
|
||||
#define RT64_HOOK_OP_BRANCH 0x4
|
||||
|
||||
// 0x5254 for ASCII "RT" followed by 0x64.
|
||||
#define RT64_HOOK_MAGIC_NUMBER 0x525464
|
||||
|
||||
#ifndef RT64_EXTENDED_OPCODE
|
||||
// TODO: Define defaults here based on the GBI.
|
||||
# define RT64_EXTENDED_OPCODE 0x64
|
||||
#endif
|
||||
|
||||
#define G_EX_VERSION 0x1
|
||||
|
||||
#define G_EX_NOOP 0x000000
|
||||
#define G_EX_PRINT 0x000001
|
||||
#define G_EX_TEXRECT_V1 0x000002
|
||||
#define G_EX_FILLRECT_V1 0x000003
|
||||
#define G_EX_SETVIEWPORT_V1 0x000004
|
||||
#define G_EX_SETSCISSOR_V1 0x000005
|
||||
#define G_EX_SETRECTALIGN_V1 0x000006
|
||||
#define G_EX_SETVIEWPORTALIGN_V1 0x000007
|
||||
#define G_EX_SETSCISSORALIGN_V1 0x000008
|
||||
#define G_EX_SETREFRESHRATE_V1 0x000009
|
||||
#define G_EX_VERTEXZTEST_V1 0x00000A
|
||||
#define G_EX_ENDVERTEXZTEST_V1 0x00000B
|
||||
#define G_EX_MATRIXGROUP_V1 0x00000C
|
||||
#define G_EX_POPMATRIXGROUP_V1 0x00000D
|
||||
#define G_EX_FORCEUPSCALE2D_V1 0x00000E
|
||||
#define G_EX_FORCETRUEBILERP_V1 0x00000F
|
||||
#define G_EX_FORCESCALELOD_V1 0x000010
|
||||
#define G_EX_FORCEBRANCH_V1 0x000011
|
||||
#define G_EX_SETRENDERTORAM_V1 0x000012
|
||||
#define G_EX_EDITGROUPBYADDRESS_V1 0x000013
|
||||
#define G_EX_VERTEX_V1 0x000014
|
||||
#define G_EX_PUSHVIEWPORT_V1 0x000015
|
||||
#define G_EX_POPVIEWPORT_V1 0x000016
|
||||
#define G_EX_PUSHSCISSOR_V1 0x000017
|
||||
#define G_EX_POPSCISSOR_V1 0x000018
|
||||
#define G_EX_PUSHOTHERMODE_V1 0x000019
|
||||
#define G_EX_POPOTHERMODE_V1 0x00001A
|
||||
#define G_EX_PUSHCOMBINE_V1 0x00001B
|
||||
#define G_EX_POPCOMBINE_V1 0x00001C
|
||||
#define G_EX_PUSHPROJMATRIX_V1 0x00001D
|
||||
#define G_EX_POPPROJMATRIX_V1 0x00001E
|
||||
#define G_EX_PUSHENVCOLOR_V1 0x00001F
|
||||
#define G_EX_POPENVCOLOR_V1 0x000020
|
||||
#define G_EX_PUSHBLENDCOLOR_V1 0x000021
|
||||
#define G_EX_POPBLENDCOLOR_V1 0x000022
|
||||
#define G_EX_PUSHFOGCOLOR_V1 0x000023
|
||||
#define G_EX_POPFOGCOLOR_V1 0x000024
|
||||
#define G_EX_PUSHFILLCOLOR_V1 0x000025
|
||||
#define G_EX_POPFILLCOLOR_V1 0x000026
|
||||
#define G_EX_PUSHPRIMCOLOR_V1 0x000027
|
||||
#define G_EX_POPPRIMCOLOR_V1 0x000028
|
||||
#define G_EX_PUSHGEOMETRYMODE_V1 0x000029
|
||||
#define G_EX_POPGEOMETRYMODE_V1 0x00002A
|
||||
#define G_EX_SETDITHERNOISESTRENGTH_V1 0x00002B
|
||||
#define G_EX_SETRDRAMEXTENDED_V1 0x00002C
|
||||
#define G_EX_MAX 0x00002D
|
||||
|
||||
#define G_EX_ORIGIN_NONE 0x800
|
||||
#define G_EX_ORIGIN_LEFT 0x0
|
||||
#define G_EX_ORIGIN_CENTER 0x200
|
||||
#define G_EX_ORIGIN_RIGHT 0x400
|
||||
|
||||
#define G_EX_NOPUSH 0x0
|
||||
#define G_EX_PUSH 0x1
|
||||
|
||||
#define G_EX_ID_IGNORE 0x0
|
||||
#define G_EX_ID_AUTO 0xFFFFFFFF
|
||||
|
||||
#define G_EX_COMPONENT_SKIP 0x0
|
||||
#define G_EX_COMPONENT_INTERPOLATE 0x1
|
||||
#define G_EX_COMPONENT_AUTO 0x2
|
||||
|
||||
#define G_EX_INTERPOLATE_SIMPLE 0x0
|
||||
#define G_EX_INTERPOLATE_DECOMPOSE 0x1
|
||||
|
||||
#define G_EX_ORDER_LINEAR 0x0
|
||||
#define G_EX_ORDER_AUTO 0x1
|
||||
|
||||
#define G_EX_EDIT_NONE 0x0
|
||||
#define G_EX_EDIT_ALLOW 0x1
|
||||
|
||||
#define G_EX_BILERP_NONE 0x0
|
||||
#define G_EX_BILERP_ONLY 0x1
|
||||
#define G_EX_BILERP_ALL 0x2
|
||||
|
||||
// Represents the 8-byte commands in the F3D microcode family
|
||||
typedef union {
|
||||
struct {
|
||||
unsigned word0;
|
||||
unsigned word1;
|
||||
} values;
|
||||
unsigned long long dummy; // Force to 8-byte alignment
|
||||
} GfxCommand;
|
||||
|
||||
typedef struct {
|
||||
short ob[3];
|
||||
unsigned short flag;
|
||||
short tc[2];
|
||||
unsigned char cn[4];
|
||||
short obp[3];
|
||||
} VertexEXColor;
|
||||
|
||||
typedef struct {
|
||||
short ob[3];
|
||||
unsigned short flag;
|
||||
short tc[2];
|
||||
signed char n[3];
|
||||
unsigned char a;
|
||||
short obp[3];
|
||||
} VertexEXNormal;
|
||||
|
||||
typedef union {
|
||||
VertexEXColor v;
|
||||
VertexEXNormal n;
|
||||
long long alignment[3];
|
||||
} VertexEX;
|
||||
|
||||
#define PARAM(value, bits, shift) \
|
||||
((unsigned) (((unsigned)(value) & ((1U << (bits)) - 1U)) << (shift)))
|
||||
|
||||
#define DOWHILE(code) \
|
||||
do { code } while (0)
|
||||
|
||||
#define G_EX_WRITECOMMAND(cmd, _word0, _word1) \
|
||||
{ \
|
||||
cmd->values.word0 = _word0; \
|
||||
cmd->values.word1 = _word1; \
|
||||
}
|
||||
|
||||
#define G_EX_COMMAND1(cmd, _word0, _word1) \
|
||||
DOWHILE( \
|
||||
GfxCommand *_cmd = (GfxCommand*)(cmd); \
|
||||
G_EX_WRITECOMMAND((_cmd + 0), _word0, _word1) \
|
||||
)
|
||||
|
||||
#define G_EX_COMMAND2(cmd, _word0, _word1, _word2, _word3) \
|
||||
DOWHILE( \
|
||||
GfxCommand *_cmd = (GfxCommand*)(cmd); \
|
||||
(void)(cmd); \
|
||||
G_EX_WRITECOMMAND((_cmd + 0), _word0, _word1) \
|
||||
G_EX_WRITECOMMAND((_cmd + 1), _word2, _word3) \
|
||||
)
|
||||
|
||||
#define G_EX_COMMAND3(cmd, _word0, _word1, _word2, _word3, _word4, _word5) \
|
||||
DOWHILE( \
|
||||
GfxCommand *_cmd = (GfxCommand*)(cmd); \
|
||||
(void)(cmd); \
|
||||
(void)(cmd); \
|
||||
G_EX_WRITECOMMAND((_cmd + 0), _word0, _word1) \
|
||||
G_EX_WRITECOMMAND((_cmd + 1), _word2, _word3) \
|
||||
G_EX_WRITECOMMAND((_cmd + 2), _word4, _word5) \
|
||||
)
|
||||
|
||||
#define G_EX_COMMAND4(cmd, _word0, _word1, _word2, _word3, _word4, _word5, _word6, _word7) \
|
||||
DOWHILE( \
|
||||
GfxCommand *_cmd = (GfxCommand*)(cmd); \
|
||||
(void)(cmd); \
|
||||
(void)(cmd); \
|
||||
(void)(cmd); \
|
||||
G_EX_WRITECOMMAND(cmd_, _word0, _word1) \
|
||||
G_EX_WRITECOMMAND(cmd_, _word2, _word3) \
|
||||
G_EX_WRITECOMMAND(cmd_, _word4, _word5) \
|
||||
G_EX_WRITECOMMAND(cmd_, _word6, _word7) \
|
||||
)
|
||||
|
||||
#define gEXGetVersion(cmd, ret) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_HOOK_OPCODE, 8, 24) | PARAM(RT64_HOOK_MAGIC_NUMBER, 24, 0), \
|
||||
PARAM(RT64_HOOK_OP_GETVERSION, 4, 28) | PARAM(ret, 28, 0))
|
||||
|
||||
#define gEXEnable(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_HOOK_OPCODE, 8, 24) | PARAM(RT64_HOOK_MAGIC_NUMBER, 24, 0), \
|
||||
PARAM(RT64_HOOK_OP_ENABLE, 4, 28) | PARAM(RT64_EXTENDED_OPCODE, 8, 0))
|
||||
|
||||
#define gEXDisable(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_HOOK_OPCODE, 8, 24) | PARAM(RT64_HOOK_MAGIC_NUMBER, 24, 0), \
|
||||
PARAM(RT64_HOOK_OP_DISABLE, 4, 28))
|
||||
|
||||
#define gEXBranchList(cmd, dlist) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_HOOK_OPCODE, 8, 24) | PARAM(RT64_HOOK_MAGIC_NUMBER, 24, 0), \
|
||||
PARAM(RT64_HOOK_OP_BRANCH, 4, 28) | PARAM(dlist, 28, 0))
|
||||
|
||||
#define gEXDisplayList(cmd, dlist) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_HOOK_OPCODE, 8, 24) | PARAM(RT64_HOOK_MAGIC_NUMBER, 24, 0), \
|
||||
PARAM(RT64_HOOK_OP_DL, 4, 28) | PARAM(dlist, 28, 0))
|
||||
|
||||
#define gEXNoOp(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_NOOP, 24, 0), \
|
||||
0)
|
||||
|
||||
#define gEXPrint(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PRINT, 24, 0), \
|
||||
0)
|
||||
|
||||
#define gEXTextureRectangle(cmd, lorigin, rorigin, ulx, uly, lrx, lry, tile, s, t, dsdx, dtdy) \
|
||||
G_EX_COMMAND3(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_TEXRECT_V1, 24, 0), \
|
||||
PARAM(tile, 3, 0) | PARAM(lorigin, 12, 3) | PARAM(rorigin, 12, 15) | PARAM(0, 5, 27), \
|
||||
\
|
||||
PARAM(ulx, 16, 16) | PARAM(uly, 16, 0), \
|
||||
PARAM(lrx, 16, 16) | PARAM(lry, 16, 0), \
|
||||
\
|
||||
PARAM(s, 16, 16) | PARAM(t, 16, 0), \
|
||||
PARAM(dsdx, 16, 16) | PARAM(dtdy, 16, 0) \
|
||||
)
|
||||
|
||||
#define gEXViewport(cmd, origin, vp) \
|
||||
G_EX_COMMAND2(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETVIEWPORT_V1, 24, 0), \
|
||||
PARAM(origin, 12, 0), \
|
||||
\
|
||||
0, \
|
||||
(unsigned)vp \
|
||||
)
|
||||
|
||||
#define gEXSetScissor(cmd, mode, lorigin, rorigin, ulx, uly, lrx, lry) \
|
||||
G_EX_COMMAND2(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETSCISSOR_V1, 24, 0), \
|
||||
PARAM(mode, 2, 0) | PARAM(lorigin, 12, 2) | PARAM(rorigin, 12, 14), \
|
||||
\
|
||||
PARAM((ulx) * 4, 16, 16) | PARAM((uly) * 4, 16, 0), \
|
||||
PARAM((lrx) * 4, 16, 16) | PARAM((lry) * 4, 16, 0) \
|
||||
)
|
||||
|
||||
#define gEXSetRectAlign(cmd, lorigin, rorigin, ulxOffset, ulyOffset, lrxOffset, lryOffset) \
|
||||
G_EX_COMMAND2(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETRECTALIGN_V1, 24, 0), \
|
||||
PARAM(lorigin, 12, 0) | PARAM(rorigin, 12, 12), \
|
||||
\
|
||||
PARAM((ulxOffset), 16, 16) | PARAM((ulyOffset), 16, 0), \
|
||||
PARAM((lrxOffset), 16, 16) | PARAM((lryOffset), 16, 0) \
|
||||
)
|
||||
|
||||
#define gEXSetViewportAlign(cmd, origin, xOffset, yOffset) \
|
||||
G_EX_COMMAND2(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETVIEWPORTALIGN_V1, 24, 0), \
|
||||
PARAM(origin, 12, 0), \
|
||||
\
|
||||
PARAM((xOffset), 16, 16) | PARAM((yOffset), 16, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXSetScissorAlign(cmd, lorigin, rorigin, ulxOffset, ulyOffset, lrxOffset, lryOffset, ulxBound, ulyBound, lrxBound, lryBound) \
|
||||
G_EX_COMMAND3(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETSCISSORALIGN_V1, 24, 0), \
|
||||
PARAM(lorigin, 12, 0) | PARAM(rorigin, 12, 12), \
|
||||
\
|
||||
PARAM((ulxOffset) * 4, 16, 16) | PARAM((ulyOffset) * 4, 16, 0), \
|
||||
PARAM((lrxOffset) * 4, 16, 16) | PARAM((lryOffset) * 4, 16, 0), \
|
||||
\
|
||||
PARAM((ulxBound) * 4, 16, 16) | PARAM((ulyBound) * 4, 16, 0), \
|
||||
PARAM((lrxBound) * 4, 16, 16) | PARAM((lryBound) * 4, 16, 0) \
|
||||
)
|
||||
|
||||
#define gEXSetRefreshRate(cmd, refresh_rate) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETREFRESHRATE_V1, 24, 0), \
|
||||
PARAM(refresh_rate, 16, 0) \
|
||||
)
|
||||
|
||||
#define gEXVertexZTest(cmd, vertex_index) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_VERTEXZTEST_V1, 24, 0), \
|
||||
PARAM(vertex_index, 8, 0) \
|
||||
)
|
||||
|
||||
#define gEXEndVertexZTest(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_ENDVERTEXZTEST_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXMatrixGroup(cmd, id, mode, push, proj, pos, rot, scale, skew, persp, vert, tile, order, edit) \
|
||||
G_EX_COMMAND2(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_MATRIXGROUP_V1, 24, 0), \
|
||||
id, \
|
||||
PARAM(push, 1, 0) | PARAM((proj) != 0, 1, 1) | PARAM(mode, 1, 2) | PARAM(pos, 2, 3) | PARAM(rot, 2, 5) | PARAM(scale, 2, 7) | PARAM(skew, 2, 9) | PARAM(persp, 2, 11) | PARAM(vert, 2, 13) | PARAM(tile, 2, 15) | PARAM(order, 2, 17) | PARAM(edit, 1, 19), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXMatrixGroupSimple(cmd, id, push, proj, pos, rot, persp, vert, tile, order, edit) \
|
||||
gEXMatrixGroup(cmd, id, G_EX_INTERPOLATE_SIMPLE, push, proj, pos, rot, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, persp, vert, tile, order, edit)
|
||||
|
||||
#define gEXMatrixGroupDecomposed(cmd, id, push, proj, pos, rot, scale, skew, persp, vert, tile, order, edit) \
|
||||
gEXMatrixGroup(cmd, id, G_EX_INTERPOLATE_DECOMPOSE, push, proj, pos, rot, scale, skew, persp, vert, tile, order, edit)
|
||||
|
||||
#define gEXMatrixGroupNoInterpolate(cmd, push, proj, edit) \
|
||||
gEXMatrixGroup(cmd, G_EX_ID_IGNORE, G_EX_INTERPOLATE_SIMPLE, push, proj, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_COMPONENT_SKIP, G_EX_ORDER_LINEAR, edit)
|
||||
|
||||
#define gEXPopMatrixGroup(cmd, proj) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPMATRIXGROUP_V1, 24, 0), \
|
||||
PARAM(1, 8, 0) | PARAM(proj, 1, 8) \
|
||||
)
|
||||
|
||||
#define gEXPopMatrixGroupN(cmd, proj, count) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPMATRIXGROUP_V1, 24, 0), \
|
||||
PARAM(count, 8, 0) | PARAM(proj, 1, 8) \
|
||||
)
|
||||
|
||||
#define gEXForceUpscale2D(cmd, force) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_FORCEUPSCALE2D_V1, 24, 0), \
|
||||
PARAM(force, 1, 0) \
|
||||
)
|
||||
|
||||
#define gEXForceTrueBilerp(cmd, mode) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_FORCETRUEBILERP_V1, 24, 0), \
|
||||
PARAM(mode, 2, 0) \
|
||||
)
|
||||
|
||||
#define gEXForceScaleLOD(cmd, force) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_FORCESCALELOD_V1, 24, 0), \
|
||||
PARAM(force, 1, 0) \
|
||||
)
|
||||
|
||||
#define gEXForceBranch(cmd, force) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_FORCEBRANCH_V1, 24, 0), \
|
||||
PARAM(force, 1, 0) \
|
||||
)
|
||||
|
||||
#define gEXSetRenderToRAM(cmd, render) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETRENDERTORAM_V1, 24, 0), \
|
||||
PARAM(render, 1, 0) \
|
||||
)
|
||||
|
||||
#define gEXEditGroupByAddress(cmd, address, mode, push, proj, pos, rot, scale, skew, persp, vert, tile, order) \
|
||||
G_EX_COMMAND2(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_EDITGROUPBYADDRESS_V1, 24, 0), \
|
||||
(unsigned)(address), \
|
||||
PARAM(push, 1, 0) | PARAM((proj) != 0, 1, 1) | PARAM(mode, 1, 2) | PARAM(pos, 2, 3) | PARAM(rot, 2, 5) | PARAM(scale, 2, 7) | PARAM(skew, 2, 9) | PARAM(persp, 2, 11) | PARAM(vert, 2, 13) | PARAM(tile, 2, 15) | PARAM(order, 2, 17) | PARAM(G_EX_EDIT_ALLOW, 1, 18), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXVertexV1(cmd, vtx, count, v0) \
|
||||
G_EX_COMMAND2(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_VERTEX_V1, 24, 0), \
|
||||
PARAM((v0)+(n), 7, 1) | PARAM(n, 8, 12), \
|
||||
0, \
|
||||
(unsigned)(vtx) \
|
||||
)
|
||||
|
||||
#define gEXPushViewport(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHVIEWPORT_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopViewport(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPVIEWPORT_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPushScissor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHSCISSOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopScissor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPSCISSOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPushOtherMode(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHOTHERMODE_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopOtherMode(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPOTHERMODE_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPushCombineMode(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHCOMBINE_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopCombineMode(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPCOMBINE_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPushProjectionMatrix(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHPROJMATRIX_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopProjectionMatrix(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPPROJMATRIX_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPushEnvColor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHENVCOLOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopEnvColor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPENVCOLOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPushBlendColor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHBLENDCOLOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopBlendColor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPBLENDCOLOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPushFogColor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHFOGCOLOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopFogColor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPFOGCOLOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPushFillColor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHFILLCOLOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopFillColor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPFILLCOLOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPushPrimColor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHPRIMCOLOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopPrimColor(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPPRIMCOLOR_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPushGeometryMode(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_PUSHGEOMETRYMODE_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXPopGeometryMode(cmd) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_POPGEOMETRYMODE_V1, 24, 0), \
|
||||
0 \
|
||||
)
|
||||
|
||||
#define gEXSetDitherNoiseStrength(cmd, value) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETDITHERNOISESTRENGTH_V1, 24, 0), \
|
||||
PARAM((value) * 1024, 16, 0) \
|
||||
)
|
||||
|
||||
#define gEXSetRDRAMExtended(cmd, isExtended) \
|
||||
G_EX_COMMAND1(cmd, \
|
||||
PARAM(RT64_EXTENDED_OPCODE, 8, 24) | PARAM(G_EX_SETRDRAMEXTENDED_V1, 24, 0), \
|
||||
PARAM(isExtended, 1, 0) \
|
||||
)
|
||||
|
||||
#endif // RT64_EXTENDED_GBI
|
||||
@@ -0,0 +1,65 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "m64p_common.h"
|
||||
#include "m64p_plugin.h"
|
||||
#include "m64p_types.h"
|
||||
|
||||
#include "rt64_api_common.h"
|
||||
|
||||
namespace RT64 {
|
||||
// Global container for the application.
|
||||
APIContainer API;
|
||||
};
|
||||
|
||||
DLLEXPORT void CALL ProcessRDPList(void) {
|
||||
const RT64::Application::Core &core = RT64::API.app->core;
|
||||
uint32_t &dpcStartReg = *core.DPC_START_REG;
|
||||
uint32_t &dpcCurReg = *core.DPC_CURRENT_REG;
|
||||
uint32_t &dpcEndReg = *core.DPC_END_REG;
|
||||
uint32_t &dpcStatusReg = *core.DPC_STATUS_REG;
|
||||
bool xbus = dpcStatusReg & DP_STATUS_XBUS_DMA;
|
||||
uint8_t *memory = xbus ? core.DMEM : core.RDRAM;
|
||||
|
||||
#ifdef LOG_PLUGIN_API_CALLS
|
||||
RT64_LOG_PRINTF("ProcessRDPList() 0x%08X", dpcCurReg);
|
||||
#endif
|
||||
|
||||
dpcStatusReg &= ~DP_STATUS_FREEZE;
|
||||
RT64::API.app->processDisplayLists(memory, dpcCurReg, dpcEndReg, false);
|
||||
|
||||
// Update registers to the end.
|
||||
dpcStartReg = dpcEndReg;
|
||||
dpcCurReg = dpcEndReg;
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL ProcessDList(void) {
|
||||
const RT64::Application::Core &core = RT64::API.app->core;
|
||||
const uint8_t *DMEM = core.DMEM;
|
||||
const OSTask_t *osTask = reinterpret_cast<const OSTask_t *>(&DMEM[0x0FC0]);
|
||||
#ifdef LOG_PLUGIN_API_CALLS
|
||||
RT64_LOG_PRINTF("ProcessDList() 0x%08X", osTask->data_ptr);
|
||||
#endif
|
||||
|
||||
RT64::API.app->state->rsp->reset();
|
||||
RT64::API.app->interpreter->loadUCodeGBI(osTask->ucode, osTask->ucode_data, true);
|
||||
RT64::API.app->processDisplayLists(core.RDRAM, osTask->data_ptr, 0, true);
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL UpdateScreen(void) {
|
||||
#ifdef LOG_PLUGIN_API_CALLS
|
||||
RT64_LOG_PRINTF("UpdateScreen()");
|
||||
#endif
|
||||
RT64::API.app->updateScreen();
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL ChangeWindow(void) {
|
||||
const bool isPJ64 = (RT64::API.apiType == RT64::APIType::Project64);
|
||||
if (!isPJ64) {
|
||||
CoreVideo_ToggleFullScreen();
|
||||
} else {
|
||||
RT64::ApplicationWindow *appWindow = RT64::API.app->appWindow.get();
|
||||
appWindow->setFullScreen(!appWindow->fullScreen);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
#pragma once
|
||||
|
||||
#include <cassert>
|
||||
#include <stdint.h>
|
||||
|
||||
#include "m64p_common.h"
|
||||
#include "m64p_plugin.h"
|
||||
#include "m64p_types.h"
|
||||
#include "m64p_vidext.h"
|
||||
|
||||
// mupen64plus function pointers for the video extension functions
|
||||
extern ptr_VidExt_InitWithRenderMode CoreVideo_InitWithRenderMode;
|
||||
extern ptr_VidExt_Quit CoreVideo_Quit;
|
||||
extern ptr_VidExt_SetCaption CoreVideo_SetCaption;
|
||||
extern ptr_VidExt_ToggleFullScreen CoreVideo_ToggleFullScreen;
|
||||
extern ptr_VidExt_ResizeWindow CoreVideo_ResizeWindow;
|
||||
extern ptr_VidExt_VK_GetSurface CoreVideo_VK_GetSurface;
|
||||
extern ptr_VidExt_VK_GetInstanceExtensions CoreVideo_VK_GetInstanceExtensions;
|
||||
extern ptr_VidExt_SetVideoMode CoreVideo_SetVideoMode;
|
||||
|
||||
// TODO: move this to applicationwindow?
|
||||
extern int window_width;
|
||||
extern int window_height;
|
||||
|
||||
#ifdef _WIN32
|
||||
namespace pj64 {
|
||||
// Prevent PJ64's definitions from conflicting with the implementations
|
||||
# define InitiateGFX InitiateGFXPJ64
|
||||
# define RomOpen RomOpenPJ64
|
||||
# include "project64/Video.h"
|
||||
# undef InitiateGFX
|
||||
# undef RomOpen
|
||||
};
|
||||
#endif
|
||||
|
||||
#include "hle/rt64_application.h"
|
||||
|
||||
#define DP_STATUS_XBUS_DMA 0x01
|
||||
#define DP_STATUS_FREEZE 0x02
|
||||
|
||||
typedef GFX_INFO MupenGraphicsInfo;
|
||||
#ifdef _WIN32
|
||||
typedef pj64::GFX_INFO Project64GraphicsInfo;
|
||||
#endif
|
||||
|
||||
struct PluginGraphicsInfo {
|
||||
union {
|
||||
MupenGraphicsInfo mupen64plus;
|
||||
#ifdef _WIN32
|
||||
Project64GraphicsInfo project64;
|
||||
#endif
|
||||
};
|
||||
};
|
||||
|
||||
namespace RT64 {
|
||||
enum class APIType {
|
||||
Native,
|
||||
Mupen64Plus,
|
||||
Project64,
|
||||
};
|
||||
|
||||
struct APIContainer {
|
||||
std::unique_ptr<Application> app;
|
||||
APIType apiType;
|
||||
};
|
||||
|
||||
extern APIContainer API;
|
||||
|
||||
template<typename T>
|
||||
void InitiateGFXCore(Application::Core &appCore, T info) {
|
||||
appCore.HEADER = info.HEADER;
|
||||
appCore.RDRAM = info.RDRAM;
|
||||
appCore.DMEM = info.DMEM;
|
||||
appCore.IMEM = info.IMEM;
|
||||
appCore.MI_INTR_REG = info.MI_INTR_REG;
|
||||
appCore.DPC_START_REG = info.DPC_START_REG;
|
||||
appCore.DPC_END_REG = info.DPC_END_REG;
|
||||
appCore.DPC_CURRENT_REG = info.DPC_CURRENT_REG;
|
||||
appCore.DPC_STATUS_REG = info.DPC_STATUS_REG;
|
||||
appCore.DPC_CLOCK_REG = info.DPC_CLOCK_REG;
|
||||
appCore.DPC_BUFBUSY_REG = info.DPC_BUFBUSY_REG;
|
||||
appCore.DPC_PIPEBUSY_REG = info.DPC_PIPEBUSY_REG;
|
||||
appCore.DPC_TMEM_REG = info.DPC_TMEM_REG;
|
||||
appCore.VI_STATUS_REG = info.VI_STATUS_REG;
|
||||
appCore.VI_ORIGIN_REG = info.VI_ORIGIN_REG;
|
||||
appCore.VI_WIDTH_REG = info.VI_WIDTH_REG;
|
||||
appCore.VI_INTR_REG = info.VI_INTR_REG;
|
||||
appCore.VI_V_CURRENT_LINE_REG = info.VI_V_CURRENT_LINE_REG;
|
||||
appCore.VI_TIMING_REG = info.VI_TIMING_REG;
|
||||
appCore.VI_V_SYNC_REG = info.VI_V_SYNC_REG;
|
||||
appCore.VI_H_SYNC_REG = info.VI_H_SYNC_REG;
|
||||
appCore.VI_LEAP_REG = info.VI_LEAP_REG;
|
||||
appCore.VI_H_START_REG = info.VI_H_START_REG;
|
||||
appCore.VI_V_START_REG = info.VI_V_START_REG;
|
||||
appCore.VI_V_BURST_REG = info.VI_V_BURST_REG;
|
||||
appCore.VI_X_SCALE_REG = info.VI_X_SCALE_REG;
|
||||
appCore.VI_Y_SCALE_REG = info.VI_Y_SCALE_REG;
|
||||
appCore.checkInterrupts = info.CheckInterrupts;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,267 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_api_common.h"
|
||||
|
||||
#include <SDL.h>
|
||||
#include "imgui/backends/imgui_impl_sdl2.h"
|
||||
|
||||
#define PLUGIN_NAME "RT64 Video Plugin"
|
||||
#define PLUGIN_VERSION 0x020509
|
||||
#define VIDEO_PLUGIN_API_VERSION 0x020200
|
||||
#define CONFIG_API_VERSION 0x020300
|
||||
|
||||
#ifndef NDEBUG
|
||||
# define LOG_PLUGIN_API_CALLS
|
||||
#endif
|
||||
|
||||
/* definitions of pointers to Core video extension functions */
|
||||
ptr_VidExt_InitWithRenderMode CoreVideo_InitWithRenderMode = NULL;
|
||||
ptr_VidExt_Quit CoreVideo_Quit = NULL;
|
||||
ptr_VidExt_SetCaption CoreVideo_SetCaption = NULL;
|
||||
ptr_VidExt_ToggleFullScreen CoreVideo_ToggleFullScreen = NULL;
|
||||
ptr_VidExt_ResizeWindow CoreVideo_ResizeWindow = NULL;
|
||||
ptr_VidExt_VK_GetSurface CoreVideo_VK_GetSurface = NULL;
|
||||
ptr_VidExt_VK_GetInstanceExtensions CoreVideo_VK_GetInstanceExtensions = NULL;
|
||||
ptr_VidExt_SetVideoMode CoreVideo_SetVideoMode = NULL;
|
||||
|
||||
#ifdef _WIN32
|
||||
#define DLSYM(a, b) GetProcAddress(a, b)
|
||||
#else
|
||||
#include <dlfcn.h>
|
||||
#define DLSYM(a, b) dlsym(a, b)
|
||||
#endif
|
||||
|
||||
DLLEXPORT m64p_error CALL PluginStartup(m64p_dynlib_handle CoreLibHandle, void *Context, void (*DebugCallback)(void *, int, const char *)) {
|
||||
CoreVideo_InitWithRenderMode = (ptr_VidExt_InitWithRenderMode)DLSYM(CoreLibHandle, "VidExt_InitWithRenderMode");
|
||||
CoreVideo_Quit = (ptr_VidExt_Quit)DLSYM(CoreLibHandle, "VidExt_Quit");
|
||||
CoreVideo_SetCaption = (ptr_VidExt_SetCaption)DLSYM(CoreLibHandle, "VidExt_SetCaption");
|
||||
CoreVideo_ToggleFullScreen = (ptr_VidExt_ToggleFullScreen)DLSYM(CoreLibHandle, "VidExt_ToggleFullScreen");
|
||||
CoreVideo_ResizeWindow = (ptr_VidExt_ResizeWindow)DLSYM(CoreLibHandle, "VidExt_ResizeWindow");
|
||||
CoreVideo_VK_GetSurface = (ptr_VidExt_VK_GetSurface)DLSYM(CoreLibHandle, "VidExt_VK_GetSurface");
|
||||
CoreVideo_VK_GetInstanceExtensions = (ptr_VidExt_VK_GetInstanceExtensions)DLSYM(CoreLibHandle, "VidExt_VK_GetInstanceExtensions");
|
||||
CoreVideo_SetVideoMode = (ptr_VidExt_SetVideoMode)DLSYM(CoreLibHandle, "VidExt_SetVideoMode");
|
||||
if (CoreVideo_InitWithRenderMode == NULL ||
|
||||
CoreVideo_Quit == NULL ||
|
||||
CoreVideo_SetCaption == NULL ||
|
||||
CoreVideo_ToggleFullScreen == NULL ||
|
||||
CoreVideo_ResizeWindow == NULL ||
|
||||
CoreVideo_VK_GetSurface == NULL ||
|
||||
CoreVideo_VK_GetInstanceExtensions == NULL ||
|
||||
CoreVideo_SetVideoMode == NULL) {
|
||||
return M64ERR_SYSTEM_FAIL;
|
||||
}
|
||||
return M64ERR_SUCCESS;
|
||||
}
|
||||
|
||||
DLLEXPORT m64p_error CALL PluginShutdown(void) {
|
||||
return M64ERR_SUCCESS;
|
||||
}
|
||||
|
||||
DLLEXPORT m64p_error CALL PluginGetVersion(m64p_plugin_type *PluginType, int *PluginVersion, int *APIVersion, const char **PluginNamePtr, int *Capabilities) {
|
||||
/* set version info */
|
||||
if (PluginType != NULL)
|
||||
*PluginType = M64PLUGIN_GFX;
|
||||
|
||||
if (PluginVersion != NULL)
|
||||
*PluginVersion = PLUGIN_VERSION;
|
||||
|
||||
if (APIVersion != NULL)
|
||||
*APIVersion = VIDEO_PLUGIN_API_VERSION;
|
||||
|
||||
if (PluginNamePtr != NULL)
|
||||
*PluginNamePtr = PLUGIN_NAME;
|
||||
|
||||
if (Capabilities != NULL)
|
||||
*Capabilities = 0;
|
||||
|
||||
return M64ERR_SUCCESS;
|
||||
}
|
||||
|
||||
#ifdef _WIN32
|
||||
DLLEXPORT void CALL GetDllInfo(pj64::PLUGIN_INFO *PluginInfo) {
|
||||
PluginInfo->Version = 0x103;
|
||||
PluginInfo->Type = pj64::PLUGIN_TYPE_VIDEO;
|
||||
strncpy(PluginInfo->Name, PLUGIN_NAME, sizeof(PluginInfo->Name));
|
||||
}
|
||||
#endif
|
||||
|
||||
DLLEXPORT void CALL MoveScreen(int xpos, int ypos) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL RomClosed(void) {
|
||||
if (RT64::API.app != nullptr) {
|
||||
RT64::API.app->end();
|
||||
RT64::API.app.reset();
|
||||
}
|
||||
}
|
||||
|
||||
DLLEXPORT int CALL RomOpen(void) {
|
||||
const bool isPJ64 = (RT64::API.apiType == RT64::APIType::Project64);
|
||||
if (isPJ64) {
|
||||
RT64::ApplicationWindow *appWindow = RT64::API.app->appWindow.get();
|
||||
appWindow->makeResizable();
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL ViStatusChanged(void) { }
|
||||
|
||||
DLLEXPORT void CALL ViWidthChanged(void) { }
|
||||
|
||||
DLLEXPORT int CALL InitiateGFX(PluginGraphicsInfo graphicsInfo) {
|
||||
// Determine if this is a PJ64 plugin by checking if the HWND element is actually valid.
|
||||
#ifdef _WIN32
|
||||
const bool isPJ64 = IsWindow(HWND(graphicsInfo.project64.hWnd));
|
||||
#else
|
||||
const bool isPJ64 = false;
|
||||
#endif
|
||||
if (isPJ64) {
|
||||
RT64::API.apiType = RT64::APIType::Project64;
|
||||
}
|
||||
else {
|
||||
RT64::API.apiType = RT64::APIType::Mupen64Plus;
|
||||
}
|
||||
|
||||
// Store core information in application.
|
||||
RT64::Application::Core appCore;
|
||||
appCore.window = {};
|
||||
|
||||
switch (RT64::API.apiType) {
|
||||
case RT64::APIType::Mupen64Plus:
|
||||
RT64::InitiateGFXCore<MupenGraphicsInfo>(appCore, graphicsInfo.mupen64plus);
|
||||
break;
|
||||
#ifdef _WIN32
|
||||
case RT64::APIType::Project64:
|
||||
RT64::InitiateGFXCore<Project64GraphicsInfo>(appCore, graphicsInfo.project64);
|
||||
appCore.window = RT64::RenderWindow(graphicsInfo.project64.hWnd);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
// Make new application with core information and set it up.
|
||||
RT64::API.app = std::make_unique<RT64::Application>(appCore, RT64::ApplicationConfiguration());
|
||||
return (RT64::API.app->setup(0) == RT64::Application::SetupResult::Success);
|
||||
}
|
||||
|
||||
int window_width = 640;
|
||||
int window_height = 480;
|
||||
|
||||
DLLEXPORT void CALL ResizeVideoOutput(int width, int height) {
|
||||
window_width = width;
|
||||
window_height = height;
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL FBRead(uint32_t addr) {
|
||||
// Unused.
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL FBWrite(uint32_t addr, uint32_t size) {
|
||||
// Unused.
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL FBGetFrameBufferInfo(void *p) {
|
||||
// Unused.
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL ShowCFB(void) {
|
||||
// Unused.
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL ReadScreen2(void *dest, int *width, int *height, int bFront) {
|
||||
// Unused.
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL SetRenderingCallback(void (*callback)(int)) {
|
||||
// Unused.
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL CaptureScreen(const char *Directory) {
|
||||
// Unused.
|
||||
}
|
||||
|
||||
// TODO: PR this to mupen64plus....
|
||||
DLLEXPORT void CALL SDL_KeyDown(int keymod, int keysym)
|
||||
{
|
||||
SDL_Event event;
|
||||
event.type = SDL_KEYDOWN;
|
||||
event.key.keysym.mod = keymod;
|
||||
event.key.keysym.sym = keysym;
|
||||
if (RT64::API.app->presentQueue->inspector != nullptr) {
|
||||
ImGui_ImplSDL2_ProcessEvent(&event);
|
||||
}
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL SDL_KeyUp(int keymod, int keysym)
|
||||
{
|
||||
SDL_Event event;
|
||||
event.type = SDL_KEYUP;
|
||||
event.key.keysym.mod = SDL_SCANCODE_TO_KEYCODE(keymod);
|
||||
event.key.keysym.sym = SDL_SCANCODE_TO_KEYCODE(keysym);
|
||||
|
||||
if (keysym == SDL_SCANCODE_F10)
|
||||
{
|
||||
if (RT64::API.app->userConfig.developerMode) {
|
||||
fprintf(stderr, "creating inspector...\n");
|
||||
const std::lock_guard<std::mutex> lock(RT64::API.app->presentQueue->inspectorMutex);
|
||||
if (RT64::API.app->presentQueue->inspector == nullptr) {
|
||||
RT64::API.app->presentQueue->inspector = std::make_unique<RT64::Inspector>(RT64::API.app->device.get(), RT64::API.app->swapChain.get(), RT64::API.app->createdGraphicsAPI);
|
||||
if (!RT64::API.app->userPaths.isEmpty()) {
|
||||
RT64::API.app->presentQueue->inspector->setIniPath(RT64::API.app->userPaths.imguiPath);
|
||||
}
|
||||
|
||||
RT64::API.app->freeCamClearQueued = true;
|
||||
ImGui_ImplSDL2_InitForVulkan(nullptr); // TODO: move this elsewhere...
|
||||
//appWindow->blockSdlKeyboard();
|
||||
}
|
||||
else if (RT64::API.app->presentQueue->inspector != nullptr) {
|
||||
RT64::API.app->presentQueue->inspector.reset(nullptr);
|
||||
//appWindow->unblockSdlKeyboard();
|
||||
}
|
||||
}
|
||||
else {
|
||||
fprintf(stdout, "Inspector is not available: developer mode is not enabled in the configuration.\n");
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (RT64::API.app->presentQueue->inspector != nullptr) {
|
||||
ImGui_ImplSDL2_ProcessEvent(&event);
|
||||
}
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL MouseMove(int x, int y)
|
||||
{
|
||||
SDL_Event event;
|
||||
event.type = SDL_MOUSEMOTION;
|
||||
event.motion.which = 1;
|
||||
event.motion.x = x;
|
||||
event.motion.y = y;
|
||||
|
||||
if (RT64::API.app->presentQueue->inspector != nullptr) {
|
||||
//printf("MouseMove x = %i, y = %i\n", x,y);
|
||||
ImGui_ImplSDL2_ProcessEvent(&event);
|
||||
}
|
||||
}
|
||||
|
||||
DLLEXPORT void CALL MouseButton(int left, int right)
|
||||
{
|
||||
if (RT64::API.app->presentQueue->inspector != nullptr) {
|
||||
printf("MouseButton left = %i\n", left);
|
||||
SDL_Event event;
|
||||
|
||||
event.type = left ? SDL_MOUSEBUTTONDOWN : SDL_MOUSEBUTTONUP;
|
||||
event.button.button = SDL_BUTTON_LEFT;
|
||||
ImGui_ImplSDL2_ProcessEvent(&event);
|
||||
|
||||
event.type = right ? SDL_MOUSEBUTTONDOWN : SDL_MOUSEBUTTONUP;
|
||||
event.button.button = SDL_BUTTON_RIGHT;
|
||||
ImGui_ImplSDL2_ProcessEvent(&event);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,144 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_common.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
|
||||
namespace RT64 {
|
||||
FILE *GlobalLogFile = nullptr;
|
||||
std::string GlobalLastError = "";
|
||||
|
||||
// FixedRect
|
||||
|
||||
FixedRect::FixedRect() {
|
||||
reset();
|
||||
}
|
||||
|
||||
FixedRect::FixedRect(int32_t ulx, int32_t uly, int32_t lrx, int32_t lry) {
|
||||
this->ulx = ulx;
|
||||
this->uly = uly;
|
||||
this->lrx = lrx;
|
||||
this->lry = lry;
|
||||
}
|
||||
|
||||
void FixedRect::reset() {
|
||||
ulx = INT32_MAX;
|
||||
uly = INT32_MAX;
|
||||
lrx = INT32_MIN;
|
||||
lry = INT32_MIN;
|
||||
}
|
||||
|
||||
bool FixedRect::isEmpty() const {
|
||||
return isNull() || (lrx == ulx) || (lry == uly);
|
||||
}
|
||||
|
||||
bool FixedRect::isNull() const {
|
||||
return (ulx > lrx) || (uly > lry);
|
||||
}
|
||||
|
||||
void FixedRect::merge(const FixedRect &rect) {
|
||||
assert(!rect.isNull());
|
||||
|
||||
ulx = std::min(ulx, rect.ulx);
|
||||
uly = std::min(uly, rect.uly);
|
||||
lrx = std::max(lrx, rect.lrx);
|
||||
lry = std::max(lry, rect.lry);
|
||||
}
|
||||
|
||||
FixedRect FixedRect::scaled(float x, float y) const {
|
||||
assert(!isNull());
|
||||
assert(x >= 0.0f);
|
||||
assert(y >= 0.0f);
|
||||
|
||||
return FixedRect(
|
||||
int32_t(floorf(left(false) * x)) << 2,
|
||||
int32_t(floorf(top(false) * y)) << 2,
|
||||
int32_t(ceilf(right(true) * x)) << 2,
|
||||
int32_t(ceilf(bottom(true) * y)) << 2
|
||||
);
|
||||
}
|
||||
|
||||
FixedRect FixedRect::intersection(const FixedRect &rect) const {
|
||||
if (!isNull() && !rect.isNull()) {
|
||||
return {
|
||||
std::max(ulx, rect.ulx),
|
||||
std::max(uly, rect.uly),
|
||||
std::min(lrx, rect.lrx),
|
||||
std::min(lry, rect.lry)
|
||||
};
|
||||
}
|
||||
else {
|
||||
return FixedRect();
|
||||
}
|
||||
}
|
||||
|
||||
bool FixedRect::fullyInside(const FixedRect &rect) const {
|
||||
assert(!isNull());
|
||||
assert(!rect.isNull());
|
||||
return (rect.ulx >= ulx) && (rect.uly >= uly) && (rect.lrx <= lrx) && (rect.lry <= lry);
|
||||
}
|
||||
|
||||
int32_t FixedRect::left(bool ceil) const {
|
||||
assert(!isNull());
|
||||
return (ulx + (ceil ? 3 : 0)) >> 2;
|
||||
}
|
||||
|
||||
int32_t FixedRect::top(bool ceil) const {
|
||||
assert(!isNull());
|
||||
return (uly + (ceil ? 3 : 0)) >> 2;
|
||||
}
|
||||
|
||||
int32_t FixedRect::right(bool ceil) const {
|
||||
assert(!isNull());
|
||||
return (lrx + (ceil ? 3 : 0)) >> 2;
|
||||
}
|
||||
|
||||
int32_t FixedRect::bottom(bool ceil) const {
|
||||
assert(!isNull());
|
||||
return (lry + (ceil ? 3 : 0)) >> 2;
|
||||
}
|
||||
|
||||
int32_t FixedRect::width(bool leftCeil, bool rightCeil) const {
|
||||
assert(!isNull());
|
||||
return right(rightCeil) - left(leftCeil);
|
||||
}
|
||||
|
||||
int32_t FixedRect::height(bool topCeil, bool bottomCeil) const {
|
||||
assert(!isNull());
|
||||
return bottom(bottomCeil) - top(topCeil);
|
||||
}
|
||||
|
||||
// FixedMatrix
|
||||
|
||||
float FixedMatrix::toFloat(uint32_t i, uint32_t j) const {
|
||||
const int xorJ = j ^ 1;
|
||||
return FixedMatrix::fixedToFloat(integer[i][xorJ], frac[i][xorJ]);
|
||||
}
|
||||
|
||||
hlslpp::float4x4 FixedMatrix::toMatrix4x4() const {
|
||||
return hlslpp::float4x4(
|
||||
toFloat(0, 0), toFloat(0, 1), toFloat(0, 2), toFloat(0, 3),
|
||||
toFloat(1, 0), toFloat(1, 1), toFloat(1, 2), toFloat(1, 3),
|
||||
toFloat(2, 0), toFloat(2, 1), toFloat(2, 2), toFloat(2, 3),
|
||||
toFloat(3, 0), toFloat(3, 1), toFloat(3, 2), toFloat(3, 3)
|
||||
);
|
||||
}
|
||||
|
||||
float FixedMatrix::fixedToFloat(int16_t integerValue, uint16_t fracValue) {
|
||||
const uint32_t fullWord = (uint32_t(integerValue) << 16) | fracValue;
|
||||
return int32_t(fullWord) / 65536.0f;
|
||||
}
|
||||
|
||||
void FixedMatrix::modifyMatrix4x4Integer(hlslpp::float4x4 &matrix, uint32_t i, uint32_t j, int16_t value) {
|
||||
const int32_t fixedValue = int32_t(matrix[i][j] * 65536.0f);
|
||||
matrix[i][j] = fixedToFloat(value, uint16_t(fixedValue & 0xFFFFU));
|
||||
}
|
||||
|
||||
void FixedMatrix::modifyMatrix4x4Fraction(hlslpp::float4x4 &matrix, uint32_t i, uint32_t j, uint16_t value) {
|
||||
const int32_t fixedValue = int32_t(matrix[i][j] * 65536.0f);
|
||||
matrix[i][j] = fixedToFloat(int16_t((fixedValue >> 16) & 0xFFFF), value);
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,125 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "rt64_hlslpp.h"
|
||||
|
||||
#ifdef _WIN32
|
||||
# define DLLEXPORT extern "C" __declspec(dllexport)
|
||||
#else
|
||||
# define DLLEXPORT extern "C" __attribute__((visibility("default")))
|
||||
#endif
|
||||
|
||||
namespace RT64 {
|
||||
enum class UpscaleMode {
|
||||
Bilinear,
|
||||
FSR,
|
||||
DLSS,
|
||||
XeSS
|
||||
};
|
||||
|
||||
static const unsigned int DepthRayQueryMask = 0x1;
|
||||
static const unsigned int NoDepthRayQueryMask = 0x2;
|
||||
static const unsigned int ShadowCatcherRayQueryMask = 0x4;
|
||||
|
||||
// Error string for last error or exception that was caught.
|
||||
extern std::string GlobalLastError;
|
||||
|
||||
#ifdef NDEBUG
|
||||
# define RT64_LOG_OPEN(x)
|
||||
# define RT64_LOG_CLOSE()
|
||||
# define RT64_LOG_PRINTF(x, ...)
|
||||
#else
|
||||
extern FILE *GlobalLogFile;
|
||||
# ifdef _WIN32
|
||||
# define RT64_LOG_OPEN(x) do { RT64::GlobalLogFile = _wfopen(x, L"wt"); } while (0)
|
||||
# else
|
||||
# define RT64_LOG_OPEN(x) do { RT64::GlobalLogFile = fopen(x, "w"); } while (0)
|
||||
# endif
|
||||
# define RT64_LOG_CLOSE() do { fclose(RT64::GlobalLogFile); } while (0)
|
||||
# define RT64_LOG_PRINTF(x, ...) do { fprintf(RT64::GlobalLogFile, x, ## __VA_ARGS__); fprintf(RT64::GlobalLogFile, "\n"); fflush(RT64::GlobalLogFile); } while (0)
|
||||
# define RT64_LOG_PRINTF_DETAILED(x, ...) do { fprintf(RT64::GlobalLogFile, x, ## __VA_ARGS__); fprintf(RT64::GlobalLogFile, " (%s in %s:%d)\n", __FUNCTION__, __FILE__, __LINE__); fflush(RT64::GlobalLogFile); } while (0)
|
||||
#endif
|
||||
|
||||
inline void CalculateTextureRowWidthPadding(uint32_t rowPitch, uint32_t &rowWidth, uint32_t &rowPadding) {
|
||||
const int RowMultiple = 256;
|
||||
rowWidth = rowPitch;
|
||||
rowPadding = (rowWidth % RowMultiple) ? RowMultiple - (rowWidth % RowMultiple) : 0;
|
||||
rowWidth += rowPadding;
|
||||
}
|
||||
|
||||
inline float HaltonSequence(int i, int b) {
|
||||
float f = 1.0;
|
||||
float r = 0.0;
|
||||
while (i > 0) {
|
||||
f = f / float(b);
|
||||
r = r + f * float(i % b);
|
||||
i = i / b;
|
||||
}
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
inline hlslpp::float2 HaltonJitter(int frame, int phases) {
|
||||
return { HaltonSequence(frame % phases + 1, 2) - 0.5f, HaltonSequence(frame % phases + 1, 3) - 0.5f };
|
||||
}
|
||||
|
||||
struct RectI {
|
||||
int x, y, w, h;
|
||||
};
|
||||
|
||||
struct FixedRect {
|
||||
int32_t ulx;
|
||||
int32_t uly;
|
||||
int32_t lrx;
|
||||
int32_t lry;
|
||||
|
||||
FixedRect();
|
||||
FixedRect(int32_t ulx, int32_t uly, int32_t lrx, int32_t lry);
|
||||
void reset();
|
||||
bool isEmpty() const;
|
||||
bool isNull() const;
|
||||
void merge(const FixedRect &rect);
|
||||
FixedRect scaled(float x, float y) const;
|
||||
|
||||
// Intersections can result in invalid rects if they don't overlap. Check if they're not null after using this.
|
||||
FixedRect intersection(const FixedRect &rect) const;
|
||||
bool fullyInside(const FixedRect &rect) const;
|
||||
int32_t left(bool ceil) const;
|
||||
int32_t top(bool ceil) const;
|
||||
int32_t right(bool ceil) const;
|
||||
int32_t bottom(bool ceil) const;
|
||||
int32_t width(bool leftCeil, bool rightCeil) const;
|
||||
int32_t height(bool topCeil, bool bottomCeil) const;
|
||||
};
|
||||
|
||||
struct FixedMatrix {
|
||||
int16_t integer[4][4];
|
||||
uint16_t frac[4][4];
|
||||
|
||||
float toFloat(uint32_t i, uint32_t j) const;
|
||||
hlslpp::float4x4 toMatrix4x4() const;
|
||||
|
||||
static float fixedToFloat(int16_t integerValue, uint16_t fracValue);
|
||||
static void modifyMatrix4x4Integer(hlslpp::float4x4 &matrix, uint32_t i, uint32_t j, int16_t integerValue);
|
||||
static void modifyMatrix4x4Fraction(hlslpp::float4x4 &matrix, uint32_t i, uint32_t j, uint16_t fracValue);
|
||||
};
|
||||
|
||||
template<class T>
|
||||
void adjustVector(std::vector<T> &vector, size_t expectedSize) {
|
||||
if (vector.capacity() < expectedSize) {
|
||||
vector.reserve(expectedSize * 2);
|
||||
}
|
||||
|
||||
if (vector.size() < expectedSize) {
|
||||
vector.resize(expectedSize);
|
||||
}
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,62 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_dynamic_libraries.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <filesystem>
|
||||
|
||||
#if defined(_WIN32)
|
||||
# include <Windows.h>
|
||||
# include "utf8conv/utf8conv.h"
|
||||
#endif
|
||||
|
||||
namespace RT64 {
|
||||
typedef std::pair<std::string, bool> NameRequiredPair;
|
||||
|
||||
const auto DynamicLibraryList = {
|
||||
NameRequiredPair("dxil.dll", true),
|
||||
NameRequiredPair("dxcompiler.dll", true),
|
||||
# if DLSS_ENABLED
|
||||
NameRequiredPair("nvngx_dlss.dll", false),
|
||||
# endif
|
||||
};
|
||||
|
||||
void LocalFunction() { }
|
||||
|
||||
// DynamicLibraries
|
||||
|
||||
bool DynamicLibraries::load() {
|
||||
# if defined(_WIN32)
|
||||
HMODULE moduleHandle = nullptr;
|
||||
if (!GetModuleHandleExW(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, LPCWSTR(LocalFunction), &moduleHandle)) {
|
||||
fprintf(stderr, "GetModuleHandleExW failed with error code 0x%X\n", GetLastError());
|
||||
return false;
|
||||
}
|
||||
|
||||
WCHAR modulePath[FILENAME_MAX];
|
||||
DWORD modulePathSz = GetModuleFileNameW(moduleHandle, modulePath, sizeof(modulePath));
|
||||
if ((modulePathSz == 0) || (modulePathSz >= sizeof(modulePath))) {
|
||||
fprintf(stderr, "GetModuleFileNameW failed with error code 0x%X\n", GetLastError());
|
||||
return false;
|
||||
}
|
||||
|
||||
// Extract the directory from the module path.
|
||||
std::filesystem::path fullPath(modulePath);
|
||||
fullPath.remove_filename();
|
||||
|
||||
const std::wstring fullPathStr = fullPath.wstring();
|
||||
for (const NameRequiredPair &pair : DynamicLibraryList) {
|
||||
const std::wstring libraryPath = fullPathStr + win32::Utf8ToUtf16(pair.first);
|
||||
HMODULE libraryModule = LoadLibraryW(libraryPath.c_str());
|
||||
if (pair.second && (libraryModule == nullptr)) {
|
||||
fprintf(stderr, "LoadLibraryW with path %ls failed with error code 0x%X\n", libraryPath.c_str(), GetLastError());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
|
||||
return true;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,13 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "rt64_timer.h"
|
||||
|
||||
namespace RT64 {
|
||||
struct DynamicLibraries {
|
||||
static bool load();
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,29 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_elapsed_timer.h"
|
||||
|
||||
namespace RT64 {
|
||||
// ElapsedTimer
|
||||
|
||||
ElapsedTimer::ElapsedTimer() {
|
||||
reset();
|
||||
}
|
||||
|
||||
void ElapsedTimer::reset() {
|
||||
startTime = Timer::current();
|
||||
}
|
||||
|
||||
int64_t ElapsedTimer::elapsedMicroseconds() const {
|
||||
return Timer::deltaMicroseconds(startTime, Timer::current());
|
||||
}
|
||||
|
||||
double ElapsedTimer::elapsedMilliseconds() const {
|
||||
return static_cast<double>(elapsedMicroseconds()) / 1000.0;
|
||||
}
|
||||
|
||||
double ElapsedTimer::elapsedSeconds() const {
|
||||
return static_cast<double>(elapsedMicroseconds()) / 1000000.0;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "rt64_timer.h"
|
||||
|
||||
namespace RT64 {
|
||||
struct ElapsedTimer {
|
||||
Timestamp startTime;
|
||||
|
||||
ElapsedTimer();
|
||||
void reset();
|
||||
int64_t elapsedMicroseconds() const;
|
||||
double elapsedMilliseconds() const;
|
||||
double elapsedSeconds() const;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,15 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_emulator_configuration.h"
|
||||
|
||||
namespace RT64 {
|
||||
// EmulatorConfiguration
|
||||
|
||||
EmulatorConfiguration::EmulatorConfiguration() {
|
||||
dither.postBlendNoise = true;
|
||||
framebuffer.renderToRAM = true;
|
||||
framebuffer.copyWithGPU = true;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "rt64_common.h"
|
||||
|
||||
namespace RT64 {
|
||||
struct EmulatorConfiguration {
|
||||
struct Dither {
|
||||
bool postBlendNoise;
|
||||
};
|
||||
|
||||
struct Framebuffer {
|
||||
bool renderToRAM;
|
||||
bool copyWithGPU;
|
||||
};
|
||||
|
||||
Dither dither;
|
||||
Framebuffer framebuffer;
|
||||
|
||||
EmulatorConfiguration();
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_enhancement_configuration.h"
|
||||
|
||||
namespace RT64 {
|
||||
// EnhancementConfiguration
|
||||
|
||||
EnhancementConfiguration::EnhancementConfiguration() {
|
||||
framebuffer.reinterpretFixULS = true;
|
||||
presentation.mode = Presentation::Mode::SkipBuffering;
|
||||
rect.fixRectLR = true;
|
||||
f3dex.forceBranch = false;
|
||||
s2dex.fixBilerpMismatch = true;
|
||||
s2dex.framebufferFastPath = true;
|
||||
textureLOD.scale = false;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,51 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "rt64_common.h"
|
||||
|
||||
namespace RT64 {
|
||||
struct EnhancementConfiguration {
|
||||
struct Framebuffer {
|
||||
bool reinterpretFixULS;
|
||||
};
|
||||
|
||||
struct Presentation {
|
||||
enum class Mode {
|
||||
Console,
|
||||
SkipBuffering,
|
||||
PresentEarly
|
||||
};
|
||||
|
||||
Mode mode;
|
||||
};
|
||||
|
||||
struct Rect {
|
||||
bool fixRectLR;
|
||||
};
|
||||
|
||||
struct F3DEX {
|
||||
bool forceBranch;
|
||||
};
|
||||
|
||||
struct S2DEX {
|
||||
bool fixBilerpMismatch;
|
||||
bool framebufferFastPath;
|
||||
};
|
||||
|
||||
struct TextureLOD {
|
||||
bool scale;
|
||||
};
|
||||
|
||||
Framebuffer framebuffer;
|
||||
Presentation presentation;
|
||||
Rect rect;
|
||||
F3DEX f3dex;
|
||||
S2DEX s2dex;
|
||||
TextureLOD textureLOD;
|
||||
|
||||
EnhancementConfiguration();
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,7 @@
|
||||
// Disable SIMD on GCC due to UB when compiling with optimizations.
|
||||
|
||||
#if defined(__GNUC__) && !defined(__clang__) && !defined(__INTEL_COMPILER)
|
||||
#define HLSLPP_SCALAR
|
||||
#endif
|
||||
|
||||
#include "hlsl++.h"
|
||||
@@ -0,0 +1,491 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_math.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
#include <memory>
|
||||
|
||||
namespace RT64 {
|
||||
float sqr(float x) {
|
||||
return x * x;
|
||||
}
|
||||
|
||||
bool matrixIsNaN(const hlslpp::float4x4 &m) {
|
||||
for (uint32_t i = 0; i < 4; i++) {
|
||||
if (hlslpp::any(hlslpp::isnan(m[i]))) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
hlslpp::float4x4 matrixScale(float scale) {
|
||||
hlslpp::float4x4 scaleMatrix(0.0f);
|
||||
scaleMatrix[0][0] = scale;
|
||||
scaleMatrix[1][1] = scale;
|
||||
scaleMatrix[2][2] = scale;
|
||||
scaleMatrix[3][3] = 1.0f;
|
||||
return scaleMatrix;
|
||||
}
|
||||
|
||||
hlslpp::float4x4 matrixScale(const hlslpp::float3& scale) {
|
||||
hlslpp::float4x4 scaleMatrix(0.0f);
|
||||
scaleMatrix[0][0] = scale.x;
|
||||
scaleMatrix[1][1] = scale.y;
|
||||
scaleMatrix[2][2] = scale.z;
|
||||
scaleMatrix[3][3] = 1.0f;
|
||||
return scaleMatrix;
|
||||
}
|
||||
|
||||
void matrixDecomposeViewProj(const hlslpp::float4x4 &vp, hlslpp::float4x4 &v, hlslpp::float4x4 &p) {
|
||||
v = hlslpp::float4x4::identity();
|
||||
p = hlslpp::float4x4::identity();
|
||||
|
||||
p[2][3] = -1.0f;
|
||||
p[3][3] = 0.0f;
|
||||
v[0][2] = -vp[0][3];
|
||||
v[1][2] = -vp[1][3];
|
||||
v[2][2] = -vp[2][3];
|
||||
v[3][2] = -vp[3][3];
|
||||
|
||||
p[2][2] = vp[0][2] / v[0][2];
|
||||
p[3][2] = vp[3][2] - p[2][2] * v[3][2];
|
||||
|
||||
p[0][0] = sqrtf(sqr(vp[0][0]) + sqr(vp[1][0]) + sqr(vp[2][0]));
|
||||
p[1][1] = sqrtf(sqr(vp[0][1]) + sqr(vp[1][1]) + sqr(vp[2][1]));
|
||||
|
||||
v[0][0] = vp[0][0] / p[0][0];
|
||||
v[1][0] = vp[1][0] / p[0][0];
|
||||
v[2][0] = vp[2][0] / p[0][0];
|
||||
v[3][0] = vp[3][0] / p[0][0];
|
||||
|
||||
v[0][1] = vp[0][1] / p[1][1];
|
||||
v[1][1] = vp[1][1] / p[1][1];
|
||||
v[2][1] = vp[2][1] / p[1][1];
|
||||
v[3][1] = vp[3][1] / p[1][1];
|
||||
|
||||
if (matrixIsNaN(v) || matrixIsNaN(p)) {
|
||||
v = hlslpp::float4x4::identity();
|
||||
p = vp;
|
||||
}
|
||||
}
|
||||
|
||||
hlslpp::float4x4 matrixTranslation(const hlslpp::float3 &t) {
|
||||
hlslpp::float4x4 m = hlslpp::float4x4::identity();
|
||||
m[3].xyz = t;
|
||||
return m;
|
||||
}
|
||||
|
||||
hlslpp::float3x3 matrixRotationX(float rad) {
|
||||
hlslpp::float3x3 m = hlslpp::float3x3::identity();
|
||||
const float rollCos = cos(rad);
|
||||
const float rollSin = sin(rad);
|
||||
m[0][0] = rollCos;
|
||||
m[0][1] = -rollSin;
|
||||
m[1][0] = rollSin;
|
||||
m[1][1] = rollCos;
|
||||
return m;
|
||||
}
|
||||
|
||||
hlslpp::float3x3 matrixRotationY(float rad) {
|
||||
hlslpp::float3x3 m = hlslpp::float3x3::identity();
|
||||
const float pitchCos = cos(rad);
|
||||
const float pitchSin = sin(rad);
|
||||
m[0][0] = pitchCos;
|
||||
m[0][2] = pitchSin;
|
||||
m[2][0] = -pitchSin;
|
||||
m[2][2] = pitchCos;
|
||||
return m;
|
||||
}
|
||||
|
||||
hlslpp::float3x3 matrixRotationZ(float rad) {
|
||||
hlslpp::float3x3 m = hlslpp::float3x3::identity();
|
||||
const float yawCos = cos(rad);
|
||||
const float yawSin = sin(rad);
|
||||
m[1][1] = yawCos;
|
||||
m[1][2] = -yawSin;
|
||||
m[2][1] = yawSin;
|
||||
m[2][2] = yawCos;
|
||||
return m;
|
||||
}
|
||||
|
||||
hlslpp::float3x3 extract3x3(const hlslpp::float4x4 &m) {
|
||||
return hlslpp::float3x3(
|
||||
m[0][0], m[0][1], m[0][2],
|
||||
m[1][0], m[1][1], m[1][2],
|
||||
m[2][0], m[2][1], m[2][2]
|
||||
);
|
||||
}
|
||||
|
||||
hlslpp::float3x3 rotationFrom3x3(const hlslpp::float3x3 &m) {
|
||||
return hlslpp::float3x3(hlslpp::normalize(m[0]), hlslpp::normalize(m[1]), hlslpp::normalize(m[2]));
|
||||
}
|
||||
|
||||
float traceFrom3x3(const hlslpp::float3x3 &m) {
|
||||
return m[0][0] + m[1][1] + m[2][2];
|
||||
}
|
||||
|
||||
float matrixDifference(const hlslpp::float4x4 &a, const hlslpp::float4x4 &b) {
|
||||
float difference = 0.0f;
|
||||
for (int i = 0; i < 4; i++) {
|
||||
difference += hlslpp::dot(hlslpp::abs(a[i] - b[i]), 1.0f);
|
||||
}
|
||||
|
||||
return difference;
|
||||
}
|
||||
|
||||
bool isMatrixAffine(const hlslpp::float4x4 &m) {
|
||||
return (m[0][3] == 0.0f) && (m[1][3] == 0.0f) && (m[2][3] == 0.0f) && (m[3][3] == 1.0f);
|
||||
}
|
||||
|
||||
bool isMatrixIdentity(const hlslpp::float4x4 &m) {
|
||||
return hlslpp::all(m == hlslpp::float4x4::identity());
|
||||
}
|
||||
|
||||
bool isMatrixViewProj(const hlslpp::float4x4 &m) {
|
||||
return (abs(m[3][3]) >= 1e-6f) && (abs(1.0f - m[3][3]) >= 1e-6f);
|
||||
}
|
||||
|
||||
hlslpp::float4x4 lerpMatrix(const hlslpp::float4x4 &a, const hlslpp::float4x4 &b, float t) {
|
||||
// Copy b into the result.
|
||||
hlslpp::float4x4 c = b;
|
||||
|
||||
// Replace with a component-wise linear interpolation between a and b.
|
||||
for (int i = 0; i < 4; i++) {
|
||||
c[i] = hlslpp::lerp(a[i], b[i], t);
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
hlslpp::float4x4 lerpMatrix3x3(const hlslpp::float4x4 &a, const hlslpp::float4x4 &b, float t) {
|
||||
// Copy b into the result.
|
||||
hlslpp::float4x4 c = b;
|
||||
|
||||
// Replace the result's top left 3x3 with a component-wise linear interpolation between a and b.
|
||||
for (int i = 0; i < 3; i++) {
|
||||
c[i].xyz = hlslpp::lerp(a[i].xyz, b[i].xyz, t);
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
hlslpp::float4x4 lerpMatrixComponents(const hlslpp::float4x4 &a, const hlslpp::float4x4 &b, bool linear, bool angular, bool perspective, float t) {
|
||||
hlslpp::float4x4 ret;
|
||||
// Start by either component-wise lerping the top left 3x3 if rotation is enabled or directly copying it otherwise.
|
||||
// This leaves the last row and last column as a copy of b's in either case.
|
||||
if (angular) {
|
||||
ret = lerpMatrix3x3(a, b, t);
|
||||
}
|
||||
else {
|
||||
ret = b;
|
||||
}
|
||||
// Next, lerp the translation component of the last row if enabled, otherwise leave it intact from the initial copy step.
|
||||
if (linear) {
|
||||
ret[3].xyz = lerp(a[3].xyz, b[3].xyz, t);
|
||||
}
|
||||
// Finally, do the same for the last column if perspective is enabled.
|
||||
if (perspective) {
|
||||
ret[0].w = lerp(a[0].w, b[0].w, t);
|
||||
ret[1].w = lerp(a[1].w, b[1].w, t);
|
||||
ret[2].w = lerp(a[2].w, b[2].w, t);
|
||||
ret[3].w = lerp(a[3].w, b[3].w, t);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
float nearPlaneFromProj(const hlslpp::float4x4 &m) {
|
||||
return std::max((m[3][3] + m[3][2]) / (m[2][2] + m[2][3]), 1e-5f);
|
||||
}
|
||||
|
||||
float farPlaneFromProj(const hlslpp::float4x4 &m) {
|
||||
return std::max((m[3][2] - m[3][3]) / (m[2][2] - m[2][3]), 1e-4f);
|
||||
}
|
||||
|
||||
float fovFromProj(const hlslpp::float4x4 &m) {
|
||||
return std::max(2.0f * atanf(-m[2][3] / m[1][1]), 1e-2f);
|
||||
}
|
||||
|
||||
float pseudoRandom(uint32_t &s) {
|
||||
s = 1664525u * s + 1013904223u;
|
||||
return float(s & 0x00FFFFFF) / float(0x01000000);
|
||||
}
|
||||
|
||||
inline hlslpp::float2 barycentricCoordinates(const hlslpp::float2 p, const hlslpp::float2 a, const hlslpp::float2 b, const hlslpp::float2 c) {
|
||||
float area = -b.y * c.x + a.y * (c.x - b.x) + a.x * (b.y - c.y) + b.x * c.y;
|
||||
float s = (a.y * c.x - a.x * c.y + (c.y - a.y) * p.x + (a.x - c.x) * p.y) / area;
|
||||
float t = (a.x * b.y - a.y * b.x + (a.y - b.y) * p.x + (b.x - a.x) * p.y) / area;
|
||||
return { s, t };
|
||||
}
|
||||
|
||||
bool epsilonEqual(float a, float b) {
|
||||
return abs(a - b) < std::numeric_limits<float>::epsilon();
|
||||
}
|
||||
|
||||
// Adapted from https://github.com/g-truc/glm/blob/master/glm/gtx/matrix_decompose.inl
|
||||
/// Make a linear combination of two vectors and return the result.
|
||||
// result = (a * ascl) + (b * bscl)
|
||||
hlslpp::float3 vecCombine(
|
||||
const hlslpp::float3& a,
|
||||
const hlslpp::float3& b,
|
||||
float ascl, float bscl)
|
||||
{
|
||||
return (a * ascl) + (b * bscl);
|
||||
}
|
||||
|
||||
hlslpp::float3 vecScale(const hlslpp::float3& v, float desiredLength)
|
||||
{
|
||||
return v * desiredLength / length(v);
|
||||
}
|
||||
|
||||
bool decomposeMatrix(const hlslpp::float4x4& mtx, hlslpp::quaternion& rotation, hlslpp::float3& scale, hlslpp::float3& skew,
|
||||
hlslpp::float3& translation, hlslpp::float4& perspective)
|
||||
{
|
||||
hlslpp::float4x4 LocalMatrix(mtx);
|
||||
|
||||
// Normalize the matrix.
|
||||
if(epsilonEqual(LocalMatrix[3][3], 0.0f)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for(size_t i = 0; i < 4; i++) {
|
||||
for(size_t j = 0; j < 4; j++) {
|
||||
LocalMatrix[i][j] /= LocalMatrix[3][3];
|
||||
}
|
||||
}
|
||||
|
||||
// perspectiveMatrix is used to solve for perspective, but it also provides
|
||||
// an easy way to test for singularity of the upper 3x3 component.
|
||||
hlslpp::float4x4 PerspectiveMatrix(LocalMatrix);
|
||||
|
||||
for(size_t i = 0; i < 3; i++) {
|
||||
PerspectiveMatrix[i][3] = 0.0f;
|
||||
}
|
||||
PerspectiveMatrix[3][3] = 1.0f;
|
||||
|
||||
/// TODO: Fixme!
|
||||
if(epsilonEqual(determinant(PerspectiveMatrix), 0.0f)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// First, isolate perspective. This is the messiest.
|
||||
if(
|
||||
!epsilonEqual(LocalMatrix[0][3], 0.0f) ||
|
||||
!epsilonEqual(LocalMatrix[1][3], 0.0f) ||
|
||||
!epsilonEqual(LocalMatrix[2][3], 0.0f))
|
||||
{
|
||||
// rightHandSide is the right hand side of the equation.
|
||||
hlslpp::float4 RightHandSide;
|
||||
RightHandSide[0] = LocalMatrix[0][3];
|
||||
RightHandSide[1] = LocalMatrix[1][3];
|
||||
RightHandSide[2] = LocalMatrix[2][3];
|
||||
RightHandSide[3] = LocalMatrix[3][3];
|
||||
|
||||
// Solve the equation by inverting PerspectiveMatrix and multiplying
|
||||
// rightHandSide by the inverse. (This is the easiest way, not
|
||||
// necessarily the best.)
|
||||
hlslpp::float4x4 InversePerspectiveMatrix = inverse(PerspectiveMatrix);
|
||||
hlslpp::float4x4 TransposedInversePerspectiveMatrix = transpose(InversePerspectiveMatrix);
|
||||
|
||||
perspective = hlslpp::mul(TransposedInversePerspectiveMatrix, RightHandSide);
|
||||
|
||||
// Clear the perspective partition
|
||||
LocalMatrix[0][3] = LocalMatrix[1][3] = LocalMatrix[2][3] = 0.0f;
|
||||
LocalMatrix[3][3] = 1.0f;
|
||||
}
|
||||
else
|
||||
{
|
||||
// No perspective.
|
||||
perspective = hlslpp::float4{0, 0, 0, 1.0f};
|
||||
}
|
||||
|
||||
// Next take care of translation (easy).
|
||||
translation = hlslpp::float3(LocalMatrix[3].xyz);
|
||||
LocalMatrix[3] = hlslpp::float4(0, 0, 0, LocalMatrix[3].w);
|
||||
|
||||
hlslpp::float3 Row[3], Pdum3;
|
||||
|
||||
// Now get scale and shear.
|
||||
for(size_t i = 0; i < 3; ++i) {
|
||||
for(size_t j = 0; j < 3; ++j) {
|
||||
Row[i][j] = LocalMatrix[i][j];
|
||||
}
|
||||
}
|
||||
|
||||
// Compute X scale factor and normalize first row.
|
||||
scale.x = length(Row[0]);// v3Length(Row[0]);
|
||||
|
||||
Row[0] = vecScale(Row[0], 1.0f);
|
||||
|
||||
// Compute XY shear factor and make 2nd row orthogonal to 1st.
|
||||
skew.z = dot(Row[0], Row[1]);
|
||||
Row[1] = vecCombine(Row[1], Row[0], 1.0f, -skew.z);
|
||||
|
||||
// Now, compute Y scale and normalize 2nd row.
|
||||
scale.y = length(Row[1]);
|
||||
Row[1] = vecScale(Row[1], 1.0f);
|
||||
skew.z /= scale.y;
|
||||
|
||||
// Compute XZ and YZ shears, orthogonalize 3rd row.
|
||||
skew.y = dot(Row[0], Row[2]);
|
||||
Row[2] = vecCombine(Row[2], Row[0], 1.0f, -skew.y);
|
||||
skew.x = dot(Row[1], Row[2]);
|
||||
Row[2] = vecCombine(Row[2], Row[1], 1.0f, -skew.x);
|
||||
|
||||
// Next, get Z scale and normalize 3rd row.
|
||||
scale.z = length(Row[2]);
|
||||
Row[2] = vecScale(Row[2], 1.0f);
|
||||
skew.y /= scale.z;
|
||||
skew.x /= scale.z;
|
||||
|
||||
// At this point, the matrix (in rows[]) is orthonormal.
|
||||
// Check for a coordinate system flip. If the determinant
|
||||
// is -1, then negate the matrix and the scaling factors.
|
||||
Pdum3 = cross(Row[1], Row[2]);
|
||||
if(dot(Row[0], Pdum3).x < 0.0f) {
|
||||
for(size_t i = 0; i < 3; i++) {
|
||||
scale[i] *= -1.0f;
|
||||
Row[i] *= -1.0f;
|
||||
}
|
||||
}
|
||||
|
||||
// Now, get the rotations out, as described in the gem.
|
||||
int i, j, k = 0;
|
||||
float root, trace = Row[0].x + Row[1].y + Row[2].z;
|
||||
if(trace > 0.0f)
|
||||
{
|
||||
root = sqrt(trace + 1.0f);
|
||||
rotation.w = 0.5f * root;
|
||||
root = 0.5f / root;
|
||||
rotation.x = root * (Row[1].z - Row[2].y);
|
||||
rotation.y = root * (Row[2].x - Row[0].z);
|
||||
rotation.z = root * (Row[0].y - Row[1].x);
|
||||
} // End if > 0
|
||||
else
|
||||
{
|
||||
static int Next[3] = {1, 2, 0};
|
||||
i = 0;
|
||||
if(Row[1].y > Row[0].x) i = 1;
|
||||
if(Row[2].z > Row[i][i]) i = 2;
|
||||
j = Next[i];
|
||||
k = Next[j];
|
||||
|
||||
root = sqrt(Row[i][i] - Row[j][j] - Row[k][k] + 1.0f);
|
||||
|
||||
rotation.f32[i] = 0.5f * root;
|
||||
root = 0.5f / root;
|
||||
rotation.f32[j] = root * (Row[i][j] + Row[j][i]);
|
||||
rotation.f32[k] = root * (Row[i][k] + Row[k][i]);
|
||||
rotation.w = root * (Row[j][k] - Row[k][j]);
|
||||
} // End if <= 0
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
hlslpp::float4x4 recomposeMatrix(const hlslpp::quaternion& rotation, const hlslpp::float3& scale, const hlslpp::float3& skew,
|
||||
const hlslpp::float3& translation, const hlslpp::float4& perspective)
|
||||
{
|
||||
hlslpp::float4x4 m = hlslpp::float4x4::identity();
|
||||
|
||||
m[0][3] = perspective.x;
|
||||
m[1][3] = perspective.y;
|
||||
m[2][3] = perspective.z;
|
||||
m[3][3] = perspective.w;
|
||||
|
||||
m = mul(matrixTranslation(translation.xyz), m);
|
||||
m = mul(hlslpp::float4x4(rotation), m);
|
||||
|
||||
if (fabs(skew.x) > 0.0f) {
|
||||
hlslpp::float4x4 tmp = hlslpp::float4x4::identity();
|
||||
tmp[2][1] = skew.x;
|
||||
m = mul(tmp, m);
|
||||
}
|
||||
|
||||
if (fabs(skew.y) > 0.0f) {
|
||||
hlslpp::float4x4 tmp = hlslpp::float4x4::identity();
|
||||
tmp[2][0] = skew.y;
|
||||
m = mul(tmp, m);
|
||||
}
|
||||
|
||||
if (fabs(skew.z) > 0.0f) {
|
||||
hlslpp::float4x4 tmp = hlslpp::float4x4::identity();
|
||||
tmp[1][0] = skew.z;
|
||||
m = mul(tmp, m);
|
||||
}
|
||||
|
||||
m = mul(matrixScale(scale), m);
|
||||
|
||||
return m;
|
||||
}
|
||||
|
||||
DecomposedTransform::DecomposedTransform(const hlslpp::float4x4& mtx) {
|
||||
valid = decomposeMatrix(mtx, rotation, scale, skew, translation, perspective);
|
||||
}
|
||||
|
||||
DecomposedTransform lerpTransforms(const DecomposedTransform& a, const DecomposedTransform& b, float weight,
|
||||
bool lerpTranslation, bool lerpRotation, bool lerpScale, bool lerpSkew, bool lerpPerpsective, bool useSlerp)
|
||||
{
|
||||
assert(a.valid && b.valid);
|
||||
DecomposedTransform ret;
|
||||
|
||||
// Lerp the individual fields based on the provided flags.
|
||||
if (lerpTranslation) {
|
||||
ret.translation = lerp(a.translation, b.translation, weight);
|
||||
}
|
||||
else {
|
||||
ret.translation = b.translation;
|
||||
}
|
||||
|
||||
if (lerpRotation) {
|
||||
if (float(dot(a.rotation, b.rotation)) > 0.0f) {
|
||||
if (useSlerp) {
|
||||
ret.rotation = slerp(a.rotation, b.rotation, 1.0f - weight);
|
||||
}
|
||||
else {
|
||||
ret.rotation = lerp(a.rotation, b.rotation, weight);
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (useSlerp) {
|
||||
ret.rotation = slerp(a.rotation, -b.rotation, 1.0f - weight);
|
||||
}
|
||||
else {
|
||||
ret.rotation = lerp(a.rotation, -b.rotation, weight);
|
||||
}
|
||||
}
|
||||
ret.rotation = normalize(ret.rotation);
|
||||
}
|
||||
else {
|
||||
ret.rotation = b.rotation;
|
||||
}
|
||||
|
||||
if (lerpScale) {
|
||||
ret.scale = lerp(a.scale, b.scale, weight);
|
||||
}
|
||||
else {
|
||||
ret.scale = b.scale;
|
||||
}
|
||||
|
||||
if (lerpSkew) {
|
||||
ret.skew = lerp(a.skew, b.skew, weight);
|
||||
}
|
||||
else {
|
||||
ret.skew = b.skew;
|
||||
}
|
||||
|
||||
if (lerpPerpsective) {
|
||||
ret.perspective = lerp(a.perspective, b.perspective, weight);
|
||||
}
|
||||
else {
|
||||
ret.perspective = b.perspective;
|
||||
}
|
||||
|
||||
// Mark the resultant transform as valid and return it.
|
||||
ret.valid = true;
|
||||
return ret;
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,57 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "rt64_common.h"
|
||||
|
||||
namespace RT64 {
|
||||
inline constexpr uint32_t swappedOffset(uint32_t i) {
|
||||
return i ^ 3;
|
||||
}
|
||||
|
||||
float sqr(float x);
|
||||
bool matrixIsNaN(const hlslpp::float4x4 &m);
|
||||
hlslpp::float4x4 matrixScale(float scale);
|
||||
hlslpp::float4x4 matrixScale(const hlslpp::float3& scale);
|
||||
void matrixDecomposeViewProj(const hlslpp::float4x4 &vp, hlslpp::float4x4 &v, hlslpp::float4x4 &p);
|
||||
hlslpp::float4x4 matrixTranslation(const hlslpp::float3 &t);
|
||||
hlslpp::float3x3 matrixRotationX(float rad);
|
||||
hlslpp::float3x3 matrixRotationY(float rad);
|
||||
hlslpp::float3x3 matrixRotationZ(float rad);
|
||||
hlslpp::float3x3 extract3x3(const hlslpp::float4x4 &m);
|
||||
hlslpp::float3x3 rotationFrom3x3(const hlslpp::float3x3 &m);
|
||||
float traceFrom3x3(const hlslpp::float3x3 &m);
|
||||
float matrixDifference(const hlslpp::float4x4 &a, const hlslpp::float4x4 &b);
|
||||
bool isMatrixAffine(const hlslpp::float4x4 &m);
|
||||
bool isMatrixIdentity(const hlslpp::float4x4 &m);
|
||||
bool isMatrixViewProj(const hlslpp::float4x4 &m);
|
||||
hlslpp::float4x4 lerpMatrix(const hlslpp::float4x4 &a, const hlslpp::float4x4 &b, float t);
|
||||
hlslpp::float4x4 lerpMatrix3x3(const hlslpp::float4x4 &a, const hlslpp::float4x4 &b, float t);
|
||||
hlslpp::float4x4 lerpMatrixComponents(const hlslpp::float4x4 &a, const hlslpp::float4x4 &b, bool linear, bool angular, bool perspective, float t);
|
||||
float nearPlaneFromProj(const hlslpp::float4x4 &m);
|
||||
float farPlaneFromProj(const hlslpp::float4x4 &m);
|
||||
float fovFromProj(const hlslpp::float4x4 &m);
|
||||
float pseudoRandom(uint32_t &s);
|
||||
hlslpp::float2 barycentricCoordinates(const hlslpp::float2 p, const hlslpp::float2 a, const hlslpp::float2 b, const hlslpp::float2 c);
|
||||
bool decomposeMatrix(const hlslpp::float4x4& mtx, hlslpp::quaternion& rotation, hlslpp::float3& scale, hlslpp::float3& skew,
|
||||
hlslpp::float3& translation, hlslpp::float4& perspective);
|
||||
hlslpp::float4x4 recomposeMatrix(const hlslpp::quaternion& rotation, const hlslpp::float3& scale, const hlslpp::float3& skew,
|
||||
const hlslpp::float3& translation, const hlslpp::float4& perspective);
|
||||
|
||||
struct DecomposedTransform {
|
||||
hlslpp::quaternion rotation;
|
||||
hlslpp::float3 scale;
|
||||
hlslpp::float3 skew;
|
||||
hlslpp::float3 translation;
|
||||
hlslpp::float4 perspective;
|
||||
bool valid = false;
|
||||
|
||||
DecomposedTransform() = default;
|
||||
DecomposedTransform(const hlslpp::float4x4& mtx);
|
||||
};
|
||||
|
||||
DecomposedTransform lerpTransforms(const DecomposedTransform& a, const DecomposedTransform& b, float weight,
|
||||
bool lerpTranslation, bool lerpRotation, bool lerpScale, bool lerpSkew, bool lerpPerpsective, bool useSlerp);
|
||||
};
|
||||
@@ -0,0 +1,82 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_profiling_timer.h"
|
||||
|
||||
#include <numeric>
|
||||
|
||||
namespace RT64 {
|
||||
// ProfilingTimer
|
||||
|
||||
ProfilingTimer::ProfilingTimer() {
|
||||
historyIndex = 0;
|
||||
accumulation = 0.0;
|
||||
startedTimestamp = {};
|
||||
}
|
||||
|
||||
ProfilingTimer::ProfilingTimer(size_t historySize) : ProfilingTimer() {
|
||||
setCount(historySize);
|
||||
}
|
||||
|
||||
void ProfilingTimer::setCount(size_t historyCount) {
|
||||
history.clear();
|
||||
history.resize(historyCount, 0);
|
||||
}
|
||||
|
||||
void ProfilingTimer::clear() {
|
||||
setCount(history.size());
|
||||
historyIndex = 0;
|
||||
accumulation = 0.0;
|
||||
}
|
||||
|
||||
void ProfilingTimer::reset() {
|
||||
accumulation = 0.0;
|
||||
}
|
||||
|
||||
void ProfilingTimer::start() {
|
||||
assert(startedTimestamp == Timestamp{});
|
||||
startedTimestamp = Timer::current();
|
||||
}
|
||||
|
||||
void ProfilingTimer::end() {
|
||||
assert(startedTimestamp > Timestamp{});
|
||||
accumulation += Timer::deltaMicroseconds(startedTimestamp, Timer::current()) / 1000.0;
|
||||
startedTimestamp = {};
|
||||
}
|
||||
|
||||
void ProfilingTimer::log() {
|
||||
assert(!history.empty());
|
||||
history[historyIndex] = accumulation;
|
||||
historyIndex = (historyIndex + 1) % history.size();
|
||||
}
|
||||
|
||||
void ProfilingTimer::logAndRestart() {
|
||||
if (startedTimestamp == Timestamp{}) {
|
||||
reset();
|
||||
start();
|
||||
}
|
||||
|
||||
end();
|
||||
log();
|
||||
reset();
|
||||
start();
|
||||
}
|
||||
|
||||
uint32_t ProfilingTimer::index() const {
|
||||
return historyIndex;
|
||||
}
|
||||
|
||||
size_t ProfilingTimer::size() const {
|
||||
return history.size();
|
||||
}
|
||||
|
||||
const double *ProfilingTimer::data() const {
|
||||
return history.data();
|
||||
}
|
||||
|
||||
double ProfilingTimer::average() const {
|
||||
assert(!history.empty());
|
||||
return std::accumulate(history.begin(), history.end(), 0.0) / history.size();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,34 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "rt64_elapsed_timer.h"
|
||||
|
||||
namespace RT64 {
|
||||
struct ProfilingTimer {
|
||||
std::vector<double> history;
|
||||
uint32_t historyIndex;
|
||||
double accumulation;
|
||||
Timestamp startedTimestamp;
|
||||
|
||||
ProfilingTimer();
|
||||
ProfilingTimer(size_t historyCount);
|
||||
void setCount(size_t historyCount);
|
||||
void clear();
|
||||
void reset();
|
||||
void start();
|
||||
void end();
|
||||
void log();
|
||||
|
||||
// Convenience function for logging the time between each call to it.
|
||||
void logAndRestart();
|
||||
uint32_t index() const;
|
||||
size_t size() const;
|
||||
const double *data() const;
|
||||
double average() const;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,23 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#if defined(_WIN32)
|
||||
|
||||
namespace RT64 {
|
||||
struct Sommelier {
|
||||
static bool detectWine() {
|
||||
HMODULE dllHandle = GetModuleHandle("ntdll.dll");
|
||||
if (dllHandle != NULL) {
|
||||
return GetProcAddress(dllHandle, "wine_get_version") != NULL;
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,78 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_thread.h"
|
||||
|
||||
#include <cassert>
|
||||
#include <thread>
|
||||
|
||||
#if defined(_WIN64)
|
||||
# include <Windows.h>
|
||||
# include "utf8conv/utf8conv.h"
|
||||
#elif defined(__linux__)
|
||||
# include <pthread.h>
|
||||
#endif
|
||||
|
||||
namespace RT64 {
|
||||
# if defined(_WIN32)
|
||||
static int toWindowsPriority(Thread::Priority priority) {
|
||||
switch (priority) {
|
||||
case Thread::Priority::Idle:
|
||||
return THREAD_PRIORITY_IDLE;
|
||||
case Thread::Priority::Lowest:
|
||||
return THREAD_PRIORITY_LOWEST;
|
||||
case Thread::Priority::Low:
|
||||
return THREAD_PRIORITY_BELOW_NORMAL;
|
||||
case Thread::Priority::Normal:
|
||||
return THREAD_PRIORITY_NORMAL;
|
||||
case Thread::Priority::High:
|
||||
return THREAD_PRIORITY_ABOVE_NORMAL;
|
||||
case Thread::Priority::Highest:
|
||||
return THREAD_PRIORITY_HIGHEST;
|
||||
default:
|
||||
assert(false && "Unknown thread priority.");
|
||||
return THREAD_PRIORITY_NORMAL;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
|
||||
// Thread
|
||||
|
||||
void Thread::setCurrentThreadName(const std::string &str) {
|
||||
# if defined(_WIN32)
|
||||
std::wstring nameWide = win32::Utf8ToUtf16(str);
|
||||
SetThreadDescription(GetCurrentThread(), nameWide.c_str());
|
||||
# elif defined(__linux__)
|
||||
pthread_setname_np(pthread_self(), str.c_str());
|
||||
# elif defined(__APPLE__)
|
||||
pthread_setname_np(str.c_str());
|
||||
# else
|
||||
static_assert(false, "Unimplemented");
|
||||
# endif
|
||||
}
|
||||
|
||||
void Thread::setCurrentThreadPriority(Priority priority) {
|
||||
# if defined(_WIN32)
|
||||
SetThreadPriority(GetCurrentThread(), toWindowsPriority(priority));
|
||||
# elif defined(__linux__) || defined(__APPLE__)
|
||||
// On Linux, thread priorities can't be changed under the default scheduler policy (SCHED_OTHER) and the other policies
|
||||
// that are available without root privileges are lower priority. Instead you can set the thread's "nice" value, which ranges
|
||||
// from -20 to 19 (lower being higher priority). However, by strict POSIX spec "nice" is meant to be per-process instead of
|
||||
// per-thread. Therefore to avoid issues in case Linux is modified to match the spec in the future, this function does nothing.
|
||||
(void)priority;
|
||||
# else
|
||||
static_assert(false, "Unimplemented");
|
||||
# endif
|
||||
}
|
||||
|
||||
void Thread::sleepMilliseconds(uint32_t millis) {
|
||||
# if defined(_WIN32)
|
||||
// The implementations of std::chrono::sleep_until and sleep_for were affected by changing the system clock backwards in older versions
|
||||
// of Microsoft's STL. This was fixed as of Visual Studio 2022 17.9, but to be safe RT64 uses Win32 Sleep directly.
|
||||
Sleep(millis);
|
||||
# else
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(millis));
|
||||
# endif
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,25 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cstdint>
|
||||
#include <string>
|
||||
|
||||
namespace RT64 {
|
||||
struct Thread {
|
||||
enum class Priority {
|
||||
Idle,
|
||||
Lowest,
|
||||
Low,
|
||||
Normal,
|
||||
High,
|
||||
Highest
|
||||
};
|
||||
|
||||
static void setCurrentThreadName(const std::string &str);
|
||||
static void setCurrentThreadPriority(Priority priority);
|
||||
static void sleepMilliseconds(uint32_t millis);
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,20 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_timer.h"
|
||||
|
||||
namespace RT64 {
|
||||
// Timer
|
||||
|
||||
void Timer::initialize() {
|
||||
}
|
||||
|
||||
Timestamp Timer::current() {
|
||||
return std::chrono::high_resolution_clock::now();
|
||||
}
|
||||
|
||||
int64_t Timer::deltaMicroseconds(const Timestamp t1, const Timestamp t2) {
|
||||
return std::chrono::duration_cast<std::chrono::microseconds>(t2 - t1).count();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,19 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <cassert>
|
||||
#include <chrono>
|
||||
#include <stdint.h>
|
||||
|
||||
namespace RT64 {
|
||||
typedef std::chrono::high_resolution_clock::time_point Timestamp;
|
||||
|
||||
struct Timer {
|
||||
static void initialize();
|
||||
static Timestamp current();
|
||||
static int64_t deltaMicroseconds(const Timestamp t1, const Timestamp t2);
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,155 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_user_configuration.h"
|
||||
|
||||
#if RT64_BUILD_PLUGIN
|
||||
# include "api/rt64_api_common.h"
|
||||
#endif
|
||||
|
||||
#include <iomanip>
|
||||
|
||||
namespace RT64 {
|
||||
#if defined(_WIN32)
|
||||
UserConfiguration::GraphicsAPI UserConfiguration::DefaultGraphicsAPI = UserConfiguration::GraphicsAPI::D3D12;
|
||||
#else
|
||||
UserConfiguration::GraphicsAPI UserConfiguration::DefaultGraphicsAPI = UserConfiguration::GraphicsAPI::Vulkan;
|
||||
#endif
|
||||
|
||||
void to_json(json &j, const UserConfiguration &cfg) {
|
||||
j["graphicsAPI"] = cfg.graphicsAPI;
|
||||
j["resolution"] = cfg.resolution;
|
||||
j["antialiasing"] = cfg.antialiasing;
|
||||
j["resolutionMultiplier"] = cfg.resolutionMultiplier;
|
||||
j["downsampleMultiplier"] = cfg.downsampleMultiplier;
|
||||
j["filtering"] = cfg.filtering;
|
||||
j["aspectRatio"] = cfg.aspectRatio;
|
||||
j["aspectTarget"] = cfg.aspectTarget;
|
||||
j["extAspectRatio"] = cfg.extAspectRatio;
|
||||
j["extAspectTarget"] = cfg.extAspectTarget;
|
||||
j["upscale2D"] = cfg.upscale2D;
|
||||
j["threePointFiltering"] = cfg.threePointFiltering;
|
||||
j["refreshRate"] = cfg.refreshRate;
|
||||
j["refreshRateTarget"] = cfg.refreshRateTarget;
|
||||
j["internalColorFormat"] = cfg.internalColorFormat;
|
||||
j["idleWorkActive"] = cfg.idleWorkActive;
|
||||
j["developerMode"] = cfg.developerMode;
|
||||
}
|
||||
|
||||
void from_json(const json &j, UserConfiguration &cfg) {
|
||||
UserConfiguration defaultCfg;
|
||||
cfg.graphicsAPI = j.value("graphicsAPI", defaultCfg.graphicsAPI);
|
||||
cfg.resolution = j.value("resolution", defaultCfg.resolution);
|
||||
cfg.antialiasing = j.value("antialiasing", defaultCfg.antialiasing);
|
||||
cfg.resolutionMultiplier = j.value("resolutionMultiplier", defaultCfg.resolutionMultiplier);
|
||||
cfg.downsampleMultiplier = j.value("downsampleMultiplier", defaultCfg.downsampleMultiplier);
|
||||
cfg.filtering = j.value("filtering", defaultCfg.filtering);
|
||||
cfg.aspectRatio = j.value("aspectRatio", defaultCfg.aspectRatio);
|
||||
cfg.aspectTarget = j.value("aspectTarget", defaultCfg.aspectTarget);
|
||||
cfg.extAspectRatio = j.value("extAspectRatio", defaultCfg.extAspectRatio);
|
||||
cfg.extAspectTarget = j.value("extAspectTarget", defaultCfg.extAspectTarget);
|
||||
cfg.upscale2D = j.value("upscale2D", defaultCfg.upscale2D);
|
||||
cfg.threePointFiltering = j.value("threePointFiltering", defaultCfg.threePointFiltering);
|
||||
cfg.refreshRate = j.value("refreshRate", defaultCfg.refreshRate);
|
||||
cfg.refreshRateTarget = j.value("refreshRateTarget", defaultCfg.refreshRateTarget);
|
||||
cfg.internalColorFormat = j.value("internalColorFormat", defaultCfg.internalColorFormat);
|
||||
cfg.idleWorkActive = j.value("idleWorkActive", defaultCfg.idleWorkActive);
|
||||
cfg.developerMode = j.value("developerMode", defaultCfg.developerMode);
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void clampEnum(T &e) {
|
||||
e = std::clamp(e, T(0), T(int(T::OptionCount) - 1));
|
||||
}
|
||||
|
||||
// Configuration
|
||||
|
||||
const int UserConfiguration::ResolutionMultiplierLimit = 32;
|
||||
|
||||
UserConfiguration::UserConfiguration() {
|
||||
# ifdef RT64_BUILD_PLUGIN
|
||||
const bool isPJ64 = (RT64::API.apiType == RT64::APIType::Project64);
|
||||
if (isPJ64) {
|
||||
graphicsAPI = DefaultGraphicsAPI;
|
||||
} else {
|
||||
graphicsAPI = UserConfiguration::GraphicsAPI::Vulkan;
|
||||
}
|
||||
# else
|
||||
graphicsAPI = DefaultGraphicsAPI;
|
||||
# endif
|
||||
resolution = Resolution::WindowIntegerScale;
|
||||
antialiasing = Antialiasing::None;
|
||||
resolutionMultiplier = 2.0f;
|
||||
downsampleMultiplier = 1;
|
||||
filtering = Filtering::AntiAliasedPixelScaling;
|
||||
aspectRatio = AspectRatio::Original;
|
||||
aspectTarget = 16.0f / 9.0f;
|
||||
extAspectRatio = AspectRatio::Original;
|
||||
extAspectTarget = 16.0f / 9.0f;
|
||||
upscale2D = Upscale2D::ScaledOnly;
|
||||
threePointFiltering = true;
|
||||
refreshRate = RefreshRate::Original;
|
||||
refreshRateTarget = 60;
|
||||
internalColorFormat = InternalColorFormat::Automatic;
|
||||
idleWorkActive = true;
|
||||
developerMode = false;
|
||||
}
|
||||
|
||||
void UserConfiguration::validate() {
|
||||
clampEnum<GraphicsAPI>(graphicsAPI);
|
||||
clampEnum<Resolution>(resolution);
|
||||
clampEnum<Antialiasing>(antialiasing);
|
||||
clampEnum<Filtering>(filtering);
|
||||
clampEnum<AspectRatio>(aspectRatio);
|
||||
clampEnum<AspectRatio>(extAspectRatio);
|
||||
clampEnum<Upscale2D>(upscale2D);
|
||||
clampEnum<RefreshRate>(refreshRate);
|
||||
clampEnum<InternalColorFormat>(internalColorFormat);
|
||||
resolutionMultiplier = std::clamp<double>(resolutionMultiplier, 0.0f, ResolutionMultiplierLimit);
|
||||
downsampleMultiplier = std::clamp<int>(downsampleMultiplier, 1, ResolutionMultiplierLimit);
|
||||
aspectTarget = std::clamp<double>(aspectTarget, 0.1f, 100.0f);
|
||||
extAspectTarget = std::clamp<double>(extAspectTarget, 0.1f, 100.0f);
|
||||
refreshRateTarget = std::clamp<int>(refreshRateTarget, 10, 1000);
|
||||
}
|
||||
|
||||
uint32_t UserConfiguration::msaaSampleCount() const {
|
||||
return UserConfiguration::msaaSampleCount(antialiasing);
|
||||
}
|
||||
|
||||
uint32_t UserConfiguration::msaaSampleCount(Antialiasing antialiasing) {
|
||||
switch (antialiasing) {
|
||||
case Antialiasing::MSAA2X:
|
||||
return 2;
|
||||
case Antialiasing::MSAA4X:
|
||||
return 4;
|
||||
case Antialiasing::MSAA8X:
|
||||
return 8;
|
||||
default:
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
// ConfigurationJSON
|
||||
|
||||
bool ConfigurationJSON::read(UserConfiguration &cfg, std::istream &stream) {
|
||||
try {
|
||||
json jroot;
|
||||
stream >> jroot;
|
||||
cfg = jroot.value("configuration", UserConfiguration());
|
||||
return !stream.bad();
|
||||
}
|
||||
catch (const nlohmann::detail::exception &e) {
|
||||
fprintf(stderr, "JSON parsing error: %s\n", e.what());
|
||||
cfg = UserConfiguration();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool ConfigurationJSON::write(const UserConfiguration &cfg, std::ostream &stream) {
|
||||
json jroot;
|
||||
jroot["configuration"] = cfg;
|
||||
stream << std::setw(4) << jroot << std::endl;
|
||||
return !stream.bad();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,152 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <json/json.hpp>
|
||||
|
||||
using json = nlohmann::json;
|
||||
|
||||
namespace RT64 {
|
||||
struct UserConfiguration {
|
||||
static const int ResolutionMultiplierLimit;
|
||||
|
||||
enum class GraphicsAPI {
|
||||
D3D12,
|
||||
Vulkan,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
static GraphicsAPI DefaultGraphicsAPI;
|
||||
|
||||
enum class Resolution {
|
||||
Original,
|
||||
WindowIntegerScale,
|
||||
Manual,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
enum class Antialiasing {
|
||||
None,
|
||||
MSAA2X,
|
||||
MSAA4X,
|
||||
MSAA8X,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
enum class Filtering {
|
||||
Nearest,
|
||||
Linear,
|
||||
AntiAliasedPixelScaling,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
enum class AspectRatio {
|
||||
Original,
|
||||
Expand,
|
||||
Manual,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
enum class Upscale2D {
|
||||
Original,
|
||||
ScaledOnly,
|
||||
All,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
enum class RefreshRate {
|
||||
Original,
|
||||
Display,
|
||||
Manual,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
enum class InternalColorFormat {
|
||||
Standard,
|
||||
High,
|
||||
Automatic,
|
||||
OptionCount
|
||||
};
|
||||
|
||||
GraphicsAPI graphicsAPI;
|
||||
Resolution resolution;
|
||||
Antialiasing antialiasing;
|
||||
double resolutionMultiplier;
|
||||
int downsampleMultiplier;
|
||||
Filtering filtering;
|
||||
AspectRatio aspectRatio;
|
||||
double aspectTarget;
|
||||
AspectRatio extAspectRatio;
|
||||
double extAspectTarget;
|
||||
Upscale2D upscale2D;
|
||||
bool threePointFiltering;
|
||||
RefreshRate refreshRate;
|
||||
int refreshRateTarget;
|
||||
InternalColorFormat internalColorFormat;
|
||||
bool idleWorkActive;
|
||||
bool developerMode;
|
||||
|
||||
UserConfiguration();
|
||||
void validate();
|
||||
uint32_t msaaSampleCount() const;
|
||||
static uint32_t msaaSampleCount(Antialiasing antialiasing);
|
||||
};
|
||||
|
||||
extern void to_json(json &j, const UserConfiguration &cfg);
|
||||
extern void from_json(const json &j, UserConfiguration &cfg);
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(UserConfiguration::GraphicsAPI, {
|
||||
{ UserConfiguration::GraphicsAPI::D3D12, "D3D12" },
|
||||
{ UserConfiguration::GraphicsAPI::Vulkan, "Vulkan" }
|
||||
});
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(UserConfiguration::Resolution, {
|
||||
{ UserConfiguration::Resolution::Original, "Original" },
|
||||
{ UserConfiguration::Resolution::WindowIntegerScale, "WindowIntegerScale" },
|
||||
{ UserConfiguration::Resolution::Manual, "Manual" }
|
||||
});
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(UserConfiguration::AspectRatio, {
|
||||
{ UserConfiguration::AspectRatio::Original, "Original" },
|
||||
{ UserConfiguration::AspectRatio::Expand, "Expand" },
|
||||
{ UserConfiguration::AspectRatio::Manual, "Manual" }
|
||||
});
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(UserConfiguration::Antialiasing, {
|
||||
{ UserConfiguration::Antialiasing::None, "None" },
|
||||
{ UserConfiguration::Antialiasing::MSAA2X, "MSAA2X" },
|
||||
{ UserConfiguration::Antialiasing::MSAA4X, "MSAA4X" },
|
||||
{ UserConfiguration::Antialiasing::MSAA8X, "MSAA8X" }
|
||||
});
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(UserConfiguration::Filtering, {
|
||||
{ UserConfiguration::Filtering::Nearest, "Nearest" },
|
||||
{ UserConfiguration::Filtering::Linear, "Linear" },
|
||||
{ UserConfiguration::Filtering::AntiAliasedPixelScaling, "AntiAliasedPixelScaling" }
|
||||
});
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(UserConfiguration::Upscale2D, {
|
||||
{ UserConfiguration::Upscale2D::Original, "Original" },
|
||||
{ UserConfiguration::Upscale2D::ScaledOnly, "ScaledOnly" },
|
||||
{ UserConfiguration::Upscale2D::All, "All" }
|
||||
});
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(UserConfiguration::RefreshRate, {
|
||||
{ UserConfiguration::RefreshRate::Original, "Original" },
|
||||
{ UserConfiguration::RefreshRate::Display, "Display" },
|
||||
{ UserConfiguration::RefreshRate::Manual, "Manual" }
|
||||
});
|
||||
|
||||
NLOHMANN_JSON_SERIALIZE_ENUM(UserConfiguration::InternalColorFormat, {
|
||||
{ UserConfiguration::InternalColorFormat::Standard, "Standard" },
|
||||
{ UserConfiguration::InternalColorFormat::High, "High" },
|
||||
{ UserConfiguration::InternalColorFormat::Automatic, "Automatic" }
|
||||
});
|
||||
|
||||
struct ConfigurationJSON {
|
||||
static bool read(UserConfiguration &cfg, std::istream &stream);
|
||||
static bool write(const UserConfiguration &cfg, std::ostream &stream);
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,70 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#include "rt64_user_paths.h"
|
||||
|
||||
#if defined(__linux__)
|
||||
# include <unistd.h>
|
||||
# include <pwd.h>
|
||||
#elif defined(_WIN32)
|
||||
# include <Shlobj.h>
|
||||
#endif
|
||||
|
||||
namespace RT64 {
|
||||
// UserPaths
|
||||
|
||||
const std::filesystem::path GamesDirectory = "games";
|
||||
const std::filesystem::path ConfigurationFile = "rt64.json";
|
||||
const std::filesystem::path ImGuiFile = "rt64-imgui.ini";
|
||||
const std::filesystem::path LogFile = "rt64.log";
|
||||
|
||||
std::filesystem::path UserPaths::detectDataPath(const std::filesystem::path &appId) {
|
||||
std::filesystem::path resultPath;
|
||||
|
||||
# if defined(_WIN32)
|
||||
PWSTR knownPath = NULL;
|
||||
HRESULT result = SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, NULL, &knownPath);
|
||||
if (result == S_OK) {
|
||||
resultPath = std::filesystem::path{ knownPath } / appId;
|
||||
}
|
||||
|
||||
CoTaskMemFree(knownPath);
|
||||
# elif defined(__linux__)
|
||||
const char *homeDir = getenv("HOME");
|
||||
if (homeDir == nullptr) {
|
||||
homeDir = getpwuid(getuid())->pw_dir;
|
||||
}
|
||||
|
||||
if (homeDir != nullptr) {
|
||||
// Prefer to store in the .config directory if it exists. Use the home directory otherwise.
|
||||
const std::string appDirName = std::string(".") + std::string(appId.c_str());
|
||||
std::filesystem::path homePath = homeDir;
|
||||
std::filesystem::path configPath = homePath / ".config";
|
||||
if (std::filesystem::exists(configPath)) {
|
||||
resultPath = configPath / appDirName;
|
||||
}
|
||||
else {
|
||||
resultPath = homePath / appDirName;
|
||||
}
|
||||
}
|
||||
# endif
|
||||
|
||||
return resultPath;
|
||||
}
|
||||
|
||||
void UserPaths::setupPaths(const std::filesystem::path &dataPath) {
|
||||
this->dataPath = dataPath;
|
||||
|
||||
if (!dataPath.empty()) {
|
||||
gamesPath = dataPath / GamesDirectory;
|
||||
configurationPath = dataPath / ConfigurationFile;
|
||||
imguiPath = dataPath / ImGuiFile;
|
||||
logPath = dataPath / LogFile;
|
||||
}
|
||||
}
|
||||
|
||||
bool UserPaths::isEmpty() const {
|
||||
return dataPath.empty();
|
||||
}
|
||||
};
|
||||
@@ -0,0 +1,22 @@
|
||||
//
|
||||
// RT64
|
||||
//
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <filesystem>
|
||||
|
||||
namespace RT64 {
|
||||
struct UserPaths {
|
||||
std::filesystem::path dataPath;
|
||||
std::filesystem::path gamesPath;
|
||||
std::filesystem::path configurationPath;
|
||||
std::filesystem::path imguiPath;
|
||||
std::filesystem::path logPath;
|
||||
|
||||
std::filesystem::path detectDataPath(const std::filesystem::path &appId);
|
||||
void setupPaths(const std::filesystem::path &dataPath);
|
||||
bool isEmpty() const;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,2 @@
|
||||
build/
|
||||
bin/
|
||||
@@ -0,0 +1,23 @@
|
||||
# 2.0.1 (2022-04-05)
|
||||
|
||||
A maintenance release with some bug fixes and improvements. There are no changes in the library API.
|
||||
|
||||
- Fixed an assert failing when detailed JSON dump was made while a custom pool was present with specified string name (#36, thanks @rbertin-aso).
|
||||
- Fixed image height calculation in JSON dump visualization tool "GpuMemDumpVis.py" (#37, thanks @rbertin-aso).
|
||||
- Added JSON Schema for JSON dump format - see file "tools\GpuMemDumpVis\GpuMemDump.schema.json".
|
||||
- Added documentation section "Resource reference counting".
|
||||
|
||||
# 2.0.0 (2022-03-25)
|
||||
|
||||
So much has changed since the first release that it doesn’t make much sense to compare the differences. Here are the most important features that the library now provides:
|
||||
|
||||
- Powerful custom pools, which give an opportunity to not only keep certain resources together, reserve some minimum or limit the maximum amount of memory they can take, but also to pass additional allocation parameters unavailable to simple allocations. Among them, probably the most interesting is `POOL_DESC::HeapProperties`, which allows you to specify parameters of a custom memory type, which may be useful on UMA platforms. Committed allocations can now also be created in custom pools.
|
||||
- The API for statistics and budget has been redesigned - see structures `Statistics`, `Budget`, `DetailedStatistics`, `TotalStatistics`.
|
||||
- The library exposes its core allocation algorithm via the “virtual allocator” interface. This can be used to allocate pieces of custom memory or whatever you like, even something completely unrelated to graphics.
|
||||
- The allocation algorithm has been replaced with the new, more efficient TLSF.
|
||||
- Added support for defragmentation.
|
||||
- Objects of the library can be used with smart pointers designed for COM objects.
|
||||
|
||||
# 1.0.0 (2019-09-02)
|
||||
|
||||
First published version.
|
||||
@@ -0,0 +1,35 @@
|
||||
cmake_minimum_required(VERSION 3.9)
|
||||
|
||||
project(D3D12MemoryAllocator)
|
||||
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
find_package(Doxygen)
|
||||
option(BUILD_DOCUMENTATION "Create and install the HTML-based API documentation (requires Doxygen)" OFF)
|
||||
option(BUILD_SHARED_LIBS "Build D3D12 Memory Allocator shared library" OFF)
|
||||
|
||||
if(BUILD_DOCUMENTATION)
|
||||
if(DOXYGEN_FOUND)
|
||||
# set input and output files
|
||||
set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/src/Doxyfile)
|
||||
set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile)
|
||||
|
||||
# request to configure the file
|
||||
configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY)
|
||||
# note the option ALL which allows to build the docs together with the application
|
||||
add_custom_target( doc_doxygen ALL
|
||||
COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT}
|
||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||
COMMENT "Generating API documentation with Doxygen"
|
||||
VERBATIM )
|
||||
else()
|
||||
message("Doxygen need to be installed to generate the doxygen documentation")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# D3D12MemoryAllocator contains an sample application which is not build by default
|
||||
option(D3D12MA_BUILD_SAMPLE "Build D3D12MemoryAllocator sample application" OFF)
|
||||
|
||||
message(STATUS "D3D12MA_BUILD_SAMPLE = ${D3D12MA_BUILD_SAMPLE}")
|
||||
|
||||
add_subdirectory(src)
|
||||
@@ -0,0 +1,19 @@
|
||||
Copyright (c) 2019-2022 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
@@ -0,0 +1,52 @@
|
||||
Notices and licenses file
|
||||
_________________________
|
||||
|
||||
AMD copyrighted code (MIT)
|
||||
Copyright (c) 2019 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
|
||||
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
|
||||
Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
|
||||
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
Dependecnies on microsoft-directx-graphics-samples v-u (MIT)
|
||||
|
||||
Copyright (c) 2019 Advanced Micro Devices, Inc. All rights reserved.
|
||||
Copyright (c) Microsoft. All rights reserved.
|
||||
|
||||
This code is licensed under the MIT License (MIT).
|
||||
THIS CODE IS PROVIDED *AS IS* WITHOUT WARRANTY OF
|
||||
ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING ANY
|
||||
IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR
|
||||
PURPOSE, MERCHANTABILITY, OR NON-INFRINGEMENT.
|
||||
|
||||
|
||||
gpuopen-librariesandsdks-vulkanmemoryallocator v-u (MIT)
|
||||
Copyright (c) 2019-2022 Advanced Micro Devices, Inc. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
@@ -0,0 +1,115 @@
|
||||
# D3D12 Memory Allocator
|
||||
|
||||
Easy to integrate memory allocation library for Direct3D 12.
|
||||
|
||||
**Documentation:** Browse online: [D3D12 Memory Allocator](https://gpuopen-librariesandsdks.github.io/D3D12MemoryAllocator/html/) (generated from Doxygen-style comments in [src/D3D12MemAlloc.h](src/D3D12MemAlloc.h))
|
||||
|
||||
**License:** MIT. See [LICENSE.txt](LICENSE.txt)
|
||||
|
||||
**Changelog:** See [CHANGELOG.md](CHANGELOG.md)
|
||||
|
||||
**Product page:** [D3D12 Memory Allocator on GPUOpen](https://gpuopen.com/gaming-product/d3d12-memory-allocator/)
|
||||
|
||||
**Build status:**
|
||||
|
||||
Windows: [](https://ci.appveyor.com/project/adam-sawicki-amd/d3d12memoryallocator)
|
||||
|
||||
[](http://isitmaintained.com/project/GPUOpen-LibrariesAndSDKs/D3D12MemoryAllocator "Average time to resolve an issue")
|
||||
|
||||
# Problem
|
||||
|
||||
Memory allocation and resource (buffer and texture) creation in new, explicit graphics APIs (Vulkan® and Direct3D 12) is difficult comparing to older graphics APIs like Direct3D 11 or OpenGL® because it is recommended to allocate bigger blocks of memory and assign parts of them to resources. [Vulkan Memory Allocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/) is a library that implements this functionality for Vulkan. It is available online since 2017 and it is successfully used in many software projects, including some AAA game studios. This is an equivalent library for D3D12.
|
||||
|
||||
# Features
|
||||
|
||||
This library can help developers to manage memory allocations and resource creation by offering function `Allocator::CreateResource` similar to the standard `ID3D12Device::CreateCommittedResource`. It internally:
|
||||
|
||||
- Allocates and keeps track of bigger memory heaps, used and unused ranges inside them, finds best matching unused ranges to create new resources there as placed resources.
|
||||
- Automatically respects size and alignment requirements for created resources.
|
||||
- Automatically handles resource heap tier - whether it's `D3D12_RESOURCE_HEAP_TIER_1` that requires to keep certain classes of resources separate or `D3D12_RESOURCE_HEAP_TIER_2` that allows to keep them all together.
|
||||
|
||||
Additional features:
|
||||
|
||||
- Well-documented - description of all classes and functions provided, along with chapters that contain general description and example code.
|
||||
- Thread-safety: Library is designed to be used in multithreaded code.
|
||||
- Configuration: Fill optional members of `ALLOCATOR_DESC` structure to provide custom CPU memory allocator and other parameters.
|
||||
- Customization and integration with custom engines: Predefine appropriate macros to provide your own implementation of external facilities used by the library, like assert, mutex, and atomic.
|
||||
- Support for resource aliasing (overlap).
|
||||
- Custom memory pools: Create a pool with desired parameters (e.g. fixed or limited maximum size, custom `D3D12_HEAP_PROPERTIES` and `D3D12_HEAP_FLAGS`) and allocate memory out of it.
|
||||
- Linear allocator: Create a pool with linear algorithm and use it for much faster allocations and deallocations in free-at-once, stack, double stack, or ring buffer fashion.
|
||||
- Defragmentation: Let the library move data around to free some memory blocks and make your allocations better compacted.
|
||||
- Statistics: Obtain brief or detailed statistics about the amount of memory used, unused, number of allocated heaps, number of allocations etc. - globally and per memory heap type. Current memory usage and budget as reported by the system can also be queried.
|
||||
- Debug annotations: Associate custom `void* pPrivateData` and debug `LPCWSTR pName` with each allocation.
|
||||
- JSON dump: Obtain a string in JSON format with detailed map of internal state, including list of allocations, their string names, and gaps between them.
|
||||
- Convert this JSON dump into a picture to visualize your memory. See [tools/GpuMemDumpVis](tools/GpuMemDumpVis/README.md).
|
||||
- Virtual allocator - an API that exposes the core allocation algorithm to be used without allocating real GPU memory, to allocate your own stuff, e.g. sub-allocate pieces of one large buffer.
|
||||
|
||||
# Prerequisites
|
||||
|
||||
- Self-contained C++ library in single pair of H + CPP files. No external dependencies other than standard C, C++ library and Windows SDK. Some features of C++14 used. STL containers, C++ exceptions, and RTTI are not used.
|
||||
- Object-oriented interface in a convention similar to D3D12.
|
||||
- Error handling implemented by returning `HRESULT` error codes - same way as in D3D12.
|
||||
- Interface documented using Doxygen-style comments.
|
||||
|
||||
# Example
|
||||
|
||||
Basic usage of this library is very simple. Advanced features are optional. After you created global `Allocator` object, a complete code needed to create a texture may look like this:
|
||||
|
||||
```cpp
|
||||
D3D12_RESOURCE_DESC resourceDesc = {};
|
||||
resourceDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
|
||||
resourceDesc.Alignment = 0;
|
||||
resourceDesc.Width = 1024;
|
||||
resourceDesc.Height = 1024;
|
||||
resourceDesc.DepthOrArraySize = 1;
|
||||
resourceDesc.MipLevels = 1;
|
||||
resourceDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
|
||||
resourceDesc.SampleDesc.Count = 1;
|
||||
resourceDesc.SampleDesc.Quality = 0;
|
||||
resourceDesc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN;
|
||||
resourceDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
|
||||
|
||||
D3D12MA::ALLOCATION_DESC allocDesc = {};
|
||||
allocDesc.HeapType = D3D12_HEAP_TYPE_DEFAULT;
|
||||
|
||||
D3D12Resource* resource;
|
||||
D3D12MA::Allocation* allocation;
|
||||
HRESULT hr = allocator->CreateResource(
|
||||
&allocDesc, &resourceDesc,
|
||||
D3D12_RESOURCE_STATE_COPY_DEST, NULL,
|
||||
&allocation, IID_PPV_ARGS(&resource));
|
||||
```
|
||||
|
||||
With this one function call:
|
||||
|
||||
1. `ID3D12Heap` memory block is allocated if needed.
|
||||
2. An unused region of the memory block is reserved for the allocation.
|
||||
3. `ID3D12Resource` is created as placed resource, bound to this region.
|
||||
|
||||
`Allocation` is an object that represents memory assigned to this texture. It can be queried for parameters like offset and size.
|
||||
|
||||
# Binaries
|
||||
|
||||
The release comes with precompiled binary executable for "D3D12Sample" application which contains test suite. It is compiled using Visual Studio 2019, so it requires appropriate libraries to work, including "MSVCP140.dll", "VCRUNTIME140.dll", "VCRUNTIME140_1.dll". If its launch fails with error message telling about those files missing, please download and install [Microsoft Visual C++ Redistributable for Visual Studio 2015, 2017 and 2019](https://support.microsoft.com/en-us/help/2977003/the-latest-supported-visual-c-downloads), "x64" version.
|
||||
|
||||
# Copyright notice
|
||||
|
||||
This software package uses third party software:
|
||||
|
||||
- Parts of the code of [Vulkan Memory Allocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/) by AMD, license: MIT
|
||||
- Parts of the code of [DirectX-Graphics-Samples](https://github.com/microsoft/DirectX-Graphics-Samples) by Microsoft, license: MIT
|
||||
|
||||
For more information see [NOTICES.txt](NOTICES.txt).
|
||||
|
||||
# Software using this library
|
||||
|
||||
- **[The Forge](https://github.com/ConfettiFX/The-Forge)** - cross-platform rendering framework. Apache License 2.0.
|
||||
- **[Wicked Engine<img src="https://github.com/turanszkij/WickedEngine/blob/master/Content/logo_small.png" width="28px" align="center"/>](https://github.com/turanszkij/WickedEngine)** - 3D engine with modern graphics
|
||||
|
||||
[Some other projects on GitHub](https://github.com/search?q=D3D12MemAlloc.h&type=Code) and some game development studios that use DX12 in their games.
|
||||
|
||||
# See also
|
||||
|
||||
- **[Vcpkg](https://github.com/Microsoft/vcpkg)** dependency manager from Microsoft offers a port of this library that is easy to install.
|
||||
- **[Vulkan Memory Allocator](https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator/)** - equivalent library for Vulkan. License: MIT.
|
||||
- **[TerraFX.Interop.D3D12MemoryAllocator](https://github.com/terrafx/terrafx.interop.d3d12memoryallocator)** - interop bindings for this library for C#, as used by [TerraFX](https://github.com/terrafx/terrafx). License: MIT.
|
||||
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 1.2 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 268 B |
|
After Width: | Height: | Size: 6.4 KiB |
@@ -0,0 +1,297 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
||||
<meta name="generator" content="Doxygen 1.10.0"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||
<title>Direct3D 12 Memory Allocator: D:/PROJECTS/D3D12 Memory Allocator/REPO/include/D3D12MemAlloc.h File Reference</title>
|
||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||||
<script type="text/javascript" src="jquery.js"></script>
|
||||
<script type="text/javascript" src="dynsections.js"></script>
|
||||
<script type="text/javascript" src="clipboard.js"></script>
|
||||
<script type="text/javascript" src="cookie.js"></script>
|
||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||||
<script type="text/javascript" src="search/searchdata.js"></script>
|
||||
<script type="text/javascript" src="search/search.js"></script>
|
||||
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||
<div id="titlearea">
|
||||
<table cellspacing="0" cellpadding="0">
|
||||
<tbody>
|
||||
<tr id="projectrow">
|
||||
<td id="projectalign">
|
||||
<div id="projectname">Direct3D 12 Memory Allocator
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- end header part -->
|
||||
<!-- Generated by Doxygen 1.10.0 -->
|
||||
<script type="text/javascript">
|
||||
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
||||
var searchBox = new SearchBox("searchBox", "search/",'.html');
|
||||
/* @license-end */
|
||||
</script>
|
||||
<script type="text/javascript" src="menudata.js"></script>
|
||||
<script type="text/javascript" src="menu.js"></script>
|
||||
<script type="text/javascript">
|
||||
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
||||
$(function() {
|
||||
initMenu('',true,false,'search.php','Search');
|
||||
$(function() { init_search(); });
|
||||
});
|
||||
/* @license-end */
|
||||
</script>
|
||||
<div id="main-nav"></div>
|
||||
<!-- window showing the filter options -->
|
||||
<div id="MSearchSelectWindow"
|
||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
||||
</div>
|
||||
|
||||
<!-- iframe showing the search results (closed by default) -->
|
||||
<div id="MSearchResultsWindow">
|
||||
<div id="MSearchResults">
|
||||
<div class="SRPage">
|
||||
<div id="SRIndex">
|
||||
<div id="SRResults"></div>
|
||||
<div class="SRStatus" id="Loading">Loading...</div>
|
||||
<div class="SRStatus" id="Searching">Searching...</div>
|
||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="nav-path" class="navpath">
|
||||
<ul>
|
||||
<li class="navelem"><a class="el" href="dir_d44c64559bbebec7f509842c48db8b23.html">include</a></li> </ul>
|
||||
</div>
|
||||
</div><!-- top -->
|
||||
<div class="header">
|
||||
<div class="summary">
|
||||
<a href="#nested-classes">Classes</a> |
|
||||
<a href="#namespaces">Namespaces</a> |
|
||||
<a href="#define-members">Macros</a> |
|
||||
<a href="#typedef-members">Typedefs</a> |
|
||||
<a href="#enum-members">Enumerations</a> |
|
||||
<a href="#func-members">Functions</a> </div>
|
||||
<div class="headertitle"><div class="title">D3D12MemAlloc.h File Reference</div></div>
|
||||
</div><!--header-->
|
||||
<div class="contents">
|
||||
<div class="textblock"><code>#include <d3d12.h></code><br />
|
||||
<code>#include <dxgi1_4.h></code><br />
|
||||
</div><table class="memberdecls">
|
||||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="nested-classes" name="nested-classes"></a>
|
||||
Classes</h2></td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html">D3D12MA::ALLOCATION_CALLBACKS</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Custom callbacks to CPU memory allocation functions. <a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">D3D12MA::ALLOCATION_DESC</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aa37d6b9fe8ea0864f7a35b9d68e8345a" title="Allocates memory and creates a D3D12 resource (buffer or texture). This is the main allocation functi...">Allocator::CreateResource</a>. <a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html">D3D12MA::Statistics</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group, custom pool, or total. <a href="struct_d3_d12_m_a_1_1_statistics.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html">D3D12MA::DetailedStatistics</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">More detailed statistics than <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" title="Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...">D3D12MA::Statistics</a>. <a href="struct_d3_d12_m_a_1_1_detailed_statistics.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html">D3D12MA::TotalStatistics</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">General statistics from current state of the allocator - total memory usage across all memory heaps and segments. <a href="struct_d3_d12_m_a_1_1_total_statistics.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_budget.html">D3D12MA::Budget</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Statistics of current memory usage and available budget for a specific memory segment group. <a href="struct_d3_d12_m_a_1_1_budget.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html">D3D12MA::VirtualAllocation</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Represents single memory allocation done inside <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">VirtualBlock</a>. <a href="struct_d3_d12_m_a_1_1_virtual_allocation.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocation.html">D3D12MA::Allocation</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Represents single memory allocation. <a href="class_d3_d12_m_a_1_1_allocation.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___d_e_s_c.html">D3D12MA::DEFRAGMENTATION_DESC</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Parameters for defragmentation. <a href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___d_e_s_c.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___m_o_v_e.html">D3D12MA::DEFRAGMENTATION_MOVE</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Single move of an allocation to be done for defragmentation. <a href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___m_o_v_e.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___p_a_s_s___m_o_v_e___i_n_f_o.html">D3D12MA::DEFRAGMENTATION_PASS_MOVE_INFO</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Parameters for incremental defragmentation steps. <a href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___p_a_s_s___m_o_v_e___i_n_f_o.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___s_t_a_t_s.html">D3D12MA::DEFRAGMENTATION_STATS</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Statistics returned for defragmentation process by function <a class="el" href="class_d3_d12_m_a_1_1_defragmentation_context.html#a1c21c26f47dcbf8f4e562063a3e25f38" title="Returns statistics of the defragmentation performed so far.">DefragmentationContext::GetStats()</a>. <a href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___s_t_a_t_s.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_defragmentation_context.html">D3D12MA::DefragmentationContext</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Represents defragmentation process in progress. <a href="class_d3_d12_m_a_1_1_defragmentation_context.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html">D3D12MA::POOL_DESC</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_pool.html" title="Custom memory pool.">D3D12MA::Pool</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515" title="Creates custom pool.">D3D12MA::Allocator::CreatePool</a>. <a href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_pool.html">D3D12MA::Pool</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Custom memory pool. <a href="class_d3_d12_m_a_1_1_pool.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html">D3D12MA::ALLOCATOR_DESC</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocator.html" title="Represents main object of this library initialized for particular ID3D12Device.">Allocator</a> object. To be used with <a class="el" href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0" title="Creates new main D3D12MA::Allocator object and returns it through ppAllocator.">CreateAllocator()</a>. <a href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_allocator.html">D3D12MA::Allocator</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Represents main object of this library initialized for particular <code>ID3D12Device</code>. <a href="class_d3_d12_m_a_1_1_allocator.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html">D3D12MA::VIRTUAL_BLOCK_DESC</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">D3D12MA::VirtualBlock</a> object to be passed to <a class="el" href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98" title="Creates new D3D12MA::VirtualBlock object and returns it through ppVirtualBlock.">CreateVirtualBlock()</a>. <a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html">D3D12MA::VIRTUAL_ALLOCATION_DESC</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Parameters of created virtual allocation to be passed to <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179" title="Creates new allocation.">VirtualBlock::Allocate()</a>. <a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct  </td><td class="memItemRight" valign="bottom"><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html">D3D12MA::VIRTUAL_ALLOCATION_INFO</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Parameters of an existing virtual allocation, returned by <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1" title="Returns information about an allocation - its offset, size and custom pointer.">VirtualBlock::GetAllocationInfo()</a>. <a href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">class  </td><td class="memItemRight" valign="bottom"><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">D3D12MA::VirtualBlock</a></td></tr>
|
||||
<tr class="memdesc:"><td class="mdescLeft"> </td><td class="mdescRight">Represents pure allocation algorithm and a data structure with allocations in some memory block, without actually allocating any GPU memory. <a href="class_d3_d12_m_a_1_1_virtual_block.html#details">More...</a><br /></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
</table><table class="memberdecls">
|
||||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="namespaces" name="namespaces"></a>
|
||||
Namespaces</h2></td></tr>
|
||||
<tr class="memitem:namespace_d3_d12_m_a" id="r_namespace_d3_d12_m_a"><td class="memItemLeft" align="right" valign="top">namespace  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html">D3D12MA</a></td></tr>
|
||||
<tr class="separator:"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
</table><table class="memberdecls">
|
||||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="define-members" name="define-members"></a>
|
||||
Macros</h2></td></tr>
|
||||
<tr class="memitem:aa623643886b8481adb32017e5c748b50" id="r_aa623643886b8481adb32017e5c748b50"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="#aa623643886b8481adb32017e5c748b50">D3D12MA_DXGI_1_4</a>   0</td></tr>
|
||||
<tr class="separator:aa623643886b8481adb32017e5c748b50"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:ad04069a2e2bbc53b7d65f85a04a2dcbc" id="r_ad04069a2e2bbc53b7d65f85a04a2dcbc"><td class="memItemLeft" align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="#ad04069a2e2bbc53b7d65f85a04a2dcbc">D3D12MA_USE_SMALL_RESOURCE_PLACEMENT_ALIGNMENT</a>   1</td></tr>
|
||||
<tr class="separator:ad04069a2e2bbc53b7d65f85a04a2dcbc"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
</table><table class="memberdecls">
|
||||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="typedef-members" name="typedef-members"></a>
|
||||
Typedefs</h2></td></tr>
|
||||
<tr class="memitem:a15e349adce86a40e0417d405aef1af80" id="r_a15e349adce86a40e0417d405aef1af80"><td class="memItemLeft" align="right" valign="top">typedef UINT64 </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#a15e349adce86a40e0417d405aef1af80">D3D12MA::AllocHandle</a></td></tr>
|
||||
<tr class="memdesc:a15e349adce86a40e0417d405aef1af80"><td class="mdescLeft"> </td><td class="mdescRight">Unique identifier of single allocation done inside the memory heap. <br /></td></tr>
|
||||
<tr class="separator:a15e349adce86a40e0417d405aef1af80"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:ad998d40b4601b84dbc538694b1faf4d5" id="r_ad998d40b4601b84dbc538694b1faf4d5"><td class="memItemLeft" align="right" valign="top">using </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#ad998d40b4601b84dbc538694b1faf4d5">D3D12MA::ALLOCATE_FUNC_PTR</a> = void* (*)(size_t Size, size_t Alignment, void* pPrivateData)</td></tr>
|
||||
<tr class="memdesc:ad998d40b4601b84dbc538694b1faf4d5"><td class="mdescLeft"> </td><td class="mdescRight">Pointer to custom callback function that allocates CPU memory. <br /></td></tr>
|
||||
<tr class="separator:ad998d40b4601b84dbc538694b1faf4d5"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a7c61f55eeb64451cb0c08c0461bbe1a3" id="r_a7c61f55eeb64451cb0c08c0461bbe1a3"><td class="memItemLeft" align="right" valign="top">using </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#a7c61f55eeb64451cb0c08c0461bbe1a3">D3D12MA::FREE_FUNC_PTR</a> = void (*)(void* pMemory, void* pPrivateData)</td></tr>
|
||||
<tr class="memdesc:a7c61f55eeb64451cb0c08c0461bbe1a3"><td class="mdescLeft"> </td><td class="mdescRight">Pointer to custom callback function that deallocates CPU memory. <br /></td></tr>
|
||||
<tr class="separator:a7c61f55eeb64451cb0c08c0461bbe1a3"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
</table><table class="memberdecls">
|
||||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="enum-members" name="enum-members"></a>
|
||||
Enumerations</h2></td></tr>
|
||||
<tr class="memitem:abbad31a7e0b3d09d77f3fb704b77645e" id="r_abbad31a7e0b3d09d77f3fb704b77645e"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645e">D3D12MA::ALLOCATION_FLAGS</a> { <br />
|
||||
  <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea0bf578b096d6ea73cea86b031541733e">D3D12MA::ALLOCATION_FLAG_NONE</a> = 0
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea661a5472dba3dcecc5a2cc92afd25675">D3D12MA::ALLOCATION_FLAG_COMMITTED</a> = 0x1
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea9a52c6ae694eadcd20896091e77c0628">D3D12MA::ALLOCATION_FLAG_NEVER_ALLOCATE</a> = 0x2
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645eab374417c1f22a833ead268a6c21424e6">D3D12MA::ALLOCATION_FLAG_WITHIN_BUDGET</a> = 0x4
|
||||
, <br />
|
||||
  <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645eafb0e2dacce691336e717550a1df72474">D3D12MA::ALLOCATION_FLAG_UPPER_ADDRESS</a> = 0x8
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea4d6808f27de6d0ae57014ec1f4d54326">D3D12MA::ALLOCATION_FLAG_CAN_ALIAS</a> = 0x10
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea4b4fa95bb0daf6a80add7fb292aa63ae">D3D12MA::ALLOCATION_FLAG_STRATEGY_MIN_MEMORY</a> = 0x00010000
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645eaa3ded8847563c24b4522af0586dbd2cb">D3D12MA::ALLOCATION_FLAG_STRATEGY_MIN_TIME</a> = 0x00020000
|
||||
, <br />
|
||||
  <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645eac30b62e36906b3c6e97b8b1d2ad8709d">D3D12MA::ALLOCATION_FLAG_STRATEGY_MIN_OFFSET</a> = 0x0004000
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645eaaeed6a77f0fe7f33459df593cea44c35">D3D12MA::ALLOCATION_FLAG_STRATEGY_BEST_FIT</a> = ALLOCATION_FLAG_STRATEGY_MIN_MEMORY
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea103ff3115f3c2126779c25be435bf6aa">D3D12MA::ALLOCATION_FLAG_STRATEGY_FIRST_FIT</a> = ALLOCATION_FLAG_STRATEGY_MIN_TIME
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645ea3e29297ad3c6cf9d9bb61b6d27a13ab3">D3D12MA::ALLOCATION_FLAG_STRATEGY_MASK</a>
|
||||
<br />
|
||||
}</td></tr>
|
||||
<tr class="memdesc:abbad31a7e0b3d09d77f3fb704b77645e"><td class="mdescLeft"> </td><td class="mdescRight">Bit flags to be used with ALLOCATION_DESC::Flags. <a href="namespace_d3_d12_m_a.html#abbad31a7e0b3d09d77f3fb704b77645e">More...</a><br /></td></tr>
|
||||
<tr class="separator:abbad31a7e0b3d09d77f3fb704b77645e"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:ab433989212ee6736bf9d63c5bc565df4" id="r_ab433989212ee6736bf9d63c5bc565df4"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#ab433989212ee6736bf9d63c5bc565df4">D3D12MA::DEFRAGMENTATION_FLAGS</a> { <a class="el" href="namespace_d3_d12_m_a.html#ab433989212ee6736bf9d63c5bc565df4a9d0301a81136ca79e3ba52542c6d2e13">D3D12MA::DEFRAGMENTATION_FLAG_ALGORITHM_FAST</a> = 0x1
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#ab433989212ee6736bf9d63c5bc565df4ace3a84861ed6a1b8066fa9c12c7e89b9">D3D12MA::DEFRAGMENTATION_FLAG_ALGORITHM_BALANCED</a> = 0x2
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#ab433989212ee6736bf9d63c5bc565df4af205647f08a5c2cddced83ed66892467">D3D12MA::DEFRAGMENTATION_FLAG_ALGORITHM_FULL</a> = 0x4
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#ab433989212ee6736bf9d63c5bc565df4a567e0fe890cc07d8dd6576584e8d9f2d">D3D12MA::DEFRAGMENTATION_FLAG_ALGORITHM_MASK</a>
|
||||
}</td></tr>
|
||||
<tr class="memdesc:ab433989212ee6736bf9d63c5bc565df4"><td class="mdescLeft"> </td><td class="mdescRight">Flags to be passed as DEFRAGMENTATION_DESC::Flags. <a href="namespace_d3_d12_m_a.html#ab433989212ee6736bf9d63c5bc565df4">More...</a><br /></td></tr>
|
||||
<tr class="separator:ab433989212ee6736bf9d63c5bc565df4"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a82bb787a69699a877b4166789a30e602" id="r_a82bb787a69699a877b4166789a30e602"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#a82bb787a69699a877b4166789a30e602">D3D12MA::DEFRAGMENTATION_MOVE_OPERATION</a> { <a class="el" href="namespace_d3_d12_m_a.html#a82bb787a69699a877b4166789a30e602a29a5c20322e633f6c34ddebd16bc61ac">D3D12MA::DEFRAGMENTATION_MOVE_OPERATION_COPY</a> = 0
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a82bb787a69699a877b4166789a30e602abefe270a1803998dda3f8e01ec3a4ad6">D3D12MA::DEFRAGMENTATION_MOVE_OPERATION_IGNORE</a> = 1
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a82bb787a69699a877b4166789a30e602aa2143507d723de458c2ed94e143ac242">D3D12MA::DEFRAGMENTATION_MOVE_OPERATION_DESTROY</a> = 2
|
||||
}</td></tr>
|
||||
<tr class="memdesc:a82bb787a69699a877b4166789a30e602"><td class="mdescLeft"> </td><td class="mdescRight">Operation performed on single defragmentation move. <a href="namespace_d3_d12_m_a.html#a82bb787a69699a877b4166789a30e602">More...</a><br /></td></tr>
|
||||
<tr class="separator:a82bb787a69699a877b4166789a30e602"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a919d8545365d6b7209a964f2b99936d1" id="r_a919d8545365d6b7209a964f2b99936d1"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1">D3D12MA::POOL_FLAGS</a> { <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1a5d8dc91add3423140809a550c7224d02">D3D12MA::POOL_FLAG_NONE</a> = 0
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aa37a0103f511954ea42a1d0bba286b6a">D3D12MA::POOL_FLAG_ALGORITHM_LINEAR</a> = 0x1
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1acc379a89755438c0f76667783b778baa">D3D12MA::POOL_FLAG_MSAA_TEXTURES_ALWAYS_COMMITTED</a> = 0x2
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1aec9d4939b8cc5438545b9df840b5f5f7">D3D12MA::POOL_FLAG_ALGORITHM_MASK</a> = POOL_FLAG_ALGORITHM_LINEAR
|
||||
}</td></tr>
|
||||
<tr class="memdesc:a919d8545365d6b7209a964f2b99936d1"><td class="mdescLeft"> </td><td class="mdescRight">Bit flags to be used with POOL_DESC::Flags. <a href="namespace_d3_d12_m_a.html#a919d8545365d6b7209a964f2b99936d1">More...</a><br /></td></tr>
|
||||
<tr class="separator:a919d8545365d6b7209a964f2b99936d1"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:ad5ae5a5e42b878f2e18ab5d1fbfb9916" id="r_ad5ae5a5e42b878f2e18ab5d1fbfb9916"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916">D3D12MA::ALLOCATOR_FLAGS</a> { <br />
|
||||
  <a class="el" href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a2fb30967b492c27823a80b5de3aea26f">D3D12MA::ALLOCATOR_FLAG_NONE</a> = 0
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a1b06bb21df006f76a9ed1bc41838bc52">D3D12MA::ALLOCATOR_FLAG_SINGLETHREADED</a> = 0x1
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a068863dc0538ff4ea153b046b31e94fb">D3D12MA::ALLOCATOR_FLAG_ALWAYS_COMMITTED</a> = 0x2
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916ae7dc7ab9168148281ebfe1586f554335">D3D12MA::ALLOCATOR_FLAG_DEFAULT_POOLS_NOT_ZEROED</a> = 0x4
|
||||
, <br />
|
||||
  <a class="el" href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916adfbfd20d716f2a46f74d6226056fef1e">D3D12MA::ALLOCATOR_FLAG_MSAA_TEXTURES_ALWAYS_COMMITTED</a> = 0x8
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916a15c1ba5fbc182ac927b3011e23e74a72">D3D12MA::ALLOCATOR_FLAG_DONT_PREFER_SMALL_BUFFERS_COMMITTED</a> = 0x10
|
||||
<br />
|
||||
}</td></tr>
|
||||
<tr class="memdesc:ad5ae5a5e42b878f2e18ab5d1fbfb9916"><td class="mdescLeft"> </td><td class="mdescRight">Bit flags to be used with ALLOCATOR_DESC::Flags. <a href="namespace_d3_d12_m_a.html#ad5ae5a5e42b878f2e18ab5d1fbfb9916">More...</a><br /></td></tr>
|
||||
<tr class="separator:ad5ae5a5e42b878f2e18ab5d1fbfb9916"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a578329923a103be086ac52e3bed2085d" id="r_a578329923a103be086ac52e3bed2085d"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085d">D3D12MA::VIRTUAL_BLOCK_FLAGS</a> { <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dafc882884f8bacd5cab3087567df8c53d">D3D12MA::VIRTUAL_BLOCK_FLAG_NONE</a> = 0
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085dabd9968af113acc9a756254ab9f1dc13d">D3D12MA::VIRTUAL_BLOCK_FLAG_ALGORITHM_LINEAR</a> = POOL_FLAG_ALGORITHM_LINEAR
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085da0fee243cbf2902a68123ac85caa21e3e">D3D12MA::VIRTUAL_BLOCK_FLAG_ALGORITHM_MASK</a> = POOL_FLAG_ALGORITHM_MASK
|
||||
}</td></tr>
|
||||
<tr class="memdesc:a578329923a103be086ac52e3bed2085d"><td class="mdescLeft"> </td><td class="mdescRight">Bit flags to be used with VIRTUAL_BLOCK_DESC::Flags. <a href="namespace_d3_d12_m_a.html#a578329923a103be086ac52e3bed2085d">More...</a><br /></td></tr>
|
||||
<tr class="separator:a578329923a103be086ac52e3bed2085d"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:a7e4152ccaf661f5398b24a23cbe9ae72" id="r_a7e4152ccaf661f5398b24a23cbe9ae72"><td class="memItemLeft" align="right" valign="top">enum  </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72">D3D12MA::VIRTUAL_ALLOCATION_FLAGS</a> { <br />
|
||||
  <a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72a03576295004dec9dc8f99a895d232027">D3D12MA::VIRTUAL_ALLOCATION_FLAG_NONE</a> = 0
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72a86beebcb80a1a10cb5525e2c9ed1435e">D3D12MA::VIRTUAL_ALLOCATION_FLAG_UPPER_ADDRESS</a> = ALLOCATION_FLAG_UPPER_ADDRESS
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72affe589cb8817363fed0d207c3a5f2ad9">D3D12MA::VIRTUAL_ALLOCATION_FLAG_STRATEGY_MIN_MEMORY</a> = ALLOCATION_FLAG_STRATEGY_MIN_MEMORY
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72ae37ebe327c9d46b5ad68e5a95c888efe">D3D12MA::VIRTUAL_ALLOCATION_FLAG_STRATEGY_MIN_TIME</a> = ALLOCATION_FLAG_STRATEGY_MIN_TIME
|
||||
, <br />
|
||||
  <a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72abd8063a364dba797e928b6aaa85dd5f0">D3D12MA::VIRTUAL_ALLOCATION_FLAG_STRATEGY_MIN_OFFSET</a> = ALLOCATION_FLAG_STRATEGY_MIN_OFFSET
|
||||
, <a class="el" href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72a6a78fdd4c16ef443e9353622caf7efb9">D3D12MA::VIRTUAL_ALLOCATION_FLAG_STRATEGY_MASK</a> = ALLOCATION_FLAG_STRATEGY_MASK
|
||||
<br />
|
||||
}</td></tr>
|
||||
<tr class="memdesc:a7e4152ccaf661f5398b24a23cbe9ae72"><td class="mdescLeft"> </td><td class="mdescRight">Bit flags to be used with VIRTUAL_ALLOCATION_DESC::Flags. <a href="namespace_d3_d12_m_a.html#a7e4152ccaf661f5398b24a23cbe9ae72">More...</a><br /></td></tr>
|
||||
<tr class="separator:a7e4152ccaf661f5398b24a23cbe9ae72"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
</table><table class="memberdecls">
|
||||
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a id="func-members" name="func-members"></a>
|
||||
Functions</h2></td></tr>
|
||||
<tr class="memitem:ab7a1cd1683986d75ce1488b0920f4cb0" id="r_ab7a1cd1683986d75ce1488b0920f4cb0"><td class="memItemLeft" align="right" valign="top">D3D12MA_API HRESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0">D3D12MA::CreateAllocator</a> (const <a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html">ALLOCATOR_DESC</a> *pDesc, <a class="el" href="class_d3_d12_m_a_1_1_allocator.html">Allocator</a> **ppAllocator)</td></tr>
|
||||
<tr class="memdesc:ab7a1cd1683986d75ce1488b0920f4cb0"><td class="mdescLeft"> </td><td class="mdescRight">Creates new main <a class="el" href="class_d3_d12_m_a_1_1_allocator.html" title="Represents main object of this library initialized for particular ID3D12Device.">D3D12MA::Allocator</a> object and returns it through <code>ppAllocator</code>. <br /></td></tr>
|
||||
<tr class="separator:ab7a1cd1683986d75ce1488b0920f4cb0"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
<tr class="memitem:ab024647ae85ee63e2fa2c1c4beac6d98" id="r_ab024647ae85ee63e2fa2c1c4beac6d98"><td class="memItemLeft" align="right" valign="top">D3D12MA_API HRESULT </td><td class="memItemRight" valign="bottom"><a class="el" href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98">D3D12MA::CreateVirtualBlock</a> (const <a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html">VIRTUAL_BLOCK_DESC</a> *pDesc, <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html">VirtualBlock</a> **ppVirtualBlock)</td></tr>
|
||||
<tr class="memdesc:ab024647ae85ee63e2fa2c1c4beac6d98"><td class="mdescLeft"> </td><td class="mdescRight">Creates new <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">D3D12MA::VirtualBlock</a> object and returns it through <code>ppVirtualBlock</code>. <br /></td></tr>
|
||||
<tr class="separator:ab024647ae85ee63e2fa2c1c4beac6d98"><td class="memSeparator" colspan="2"> </td></tr>
|
||||
</table>
|
||||
<h2 class="groupheader">Macro Definition Documentation</h2>
|
||||
<a id="aa623643886b8481adb32017e5c748b50" name="aa623643886b8481adb32017e5c748b50"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#aa623643886b8481adb32017e5c748b50">◆ </a></span>D3D12MA_DXGI_1_4</h2>
|
||||
|
||||
<div class="memitem">
|
||||
<div class="memproto">
|
||||
<table class="memname">
|
||||
<tr>
|
||||
<td class="memname">#define D3D12MA_DXGI_1_4   0</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div><div class="memdoc">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<a id="ad04069a2e2bbc53b7d65f85a04a2dcbc" name="ad04069a2e2bbc53b7d65f85a04a2dcbc"></a>
|
||||
<h2 class="memtitle"><span class="permalink"><a href="#ad04069a2e2bbc53b7d65f85a04a2dcbc">◆ </a></span>D3D12MA_USE_SMALL_RESOURCE_PLACEMENT_ALIGNMENT</h2>
|
||||
|
||||
<div class="memitem">
|
||||
<div class="memproto">
|
||||
<table class="memname">
|
||||
<tr>
|
||||
<td class="memname">#define D3D12MA_USE_SMALL_RESOURCE_PLACEMENT_ALIGNMENT   1</td>
|
||||
</tr>
|
||||
</table>
|
||||
</div><div class="memdoc">
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- contents -->
|
||||
<!-- start footer part -->
|
||||
<hr class="footer"/><address class="footer"><small>
|
||||
Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.10.0
|
||||
</small></address>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,109 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
|
||||
<meta name="generator" content="Doxygen 1.10.0"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
||||
<title>Direct3D 12 Memory Allocator: Class List</title>
|
||||
<link href="tabs.css" rel="stylesheet" type="text/css"/>
|
||||
<script type="text/javascript" src="jquery.js"></script>
|
||||
<script type="text/javascript" src="dynsections.js"></script>
|
||||
<script type="text/javascript" src="clipboard.js"></script>
|
||||
<script type="text/javascript" src="cookie.js"></script>
|
||||
<link href="search/search.css" rel="stylesheet" type="text/css"/>
|
||||
<script type="text/javascript" src="search/searchdata.js"></script>
|
||||
<script type="text/javascript" src="search/search.js"></script>
|
||||
<link href="doxygen.css" rel="stylesheet" type="text/css" />
|
||||
</head>
|
||||
<body>
|
||||
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
||||
<div id="titlearea">
|
||||
<table cellspacing="0" cellpadding="0">
|
||||
<tbody>
|
||||
<tr id="projectrow">
|
||||
<td id="projectalign">
|
||||
<div id="projectname">Direct3D 12 Memory Allocator
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
<!-- end header part -->
|
||||
<!-- Generated by Doxygen 1.10.0 -->
|
||||
<script type="text/javascript">
|
||||
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
||||
var searchBox = new SearchBox("searchBox", "search/",'.html');
|
||||
/* @license-end */
|
||||
</script>
|
||||
<script type="text/javascript" src="menudata.js"></script>
|
||||
<script type="text/javascript" src="menu.js"></script>
|
||||
<script type="text/javascript">
|
||||
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&dn=expat.txt MIT */
|
||||
$(function() {
|
||||
initMenu('',true,false,'search.php','Search');
|
||||
$(function() { init_search(); });
|
||||
});
|
||||
/* @license-end */
|
||||
</script>
|
||||
<div id="main-nav"></div>
|
||||
</div><!-- top -->
|
||||
<!-- window showing the filter options -->
|
||||
<div id="MSearchSelectWindow"
|
||||
onmouseover="return searchBox.OnSearchSelectShow()"
|
||||
onmouseout="return searchBox.OnSearchSelectHide()"
|
||||
onkeydown="return searchBox.OnSearchSelectKey(event)">
|
||||
</div>
|
||||
|
||||
<!-- iframe showing the search results (closed by default) -->
|
||||
<div id="MSearchResultsWindow">
|
||||
<div id="MSearchResults">
|
||||
<div class="SRPage">
|
||||
<div id="SRIndex">
|
||||
<div id="SRResults"></div>
|
||||
<div class="SRStatus" id="Loading">Loading...</div>
|
||||
<div class="SRStatus" id="Searching">Searching...</div>
|
||||
<div class="SRStatus" id="NoMatches">No Matches</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="header">
|
||||
<div class="headertitle"><div class="title">Class List</div></div>
|
||||
</div><!--header-->
|
||||
<div class="contents">
|
||||
<div class="textblock">Here are the classes, structs, unions and interfaces with brief descriptions:</div><div class="directory">
|
||||
<div class="levels">[detail level <span onclick="javascript:dynsection.toggleLevel(1);">1</span><span onclick="javascript:dynsection.toggleLevel(2);">2</span>]</div><table class="directory">
|
||||
<tr id="row_0_" class="even"><td class="entry"><span style="width:0px;display:inline-block;"> </span><span id="arr_0_" class="arrow" onclick="dynsection.toggleFolder('0_')">▼</span><span class="icona"><span class="icon">N</span></span><a class="el" href="namespace_d3_d12_m_a.html" target="_self">D3D12MA</a></td><td class="desc"></td></tr>
|
||||
<tr id="row_0_0_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_allocation.html" target="_self">Allocation</a></td><td class="desc">Represents single memory allocation </td></tr>
|
||||
<tr id="row_0_1_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___c_a_l_l_b_a_c_k_s.html" target="_self">ALLOCATION_CALLBACKS</a></td><td class="desc">Custom callbacks to CPU memory allocation functions </td></tr>
|
||||
<tr id="row_0_2_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">ALLOCATION_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocation.html" title="Represents single memory allocation.">D3D12MA::Allocation</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aa37d6b9fe8ea0864f7a35b9d68e8345a" title="Allocates memory and creates a D3D12 resource (buffer or texture). This is the main allocation functi...">Allocator::CreateResource</a> </td></tr>
|
||||
<tr id="row_0_3_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_allocator.html" target="_self">Allocator</a></td><td class="desc">Represents main object of this library initialized for particular <code>ID3D12Device</code> </td></tr>
|
||||
<tr id="row_0_4_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_a_l_l_o_c_a_t_o_r___d_e_s_c.html" target="_self">ALLOCATOR_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_allocator.html" title="Represents main object of this library initialized for particular ID3D12Device.">Allocator</a> object. To be used with <a class="el" href="namespace_d3_d12_m_a.html#ab7a1cd1683986d75ce1488b0920f4cb0" title="Creates new main D3D12MA::Allocator object and returns it through ppAllocator.">CreateAllocator()</a> </td></tr>
|
||||
<tr id="row_0_5_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_budget.html" target="_self">Budget</a></td><td class="desc">Statistics of current memory usage and available budget for a specific memory segment group </td></tr>
|
||||
<tr id="row_0_6_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___d_e_s_c.html" target="_self">DEFRAGMENTATION_DESC</a></td><td class="desc">Parameters for defragmentation </td></tr>
|
||||
<tr id="row_0_7_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___m_o_v_e.html" target="_self">DEFRAGMENTATION_MOVE</a></td><td class="desc">Single move of an allocation to be done for defragmentation </td></tr>
|
||||
<tr id="row_0_8_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___p_a_s_s___m_o_v_e___i_n_f_o.html" target="_self">DEFRAGMENTATION_PASS_MOVE_INFO</a></td><td class="desc">Parameters for incremental defragmentation steps </td></tr>
|
||||
<tr id="row_0_9_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_d_e_f_r_a_g_m_e_n_t_a_t_i_o_n___s_t_a_t_s.html" target="_self">DEFRAGMENTATION_STATS</a></td><td class="desc">Statistics returned for defragmentation process by function <a class="el" href="class_d3_d12_m_a_1_1_defragmentation_context.html#a1c21c26f47dcbf8f4e562063a3e25f38" title="Returns statistics of the defragmentation performed so far.">DefragmentationContext::GetStats()</a> </td></tr>
|
||||
<tr id="row_0_10_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_defragmentation_context.html" target="_self">DefragmentationContext</a></td><td class="desc">Represents defragmentation process in progress </td></tr>
|
||||
<tr id="row_0_11_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_detailed_statistics.html" target="_self">DetailedStatistics</a></td><td class="desc">More detailed statistics than <a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" title="Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group,...">D3D12MA::Statistics</a> </td></tr>
|
||||
<tr id="row_0_12_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_pool.html" target="_self">Pool</a></td><td class="desc">Custom memory pool </td></tr>
|
||||
<tr id="row_0_13_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_p_o_o_l___d_e_s_c.html" target="_self">POOL_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_pool.html" title="Custom memory pool.">D3D12MA::Pool</a> object. To be used with <a class="el" href="class_d3_d12_m_a_1_1_allocator.html#aac7b1f6bf53cbf4c4ce2264cb72ca515" title="Creates custom pool.">D3D12MA::Allocator::CreatePool</a> </td></tr>
|
||||
<tr id="row_0_14_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_statistics.html" target="_self">Statistics</a></td><td class="desc">Calculated statistics of memory usage e.g. in a specific memory heap type, memory segment group, custom pool, or total </td></tr>
|
||||
<tr id="row_0_15_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_total_statistics.html" target="_self">TotalStatistics</a></td><td class="desc">General statistics from current state of the allocator - total memory usage across all memory heaps and segments </td></tr>
|
||||
<tr id="row_0_16_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___d_e_s_c.html" target="_self">VIRTUAL_ALLOCATION_DESC</a></td><td class="desc">Parameters of created virtual allocation to be passed to <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#a9281daf76e888ea1bd5247d5732e8179" title="Creates new allocation.">VirtualBlock::Allocate()</a> </td></tr>
|
||||
<tr id="row_0_17_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___a_l_l_o_c_a_t_i_o_n___i_n_f_o.html" target="_self">VIRTUAL_ALLOCATION_INFO</a></td><td class="desc">Parameters of an existing virtual allocation, returned by <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html#ac605dce05ca0d411e46079f0bad765d1" title="Returns information about an allocation - its offset, size and custom pointer.">VirtualBlock::GetAllocationInfo()</a> </td></tr>
|
||||
<tr id="row_0_18_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_v_i_r_t_u_a_l___b_l_o_c_k___d_e_s_c.html" target="_self">VIRTUAL_BLOCK_DESC</a></td><td class="desc">Parameters of created <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">D3D12MA::VirtualBlock</a> object to be passed to <a class="el" href="namespace_d3_d12_m_a.html#ab024647ae85ee63e2fa2c1c4beac6d98" title="Creates new D3D12MA::VirtualBlock object and returns it through ppVirtualBlock.">CreateVirtualBlock()</a> </td></tr>
|
||||
<tr id="row_0_19_" class="even"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="struct_d3_d12_m_a_1_1_virtual_allocation.html" target="_self">VirtualAllocation</a></td><td class="desc">Represents single memory allocation done inside <a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" title="Represents pure allocation algorithm and a data structure with allocations in some memory block,...">VirtualBlock</a> </td></tr>
|
||||
<tr id="row_0_20_" class="odd"><td class="entry"><span style="width:32px;display:inline-block;"> </span><span class="icona"><span class="icon">C</span></span><a class="el" href="class_d3_d12_m_a_1_1_virtual_block.html" target="_self">VirtualBlock</a></td><td class="desc">Represents pure allocation algorithm and a data structure with allocations in some memory block, without actually allocating any GPU memory </td></tr>
|
||||
</table>
|
||||
</div><!-- directory -->
|
||||
</div><!-- contents -->
|
||||
<!-- start footer part -->
|
||||
<hr class="footer"/><address class="footer"><small>
|
||||
Generated by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.10.0
|
||||
</small></address>
|
||||
</body>
|
||||
</html>
|
||||
|
After Width: | Height: | Size: 676 B |