diff --git a/Makefile.libretro b/Makefile.libretro index ba86af4..140b874 100644 --- a/Makefile.libretro +++ b/Makefile.libretro @@ -14,6 +14,7 @@ filter_out1 = $(filter-out $(firstword $1),$1) filter_out2 = $(call filter_out1,$(call filter_out1,$1)) unixpath = $(subst \,/,$1) unixcygpath = /$(subst :,,$(call unixpath,$1)) +RETROARCH_OBJECTS := ifeq ($(platform),) platform = unix @@ -163,10 +164,13 @@ else ifeq ($(platform), ps2) FCEU_DEFINES := -DPATH_MAX=1024 -DINLINE=inline -DPSS_STYLE=1 -DFCEU_VERSION_NUMERIC=9813 -DHAVE_ASPRINTF ENDIANNESS_DEFINES := -DLSB_FIRST -DLOCAL_LE=1 PLATFORM_DEFINES := -DPS2 -G0 -DFRONTEND_SUPPORTS_ABGR1555 -DRENDER_GSKIT_PS2 + PLATFORM_DEFINES += -Dmemcpy=mips_memcpy -Dmemset=mips_memset PLATFORM_DEFINES += -I$(PS2SDK)/ee/include -I$(PS2SDK)/common/include -Ips2/ -I$(PS2DEV)/gsKit/include STATIC_LINKING=1 EXTERNAL_ZLIB=1 + RETROARCH_OBJECTS += ps2/SMS_Utils.o + # PSP else ifeq ($(platform), psp1) TARGET := $(TARGET_NAME)_libretro_$(platform).a @@ -672,6 +676,7 @@ include Makefile.common CFLAGS += -DWANT_GRIFFIN OBJECTS := $(SOURCES_C:.c=.o) +OBJECTS += $(RETROARCH_OBJECTS) DEFINES := $(COREDEFINES) $(PLATFORM_DEFINES) @@ -739,6 +744,11 @@ endif %.o: %.c $(CC) -c $(OBJOUT)$@ $< $(CFLAGS) $(INCFLAGS) +ifeq ($(platform), ps2) +%.o: %.s + ee-as -G0 $< -o $@ +endif + clean-objs: rm -f $(OBJECTS) diff --git a/ps2/SMS_Utils.s b/ps2/SMS_Utils.s new file mode 100644 index 0000000..e437356 --- /dev/null +++ b/ps2/SMS_Utils.s @@ -0,0 +1,202 @@ +/* +# ___ _ _ ___ +# | | | | | +# ___| | | ___| PS2DEV Open Source Project. +#---------------------------------------------------------- +# MUL64 is pulled from some binary library (I don't remember which one). +# mips_memcpy routine is pulled from 'sde' library from MIPS. +# +*/ +.set noat +.set noreorder +.set nomacro + +.globl MUL64 +.globl mips_memcpy +.globl mips_memset + +.text + +MUL64: + pmultuw $v0, $a0, $a1 + dsra32 $a2, $a0, 0 + dsra32 $v1, $a1, 0 + mult $v1, $a0, $v1 + mult1 $a2, $a2, $a1 + addu $v1, $v1, $a2 + dsll32 $v1, $v1, 0 + jr $ra + daddu $v0, $v0, $v1 + +mips_memcpy: + addu $v0, $a0, $zero + beqz $a2, 1f + sltiu $t2, $a2, 12 + bnez $t2, 2f + xor $v1, $a1, $a0 + andi $v1, $v1, 7 + negu $a3, $a0 + beqz $v1, 3f + andi $a3, $a3, 7 + beqz $a3, 4f + subu $a2, $a2, $a3 + ldr $v1, 0($a1) + ldl $v1, 7($a1) + addu $a1, $a1, $a3 + sdr $v1, 0($a0) + addu $a0, $a0, $a3 +4: + andi $v1, $a2, 31 + subu $a3, $a2, $v1 + beqz $a3, 5f + addu $a2, $v1, $zero + addu $a3, $a3, $a1 +6: + ldr $v1, 0($a1) + ldl $v1, 7($a1) + ldr $t0, 8($a1) + ldl $t0, 15($a1) + ldr $t1, 16($a1) + ldl $t1, 23($a1) + ldr $t2, 24($a1) + ldl $t2, 31($a1) + sd $v1, 0($a0) + sd $t0, 8($a0) + sd $t1, 16($a0) + addiu $a1, $a1, 32 + addiu $a0, $a0, 32 + bne $a1, $a3, 6b + sd $t2, -8($a0) +5: + andi $v1, $a2, 7 + subu $a3, $a2, $v1 + beqz $a3, 2f + addu $a2, $v1, $zero + addu $a3, $a3, $a1 +7: + ldr $v1, 0($a1) + ldl $v1, 7($a1) + addiu $a1, $a1, 8 + addiu $a0, $a0, 8 + nop + bne $a1, $a3, 7b + sd $v1, -8($a0) + beq $zero, $zero, 2f + nop +3: + beqz $a3, 8f + subu $a2, $a2, $a3 + ldr $v1, 0($a1) + addu $a1, $a1, $a3 + sdr $v1, 0($a0) + addu $a0, $a0, $a3 +8: + andi $v1, $a2, 31 + subu $a3, $a2, $v1 + beqz $a3, 9f + addu $a2, $v1, $zero + addu $a3, $a3, $a1 +10: + ld $v1, 0($a1) + ld $t0, 8($a1) + ld $t1, 16($a1) + ld $t2, 24($a1) + sd $v1, 0($a0) + sd $t0, 8($a0) + sd $t1, 16($a0) + addiu $a1, $a1, 32 + addiu $a0, $a0, 32 + bne $a1, $a3, 10b + sd $t2, -8($a0) +9: + andi $v1, $a2, 7 + subu $a3, $a2, $v1 + beqz $a3, 2f + addu $a2, $v1, $zero + addu $a3, $a3, $a1 +11: + ld $v1, 0($a1) + addiu $a1, $a1, 8 + addiu $a0, $a0, 8 + nop + nop + bne $a1, $a3, 11b + sd $v1, -8($a0) +2: + beqz $a2, 1f + addu $a3, $a2, $a1 +12: + lbu $v1, 0($a1) + addiu $a1, $a1, 1 + addiu $a0, $a0, 1 + nop + nop + bne $a1, $a3, 12b + sb $v1, -1($a0) +1: + jr $ra + nop + +mips_memset: + beqz $a2, 1f + sltiu $at, $a2, 16 + bnez $at, 2f + andi $a1, $a1, 0xFF + dsll $at, $a1, 0x8 + or $a1, $a1, $at + dsll $at, $a1, 0x10 + or $a1, $a1, $at + dsll32 $at, $a1, 0x0 + or $a1, $a1, $at + andi $v1, $a0, 0x7 + beqz $v1, 3f + li $a3, 8 + subu $a3, $a3, $v1 + subu $a2, $a2, $a3 + sdr $a1, 0($a0) + addu $a0, $a0, $a3 +3: + andi $v1, $a2, 0x1f + subu $a3, $a2, $v1 + beqz $a3, 4f + move $a2, $v1 + addu $a3, $a3, $a0 +5: + sd $a1, 0($a0) + sd $a1, 8($a0) + sd $a1, 16($a0) + addiu $a0, $a0, 32 + sd $a1, -8($a0) + bne $a0, $a3, 5b +4: + andi $v1, $a2, 0x7 + subu $a3, $a2, $v1 + beqz $a3, 2f + move $a2, $v1 + addu $a3, $a3, $a0 +6: + addiu $a0, $a0, 8 + beq $a0, $a3, 2f + sd $a1, -8($a0) + addiu $a0, $a0, 8 + beq $a0, $a3, 2f + sd $a1, -8($a0) + addiu $a0, $a0, 8 + bne $a0, $a3, 6b + sd $a1, -8($a0) +2: + beqz $a2, 1f + addu $a3, $a2, $a0 +7: + addiu $a0, $a0, 1 + beq $a0, $a3, 1f + sb $a1, -1($a0) + addiu $a0, $a0, 1 + beq $a0, $a3, 1f + sb $a1, -1($a0) + addiu $a0, $a0, 1 + bne $a0, $a3, 7b + sb $a1, -1($a0) +1: + jr $ra + nop diff --git a/src/drivers/libretro/libretro-common/include/libretro_gskit_ps2.h b/src/drivers/libretro/libretro-common/include/libretro_gskit_ps2.h index e1e978d..f7b61dc 100644 --- a/src/drivers/libretro/libretro-common/include/libretro_gskit_ps2.h +++ b/src/drivers/libretro/libretro-common/include/libretro_gskit_ps2.h @@ -35,6 +35,16 @@ #define RETRO_HW_RENDER_INTERFACE_GSKIT_PS2_VERSION 1 +struct retro_hw_ps2_insets +{ + float top; + float left; + float bottom; + float right; +}; + +#define empty_ps2_insets (struct retro_hw_ps2_insets){0.f, 0.f, 0.f, 0.f} + struct retro_hw_render_interface_gskit_ps2 { /* Must be set to RETRO_HW_RENDER_INTERFACE_GSKIT_PS2. */ @@ -48,6 +58,8 @@ struct retro_hw_render_interface_gskit_ps2 */ GSTEXTURE *coreTexture; bool clearTexture; + bool updatedPalette; + struct retro_hw_ps2_insets padding; }; typedef struct retro_hw_render_interface_gskit_ps2 RETRO_HW_RENDER_INTEFACE_GSKIT_PS2; diff --git a/src/drivers/libretro/libretro.c b/src/drivers/libretro/libretro.c index cc6cfb0..aad2752 100644 --- a/src/drivers/libretro/libretro.c +++ b/src/drivers/libretro/libretro.c @@ -55,6 +55,10 @@ void* linearMemAlign(size_t size, size_t alignment); void linearFree(void* mem); #endif +#if defined(RENDER_GSKIT_PS2) +RETRO_HW_RENDER_INTEFACE_GSKIT_PS2 *ps2 = NULL; +#endif + static retro_video_refresh_t video_cb = NULL; static retro_input_poll_t poll_cb = NULL; static retro_input_state_t input_cb = NULL; @@ -1564,42 +1568,31 @@ static void retro_run_blit(uint8_t *gfx) video_cb(texture_vram_p, width, height, 256); #elif defined(RENDER_GSKIT_PS2) - - RETRO_HW_RENDER_INTEFACE_GSKIT_PS2 *ps2 = NULL; uint32_t *buf = (uint32_t *)RETRO_HW_FRAME_BUFFER_VALID; - incr += (overscan_h ? 16 : 0); - width -= (overscan_h ? 16 : 0); - height -= (overscan_v ? 16 : 0); - pitch -= (overscan_h ? 32 : 0); - gfx += (overscan_v ? ((overscan_h ? 8 : 0) + 256 * 8) : (overscan_h ? 8 : 0)); + if (!ps2) { + if (!environ_cb(RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE, (void **)&ps2) || !ps2) { + printf("Failed to get HW rendering interface!\n"); + return; + } - if (!environ_cb(RETRO_ENVIRONMENT_GET_HW_RENDER_INTERFACE, (void **)&ps2) || !ps2) { - printf("Failed to get HW rendering interface!\n"); - return; - } + if (ps2->interface_version != RETRO_HW_RENDER_INTERFACE_GSKIT_PS2_VERSION) { + printf("HW render interface mismatch, expected %u, got %u!\n", + RETRO_HW_RENDER_INTERFACE_GSKIT_PS2_VERSION, ps2->interface_version); + return; + } - if (ps2->interface_version != RETRO_HW_RENDER_INTERFACE_GSKIT_PS2_VERSION) { - printf("HW render interface mismatch, expected %u, got %u!\n", - RETRO_HW_RENDER_INTERFACE_GSKIT_PS2_VERSION, ps2->interface_version); - return; - } - - if (ps2->clearTexture || !ps2->coreTexture->Clut || !ps2->coreTexture->Mem ) { - /* If it is empty we need to create it */ ps2->coreTexture->Width = width; ps2->coreTexture->Height = height; ps2->coreTexture->PSM = GS_PSM_T8; ps2->coreTexture->ClutPSM = GS_PSM_CT16; ps2->coreTexture->Filter = GS_FILTER_LINEAR; + ps2->coreTexture->Clut = (u32*)retro_palette; + ps2->updatedPalette = true; + ps2->padding = (struct retro_hw_ps2_insets){8.0f, 8.0f, 8.0f, 8.0f}; } - for (y = 0; y < height; y++, gfx += incr) - for ( x = 0; x < width; x++, gfx++) - fceu_video_out[y * width + x] = *gfx; - - ps2->coreTexture->Clut = (u32*)retro_palette; - ps2->coreTexture->Mem = (u32*)fceu_video_out; + ps2->coreTexture->Mem = (u32*)gfx; video_cb(buf, width, height, pitch); #else