Files
Andrea de26b0e2c4 Add linked-cabinet networking through RetroArch Netplay
Simulate the Model 3 network board in the Libretro core and carry its
frames over RetroArch Netplay's packet interface
(RETRO_ENVIRONMENT_SET_NETPACKET_INTERFACE), so linked cabinets can play
together without the standalone socket board.

Supported families: Daytona USA 2, Harley-Davidson, Scud Race, Sega
Rally 2, Ski Champ, Spikeout and Spikeout Final Edition (Type 1); Le
Mans 24, Virtual On 2 and Dirt Devils (Type 2). Two to sixteen cabinets,
with a handshake, a common roster, role checks and a per-frame exchange
with a timeout. New options: Network Board (connected by default) and
Linked Cabinets (2-16).

Squashed from these commits, whose intermediate steps (Daytona 2 only,
then Scud Race, then all Type 1, then Type 2) have no value on their own:
  e7ea7d48b0 Add experimental Daytona 2 cabinet networking
  437256ddbb Add experimental Scud Race cabinet networking
  c4f012958a Recognize linked-cabinet network hardware
  d43eda03ec Enable Sega Rally 2 network transport
  55b59bbcb3 Support multi-cabinet linked play
  bc3788aea7 Enable netpacket transport for all Type 1 games
  f7029c25f6 Add Type 2 linked-cabinet transport
  03ee7631c0 Connect the network board by default
  ad99627b37 Document all supported linked-cabinet families
  74da0c469b Document linked-cabinet role requirements (option text)

Adapted on dev:
- The game-aware NVRAM settings options are not on dev, so each
  cabinet's link role (Master/Slave/Satellite) and car or machine number
  are set in the game's Service Menu, as on real cabinets; the option
  descriptions say so. Option visibility per game is left out.
- The NetBoard config defaults were only defined for Windows; they are
  now defined on every platform, and NetworkCabinets uses unsigned
  bounds so it compiles.
- Network, NetworkCabinets and SimulateNet are applied after the
  Supermodel.ini merge, like the other core options.
- jni/Android.mk gets -DNET_BOARD and the new source file.
- The README part of 74da0c4 waits for the dev README.

Tested: Linux, two RetroArch 1.22.2 instances over localhost Netplay:
Daytona 2 (Type 1) and Le Mans 24 (Type 2) link as Master and Slave and
exchange frames; Daytona 2 races show the other cabinet's car at full
speed. Single player with the board connected and no Netplay: Daytona 2,
Scud Race, Sega Rally 2 and Le Mans 24 boot to attract mode as before,
same speed and log. Windows, macOS, RPi5 and Android arm64 (ndk-build)
builds pass.
2026-11-10 03:26:50 +02:00

161 lines
6.4 KiB
Makefile

LOCAL_PATH := $(call my-dir)
CORE_DIR := $(LOCAL_PATH)/..
COMM_DIR := $(CORE_DIR)/Src/OSD/libretro/libretro-common
DEPS_DIR := $(CORE_DIR)/deps
GIT_VERSION := $(shell git -C $(CORE_DIR) rev-parse --short HEAD 2>/dev/null || echo unknown)
COREFLAGS := \
-DANDROID -D__LIBRETRO__ -DSUPERMODEL_OSD_LIBRETRO -DNET_BOARD -DPSS_STYLE=1 \
-D_FILE_OFFSET_BITS=64 -D_POSIX_C_SOURCE=200809L -D_GNU_SOURCE \
-DEGL_EGLEXT_PROTOTYPES \
-DGLES -Dgles -DHAVE_OPENGLES=1 -DHAVE_OPENGLES3=1 -DCORE_GLES -D__glext_h_ -D__GLEXT_H_ \
-DGIT_VERSION=\"$(GIT_VERSION)\" \
-O3 -DNDEBUG \
-ffunction-sections -fdata-sections \
-Wno-write-strings \
-I$(CORE_DIR) \
-I$(DEPS_DIR)/ugui \
-I$(COMM_DIR)/include \
-I$(CORE_DIR)/Src/OSD/libretro/include \
-I$(CORE_DIR)/Src/OSD/libretro \
-I$(CORE_DIR)/Src \
-I$(CORE_DIR)/Src/CPU/68K/Musashi \
-I$(CORE_DIR)/Src/CPU/68K/Musashi/generated \
-I$(CORE_DIR)/Src/OSD/Android/include
SOURCES_C := \
$(CORE_DIR)/Src/Pkgs/unzip.c \
$(CORE_DIR)/Src/Pkgs/ioapi.c \
$(CORE_DIR)/Src/CPU/68K/Musashi/m68kcpu.c \
$(CORE_DIR)/Src/CPU/68K/Musashi/generated/m68kops.c \
$(CORE_DIR)/Src/CPU/68K/Musashi/generated/m68kopac.c \
$(CORE_DIR)/Src/CPU/68K/Musashi/generated/m68kopdm.c \
$(CORE_DIR)/Src/CPU/68K/Musashi/generated/m68kopnz.c \
$(DEPS_DIR)/ugui/ugui.c \
$(CORE_DIR)/Src/ugui_tools.c \
$(COMM_DIR)/streams/file_stream.c \
$(COMM_DIR)/streams/file_stream_transforms.c \
$(COMM_DIR)/file/file_path.c \
$(COMM_DIR)/file/file_path_io.c \
$(COMM_DIR)/file/retro_dirent.c \
$(COMM_DIR)/vfs/vfs_implementation.c \
$(COMM_DIR)/lists/dir_list.c \
$(COMM_DIR)/lists/string_list.c \
$(COMM_DIR)/string/stdstring.c \
$(COMM_DIR)/compat/compat_strl.c \
$(COMM_DIR)/compat/fopen_utf8.c \
$(COMM_DIR)/compat/compat_strcasestr.c \
$(COMM_DIR)/compat/compat_posix_string.c \
$(COMM_DIR)/encodings/encoding_utf.c \
$(COMM_DIR)/memmap/memalign.c \
$(COMM_DIR)/time/rtime.c \
$(COMM_DIR)/hash/rhash.c \
$(COMM_DIR)/glsym/glsym_es3.c
SOURCES_CXX := \
$(CORE_DIR)/Src/CPU/PowerPC/PPCDisasm.cpp \
$(CORE_DIR)/Src/BlockFile.cpp \
$(CORE_DIR)/Src/Model3/93C46.cpp \
$(CORE_DIR)/Src/Util/BitRegister.cpp \
$(CORE_DIR)/Src/Model3/JTAG.cpp \
$(CORE_DIR)/Src/Pkgs/imgui/imgui.cpp \
$(CORE_DIR)/Src/Pkgs/imgui/imgui_draw.cpp \
$(CORE_DIR)/Src/Pkgs/imgui/imgui_tables.cpp \
$(CORE_DIR)/Src/Pkgs/imgui/imgui_widgets.cpp \
$(CORE_DIR)/Src/Pkgs/imgui/imgui_impl_opengl3.cpp \
$(CORE_DIR)/Src/Graphics/Shader.cpp \
$(CORE_DIR)/Src/Graphics/GLSLVersion.cpp \
$(CORE_DIR)/Src/Model3/Real3D.cpp \
$(CORE_DIR)/Src/Graphics/New3D/New3D.cpp \
$(CORE_DIR)/Src/Graphics/New3D/Mat4.cpp \
$(CORE_DIR)/Src/Graphics/New3D/Model.cpp \
$(CORE_DIR)/Src/Graphics/New3D/PolyHeader.cpp \
$(CORE_DIR)/Src/Graphics/New3D/TextureBank.cpp \
$(CORE_DIR)/Src/Graphics/New3D/VBO.cpp \
$(CORE_DIR)/Src/Graphics/New3D/Vec.cpp \
$(CORE_DIR)/Src/Graphics/New3D/R3DShader.cpp \
$(CORE_DIR)/Src/Graphics/New3D/R3DFloat.cpp \
$(CORE_DIR)/Src/Graphics/New3D/R3DScrollFog.cpp \
$(CORE_DIR)/Src/Graphics/New3D/R3DFrameBuffers.cpp \
$(CORE_DIR)/Src/Graphics/New3D/GLSLShader.cpp \
$(CORE_DIR)/Src/Graphics/FBO.cpp \
$(CORE_DIR)/Src/Graphics/SuperAA.cpp \
$(CORE_DIR)/Src/Graphics/Render2D.cpp \
$(CORE_DIR)/Src/Model3/TileGen.cpp \
$(CORE_DIR)/Src/Model3/Model3.cpp \
$(CORE_DIR)/Src/CPU/PowerPC/ppc.cpp \
$(CORE_DIR)/Src/Model3/SoundBoard.cpp \
$(CORE_DIR)/Src/Sound/SCSP.cpp \
$(CORE_DIR)/Src/Sound/SCSPDSP.cpp \
$(CORE_DIR)/Src/CPU/68K/68K.cpp \
$(CORE_DIR)/Src/Model3/DSB.cpp \
$(CORE_DIR)/Src/CPU/Z80/Z80.cpp \
$(CORE_DIR)/Src/Model3/IRQ.cpp \
$(CORE_DIR)/Src/Model3/53C810.cpp \
$(CORE_DIR)/Src/Model3/PCI.cpp \
$(CORE_DIR)/Src/Model3/RTC72421.cpp \
$(CORE_DIR)/Src/Model3/DriveBoard/DriveBoard.cpp \
$(CORE_DIR)/Src/Model3/DriveBoard/WheelBoard.cpp \
$(CORE_DIR)/Src/Model3/DriveBoard/JoystickBoard.cpp \
$(CORE_DIR)/Src/Model3/DriveBoard/SkiBoard.cpp \
$(CORE_DIR)/Src/Model3/DriveBoard/BillBoard.cpp \
$(CORE_DIR)/Src/Model3/DriveBoard/Z80CTC.cpp \
$(CORE_DIR)/Src/Model3/MPC10x.cpp \
$(CORE_DIR)/Src/Inputs/Input.cpp \
$(CORE_DIR)/Src/Inputs/Inputs.cpp \
$(CORE_DIR)/Src/Inputs/InputSource.cpp \
$(CORE_DIR)/Src/Inputs/InputSystem.cpp \
$(CORE_DIR)/Src/Inputs/InputTypes.cpp \
$(CORE_DIR)/Src/Inputs/MultiInputSource.cpp \
$(CORE_DIR)/Src/OSD/Outputs.cpp \
$(CORE_DIR)/Src/Sound/MPEG/MpegAudio.cpp \
$(CORE_DIR)/Src/Model3/Crypto.cpp \
$(CORE_DIR)/Src/OSD/Logger.cpp \
$(CORE_DIR)/Src/Util/Format.cpp \
$(CORE_DIR)/Src/Util/NewConfig.cpp \
$(CORE_DIR)/Src/Util/ByteSwap.cpp \
$(CORE_DIR)/Src/Util/ConfigBuilders.cpp \
$(CORE_DIR)/Src/GameLoader.cpp \
$(CORE_DIR)/Src/Pkgs/tinyxml2.cpp \
$(CORE_DIR)/Src/ROMSet.cpp \
$(CORE_DIR)/Src/OSD/libretro/libretroAudio.cpp \
$(CORE_DIR)/Src/OSD/libretro/libretroThread.cpp \
$(CORE_DIR)/Src/OSD/libretro/libretroCrosshair.cpp \
$(CORE_DIR)/Src/OSD/libretro/libretroGui.cpp \
$(CORE_DIR)/Src/OSD/libretro/LibretroBlockFileMemory.cpp \
$(CORE_DIR)/Src/OSD/libretro/CLibretroInputSystem.cpp \
$(CORE_DIR)/Src/OSD/libretro/CLibretroOutputSystem.cpp \
$(CORE_DIR)/Src/OSD/libretro/LibretroNetBoard.cpp \
$(CORE_DIR)/Src/OSD/libretro/LibretroWrapper.cpp \
$(CORE_DIR)/Src/OSD/libretro/vfs_ioapi.cpp \
$(CORE_DIR)/Src/OSD/libretro/libretro.cpp \
$(CORE_DIR)/Src/OSD/Unix/FileSystemPath.cpp
include $(CLEAR_VARS)
LOCAL_MODULE := retro
LOCAL_SRC_FILES := $(SOURCES_C) $(SOURCES_CXX)
LOCAL_CFLAGS := $(COREFLAGS)
LOCAL_CXXFLAGS := $(COREFLAGS) -std=c++17
LOCAL_LDFLAGS := -Wl,--no-undefined -Wl,-version-script,$(CORE_DIR)/link.T
LOCAL_LDLIBS := -lGLESv3 -llog -lz
# arm64-v8a: JIT dynarec + NEON
ifeq ($(TARGET_ARCH_ABI),arm64-v8a)
LOCAL_SRC_FILES += $(CORE_DIR)/Src/CPU/PowerPC/Jit/JitArm64.cpp
LOCAL_CFLAGS += -DHAVE_PPC_JIT -DHAVE_NEON -D__ARM_NEON__
LOCAL_CXXFLAGS += -DHAVE_PPC_JIT -DHAVE_NEON -D__ARM_NEON__
endif
# armeabi-v7a: NEON
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a)
LOCAL_ARM_NEON := true
LOCAL_CFLAGS += -DHAVE_NEON -D__ARM_NEON__ -march=armv7-a -mfloat-abi=softfp -mfpu=neon
LOCAL_CXXFLAGS += -DHAVE_NEON -D__ARM_NEON__ -march=armv7-a -mfloat-abi=softfp -mfpu=neon
endif
include $(BUILD_SHARED_LIBRARY)