D2R (Diablo II Resurrected) has no profile and its code could not run here: the host-call svcs its cuts emitted only died, the touch-run-v4 rule set needed a missing dm/PRODUCT, and the host files its hooks called were never in this repository. Removed with it: - rewriter: D2R cuts, observation gates and parameter slots, the touch-run-v4 rule set and private gates, the boot list, the cut scope column and the KRES / KASPECT key slots (fixups.tsv keeps the four thread slots; no params.tsv any more); dm/tools/product.sh - host: D2R save edits, add-on content, render-scale controller, time() takeover and Terror Zone clock, crash decoding at D2R offsets, host-call registry and stubs, i18n, UI-screen, shell-app loader, zero-stripped archives, boot profiling hooks with no implementation; D2R headers, tests and scripts; dm/ios/Sources/dm_touch_controls; dm/third_party/libdeflate - graphics: runtime extrapolation, world freeze, iPad UI shift, shop drag image, brightness LUT, visual ruler, bloom / FXAA shader hashes, DM_GFXUSE, the eco-fps setting, the loading-screen gate; shader_map.py, nometal_run.py, nvn_slots.py, nvn_slots.tsv and the PC-texture samples The legacy frame step (frame_step legacy, DM_FRAME_STEP) is retired: the Breath of the Wild and Tears of the Kingdom stubs lose their mode test. Breath of the Wild's interval-controller cuts stay: the framework keeps the controller's interval while the game's VFR override holds. patch_nso.py output is byte-identical for all 15 games on this machine except the two frame-step stubs; all 18 profiles build; the host tests pass (their Makefile now builds the general tests only).
48 lines
3.8 KiB
Makefile
48 lines
3.8 KiB
Makefile
# Game profile (dm/games/<id>/): the host is built for it (make GAME=base game title ID, required: there is no default game). game_profile.h is generated from game.tsv into gen/<id>/, dmsh_chain.h lives in the profile folder
|
|
# without GAME only clean and a bare make (whose default goal only builds libvpx) pass; anything else stops and lists the profiles
|
|
ifeq ($(strip $(GAME)),)
|
|
ifneq ($(filter-out clean,$(MAKECMDGOALS)),)
|
|
$(error GAME is not set: make GAME=<base game title ID>: $(shell python3 ../games/game.py list | awk -F'\t' '{printf "%s (%s) ", $$1, $$3}'))
|
|
endif
|
|
endif
|
|
# A profile outside the repository (DM_GAMES_DIR, e.g. the NSP script's provisional profile) is reached through the symlink gen/<id>/profile: make cannot take paths with spaces.
|
|
# DM_GAMES_FIRST=1 (the NSP script's --provisional) takes it even when dm/games has the game
|
|
ifneq ($(strip $(GAME)),)
|
|
GAME_DIR := $(if $(and $(wildcard ../games/$(GAME)/game.tsv),$(if $(DM_GAMES_FIRST),,1)),../games/$(GAME),$(shell python3 ../games/game.py link $(GAME) gen/$(GAME)/profile >&2 && echo gen/$(GAME)/profile))
|
|
ifeq ($(GAME_DIR),)
|
|
$(error no game profile $(GAME) (neither in dm/games nor in DM_GAMES_DIR))
|
|
endif
|
|
endif
|
|
GAME_H = gen/$(GAME)/game_profile.h
|
|
CFLAGS=-O1 -g -Wall -Wno-unused-function
|
|
# Service-layer takeover hle_*.c files are included by wildcard: adding a file does not touch this line (avoids merge conflicts)
|
|
SRC=main.c loader.c hle.c crash.c probe.c thread.c memstat.m $(sort $(wildcard hle_*.c)) front_mac.m entry.S
|
|
# NVN null device + nn::vi + the Vulkan layer (dm/gfx/)
|
|
# Sources under dm/gfx, dm/gfx/nvn, dm/gfx/tex and dm/gfx/vk are included by wildcard (tests/ and metal/ do not go into the host): adding a file does not touch this line
|
|
GFX=$(sort $(wildcard ../gfx/*.c ../gfx/nvn/*.c ../gfx/nvn/*.m ../gfx/nvn/*.S ../gfx/tex/*.c ../gfx/tex/*.m ../gfx/vk/*.m))
|
|
GFX_H=$(sort $(wildcard ../gfx/nvn/*.h ../gfx/nvn/include/*.h ../gfx/tex/*.h))
|
|
# Third party: libvpx ships only the VP9 decoder's sources (movie decoding, hle_movie.c), with its configuration headers in config/ (arm64, shared by Mac and iOS). Built separately into a static library, file by file, so host changes do not recompile it
|
|
VPX=../third_party/libvpx
|
|
VPX_SRC=$(sort $(shell find $(VPX) -name '*.c'))
|
|
VPX_OBJ=$(patsubst $(VPX)/%.c,gen/vpx/%.o,$(VPX_SRC))
|
|
VPX_LIB=gen/vpx/libvpx.a
|
|
gen/vpx/%.o: $(VPX)/%.c $(wildcard $(VPX)/config/*.h)
|
|
@mkdir -p $(dir $@)
|
|
clang -O2 -g -I$(VPX) -I$(VPX)/config -c $< -o $@
|
|
$(VPX_LIB): $(VPX_OBJ)
|
|
rm -f $@; ar rcs $@ $^
|
|
.DEFAULT_GOAL := dmhost # The header generation rules are written first below, so the default goal must be stated explicitly (otherwise make only generates the headers and does not build the host)
|
|
.PHONY: game_profile
|
|
game_profile: $(GAME_H)
|
|
# Regenerated on every make (FORCE): the same GAME can come from another profile folder (DM_GAMES_FIRST), whose game.tsv may be older than the header; game.py writes it only when it changes
|
|
$(GAME_H): $(GAME_DIR)/game.tsv ../games/game.py FORCE
|
|
@python3 ../games/game.py header $(GAME) $@
|
|
# Records which game the host was built for: changing GAME changes the stamp's content and rebuilds the host (otherwise make sees dmhost as newer than both headers and keeps the other game's host)
|
|
GAME_STAMP = gen/game.stamp
|
|
$(GAME_STAMP): FORCE
|
|
@mkdir -p gen; echo $(GAME) | cmp -s - $@ || echo $(GAME) > $@
|
|
.PHONY: FORCE
|
|
FORCE:
|
|
dmhost: $(SRC) $(GFX) dm.h hle.h dm_input.h front.h $(GFX_H) $(GAME_H) $(GAME_DIR)/dmsh_chain.h $(GAME_STAMP) $(VPX_LIB)
|
|
clang $(CFLAGS) -I../gfx/nvn/include -I../third_party/vulkan-headers/include -I$(dir $(GAME_H)) -I$(GAME_DIR) -I$(VPX) -I../third_party/stb_vorbis -fobjc-arc -o $@ $(SRC) $(GFX) $(VPX_LIB) -framework Cocoa -framework QuartzCore -framework Metal -framework AudioToolbox -framework VideoToolbox -framework CoreMedia -framework CoreVideo -framework ImageIO -framework UniformTypeIdentifiers
|