diff --git a/samples/test_agc_imports/Makefile b/samples/test_agc_imports/Makefile new file mode 100644 index 00000000..1a54f24a --- /dev/null +++ b/samples/test_agc_imports/Makefile @@ -0,0 +1,48 @@ +# Copyright (C) 2023 John Törnblom +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; see the file COPYING. If not see +# . + +PS5_HOST ?= ps5 +PS5_PORT ?= 9021 + +ifdef PS5_PAYLOAD_SDK + include $(PS5_PAYLOAD_SDK)/toolchain/prospero.mk +else + $(error PS5_PAYLOAD_SDK is undefined) +endif + +ELF := test_agc_imports.elf + +CFLAGS := -Wall -Werror -g -lSceAgc -lSceAgcDriver + +all: $(ELF) + +$(ELF): main.c + $(CC) $(CFLAGS) -o $@ $^ + +clean: + rm -f $(ELF) + +test: $(ELF) + $(PS5_DEPLOY) -h $(PS5_HOST) -p $(PS5_PORT) $^ + +debug: $(ELF) + gdb-multiarch \ + -ex "set architecture i386:x86-64" \ + -ex "target extended-remote $(PS5_HOST):2159" \ + -ex "file $(ELF)" \ + -ex "remote put $(ELF) /data/$(ELF)" \ + -ex "set remote exec-file /data/$(ELF)" \ + -ex "start" diff --git a/samples/test_agc_imports/main.c b/samples/test_agc_imports/main.c new file mode 100644 index 00000000..63a453a7 --- /dev/null +++ b/samples/test_agc_imports/main.c @@ -0,0 +1,72 @@ +/* Copyright (C) 2026 Mihawk + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +#include + +/* Only addresses are used here; this sample does not call these functions. */ +extern void sceAgcCbReleaseMem(void); +extern void sceAgcCbSetShRegisterRangeDirect(void); +extern void sceAgcCreateShader(void); +extern void sceAgcDcbDrawIndex(void); +extern void sceAgcDcbDrawIndexAuto(void); +extern void sceAgcDcbSetCxRegistersIndirect(void); +extern void sceAgcDcbSetFlip(void); +extern void sceAgcDcbSetIndexBuffer(void); +extern void sceAgcDcbSetIndexCount(void); +extern void sceAgcDcbSetIndexSize(void); +extern void sceAgcDcbSetNumInstances(void); +extern void sceAgcDcbSetShRegistersIndirect(void); +extern void sceAgcDcbSetUcRegistersIndirect(void); +extern void sceAgcGetRegisterDefaults(void); +extern void sceAgcInit(void); +extern void sceAgcLinkShaders(void); +extern void sceAgcSuspendPoint(void); +extern void sceAgcDriverGetHsOffchipParam(void); +extern void sceAgcDriverGetTFRing(void); +extern void sceAgcDriverGetWaitRenderingPacketSizeInDwords(void); +extern void sceAgcDriverSetHsOffchipParam(void); +extern void sceAgcDriverSetTFRing(void); +extern void sceAgcDriverSubmitDcb(void); +extern void sceAgcDriverWaitUntilSafeForRendering(void); + +static const struct { + const char *name; + void (*address)(void); +} imports[] = { + {"sceAgcCbReleaseMem", sceAgcCbReleaseMem}, + {"sceAgcCbSetShRegisterRangeDirect", sceAgcCbSetShRegisterRangeDirect}, + {"sceAgcCreateShader", sceAgcCreateShader}, + {"sceAgcDcbDrawIndex", sceAgcDcbDrawIndex}, + {"sceAgcDcbDrawIndexAuto", sceAgcDcbDrawIndexAuto}, + {"sceAgcDcbSetCxRegistersIndirect", sceAgcDcbSetCxRegistersIndirect}, + {"sceAgcDcbSetFlip", sceAgcDcbSetFlip}, + {"sceAgcDcbSetIndexBuffer", sceAgcDcbSetIndexBuffer}, + {"sceAgcDcbSetIndexCount", sceAgcDcbSetIndexCount}, + {"sceAgcDcbSetIndexSize", sceAgcDcbSetIndexSize}, + {"sceAgcDcbSetNumInstances", sceAgcDcbSetNumInstances}, + {"sceAgcDcbSetShRegistersIndirect", sceAgcDcbSetShRegistersIndirect}, + {"sceAgcDcbSetUcRegistersIndirect", sceAgcDcbSetUcRegistersIndirect}, + {"sceAgcGetRegisterDefaults", sceAgcGetRegisterDefaults}, + {"sceAgcInit", sceAgcInit}, + {"sceAgcLinkShaders", sceAgcLinkShaders}, + {"sceAgcSuspendPoint", sceAgcSuspendPoint}, + {"sceAgcDriverGetHsOffchipParam", sceAgcDriverGetHsOffchipParam}, + {"sceAgcDriverGetTFRing", sceAgcDriverGetTFRing}, + {"sceAgcDriverGetWaitRenderingPacketSizeInDwords", sceAgcDriverGetWaitRenderingPacketSizeInDwords}, + {"sceAgcDriverSetHsOffchipParam", sceAgcDriverSetHsOffchipParam}, + {"sceAgcDriverSetTFRing", sceAgcDriverSetTFRing}, + {"sceAgcDriverSubmitDcb", sceAgcDriverSubmitDcb}, + {"sceAgcDriverWaitUntilSafeForRendering", sceAgcDriverWaitUntilSafeForRendering}, +}; + +int +main(void) { + for(unsigned i = 0; i < sizeof(imports) / sizeof(imports[0]); i++) { + printf("%s: %p\n", imports[i].name, (void *)imports[i].address); + if(!imports[i].address) { + return 1; + } + } + return 0; +} diff --git a/sce_stubs/libSceAgc.c b/sce_stubs/libSceAgc.c new file mode 100644 index 00000000..6d54b4b5 --- /dev/null +++ b/sce_stubs/libSceAgc.c @@ -0,0 +1,73 @@ +/* Copyright (C) 2026 Mihawk + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/* Link-time symbols only; implementations are provided by the system module. */ + +asm(".global sceAgcCbReleaseMem\n" + ".type sceAgcCbReleaseMem @function\n" + "sceAgcCbReleaseMem:\n"); + +asm(".global sceAgcCbSetShRegisterRangeDirect\n" + ".type sceAgcCbSetShRegisterRangeDirect @function\n" + "sceAgcCbSetShRegisterRangeDirect:\n"); + +asm(".global sceAgcCreateShader\n" + ".type sceAgcCreateShader @function\n" + "sceAgcCreateShader:\n"); + +asm(".global sceAgcDcbDrawIndex\n" + ".type sceAgcDcbDrawIndex @function\n" + "sceAgcDcbDrawIndex:\n"); + +asm(".global sceAgcDcbDrawIndexAuto\n" + ".type sceAgcDcbDrawIndexAuto @function\n" + "sceAgcDcbDrawIndexAuto:\n"); + +asm(".global sceAgcDcbSetCxRegistersIndirect\n" + ".type sceAgcDcbSetCxRegistersIndirect @function\n" + "sceAgcDcbSetCxRegistersIndirect:\n"); + +asm(".global sceAgcDcbSetFlip\n" + ".type sceAgcDcbSetFlip @function\n" + "sceAgcDcbSetFlip:\n"); + +asm(".global sceAgcDcbSetIndexBuffer\n" + ".type sceAgcDcbSetIndexBuffer @function\n" + "sceAgcDcbSetIndexBuffer:\n"); + +asm(".global sceAgcDcbSetIndexCount\n" + ".type sceAgcDcbSetIndexCount @function\n" + "sceAgcDcbSetIndexCount:\n"); + +asm(".global sceAgcDcbSetIndexSize\n" + ".type sceAgcDcbSetIndexSize @function\n" + "sceAgcDcbSetIndexSize:\n"); + +asm(".global sceAgcDcbSetNumInstances\n" + ".type sceAgcDcbSetNumInstances @function\n" + "sceAgcDcbSetNumInstances:\n"); + +asm(".global sceAgcDcbSetShRegistersIndirect\n" + ".type sceAgcDcbSetShRegistersIndirect @function\n" + "sceAgcDcbSetShRegistersIndirect:\n"); + +asm(".global sceAgcDcbSetUcRegistersIndirect\n" + ".type sceAgcDcbSetUcRegistersIndirect @function\n" + "sceAgcDcbSetUcRegistersIndirect:\n"); + +asm(".global sceAgcGetRegisterDefaults\n" + ".type sceAgcGetRegisterDefaults @function\n" + "sceAgcGetRegisterDefaults:\n"); + +asm(".global sceAgcInit\n" + ".type sceAgcInit @function\n" + "sceAgcInit:\n"); + +asm(".global sceAgcLinkShaders\n" + ".type sceAgcLinkShaders @function\n" + "sceAgcLinkShaders:\n"); + +asm(".global sceAgcSuspendPoint\n" + ".type sceAgcSuspendPoint @function\n" + "sceAgcSuspendPoint:\n"); diff --git a/sce_stubs/libSceAgcDriver.c b/sce_stubs/libSceAgcDriver.c new file mode 100644 index 00000000..fdc42992 --- /dev/null +++ b/sce_stubs/libSceAgcDriver.c @@ -0,0 +1,33 @@ +/* Copyright (C) 2026 Mihawk + * SPDX-License-Identifier: GPL-3.0-or-later + */ + +/* Link-time symbols only; implementations are provided by the system module. */ + +asm(".global sceAgcDriverGetHsOffchipParam\n" + ".type sceAgcDriverGetHsOffchipParam @function\n" + "sceAgcDriverGetHsOffchipParam:\n"); + +asm(".global sceAgcDriverGetTFRing\n" + ".type sceAgcDriverGetTFRing @function\n" + "sceAgcDriverGetTFRing:\n"); + +asm(".global sceAgcDriverGetWaitRenderingPacketSizeInDwords\n" + ".type sceAgcDriverGetWaitRenderingPacketSizeInDwords @function\n" + "sceAgcDriverGetWaitRenderingPacketSizeInDwords:\n"); + +asm(".global sceAgcDriverSetHsOffchipParam\n" + ".type sceAgcDriverSetHsOffchipParam @function\n" + "sceAgcDriverSetHsOffchipParam:\n"); + +asm(".global sceAgcDriverSetTFRing\n" + ".type sceAgcDriverSetTFRing @function\n" + "sceAgcDriverSetTFRing:\n"); + +asm(".global sceAgcDriverSubmitDcb\n" + ".type sceAgcDriverSubmitDcb @function\n" + "sceAgcDriverSubmitDcb:\n"); + +asm(".global sceAgcDriverWaitUntilSafeForRendering\n" + ".type sceAgcDriverWaitUntilSafeForRendering @function\n" + "sceAgcDriverWaitUntilSafeForRendering:\n");