From e040afd35dec99857e52accca9ef7b6c15dbbdb5 Mon Sep 17 00:00:00 2001 From: Francisco Javier Trujillo Mata Date: Sat, 23 Nov 2019 17:34:35 +0100 Subject: Make PSP version to render the image it-self instead of using RetroArch --- libretro.c | 43 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 41 insertions(+), 2 deletions(-) (limited to 'libretro.c') diff --git a/libretro.c b/libretro.c index f35599b..a7255e7 100644 --- a/libretro.c +++ b/libretro.c @@ -93,6 +93,46 @@ static inline void deinit_context_switch(void) co_delete(cpu_thread); } +static uint32_t next_pow2(uint32_t v) +{ + v--; + v |= v >> 1; + v |= v >> 2; + v |= v >> 4; + v |= v >> 8; + v |= v >> 16; + v++; + return v; +} + +static void video_run(void) { +#if defined(PSP) + static unsigned int __attribute__((aligned(16))) d_list[32]; + void* texture_vram_p = NULL; + int texture_size = (GBA_SCREEN_WIDTH*GBA_SCREEN_HEIGHT*2); + + texture_vram_p = (void*) (0x44200000 - texture_size); /* max VRAM address - frame size */ + + sceKernelDcacheWritebackRange(gba_screen_pixels, texture_size); + + sceGuStart(GU_DIRECT, d_list); + sceGuTexMode(GU_PSM_5650, 0, 0, GU_FALSE); + sceGuCopyImage(GU_PSM_5650, 0, 0, GBA_SCREEN_WIDTH, GBA_SCREEN_HEIGHT, GBA_SCREEN_WIDTH, + gba_screen_pixels, 0, 0, GBA_SCREEN_WIDTH, texture_vram_p); + sceGuTexImage(0, next_pow2(GBA_SCREEN_WIDTH), next_pow2(GBA_SCREEN_HEIGHT), GBA_SCREEN_WIDTH, texture_vram_p); + sceGuTexFunc(GU_TFX_REPLACE, GU_TCC_RGB); + sceGuDisable(GU_BLEND); + + sceGuFinish(); + + video_cb(texture_vram_p, GBA_SCREEN_WIDTH, GBA_SCREEN_HEIGHT, + GBA_SCREEN_PITCH * 2); +#else + video_cb(gba_screen_pixels, GBA_SCREEN_WIDTH, GBA_SCREEN_HEIGHT, + GBA_SCREEN_PITCH * 2); +#endif +} + #ifdef PERF_TEST extern struct retro_perf_callback perf_cb; @@ -585,8 +625,7 @@ void retro_run(void) render_audio(); - video_cb(gba_screen_pixels, GBA_SCREEN_WIDTH, GBA_SCREEN_HEIGHT, - GBA_SCREEN_PITCH * 2); + video_run(); if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE_UPDATE, &updated) && updated) check_variables(0); -- cgit v1.2.3