#include #include #include "ps2gs.h" #include "ps2base.h" static Ps2Base *Base; static int Release() { Base->release(); } static int Acquire() { Base->acquire(); } int Ps2Base::release() { if (g_vpu1) ps2_vpu_close(g_vpu1); if (g_vpu0) ps2_vpu_close(g_vpu0); if (g_fd_gs >= 0) ps2_gs_close(); g_vpu1 = NULL; g_vpu0 = NULL; g_fd_gs = -1; doExtraRelease(); return PS2_GS_VC_REL_SUCCESS; } int Ps2Base::acquire() { g_fd_gs = ps2_gs_open(-1); g_vpu0 = ps2_vpu_open(0); g_vpu1 = ps2_vpu_open(1); if (g_fd_gs < 0 || g_vpu0 == NULL || g_vpu1 == NULL) { release(); return PS2_GS_VC_ACQ_FAILURE; } ps2_vpu_reset(g_vpu1); ps2_vpu_reset(g_vpu0); ps2_gs_reset(0, g_inter, g_out_mode, g_ff_mode, g_resolution, g_refresh_rate); doExtraAcquire(); return PS2_GS_VC_ACQ_SUCCESS; } Ps2Base::Ps2Base() { if( Base!=NULL ) throw( "Hey - Ps2Base is meant to be a singleton!\n" ); Base = this; gp = ps2_gs_get_gparam(); g_fd_gs = ps2_gs_open(-1); g_vpu0 = ps2_vpu_open(0); // must be opened for vpu1... g_vpu1 = ps2_vpu_open(1); } void Ps2Base::doExtraAcquire() { } void Ps2Base::doExtraRelease() { } void Ps2Base::usage(const char *msg1, const char *msg2, const char *MoreUsage ) { if (msg1) fprintf(stderr, "%s: %s %s\n", g_program_name, msg1, msg2 ? msg2 : ""); fprintf(stderr, "Usage: %s %s [] [] [] [] [] [] []\n", g_program_name, MoreUsage ); fprintf(stderr, " ii: interlace or noninterlace\n" " -inter, -nointer\n" " mode: video mode\n" " -ntsc, -pal, -dtv, -vesa\n" " ff: field/frame mode\n" " -frame, -field\n" " reso: resolution\n" " -640x480, -800x600, -1024x768\n" " rate: refresh rate\n" " -60, -75\n" " bpp: color bits per pixel\n" " -16, -24, -32\n" " z-bpp: depth bits per pixel\n" " -z0, -z16, -z24\n" ); exit(1); } void Ps2Base::parseCommandLine(int argc, char *argv[], bool (*ParseExtraOption)( const char *option ), const char *Usage ) { g_program_name = argv[0]; g_inter = PS2_GS_NOINTERLACE; g_out_mode = PS2_GS_VESA; g_ff_mode = PS2_GS_FRAME; g_resolution = PS2_GS_640x480; g_refresh_rate = PS2_GS_60Hz; g_psm = PS2_GS_PSMCT32; g_zpsm = PS2_GS_PSMZ24; g_zbits = 24; for (int i = 1; i < argc; i++) { char *p = argv[i]; if (strcmp(p, "-inter") == 0) g_inter = PS2_GS_INTERLACE; else if (strcmp(p, "-nointer") == 0) g_inter = PS2_GS_NOINTERLACE; else if (strcmp(p, "-ntsc") == 0) g_out_mode = PS2_GS_NTSC; else if (strcmp(p, "-pal") == 0) g_out_mode = PS2_GS_PAL; else if (strcmp(p, "-dtv") == 0) g_out_mode = PS2_GS_DTV; else if (strcmp(p, "-vesa") == 0) g_out_mode = PS2_GS_VESA; else if (strcmp(p, "-frame") == 0) g_ff_mode = PS2_GS_FRAME; else if (strcmp(p, "-field") == 0) g_ff_mode = PS2_GS_FIELD; else if (strcmp(p, "-640x480") == 0) g_resolution = PS2_GS_640x480; else if (strcmp(p, "-800x600") == 0) g_resolution = PS2_GS_800x600; else if (strcmp(p, "-1024x768") == 0) g_resolution = PS2_GS_1024x768; else if (strcmp(p, "-1280x1024") == 0) g_resolution = PS2_GS_1280x1024; else if (strcmp(p, "-60") == 0) g_refresh_rate = PS2_GS_60Hz; else if (strcmp(p, "-75") == 0) g_refresh_rate = PS2_GS_75Hz; else if (strcmp(p, "-32") == 0) g_psm = PS2_GS_PSMCT32; else if (strcmp(p, "-24") == 0) g_psm = PS2_GS_PSMCT24; else if (strcmp(p, "-16") == 0) g_psm = PS2_GS_PSMCT16S; else if (strcmp(p, "-z24") == 0) { g_zpsm = PS2_GS_PSMZ24; g_zbits = 24; } else if (strcmp(p, "-z16") == 0) { g_zpsm = PS2_GS_PSMZ16S; g_zbits = 16; } else if (strcmp(p, "-z0") == 0) { g_zpsm = PS2_GS_PSMZ24; g_zbits = 0; } else if (!ParseExtraOption || !ParseExtraOption( p )) { usage("illegal option", p, Usage ); } } if (g_psm == PS2_GS_PSMCT16S && g_zpsm == PS2_GS_PSMZ16) { g_psm = PS2_GS_PSMCT16; g_zpsm = PS2_GS_PSMZ16; } } void Ps2Base::gsEnableVcSwitch() { ps2_gs_vc_enablevcswitch( Acquire, Release); } void Ps2Base::gsStartDisplay() { ps2_gs_start_display(1); } void TexEnv::draw( ps2_image *image, int width, int height, __u64 alpha ) { ps2_gs_set_texenv(&gs_tex, 0, image, width, height, 0, 0, 0, 0, 1); PS2_GIFTAG_CLEAR_TAG(&giftag); giftag.NLOOP = (sizeof(TexEnv) - sizeof(ps2_giftag)) / 16; // or sizeof(texenv) / 16 - 1; (main.c) giftag.EOP = 1; giftag.NREG = 1; giftag.REGS0 = PS2_GIFTAG_REGS_AD; ps2_gs_set_alphaenv(&gs_alpha, 0); *(__u64 *)&gs_alpha.alpha1 = alpha; *(__u64 *)&gs_test = PS2_GS_SETREG_TEST(0, 0, 0, 0, 0, 0, 1, PS2_GS_TEST_ZTST_ALWAYS); gs_test1addr = PS2_GS_TEST_1; ps2_gs_put_drawenv(&giftag); } void TexEnv::draw2( ps2_image *image, int width, int height, __u64 alpha, __u64 test ) { ps2_gs_set_texenv(&gs_tex, 0, image, width, height, 0, 0, 0, 0, 1); PS2_GIFTAG_CLEAR_TAG(&giftag); giftag.NLOOP = (sizeof(TexEnv) - sizeof(ps2_giftag)) / 16; // or sizeof(texenv) / 16 - 1; (main.c) giftag.EOP = 1; giftag.PRE = 0; // check what this is? giftag.NREG = 1; giftag.REGS0 = PS2_GIFTAG_REGS_AD; ps2_gs_set_alphaenv(&gs_alpha, 0); *(__u64 *)&gs_alpha.alpha1 = alpha; *(__u64 *)&gs_test = test; *(__u64 *)&gs_tex.clamp1 = PS2_GS_SETREG_CLAMP(0, 0, 0, 0, 0, 0); // check gs_test1addr = PS2_GS_TEST_1; ps2_gs_put_drawenv(&giftag); }