Add prim video support

main
Daniel Santos 2022-06-24 15:48:50 -03:00 committed by Sam Lantinga
parent 46f95a7a5f
commit a81aa99298
3 changed files with 157 additions and 3 deletions

View File

@ -3040,6 +3040,10 @@ if(APPLE)
target_compile_options(sdl-build-options INTERFACE "-fobjc-arc") target_compile_options(sdl-build-options INTERFACE "-fobjc-arc")
endif() endif()
if(PS2)
target_compile_options(sdl-build-options INTERFACE "-Wno-error=declaration-after-statement")
endif()
if(SDL_SHARED) if(SDL_SHARED)
add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES}) add_library(SDL2 SHARED ${SOURCE_FILES} ${VERSION_SOURCES})
add_dependencies(SDL2 sdl_headers_copy) add_dependencies(SDL2 sdl_headers_copy)

View File

@ -57,6 +57,9 @@ static void PS2_VideoQuit(_THIS);
/* PS2 driver bootstrap functions */ /* PS2 driver bootstrap functions */
static GSGLOBAL *gsGlobal = NULL;
static int vsync_sema_id = 0;
static void static void
PS2_DeleteDevice(SDL_VideoDevice * device) PS2_DeleteDevice(SDL_VideoDevice * device)
{ {
@ -96,17 +99,112 @@ VideoBootStrap PS2_bootstrap = {
}; };
/* PRIVATE METHODS */
static int vsync_handler()
{
iSignalSema(vsync_sema_id);
ExitHandler();
return 0;
}
/* Copy of gsKit_sync_flip, but without the 'flip' */
static void gsKit_sync(GSGLOBAL *gsGlobal)
{
if (!gsGlobal->FirstFrame) WaitSema(vsync_sema_id);
while (PollSema(vsync_sema_id) >= 0)
;
}
/* Copy of gsKit_sync_flip, but without the 'sync' */
static void gsKit_flip(GSGLOBAL *gsGlobal)
{
if (!gsGlobal->FirstFrame)
{
if (gsGlobal->DoubleBuffering == GS_SETTING_ON)
{
GS_SET_DISPFB2( gsGlobal->ScreenBuffer[
gsGlobal->ActiveBuffer & 1] / 8192,
gsGlobal->Width / 64, gsGlobal->PSM, 0, 0 );
gsGlobal->ActiveBuffer ^= 1;
}
}
gsKit_setactive(gsGlobal);
}
int int
PS2_VideoInit(_THIS) PS2_VideoInit(_THIS)
{ {
ee_sema_t sema;
sema.init_count = 0;
sema.max_count = 1;
sema.option = 0;
vsync_sema_id = CreateSema(&sema);
gsGlobal = gsKit_init_global();
gsGlobal->Mode = gsKit_check_rom();
if (gsGlobal->Mode == GS_MODE_PAL){
gsGlobal->Height = 512;
} else {
gsGlobal->Height = 448;
}
gsGlobal->PSM = GS_PSM_CT24;
gsGlobal->PSMZ = GS_PSMZ_16S;
gsGlobal->ZBuffering = GS_SETTING_OFF;
gsGlobal->DoubleBuffering = GS_SETTING_ON;
gsGlobal->PrimAlphaEnable = GS_SETTING_ON;
gsGlobal->Dithering = GS_SETTING_OFF;
gsKit_set_primalpha(gsGlobal, GS_SETREG_ALPHA(0, 1, 0, 1, 0), 0);
dmaKit_init(D_CTRL_RELE_OFF, D_CTRL_MFD_OFF, D_CTRL_STS_UNSPEC, D_CTRL_STD_OFF, D_CTRL_RCYC_8, 1 << DMA_CHANNEL_GIF);
dmaKit_chan_init(DMA_CHANNEL_GIF);
printf("\nGraphics: created %ix%i video surface\n",
gsGlobal->Width, gsGlobal->Height);
gsKit_set_clamp(gsGlobal, GS_CMODE_REPEAT);
gsKit_vram_clear(gsGlobal);
gsKit_init_screen(gsGlobal);
gsKit_TexManager_init(gsGlobal);
gsKit_add_vsync_handler(vsync_handler);
gsKit_mode_switch(gsGlobal, GS_ONESHOT);
gsKit_clear(gsGlobal, GS_SETREG_RGBAQ(0x80,0x00,0x00,0x80,0x00));
if (gsGlobal->DoubleBuffering == GS_SETTING_OFF) {
gsKit_sync(gsGlobal);
gsKit_queue_exec(gsGlobal);
} else {
gsKit_queue_exec(gsGlobal);
gsKit_finish();
gsKit_sync(gsGlobal);
gsKit_flip(gsGlobal);
}
gsKit_TexManager_nextFrame(gsGlobal);
SDL_DisplayMode mode; SDL_DisplayMode mode;
/* Use a fake 32-bpp desktop mode */ /* Use a fake 32-bpp desktop mode */
SDL_zero(mode); SDL_zero(mode);
mode.format = SDL_PIXELFORMAT_RGB888; mode.format = SDL_PIXELFORMAT_RGB888;
mode.w = 1024; mode.w = 640;
mode.h = 768; if (gsGlobal->Mode == GS_MODE_PAL){
mode.refresh_rate = 0; mode.h = 512;
} else {
mode.h = 448;
}
mode.refresh_rate = 60;
mode.driverdata = NULL; mode.driverdata = NULL;
if (SDL_AddBasicVideoDisplay(&mode) < 0) { if (SDL_AddBasicVideoDisplay(&mode) < 0) {
return -1; return -1;
@ -118,15 +216,59 @@ PS2_VideoInit(_THIS)
return 0; return 0;
} }
static int
SDL_to_PS2_PFM(Uint32 format)
{
switch (format) {
case SDL_PIXELFORMAT_RGBA5551:
return GS_PSM_CT16S;
case SDL_PIXELFORMAT_RGB24:
return GS_PSM_CT24;
case SDL_PIXELFORMAT_ABGR32:
return GS_PSM_CT32;
default:
return GS_PSM_CT24;
}
}
static int static int
PS2_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode) PS2_SetDisplayMode(_THIS, SDL_VideoDisplay * display, SDL_DisplayMode * mode)
{ {
gsGlobal->Mode = GS_MODE_NTSC;
gsGlobal->Width = mode->w;
if ((gsGlobal->Interlace == GS_INTERLACED) && (gsGlobal->Field == GS_FRAME))
gsGlobal->Height = mode->h / 2;
else
gsGlobal->Height = mode->h;
gsGlobal->PSM = SDL_to_PS2_PFM(mode->format);
gsGlobal->PSMZ = GS_PSMZ_16S;
gsGlobal->ZBuffering = GS_SETTING_OFF;
gsGlobal->DoubleBuffering = GS_SETTING_ON;
gsGlobal->PrimAlphaEnable = GS_SETTING_ON;
gsGlobal->Dithering = GS_SETTING_OFF;
gsGlobal->Interlace = GS_INTERLACED;
gsGlobal->Field = GS_FIELD;
gsKit_set_primalpha(gsGlobal, GS_SETREG_ALPHA(0, 1, 0, 1, 0), 0);
gsKit_set_clamp(gsGlobal, GS_CMODE_REPEAT);
gsKit_vram_clear(gsGlobal);
gsKit_init_screen(gsGlobal);
gsKit_set_display_offset(gsGlobal, -0.5f, -0.5f);
gsKit_sync_flip(gsGlobal);
gsKit_mode_switch(gsGlobal, GS_ONESHOT);
gsKit_clear(gsGlobal, GS_SETREG_RGBAQ(0x00,0x00,0x00,0x80,0x00));
return 0; return 0;
} }
void void
PS2_VideoQuit(_THIS) PS2_VideoQuit(_THIS)
{ {
gsKit_deinit_global(gsGlobal);
} }
#endif /* SDL_VIDEO_DRIVER_PS2 */ #endif /* SDL_VIDEO_DRIVER_PS2 */

View File

@ -25,6 +25,14 @@
#include "../SDL_sysvideo.h" #include "../SDL_sysvideo.h"
#include <kernel.h>
#include <gsKit.h>
#include <dmaKit.h>
#include <gsToolkit.h>
#include <gsInline.h>
#endif /* SDL_ps2video_h_ */ #endif /* SDL_ps2video_h_ */
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */