X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=frontend%2Flibretro.c;h=80dc8a9da944650568d4bef1c111a0e6cc4e1f36;hb=a3d87cd770ffb9b5bcbf519683ec7f29d67794e6;hp=26f36d42857007dfc4aaa2253e111c6508dde361;hpb=00274bf7d753021f93f7c29593084bed62b093c9;p=pcsx_rearmed.git diff --git a/frontend/libretro.c b/frontend/libretro.c index 26f36d42..80dc8a9d 100644 --- a/frontend/libretro.c +++ b/frontend/libretro.c @@ -80,7 +80,7 @@ static unsigned msg_interface_version = 0; static void *vout_buf; static void *vout_buf_ptr; -static int vout_width, vout_height; +static int vout_width = 256, vout_height = 240, vout_pitch = 256; static int vout_fb_dirty; static int psx_w, psx_h; static bool vout_can_dupe; @@ -145,7 +145,9 @@ int in_mouse[8][2]; int multitap1 = 0; int multitap2 = 0; int in_enable_vibration = 1; -int in_enable_crosshair[2] = { 0, 0 }; +static int in_enable_crosshair[2] = { 0, 0 }; +static int in_dualshock_analog_combo = 0; +static bool in_dualshock_toggling = false; // NegCon adjustment parameters // > The NegCon 'twist' action is somewhat awkward when mapped @@ -234,8 +236,13 @@ static void set_vout_fb() fb.height = vout_height; fb.access_flags = RETRO_MEMORY_ACCESS_WRITE; - if (environ_cb(RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER, &fb) && fb.format == RETRO_PIXEL_FORMAT_RGB565) - vout_buf_ptr = (uint16_t *)fb.data; + vout_pitch = vout_width; + if (environ_cb(RETRO_ENVIRONMENT_GET_CURRENT_SOFTWARE_FRAMEBUFFER, &fb) && fb.format == RETRO_PIXEL_FORMAT_RGB565) { + vout_buf_ptr = fb.data; + if (fb.pitch / 2 != vout_pitch && fb.pitch != vout_width * 2) + SysPrintf("got unusual pitch %zd for resolution %dx%d\n", fb.pitch, vout_width, vout_height); + vout_pitch = fb.pitch / 2; + } else vout_buf_ptr = vout_buf; } @@ -317,7 +324,7 @@ static void vout_flip(const void *vram, int stride, int bgr24, { unsigned short *dest = vout_buf_ptr; const unsigned short *src = vram; - int dstride = vout_width, h1 = h; + int dstride = vout_pitch, h1 = h; int port = 0; if (vram == NULL || dims_changed || (in_enable_crosshair[0] + in_enable_crosshair[1]) > 0) @@ -357,7 +364,7 @@ static void vout_flip(const void *vram, int stride, int bgr24, out: #ifndef FRONTEND_SUPPORTS_RGB565 - convert(vout_buf_ptr, vout_width * vout_height * 2); + convert(vout_buf_ptr, vout_pitch * vout_height * 2); #endif vout_fb_dirty = 1; pl_rearmed_cbs.flip_cnt++; @@ -395,6 +402,7 @@ void *pl_3ds_mmap(unsigned long addr, size_t size, int is_fixed, if ((custom_map->size == size) && (custom_map->tag == tag)) { uint32_t ptr_aligned, tmp; + void *ret; custom_map->buffer = malloc(size + 0x1000); ptr_aligned = (((u32)custom_map->buffer) + 0xFFF) & ~0xFFF; @@ -405,12 +413,14 @@ void *pl_3ds_mmap(unsigned long addr, size_t size, int is_fixed, exit(1); } - return (void *)custom_map->target_map; + ret = (void *)custom_map->target_map; + memset(ret, 0, size); + return ret; } } } - return malloc(size); + return calloc(size, 1); } void pl_3ds_munmap(void *ptr, size_t size, enum psxMapTag tag) @@ -476,6 +486,7 @@ int init_vita_mmap() custom_psx_maps[3].buffer = tmpaddr + 0x0900000; custom_psx_maps[4].buffer = tmpaddr + 0x1000000; custom_psx_maps[5].buffer = tmpaddr + 0x2000000; + memset(tmpaddr, 0, 0x2210000); #if 0 for(n = 0; n < 5; n++){ sceClibPrintf("addr reserved %x\n",custom_psx_maps[n].buffer); @@ -511,7 +522,7 @@ void *pl_vita_mmap(unsigned long addr, size_t size, int is_fixed, } } - return malloc(size); + return calloc(size, 1); } void pl_vita_munmap(void *ptr, size_t size, enum psxMapTag tag) @@ -976,8 +987,8 @@ void retro_get_system_info(struct retro_system_info *info) void retro_get_system_av_info(struct retro_system_av_info *info) { - unsigned geom_height = vout_height > 0 ? vout_height : 240; - unsigned geom_width = vout_width > 0 ? vout_width : 320; + unsigned geom_height = vout_height; + unsigned geom_width = vout_width; memset(info, 0, sizeof(*info)); info->timing.fps = is_pal_mode ? 50.0 : 60.0; @@ -2002,6 +2013,30 @@ static void update_variables(bool in_flight) in_enable_vibration = 1; } + var.value = NULL; + var.key = "pcsx_rearmed_analog_combo"; + + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + if (strcmp(var.value, "l1+r1+select") == 0) + in_dualshock_analog_combo = (1 << RETRO_DEVICE_ID_JOYPAD_L) | + (1 << RETRO_DEVICE_ID_JOYPAD_R) | (1 << RETRO_DEVICE_ID_JOYPAD_SELECT); + else if (strcmp(var.value, "l1+r1+start") == 0) + in_dualshock_analog_combo = (1 << RETRO_DEVICE_ID_JOYPAD_L) | + (1 << RETRO_DEVICE_ID_JOYPAD_R) | (1 << RETRO_DEVICE_ID_JOYPAD_START); + else if (strcmp(var.value, "l1+r1+l3") == 0) + in_dualshock_analog_combo = (1 << RETRO_DEVICE_ID_JOYPAD_L) | + (1 << RETRO_DEVICE_ID_JOYPAD_R) | (1 << RETRO_DEVICE_ID_JOYPAD_L3); + else if (strcmp(var.value, "l1+r1+r3") == 0) + in_dualshock_analog_combo = (1 << RETRO_DEVICE_ID_JOYPAD_L) | + (1 << RETRO_DEVICE_ID_JOYPAD_R) | (1 << RETRO_DEVICE_ID_JOYPAD_R3); + else if (strcmp(var.value, "l3+r3") == 0) + in_dualshock_analog_combo = (1 << RETRO_DEVICE_ID_JOYPAD_L3) | + (1 << RETRO_DEVICE_ID_JOYPAD_R3); + else + in_dualshock_analog_combo = 0; + } + var.value = NULL; var.key = "pcsx_rearmed_dithering"; @@ -2231,6 +2266,7 @@ static void update_variables(bool in_flight) spu_config.iUseInterpolation = 0; } +#if P_HAVE_PTHREAD var.value = NULL; var.key = "pcsx_rearmed_spu_thread"; if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) @@ -2240,7 +2276,9 @@ static void update_variables(bool in_flight) else spu_config.iUseThread = 0; } +#endif +#if 0 // currently disabled, see USE_READ_THREAD in libpcsxcore/cdriso.c if (P_HAVE_PTHREAD) { var.value = NULL; var.key = "pcsx_rearmed_async_cd"; @@ -2263,6 +2301,7 @@ static void update_variables(bool in_flight) } } } +#endif var.value = NULL; var.key = "pcsx_rearmed_noxadecoding"; @@ -2564,6 +2603,18 @@ static void update_variables(bool in_flight) mouse_sensitivity = atof(var.value); } + if (found_bios) + { + var.value = NULL; + var.key = "pcsx_rearmed_show_bios_bootlogo"; + if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) + { + Config.SlowBoot = 0; + if (strcmp(var.value, "enabled") == 0) + Config.SlowBoot = 1; + } + } + if (in_flight) { // inform core things about possible config changes @@ -2581,27 +2632,6 @@ static void update_variables(bool in_flight) /* dfinput_activate(); */ } - else - { - //not yet running - - //bootlogo display hack - if (found_bios) - { - var.value = NULL; - var.key = "pcsx_rearmed_show_bios_bootlogo"; - if (environ_cb(RETRO_ENVIRONMENT_GET_VARIABLE, &var) && var.value) - { - Config.SlowBoot = 0; - rebootemu = 0; - if (strcmp(var.value, "enabled") == 0) - { - Config.SlowBoot = 1; - rebootemu = 1; - } - } - } - } update_option_visibility(); } @@ -2859,13 +2889,13 @@ static void update_input_mouse(int port, int ret) static void update_input(void) { - // reset all keystate, query libretro for keystate int i; int j; + // reset all keystate, query libretro for keystate for (i = 0; i < PORTS_NUMBER; i++) { - int16_t ret = 0; + int32_t ret = 0; int type = in_type[i]; in_keystate[i] = 0; @@ -2874,7 +2904,11 @@ static void update_input(void) continue; if (libretro_supports_bitmasks) + { ret = input_state_cb(i, RETRO_DEVICE_JOYPAD, 0, RETRO_DEVICE_ID_JOYPAD_MASK); + // undo int16 sign extension (why input_state_cb returns int16 in the first place?) + ret &= (1 << (RETRO_DEVICE_ID_JOYPAD_R3 + 1)) - 1; + } else { for (j = 0; j < (RETRO_DEVICE_ID_JOYPAD_R3 + 1); j++) @@ -2899,7 +2933,23 @@ static void update_input(void) update_input_mouse(i, ret); break; default: - // Query digital inputs + // dualshock ANALOG toggle? + if (type == PSE_PAD_TYPE_ANALOGPAD && in_dualshock_analog_combo != 0 + && ret == in_dualshock_analog_combo) + { + if (!in_dualshock_toggling) + { + int state = padToggleAnalog(i); + char msg[32]; + snprintf(msg, sizeof(msg), "ANALOG %s", state ? "ON" : "OFF"); + show_notification(msg, 800, 1); + in_dualshock_toggling = true; + } + return; + } + in_dualshock_toggling = false; + + // Set digital inputs for (j = 0; j < RETRO_PSX_MAP_LEN; j++) if (ret & (1 << j)) in_keystate[i] |= retro_psx_map[j]; @@ -2972,6 +3022,7 @@ void retro_run(void) LoadCdrom(); } + set_vout_fb(); print_internal_fps(); /* Check whether current frame should @@ -3033,10 +3084,8 @@ void retro_run(void) } video_cb((vout_fb_dirty || !vout_can_dupe || !duping_enable) ? vout_buf_ptr : NULL, - vout_width, vout_height, vout_width * 2); + vout_width, vout_height, vout_pitch * 2); vout_fb_dirty = 0; - - set_vout_fb(); } static bool try_use_bios(const char *path, bool preferred_only) @@ -3294,8 +3343,10 @@ void retro_init(void) #elif defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L) && P_HAVE_POSIX_MEMALIGN if (posix_memalign(&vout_buf, 16, VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2) != 0) vout_buf = (void *) 0; + else + memset(vout_buf, 0, VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2); #else - vout_buf = malloc(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT * 2); + vout_buf = calloc(VOUT_MAX_WIDTH * VOUT_MAX_HEIGHT, 2); #endif vout_buf_ptr = vout_buf;