// Vita3K emulator project // Copyright (C) 2025 Vita3K team // // This program 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 2 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; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #include "../SceDisplay/SceDisplay.h" #include #include #include #include #include TRACY_MODULE_NAME(SceSharedFB); typedef struct SceSharedFbInfo { // size is 0x58 Ptr base1; // cdram base int memsize; Ptr base2; // cdram base int unk_0C; Ptr unk_10; int unk_14; int unk_18; int unk_1C; int unk_20; int pitch; // 960 int width; // 960 int height; // 544 SceGxmColorFormat color_format; // SCE_GXM_COLOR_FORMAT_U8U8U8U8_ABGR int curbuf; int unk_38; int unk_3C; int unk_40; int unk_44; int vsync; int unk_4C; int unk_50; int unk_54; } SceSharedFbInfo; struct SharedFbState { SceSharedFbInfo info; }; LIBRARY_INIT(SceSharedFb) { emuenv.kernel.obj_store.create(); } DECL_EXPORT(int, sceSharedFbCreate, int smth); EXPORT(int, _sceSharedFbOpen, int smth) { TRACY_FUNC(_sceSharedFbOpen, smth); STUBBED("sceSharedFbCreate"); return CALL_EXPORT(sceSharedFbCreate, smth); } EXPORT(int, sceSharedFbBegin, int id, SceSharedFbInfo *info) { TRACY_FUNC(sceSharedFbBegin, id, info); SharedFbState *state = emuenv.kernel.obj_store.get(); state->info.curbuf = 1; *info = state->info; return 0; } EXPORT(int, sceSharedFbClose) { return UNIMPLEMENTED(); } EXPORT(int, sceSharedFbCreate, int smth) { TRACY_FUNC(sceSharedFbCreate, smth); SharedFbState *state = emuenv.kernel.obj_store.get(); if (state->info.memsize == 0) { // enough memory for 2 956x544 buffers constexpr uint32_t alloc_size = 4 * 1024 * 512 * 2; Ptr data = Ptr(alloc(emuenv.mem, alloc_size, "sharedFB")); state->info = SceSharedFbInfo{ .base1 = data, .memsize = alloc_size, .base2 = data + alloc_size / 2, .pitch = 960, .width = 960, .height = 544, .color_format = SCE_GXM_COLOR_FORMAT_U8U8U8U8_ABGR, .curbuf = 1, }; } return 1; } EXPORT(int, sceSharedFbDelete) { return UNIMPLEMENTED(); } EXPORT(int, sceSharedFbEnd) { TRACY_FUNC(sceSharedFbEnd); SharedFbState *state = emuenv.kernel.obj_store.get(); Ptr data = (state->info.curbuf == 0) ? state->info.base2 : state->info.base1; // tell the display a new buffer is ready SceDisplayFrameBuf frame_buf{ .size = sizeof(SceDisplayFrameBuf), .base = data, .pitch = 960, .width = 960, .height = 544 }; return CALL_EXPORT(_sceDisplaySetFrameBuf, &frame_buf, SCE_DISPLAY_SETBUF_NEXTFRAME, nullptr); } EXPORT(int, sceSharedFbGetInfo, int id, SceSharedFbInfo *info) { TRACY_FUNC(sceSharedFbGetInfo); SharedFbState *state = emuenv.kernel.obj_store.get(); *info = state->info; return 0; } EXPORT(int, sceSharedFbGetRenderingInfo) { return UNIMPLEMENTED(); } EXPORT(int, sceSharedFbGetShellRenderPort) { return UNIMPLEMENTED(); } EXPORT(int, sceSharedFbUpdateProcess) { return UNIMPLEMENTED(); } EXPORT(int, sceSharedFbUpdateProcessBegin) { return UNIMPLEMENTED(); } EXPORT(int, sceSharedFbUpdateProcessEnd) { return UNIMPLEMENTED(); }