summaryrefslogtreecommitdiff
path: root/libretro.c
diff options
context:
space:
mode:
authorFrancisco Javier Trujillo Mata2019-11-23 17:34:35 +0100
committerFrancisco Javier Trujillo Mata2019-11-23 17:34:35 +0100
commite040afd35dec99857e52accca9ef7b6c15dbbdb5 (patch)
treec668946a8b4311b73e91bf9d7042e7d6636c0f6e /libretro.c
parent5afe4c2a3974d6e48a977db85f7aab75e8bcc3d3 (diff)
downloadpicogpsp-e040afd35dec99857e52accca9ef7b6c15dbbdb5.tar.gz
picogpsp-e040afd35dec99857e52accca9ef7b6c15dbbdb5.tar.bz2
picogpsp-e040afd35dec99857e52accca9ef7b6c15dbbdb5.zip
Make PSP version to render the image it-self instead of using RetroArch
Diffstat (limited to 'libretro.c')
-rw-r--r--libretro.c43
1 files changed, 41 insertions, 2 deletions
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);