From 0968bcc173f17936470091bc43a0b07307452779 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 09:57:21 +0100 Subject: [PATCH 01/61] (menu_input_bind_dialog) Prevent warning --- menu/widgets/menu_input_bind_dialog.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/menu/widgets/menu_input_bind_dialog.c b/menu/widgets/menu_input_bind_dialog.c index c80206d09b..4bfb321dcf 100644 --- a/menu/widgets/menu_input_bind_dialog.c +++ b/menu/widgets/menu_input_bind_dialog.c @@ -381,16 +381,16 @@ bool menu_input_key_bind_set_min_max(menu_input_ctx_bind_limits_t *lim) bool menu_input_key_bind_iterate(menu_input_ctx_bind_t *bind) { - struct menu_bind_state binds; + struct menu_bind_state binds = {0}; /* single binds can have latching issues, * single_bind_delay = 0 (single bind not yet bound) * single_bind_delay = 1 (latching procedure) * single_bind_delay = 2 (second iteration, will quit iteration loop) */ static unsigned single_bind_delay = 0; - bool trigger_found = false; - bool timed_out = false; - settings_t *settings = config_get_ptr(); + bool trigger_found = false; + bool timed_out = false; + settings_t *settings = config_get_ptr(); rarch_timer_tick(&menu_input_binds.timer); From 6eac6a64471e81c1a4b01a73fbf753eee323d2d3 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 15:20:14 +0100 Subject: [PATCH 02/61] joy_idx goes through joypad_map now --- input/input_driver.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 562770edb3..50abb30827 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -289,7 +289,7 @@ void input_poll(void) if (bind_valid) { - joypad_info.joy_idx = i; + joypad_info.joy_idx = settings->input.joypad_map[i]; joypad_info.auto_binds = settings->input.autoconf_binds[i]; input_driver_turbo_btns.frame_enable[i] = current_input->input_state( @@ -383,7 +383,7 @@ int16_t input_state(unsigned port, unsigned device, if (bind_valid) { - joypad_info.joy_idx = port; + joypad_info.joy_idx = settings->input.joypad_map[port]; joypad_info.auto_binds = settings->input.autoconf_binds[port]; res = current_input->input_state( current_input_data, joypad_info, libretro_input_binds, port, device, idx, id); @@ -508,7 +508,7 @@ void state_tracker_update_input(uint16_t *input1, uint16_t *input2) if (binds[0][id].valid) { - joypad_info.joy_idx = 0; + joypad_info.joy_idx = settings->input.joypad_map[0]; joypad_info.auto_binds = settings->input.autoconf_binds[0]; *input1 |= (current_input->input_state(current_input_data, joypad_info, binds, @@ -516,7 +516,7 @@ void state_tracker_update_input(uint16_t *input1, uint16_t *input2) } if (binds[1][id].valid) { - joypad_info.joy_idx = 1; + joypad_info.joy_idx = settings->input.joypad_map[1]; joypad_info.auto_binds = settings->input.autoconf_binds[1]; *input2 |= (current_input->input_state(current_input_data, joypad_info, binds, @@ -559,7 +559,7 @@ static INLINE bool input_menu_keys_pressed_internal( const input_device_driver_t *sec = current_input->get_sec_joypad_driver ? current_input->get_sec_joypad_driver(current_input_data) : NULL; - joypad_info.joy_idx = port; + joypad_info.joy_idx = settings->input.joypad_map[port]; joypad_info.auto_binds = settings->input.autoconf_binds[port]; joypad_info.axis_threshold = settings->input.axis_threshold; @@ -710,7 +710,7 @@ uint64_t input_menu_keys_pressed( if (check_input_driver_block_hotkey(binds_norm, binds_auto)) { - joypad_info.joy_idx = 0; + joypad_info.joy_idx = settings->input.joypad_map[0]; joypad_info.auto_binds = settings->input.autoconf_binds[0]; if (settings->input.binds[0][RARCH_ENABLE_HOTKEY].valid @@ -826,7 +826,7 @@ static INLINE bool input_keys_pressed_internal( { bool bind_valid = binds[i].valid; - joypad_info.joy_idx = 0; + joypad_info.joy_idx = settings->input.joypad_map[0]; joypad_info.auto_binds = settings->input.autoconf_binds[0]; if (bind_valid && current_input->input_state(current_input_data, @@ -912,7 +912,7 @@ uint64_t input_keys_pressed( if (check_input_driver_block_hotkey(binds_norm, binds_auto)) { - joypad_info.joy_idx = 0; + joypad_info.joy_idx = settings->input.joypad_map[0]; joypad_info.auto_binds = settings->input.autoconf_binds[0]; if ( enable_hotkey_valid && current_input->input_state( @@ -930,7 +930,7 @@ uint64_t input_keys_pressed( if (check_input_driver_block_hotkey( focus_normal, focus_binds_auto) && game_focus_toggle_valid) { - joypad_info.joy_idx = 0; + joypad_info.joy_idx = settings->input.joypad_map[0]; joypad_info.auto_binds = settings->input.autoconf_binds[0]; if (current_input->input_state(current_input_data, joypad_info, &binds, 0, RETRO_DEVICE_JOYPAD, 0, RARCH_GAME_FOCUS_TOGGLE)) From 77cf4f4e064172d8d53967756cda12f2140d6e7a Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 16:09:40 +0100 Subject: [PATCH 03/61] This should fix index issue --- input/input_driver.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/input/input_driver.c b/input/input_driver.c index 50abb30827..2003087627 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -290,7 +290,7 @@ void input_poll(void) if (bind_valid) { joypad_info.joy_idx = settings->input.joypad_map[i]; - joypad_info.auto_binds = settings->input.autoconf_binds[i]; + joypad_info.auto_binds = settings->input.autoconf_binds[joypad_info.joy_idx]; input_driver_turbo_btns.frame_enable[i] = current_input->input_state( current_input_data, joypad_info, libretro_input_binds, @@ -384,7 +384,7 @@ int16_t input_state(unsigned port, unsigned device, if (bind_valid) { joypad_info.joy_idx = settings->input.joypad_map[port]; - joypad_info.auto_binds = settings->input.autoconf_binds[port]; + joypad_info.auto_binds = settings->input.autoconf_binds[joypad_info.joy_idx]; res = current_input->input_state( current_input_data, joypad_info, libretro_input_binds, port, device, idx, id); } @@ -509,7 +509,7 @@ void state_tracker_update_input(uint16_t *input1, uint16_t *input2) if (binds[0][id].valid) { joypad_info.joy_idx = settings->input.joypad_map[0]; - joypad_info.auto_binds = settings->input.autoconf_binds[0]; + joypad_info.auto_binds = settings->input.autoconf_binds[joypad_info.joy_idx]; *input1 |= (current_input->input_state(current_input_data, joypad_info, binds, 0, RETRO_DEVICE_JOYPAD, 0, id) ? 1 : 0) << i; @@ -517,7 +517,7 @@ void state_tracker_update_input(uint16_t *input1, uint16_t *input2) if (binds[1][id].valid) { joypad_info.joy_idx = settings->input.joypad_map[1]; - joypad_info.auto_binds = settings->input.autoconf_binds[1]; + joypad_info.auto_binds = settings->input.autoconf_binds[joypad_info.joy_idx]; *input2 |= (current_input->input_state(current_input_data, joypad_info, binds, 1, RETRO_DEVICE_JOYPAD, 0, id) ? 1 : 0) << i; @@ -560,7 +560,7 @@ static INLINE bool input_menu_keys_pressed_internal( ? current_input->get_sec_joypad_driver(current_input_data) : NULL; joypad_info.joy_idx = settings->input.joypad_map[port]; - joypad_info.auto_binds = settings->input.autoconf_binds[port]; + joypad_info.auto_binds = settings->input.autoconf_binds[joypad_info.joy_idx]; joypad_info.axis_threshold = settings->input.axis_threshold; if (sec && input_joypad_pressed(sec, @@ -711,7 +711,7 @@ uint64_t input_menu_keys_pressed( if (check_input_driver_block_hotkey(binds_norm, binds_auto)) { joypad_info.joy_idx = settings->input.joypad_map[0]; - joypad_info.auto_binds = settings->input.autoconf_binds[0]; + joypad_info.auto_binds = settings->input.autoconf_binds[joypad_info.joy_idx]; if (settings->input.binds[0][RARCH_ENABLE_HOTKEY].valid && current_input->input_state(current_input_data, joypad_info, @@ -827,7 +827,7 @@ static INLINE bool input_keys_pressed_internal( bool bind_valid = binds[i].valid; joypad_info.joy_idx = settings->input.joypad_map[0]; - joypad_info.auto_binds = settings->input.autoconf_binds[0]; + joypad_info.auto_binds = settings->input.autoconf_binds[joypad_info.joy_idx]; if (bind_valid && current_input->input_state(current_input_data, joypad_info, &binds, @@ -913,7 +913,7 @@ uint64_t input_keys_pressed( if (check_input_driver_block_hotkey(binds_norm, binds_auto)) { joypad_info.joy_idx = settings->input.joypad_map[0]; - joypad_info.auto_binds = settings->input.autoconf_binds[0]; + joypad_info.auto_binds = settings->input.autoconf_binds[joypad_info.joy_idx]; if ( enable_hotkey_valid && current_input->input_state( current_input_data, joypad_info, &binds, 0, @@ -931,7 +931,7 @@ uint64_t input_keys_pressed( focus_normal, focus_binds_auto) && game_focus_toggle_valid) { joypad_info.joy_idx = settings->input.joypad_map[0]; - joypad_info.auto_binds = settings->input.autoconf_binds[0]; + joypad_info.auto_binds = settings->input.autoconf_binds[joypad_info.joy_idx]; if (current_input->input_state(current_input_data, joypad_info, &binds, 0, RETRO_DEVICE_JOYPAD, 0, RARCH_GAME_FOCUS_TOGGLE)) input_driver_block_hotkey = false; From da51c2ebf6bd1b4ef98cb088b4f947f6570358a0 Mon Sep 17 00:00:00 2001 From: John Regan Date: Mon, 16 Jan 2017 10:26:17 -0600 Subject: [PATCH 04/61] coreaudio: fix getting device name --- audio/drivers/coreaudio.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/audio/drivers/coreaudio.c b/audio/drivers/coreaudio.c index d9e73a1251..a17ead090f 100644 --- a/audio/drivers/coreaudio.c +++ b/audio/drivers/coreaudio.c @@ -139,7 +139,7 @@ static void choose_output_device(coreaudio_t *dev, const char* device) AudioObjectPropertyAddress propaddr = { kAudioHardwarePropertyDevices, - kAudioObjectPropertyScopeGlobal, + kAudioObjectPropertyScopeOutput, kAudioObjectPropertyElementMaster }; UInt32 size = 0; @@ -155,14 +155,13 @@ static void choose_output_device(coreaudio_t *dev, const char* device) &propaddr, 0, 0, &size, devices) != noErr) goto done; - propaddr.mScope = kAudioDevicePropertyScopeOutput; propaddr.mSelector = kAudioDevicePropertyDeviceName; - size = 1024; for (i = 0; i < deviceCount; i ++) { char device_name[1024]; device_name[0] = 0; + size = 1024; if (AudioObjectGetPropertyData(devices[i], &propaddr, 0, 0, &size, device_name) == noErr From 9feb430b580ba1dcf039b6d95ad44fdcab5753a4 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 18:02:28 +0100 Subject: [PATCH 05/61] Don't pass video_info_t as pointer --- gfx/video_driver.c | 2 +- gfx/video_thread_wrapper.c | 11 ++++++----- gfx/video_thread_wrapper.h | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 40cfcaa5f7..30148ebd0c 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -753,7 +753,7 @@ static bool init_video(void) if (!video_init_thread((const video_driver_t**)¤t_video, &video_driver_data, input_get_double_ptr(), input_driver_get_data_ptr(), - current_video, &video)) + current_video, video)) { RARCH_ERR("Cannot open threaded video driver ... Exiting ...\n"); goto error; diff --git a/gfx/video_thread_wrapper.c b/gfx/video_thread_wrapper.c index 63720d0579..ed868fb1d7 100644 --- a/gfx/video_thread_wrapper.c +++ b/gfx/video_thread_wrapper.c @@ -809,7 +809,8 @@ static void video_thread_set_nonblock_state(void *data, bool state) thr->nonblock = state; } -static bool video_thread_init(thread_video_t *thr, const video_info_t *info, +static bool video_thread_init(thread_video_t *thr, + const video_info_t info, const input_driver_t **input, void **input_data) { size_t max_size; @@ -822,15 +823,15 @@ static bool video_thread_init(thread_video_t *thr, const video_info_t *info, thr->cond_thread = scond_new(); thr->input = input; thr->input_data = input_data; - thr->info = *info; + thr->info = info; thr->alive = true; thr->focus = true; thr->has_windowed = true; thr->suppress_screensaver = true; - max_size = info->input_scale * RARCH_SCALE_BASE; + max_size = info.input_scale * RARCH_SCALE_BASE; max_size *= max_size; - max_size *= info->rgb32 ? sizeof(uint32_t) : sizeof(uint16_t); + max_size *= info.rgb32 ? sizeof(uint32_t) : sizeof(uint16_t); thr->frame.buffer = (uint8_t*)malloc(max_size); if (!thr->frame.buffer) @@ -1355,7 +1356,7 @@ static void video_thread_set_callbacks( **/ bool video_init_thread(const video_driver_t **out_driver, void **out_data, const input_driver_t **input, void **input_data, - const video_driver_t *drv, const video_info_t *info) + const video_driver_t *drv, const video_info_t info) { thread_video_t *thr = (thread_video_t*)calloc(1, sizeof(*thr)); if (!thr) diff --git a/gfx/video_thread_wrapper.h b/gfx/video_thread_wrapper.h index 9cfad4160c..190b5f2226 100644 --- a/gfx/video_thread_wrapper.h +++ b/gfx/video_thread_wrapper.h @@ -53,7 +53,7 @@ typedef struct thread_video thread_video_t; bool video_init_thread( const video_driver_t **out_driver, void **out_data, const input_driver_t **input, void **input_data, - const video_driver_t *driver, const video_info_t *info); + const video_driver_t *driver, const video_info_t info); /** * video_thread_get_ptr: From fc5afa31227c098f87f34bdc079b5bb8c992231e Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 12:50:08 -0500 Subject: [PATCH 06/61] add UTF8 BOM to fix MSVC build --- menu/widgets/menu_osk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/menu/widgets/menu_osk.c b/menu/widgets/menu_osk.c index db9c8c1488..bfafb3b579 100644 --- a/menu/widgets/menu_osk.c +++ b/menu/widgets/menu_osk.c @@ -1,4 +1,4 @@ -/* RetroArch - A frontend for libretro. +/* RetroArch - A frontend for libretro. * Copyright (C) 2011-2016 - Daniel De Matteis * * RetroArch is free software: you can redistribute it and/or modify it under the terms From 8cb692622a887b448e6bdcd1171946974d36515f Mon Sep 17 00:00:00 2001 From: aliaspider Date: Mon, 16 Jan 2017 18:52:39 +0100 Subject: [PATCH 07/61] (WiiU) add support for bluetooth controllers (Wiimote, nunchuk, classic controller, wiiu pro controller). --- frontend/drivers/platform_wiiu.c | 4 + input/drivers/wiiu_input.c | 4 +- input/drivers_joypad/wiiu_joypad.c | 253 ++++++++++++++++++++++------- input/input_autodetect_builtin.c | 107 +++++++++++- wiiu/padscore.h | 126 ++++++++++++++ wiiu/system/imports.h | 14 ++ 6 files changed, 443 insertions(+), 65 deletions(-) create mode 100644 wiiu/padscore.h diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index fcfc4e68ca..29e903ca8b 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -49,6 +49,7 @@ #include #include #include +#include #include #include @@ -279,6 +280,9 @@ int main(int argc, char **argv) devoptab_list[STD_ERR] = &dotab_stdout; #endif VPADInit(); + WPADEnableURCC(true); + WPADEnableWiiRemote(true); + KPADInit(); verbosity_enable(); DEBUG_VAR(argc); diff --git a/input/drivers/wiiu_input.c b/input/drivers/wiiu_input.c index 35013bd6ef..c2e12b5ff6 100644 --- a/input/drivers/wiiu_input.c +++ b/input/drivers/wiiu_input.c @@ -30,7 +30,7 @@ #include "wiiu_dbg.h" -#define MAX_PADS 1 +#define MAX_PADS 5 typedef struct wiiu_input { @@ -56,7 +56,7 @@ static int16_t wiiu_input_state(void *data, { wiiu_input_t *wiiu = (wiiu_input_t*)data; - if(!wiiu || (port > 0) || !binds || !binds[port]) + if(!wiiu || !(port < MAX_PADS) || !binds || !binds[port]) return 0; switch (device) diff --git a/input/drivers_joypad/wiiu_joypad.c b/input/drivers_joypad/wiiu_joypad.c index e74e293818..f941254fab 100644 --- a/input/drivers_joypad/wiiu_joypad.c +++ b/input/drivers_joypad/wiiu_joypad.c @@ -19,6 +19,7 @@ #endif #include +#include #include "../input_config.h" #include "../input_driver.h" @@ -32,28 +33,61 @@ #include "wiiu_dbg.h" #ifndef MAX_PADS -#define MAX_PADS 1 +#define MAX_PADS 5 #endif -static uint64_t pad_state; -static int16_t analog_state[1][2][2]; +#define WIIUINPUT_TYPE_WIIMOTE 0x00 +#define WIIUINPUT_TYPE_NUNCHUK 0x01 +#define WIIUINPUT_TYPE_CLASSIC_CONTROLLER 0x02 +#define WIIUINPUT_TYPE_PRO_CONTROLLER 0x1F +#define WIIUINPUT_TYPE_NONE 0xFD + +static uint64_t pad_state[MAX_PADS]; +static u8 pad_type[MAX_PADS - 1] = {WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE, WIIUINPUT_TYPE_NONE}; +static int16_t analog_state[MAX_PADS][2][2]; extern uint64_t lifecycle_state; static bool wiiu_pad_inited = false; -static const char *wiiu_joypad_name(unsigned pad) + + +static const char* wiiu_joypad_name(unsigned pad) { - return "WIIU Controller"; + if (pad == 0) + return "WIIU Gamepad"; + + if (pad < MAX_PADS) + { + switch (pad_type[pad - 1]) + { + case WIIUINPUT_TYPE_NONE: + return "N/A"; + + case WIIUINPUT_TYPE_PRO_CONTROLLER: + return "WIIU Pro Controller"; + + case WIIUINPUT_TYPE_WIIMOTE: + return "Wiimote Controller"; + + case WIIUINPUT_TYPE_NUNCHUK: + return "Nunchuk Controller"; + + case WIIUINPUT_TYPE_CLASSIC_CONTROLLER: + return "Classic Controller"; + } + } + + return "unknown"; } static void wiiu_joypad_autodetect_add(unsigned autoconf_pad) { if (!input_autoconfigure_connect( - wiiu_joypad_name(autoconf_pad), - NULL, - wiiu_joypad.ident, - autoconf_pad, - 0, - 0 + wiiu_joypad_name(autoconf_pad), + NULL, + wiiu_joypad.ident, + autoconf_pad, + 0, + 0 )) input_config_set_device_name(autoconf_pad, wiiu_joypad_name(autoconf_pad)); } @@ -63,12 +97,12 @@ static bool wiiu_joypad_button(unsigned port_num, uint16_t key) if (port_num >= MAX_PADS) return false; - return (pad_state & (UINT64_C(1) << key)); + return (pad_state[port_num] & (UINT64_C(1) << key)); } static uint64_t wiiu_joypad_get_buttons(unsigned port_num) { - return pad_state; + return pad_state[port_num]; } static int16_t wiiu_joypad_axis(unsigned port_num, uint32_t joyaxis) @@ -94,18 +128,21 @@ static int16_t wiiu_joypad_axis(unsigned port_num, uint32_t joyaxis) switch (axis) { - case 0: - val = analog_state[port_num][0][0]; - break; - case 1: - val = analog_state[port_num][0][1]; - break; - case 2: - val = analog_state[port_num][1][0]; - break; - case 3: - val = analog_state[port_num][1][1]; - break; + case 0: + val = analog_state[port_num][0][0]; + break; + + case 1: + val = analog_state[port_num][0][1]; + break; + + case 2: + val = analog_state[port_num][1][0]; + break; + + case 3: + val = analog_state[port_num][1][1]; + break; } if (is_neg && val > 0) @@ -118,51 +155,144 @@ static int16_t wiiu_joypad_axis(unsigned port_num, uint32_t joyaxis) static void wiiu_joypad_poll(void) { + int c; VPADStatus vpad; VPADReadError vpadError; + VPADRead(0, &vpad, 1, &vpadError); - if(vpadError) - return; + if (!vpadError) + { + pad_state[0] = 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_LEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_DOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_RIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_UP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_PLUS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_MINUS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_X) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_Y) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_B) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_A) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_R) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_L) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_ZR) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_ZL) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_STICK_R) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R3) : 0; + pad_state[0] |= (vpad.hold & VPAD_BUTTON_STICK_L) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L3) : 0; - pad_state = 0; - pad_state |= (vpad.hold & VPAD_BUTTON_LEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_DOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_RIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_UP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_PLUS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_MINUS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_X) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_Y) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_B) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_A) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_R) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_L) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_ZR) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_ZL) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_STICK_R) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R3) : 0; - pad_state |= (vpad.hold & VPAD_BUTTON_STICK_L) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L3) : 0; + analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = vpad.leftStick.x * 0x7FF0; + analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = -vpad.leftStick.y * 0x7FF0; + analog_state[0][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = vpad.rightStick.x * 0x7FF0; + analog_state[0][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = -vpad.rightStick.y * 0x7FF0; - analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = vpad.leftStick.x * 0x7FF0; - analog_state[0][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = -vpad.leftStick.y * 0x7FF0; - analog_state[0][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = vpad.rightStick.x * 0x7FF0; - analog_state[0][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = -vpad.rightStick.y * 0x7FF0; + BIT64_CLEAR(lifecycle_state, RARCH_MENU_TOGGLE); - BIT64_CLEAR(lifecycle_state, RARCH_MENU_TOGGLE); + if (((vpad.tpNormal.touched) && (vpad.tpNormal.x > 200) && (vpad.tpNormal.validity) == 0) || + (vpad.trigger & VPAD_BUTTON_HOME)) + BIT64_SET(lifecycle_state, RARCH_MENU_TOGGLE); - if(((vpad.tpNormal.touched) && (vpad.tpNormal.x > 200) && (vpad.tpNormal.validity) == 0) || - (vpad.trigger & VPAD_BUTTON_HOME)) - BIT64_SET(lifecycle_state, RARCH_MENU_TOGGLE); + /* panic button */ + if ((vpad.hold & VPAD_BUTTON_R) && + (vpad.hold & VPAD_BUTTON_L) && + (vpad.hold & VPAD_BUTTON_STICK_R) && + (vpad.hold & VPAD_BUTTON_STICK_L)) + command_event(CMD_EVENT_QUIT, NULL); + } - /* panic button */ - if((vpad.hold & VPAD_BUTTON_R) && - (vpad.hold & VPAD_BUTTON_L) && - (vpad.hold & VPAD_BUTTON_STICK_R) && - (vpad.hold & VPAD_BUTTON_STICK_L)) - command_event(CMD_EVENT_QUIT, NULL); + for (c = 0; c < 4; c++) + { + KPADData kpad; + u32 result; + + result = KPADRead(c, &kpad, 1); + + if (!result) + continue; + + if (pad_type[c] != kpad.device_type) + { + pad_type[c] = kpad.device_type; + wiiu_joypad_autodetect_add(c + 1); + } + + pad_state[c + 1] = 0; + + switch (kpad.device_type) + { + case WIIUINPUT_TYPE_WIIMOTE: + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_LEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_DOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_RIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_UP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_PLUS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_MINUS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_1) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_B) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_A) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; + + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = 0; + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = 0; + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = 0; + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = 0; + break; + + case WIIUINPUT_TYPE_NUNCHUK: + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_LEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_DOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_RIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_UP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_PLUS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_MINUS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_1) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_2) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_B) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_A) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_Z) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; + pad_state[c + 1] |= (kpad.btns_h & WPAD_BUTTON_C) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; + + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = kpad.nunchuck.stick_x * 0x7FF0; + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = -kpad.nunchuck.stick_y * 0x7FF0; + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = 0; + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = 0; + break; + + case WIIUINPUT_TYPE_PRO_CONTROLLER: + + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_PRO_BUTTON_STICK_R) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R3) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_PRO_BUTTON_STICK_L) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L3) : 0; + + /* fallthrough */ + case WIIUINPUT_TYPE_CLASSIC_CONTROLLER: + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_LEFT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_LEFT) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_DOWN) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_DOWN) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_RIGHT) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_RIGHT) : + 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_UP) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_UP) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_PLUS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_START) : + 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_MINUS) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_SELECT) : + 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_X) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_X) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_Y) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_Y) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_B) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_B) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_A) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_A) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_R) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_L) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_ZR) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_R2) : 0; + pad_state[c + 1] |= (kpad.classic.btns_h & WPAD_CLASSIC_BUTTON_ZL) ? (UINT64_C(1) << RETRO_DEVICE_ID_JOYPAD_L2) : 0; + + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_X] = kpad.classic.lstick_x * 0x7FF0; + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_LEFT] [RETRO_DEVICE_ID_ANALOG_Y] = -kpad.classic.lstick_y * 0x7FF0; + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_X] = kpad.classic.rstick_x * 0x7FF0; + analog_state[c + 1][RETRO_DEVICE_INDEX_ANALOG_RIGHT] [RETRO_DEVICE_ID_ANALOG_Y] = -kpad.classic.rstick_y * 0x7FF0; + break; + } + } } -static bool wiiu_joypad_init(void *data) +static bool wiiu_joypad_init(void* data) { wiiu_joypad_autodetect_add(0); wiiu_joypad_poll(); @@ -174,7 +304,7 @@ static bool wiiu_joypad_init(void *data) static bool wiiu_joypad_query_pad(unsigned pad) { - return pad < MAX_USERS && wiiu_pad_inited; + return pad < MAX_PADS && wiiu_pad_inited; } static void wiiu_joypad_destroy(void) @@ -182,7 +312,8 @@ static void wiiu_joypad_destroy(void) wiiu_pad_inited = false; } -input_device_driver_t wiiu_joypad = { +input_device_driver_t wiiu_joypad = +{ wiiu_joypad_init, wiiu_joypad_query_pad, wiiu_joypad_destroy, diff --git a/input/input_autodetect_builtin.c b/input/input_autodetect_builtin.c index 78bfd2fc35..3061277223 100644 --- a/input/input_autodetect_builtin.c +++ b/input/input_autodetect_builtin.c @@ -193,7 +193,9 @@ DECL_AXIS(r_x_minus, -2) \ DECL_AXIS(r_y_plus, -3) \ DECL_AXIS(r_y_minus, +3) -#define WIIUINPUT_DEFAULT_BINDS \ +#ifdef WIIU + +#define WIIUINPUT_GAMEPAD_DEFAULT_BINDS \ DECL_BTN(a, 8) \ DECL_BTN(b, 0) \ DECL_BTN(x, 9) \ @@ -217,6 +219,103 @@ DECL_AXIS(r_x_minus, -2) \ DECL_AXIS(r_y_plus, -3) \ DECL_AXIS(r_y_minus, +3) +#define WIIUINPUT_PRO_CONTROLLER_DEFAULT_BINDS \ +DECL_BTN(a, 8) \ +DECL_BTN(b, 0) \ +DECL_BTN(x, 9) \ +DECL_BTN(y, 1) \ +DECL_BTN(start, 3) \ +DECL_BTN(select, 2) \ +DECL_BTN(up, 4) \ +DECL_BTN(down, 5) \ +DECL_BTN(left, 6) \ +DECL_BTN(right, 7) \ +DECL_BTN(l, 10) \ +DECL_BTN(r, 11) \ +DECL_BTN(l2, 12) \ +DECL_BTN(r2, 13) \ +DECL_AXIS(l_x_plus, +0) \ +DECL_AXIS(l_x_minus, -0) \ +DECL_AXIS(l_y_plus, +1) \ +DECL_AXIS(l_y_minus, -1) \ +DECL_AXIS(r_x_plus, +2) \ +DECL_AXIS(r_x_minus, -2) \ +DECL_AXIS(r_y_plus, -3) \ +DECL_AXIS(r_y_minus, +3) + +#define WIIUINPUT_CLASSIC_CONTROLLER_DEFAULT_BINDS \ +DECL_BTN(a, 8) \ +DECL_BTN(b, 0) \ +DECL_BTN(x, 9) \ +DECL_BTN(y, 1) \ +DECL_BTN(start, 3) \ +DECL_BTN(select, 2) \ +DECL_BTN(up, 4) \ +DECL_BTN(down, 5) \ +DECL_BTN(left, 6) \ +DECL_BTN(right, 7) \ +DECL_BTN(l, 10) \ +DECL_BTN(r, 11) \ +DECL_BTN(l2, 12) \ +DECL_BTN(r2, 13) \ +DECL_AXIS(l_x_plus, +0) \ +DECL_AXIS(l_x_minus, -0) \ +DECL_AXIS(l_y_plus, +1) \ +DECL_AXIS(l_y_minus, -1) \ +DECL_AXIS(r_x_plus, +2) \ +DECL_AXIS(r_x_minus, -2) \ +DECL_AXIS(r_y_plus, -3) \ +DECL_AXIS(r_y_minus, +3) + +#define WIIUINPUT_WIIMOTE_DEFAULT_BINDS \ +DECL_BTN(a, 8) \ +DECL_BTN(b, 0) \ +DECL_BTN(x, 9) \ +DECL_BTN(y, 1) \ +DECL_BTN(start, 3) \ +DECL_BTN(select, 2) \ +DECL_BTN(up, 4) \ +DECL_BTN(down, 5) \ +DECL_BTN(left, 6) \ +DECL_BTN(right, 7) \ +DECL_BTN(l, 10) \ +DECL_BTN(r, 11) \ +DECL_BTN(l2, 12) \ +DECL_BTN(r2, 13) \ +DECL_AXIS(l_x_plus, +0) \ +DECL_AXIS(l_x_minus, -0) \ +DECL_AXIS(l_y_plus, +1) \ +DECL_AXIS(l_y_minus, -1) \ +DECL_AXIS(r_x_plus, +2) \ +DECL_AXIS(r_x_minus, -2) \ +DECL_AXIS(r_y_plus, -3) \ +DECL_AXIS(r_y_minus, +3) + +#define WIIUINPUT_NUNCHUK_DEFAULT_BINDS \ +DECL_BTN(a, 8) \ +DECL_BTN(b, 0) \ +DECL_BTN(x, 9) \ +DECL_BTN(y, 1) \ +DECL_BTN(start, 3) \ +DECL_BTN(select, 2) \ +DECL_BTN(up, 4) \ +DECL_BTN(down, 5) \ +DECL_BTN(left, 6) \ +DECL_BTN(right, 7) \ +DECL_BTN(l, 10) \ +DECL_BTN(r, 11) \ +DECL_BTN(l2, 12) \ +DECL_BTN(r2, 13) \ +DECL_AXIS(l_x_plus, +0) \ +DECL_AXIS(l_x_minus, -0) \ +DECL_AXIS(l_y_plus, +1) \ +DECL_AXIS(l_y_minus, -1) \ +DECL_AXIS(r_x_plus, +2) \ +DECL_AXIS(r_x_minus, -2) \ +DECL_AXIS(r_y_plus, -3) \ +DECL_AXIS(r_y_minus, +3) +#endif + #define GXINPUT_GAMECUBE_DEFAULT_BINDS \ DECL_BTN(a, 0) \ DECL_BTN(b, 1) \ @@ -417,7 +516,11 @@ const char* const input_builtin_autoconfs[] = #endif #endif #ifdef WIIU - DECL_AUTOCONF_DEVICE("WIIU Controller", "wiiu", WIIUINPUT_DEFAULT_BINDS), + DECL_AUTOCONF_DEVICE("WIIU Gamepad", "wiiu", WIIUINPUT_GAMEPAD_DEFAULT_BINDS), + DECL_AUTOCONF_DEVICE("WIIU Pro Controller", "wiiu", WIIUINPUT_PRO_CONTROLLER_DEFAULT_BINDS), + DECL_AUTOCONF_DEVICE("Wiimote Controller", "wiiu", WIIUINPUT_WIIMOTE_DEFAULT_BINDS), + DECL_AUTOCONF_DEVICE("Nunchuk Controller", "wiiu", WIIUINPUT_NUNCHUK_DEFAULT_BINDS), + DECL_AUTOCONF_DEVICE("Classic Controller", "wiiu", WIIUINPUT_CLASSIC_CONTROLLER_DEFAULT_BINDS), #endif #ifdef __CELLOS_LV2__ DECL_AUTOCONF_DEVICE("SixAxis Controller", "ps3", PS3INPUT_DEFAULT_BINDS), diff --git a/wiiu/padscore.h b/wiiu/padscore.h new file mode 100644 index 0000000000..962dff02d4 --- /dev/null +++ b/wiiu/padscore.h @@ -0,0 +1,126 @@ +/**************************************************************************** + * Copyright (C) 2015 + * by Dimok + * + * This software is provided 'as-is', without any express or implied + * warranty. In no event will the authors be held liable for any + * damages arising from the use of this software. + * + * Permission is granted to anyone to use this software for any + * purpose, including commercial applications, and to alter it and + * redistribute it freely, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you + * must not claim that you wrote the original software. If you use + * this software in a product, an acknowledgment in the product + * documentation would be appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and + * must not be misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + ***************************************************************************/ +#ifndef __PAD_SCORE_FUNCTIONS_H_ +#define __PAD_SCORE_FUNCTIONS_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +#define WPAD_BUTTON_LEFT 0x0001 +#define WPAD_BUTTON_RIGHT 0x0002 +#define WPAD_BUTTON_DOWN 0x0004 +#define WPAD_BUTTON_UP 0x0008 +#define WPAD_BUTTON_PLUS 0x0010 +#define WPAD_BUTTON_2 0x0100 +#define WPAD_BUTTON_1 0x0200 +#define WPAD_BUTTON_B 0x0400 +#define WPAD_BUTTON_A 0x0800 +#define WPAD_BUTTON_MINUS 0x1000 +#define WPAD_BUTTON_Z 0x2000 +#define WPAD_BUTTON_C 0x4000 +#define WPAD_BUTTON_HOME 0x8000 + +#define WPAD_CLASSIC_BUTTON_UP 0x0001 +#define WPAD_CLASSIC_BUTTON_LEFT 0x0002 +#define WPAD_CLASSIC_BUTTON_ZR 0x0004 +#define WPAD_CLASSIC_BUTTON_X 0x0008 +#define WPAD_CLASSIC_BUTTON_A 0x0010 +#define WPAD_CLASSIC_BUTTON_Y 0x0020 +#define WPAD_CLASSIC_BUTTON_B 0x0040 +#define WPAD_CLASSIC_BUTTON_ZL 0x0080 +#define WPAD_CLASSIC_BUTTON_R 0x0200 +#define WPAD_CLASSIC_BUTTON_PLUS 0x0400 +#define WPAD_CLASSIC_BUTTON_HOME 0x0800 +#define WPAD_CLASSIC_BUTTON_MINUS 0x1000 +#define WPAD_CLASSIC_BUTTON_L 0x2000 +#define WPAD_CLASSIC_BUTTON_DOWN 0x4000 +#define WPAD_CLASSIC_BUTTON_RIGHT 0x8000 + +#define WPAD_PRO_BUTTON_STICK_R 0x10000 +#define WPAD_PRO_BUTTON_STICK_L 0x20000 + +void InitPadScoreFunctionPointers(void); + + +typedef struct _KPADData +{ + u32 btns_h; + u32 btns_d; + u32 btns_r; + u32 unused_1[5]; + f32 pos_x; + f32 pos_y; + u32 unused_2[3]; + f32 angle_x; + f32 angle_y; + u32 unused_3[8]; + u8 device_type; + u8 wpad_error; + u8 pos_valid; + u8 unused_4[1]; + + union + { + struct + { + f32 stick_x; + f32 stick_y; + } nunchuck; + + struct + { + u32 btns_h; + u32 btns_d; + u32 btns_r; + f32 lstick_x; + f32 lstick_y; + f32 rstick_x; + f32 rstick_y; + f32 ltrigger; + f32 rtrigger; + } classic; + + u32 unused_6[20]; + }; + u32 unused_7[16]; +} KPADData; + +typedef void (* wpad_connect_callback_t)(s32 chan, s32 status); + +void KPADInit (void); +s32 WPADProbe (s32 chan, u32 * pad_type); +s32 WPADSetDataFormat(s32 chan, s32 format); +void WPADEnableURCC(s32 enable); +void WPADEnableWiiRemote(s32 enable); +void WPADRead(s32 chan, void * data); +s32 KPADRead(s32 chan, void * data, u32 size); + +#ifdef __cplusplus +} +#endif + +#endif // __PAD_SCORE_FUNCTIONS_H_ diff --git a/wiiu/system/imports.h b/wiiu/system/imports.h index 144d4518fb..b6f6a9d8b1 100644 --- a/wiiu/system/imports.h +++ b/wiiu/system/imports.h @@ -178,3 +178,17 @@ IMPORT(VPADRead); IMPORT(VPADInit); IMPORT_END(); + +/* padscore */ +IMPORT_BEGIN(padscore); + +IMPORT(KPADInit); +IMPORT(WPADProbe); +IMPORT(WPADSetDataFormat); +IMPORT(WPADEnableURCC); +IMPORT(WPADEnableWiiRemote); +IMPORT(WPADRead); +IMPORT(KPADRead); + +IMPORT_END(); + From a9749849e34dc51313f6edaec6a80ba548407980 Mon Sep 17 00:00:00 2001 From: aliaspider Date: Mon, 16 Jan 2017 18:53:35 +0100 Subject: [PATCH 08/61] (WiiU) disc script: no need to delete icons. --- dist-scripts/wiiu-cores.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/dist-scripts/wiiu-cores.sh b/dist-scripts/wiiu-cores.sh index e3a5d53fc2..b1a384e555 100755 --- a/dist-scripts/wiiu-cores.sh +++ b/dist-scripts/wiiu-cores.sh @@ -117,7 +117,6 @@ for f in `ls -v *_${platform}.${EXT}`; do fi fi rm -rf ${name}_meta.xml - rm -rf $name.png done From 99508cfd6436a3b3f64a753ab7243c7195a133e0 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 15:06:46 -0500 Subject: [PATCH 09/61] allow --disable-vulkan on Windows --- Makefile.common | 7 +++++-- qb/qb.params.sh | 1 + 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile.common b/Makefile.common index e3e3d219ae..15374c1dca 100644 --- a/Makefile.common +++ b/Makefile.common @@ -441,8 +441,11 @@ ifeq ($(HAVE_NEON),1) endif ifneq ($(findstring Win32,$(OS)),) -HAVE_VULKAN=1 -DEFINES += -DHAVE_VULKAN + # if user explicitly sets --disable-vulkan on Windows, then disable it + ifneq ($(HAVE_NO_VULKAN),1) + HAVE_VULKAN=1 + DEFINES += -DHAVE_VULKAN + endif endif HW_CONTEXT_MENU_DRIVERS=$(HAVE_RGUI) diff --git a/qb/qb.params.sh b/qb/qb.params.sh index 3964fe26fb..4b822298a8 100644 --- a/qb/qb.params.sh +++ b/qb/qb.params.sh @@ -72,6 +72,7 @@ parse_input() # Parse stuff :V --disable-*) opt_exists "${1##--disable-}" "$1" eval "HAVE_$opt=no" + eval "HAVE_NO_$opt=yes" ;; --with-*) arg="${1##--with-}" From f96ee3e6d6bb4562f7a5c7d3f6370f85e28938f2 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 21:31:30 +0100 Subject: [PATCH 10/61] (menu) cleanups; move variables --- menu/menu_displaylist.c | 3 +-- menu/menu_shader.c | 8 ++++---- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 84f802422e..c637fa9fd2 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -318,7 +318,6 @@ static int menu_displaylist_parse_core_info(menu_displaylist_info_t *info) unsigned i; char tmp[PATH_MAX_LENGTH]; core_info_t *core_info = NULL; - settings_t *settings = config_get_ptr(); tmp[0] = '\0'; @@ -440,6 +439,7 @@ static int menu_displaylist_parse_core_info(menu_displaylist_info_t *info) if (core_info->firmware_count > 0) { core_info_ctx_firmware_t firmware_info; + settings_t *settings = config_get_ptr(); firmware_info.path = core_info->path; firmware_info.directory.system = settings->directory.system; @@ -1715,7 +1715,6 @@ static int menu_displaylist_parse_database_entry(menu_displaylist_info_t *info) char tmp[PATH_MAX_LENGTH]; char crc_str[20]; database_info_t *db_info_entry = &db_info->list[i]; - settings_t *settings = config_get_ptr(); bool show_advanced_settings = false; crc_str[0] = tmp[0] = '\0'; diff --git a/menu/menu_shader.c b/menu/menu_shader.c index aa299e49b6..a96319acb6 100644 --- a/menu/menu_shader.c +++ b/menu/menu_shader.c @@ -309,7 +309,6 @@ bool menu_shader_manager_save_preset( config_file_t *conf = NULL; bool ret = false; struct video_shader *shader = menu_shader_get(); - settings_t *settings = config_get_ptr(); buffer[0] = config_directory[0] = '\0'; preset_path[0] = '\0'; @@ -385,9 +384,10 @@ bool menu_shader_manager_save_preset( if (!fullpath) { - dirs[0] = settings->directory.video_shader; - dirs[1] = settings->directory.menu_config; - dirs[2] = config_directory; + settings_t *settings = config_get_ptr(); + dirs[0] = settings->directory.video_shader; + dirs[1] = settings->directory.menu_config; + dirs[2] = config_directory; } conf = (config_file_t*)config_file_new(NULL); From 1c82287e109acad26dc2c89f71c6bb78d15bd411 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 21:33:25 +0100 Subject: [PATCH 11/61] (video_state_tracker.c) Don't need header include --- gfx/video_state_tracker.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gfx/video_state_tracker.c b/gfx/video_state_tracker.c index b1bf54d5bb..93a2f40338 100644 --- a/gfx/video_state_tracker.c +++ b/gfx/video_state_tracker.c @@ -28,8 +28,9 @@ #endif #include "video_state_tracker.h" + #include "../input/input_config.h" -#include "../configuration.h" + #include "../verbosity.h" struct state_tracker_internal From d519ad7017f6c3c0ac3c89fe548bbb4bb2c28912 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 21:36:04 +0100 Subject: [PATCH 12/61] (input_config.c) Move variable --- input/input_config.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/input/input_config.c b/input/input_config.c index 093c37debd..1f41f3a199 100644 --- a/input/input_config.c +++ b/input/input_config.c @@ -486,11 +486,13 @@ const char *input_config_get_device_name(unsigned port) void input_config_set_device_name(unsigned port, const char *name) { - settings_t *settings = config_get_ptr(); if (!string_is_empty(name)) + { + settings_t *settings = config_get_ptr(); strlcpy(settings->input.device_names[port], name, sizeof(settings->input.device_names[port])); + } } bool input_config_get_bind_idx(unsigned port, unsigned *joy_idx_real) From cb64f28950f47d15a2983b1b2b4da5499140893c Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 22:04:57 +0100 Subject: [PATCH 13/61] Create drivers_init --- command.c | 4 ++-- driver.c | 17 ++--------------- driver.h | 9 ++------- retroarch.c | 2 +- 4 files changed, 7 insertions(+), 25 deletions(-) diff --git a/command.c b/command.c index c5ec6d3e7a..5a419fd7da 100644 --- a/command.c +++ b/command.c @@ -2259,7 +2259,7 @@ bool command_event(enum event_command cmd, void *data) { int flags = DRIVER_AUDIO_MASK; driver_ctl(RARCH_DRIVER_CTL_UNINIT, &flags); - driver_ctl(RARCH_DRIVER_CTL_INIT, &flags); + drivers_init(flags); } break; case CMD_EVENT_RESET_CONTEXT: @@ -2278,7 +2278,7 @@ bool command_event(enum event_command cmd, void *data) memcpy(hwr, &hwr_copy, sizeof(*hwr)); video_driver_set_context_negotiation_interface(iface); - driver_ctl(RARCH_DRIVER_CTL_INIT, &flags); + drivers_init(flags); } break; case CMD_EVENT_SHUTDOWN: diff --git a/driver.c b/driver.c index 5de24cb3de..b0f1aacfd5 100644 --- a/driver.c +++ b/driver.c @@ -287,13 +287,13 @@ static bool driver_update_system_av_info(const struct retro_system_av_info *info } /** - * init_drivers: + * drivers_init: * @flags : Bitmask of drivers to initialize. * * Initializes drivers. * @flags determines which drivers get initialized. **/ -static void init_drivers(int flags) +void drivers_init(int flags) { if (flags & DRIVER_VIDEO_MASK) video_driver_unset_own_driver(); @@ -453,19 +453,6 @@ bool driver_ctl(enum driver_ctl_state state, void *data) int flags = DRIVERS_CMD_ALL; return driver_ctl(RARCH_DRIVER_CTL_UNINIT, &flags); } - case RARCH_DRIVER_CTL_INIT: - { - int *flags = (int*)data; - if (!flags) - return false; - init_drivers(*flags); - } - break; - case RARCH_DRIVER_CTL_INIT_ALL: - { - int flags = DRIVERS_CMD_ALL; - return driver_ctl(RARCH_DRIVER_CTL_INIT, &flags); - } case RARCH_DRIVER_CTL_INIT_PRE: audio_driver_find_driver(); video_driver_find_driver(); diff --git a/driver.h b/driver.h index 475564058b..34633736e6 100644 --- a/driver.h +++ b/driver.h @@ -72,13 +72,6 @@ enum driver_ctl_state RARCH_DRIVER_CTL_UNINIT_ALL, - /* Initializes drivers. - * @data is a bitmask which determines - * which drivers get initialized. */ - RARCH_DRIVER_CTL_INIT, - - RARCH_DRIVER_CTL_INIT_ALL, - /* Attempts to find a default driver for * all driver types. * @@ -122,6 +115,8 @@ typedef struct driver_ctx_info bool driver_ctl(enum driver_ctl_state state, void *data); +void drivers_init(int flags); + RETRO_END_DECLS #endif diff --git a/retroarch.c b/retroarch.c index 2fe95be733..9da45ef39e 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1074,7 +1074,7 @@ bool retroarch_main_init(int argc, char *argv[]) } } - driver_ctl(RARCH_DRIVER_CTL_INIT_ALL, NULL); + drivers_init(DRIVERS_CMD_ALL); command_event(CMD_EVENT_COMMAND_INIT, NULL); command_event(CMD_EVENT_REMOTE_INIT, NULL); command_event(CMD_EVENT_REWIND_INIT, NULL); From 8958e02b54bf01709c706bd156e3447823cbc32f Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 22:17:44 +0100 Subject: [PATCH 14/61] Don't invoke this at beginning of function --- ui/drivers/ui_win32.c | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index b11764bd19..0fe7a67ae1 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -358,11 +358,8 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { int i, pos; - video_shader_ctx_t shader_info; const ui_window_t *window = ui_companion_driver_get_window_ptr(); - video_shader_driver_get_current_shader(&shader_info); - switch (message) { case WM_CREATE: @@ -390,14 +387,18 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message, if (g_shader_dlg.controls[i].type != SHADER_PARAM_CTRL_CHECKBOX) break; - if (SendMessage(g_shader_dlg.controls[i].checkbox.hwnd, - BM_GETCHECK, 0, 0) == BST_CHECKED) - shader_info.data->parameters[i].current = - shader_info.data->parameters[i].maximum; - else - shader_info.data->parameters[i].current = - shader_info.data->parameters[i].minimum; + { + video_shader_ctx_t shader_info; + video_shader_driver_get_current_shader(&shader_info); + if (SendMessage(g_shader_dlg.controls[i].checkbox.hwnd, + BM_GETCHECK, 0, 0) == BST_CHECKED) + shader_info.data->parameters[i].current = + shader_info.data->parameters[i].maximum; + else + shader_info.data->parameters[i].current = + shader_info.data->parameters[i].minimum; + } break; case WM_HSCROLL: @@ -410,8 +411,14 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message, break; pos = (int)SendMessage(g_shader_dlg.controls[i].trackbar.hwnd, TBM_GETPOS, 0, 0); - shader_info.data->parameters[i].current = - shader_info.data->parameters[i].minimum + pos * shader_info.data->parameters[i].step; + + { + video_shader_ctx_t shader_info; + video_shader_driver_get_current_shader(&shader_info); + + shader_info.data->parameters[i].current = + shader_info.data->parameters[i].minimum + pos * shader_info.data->parameters[i].step; + } shader_dlg_refresh_trackbar_label(i); break; From 0b1a204949278e63e61f82585a1917c9a39a1c22 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 22:32:39 +0100 Subject: [PATCH 15/61] Roll this back --- menu/widgets/menu_input_bind_dialog.c | 60 +++++---------------------- 1 file changed, 11 insertions(+), 49 deletions(-) diff --git a/menu/widgets/menu_input_bind_dialog.c b/menu/widgets/menu_input_bind_dialog.c index 4bfb321dcf..cc782330e9 100644 --- a/menu/widgets/menu_input_bind_dialog.c +++ b/menu/widgets/menu_input_bind_dialog.c @@ -381,16 +381,9 @@ bool menu_input_key_bind_set_min_max(menu_input_ctx_bind_limits_t *lim) bool menu_input_key_bind_iterate(menu_input_ctx_bind_t *bind) { - struct menu_bind_state binds = {0}; - /* single binds can have latching issues, - * single_bind_delay = 0 (single bind not yet bound) - * single_bind_delay = 1 (latching procedure) - * single_bind_delay = 2 (second iteration, will quit iteration loop) - */ - static unsigned single_bind_delay = 0; - bool trigger_found = false; - bool timed_out = false; - settings_t *settings = config_get_ptr(); + struct menu_bind_state binds; + bool timed_out = false; + settings_t *settings = config_get_ptr(); rarch_timer_tick(&menu_input_binds.timer); @@ -407,27 +400,12 @@ bool menu_input_key_bind_iterate(menu_input_ctx_bind_t *bind) timed_out = true; } - if (single_bind_delay > 0) - { - snprintf(bind->s, bind->len, "Confirming key %s ...", - input_config_bind_map_get_desc( - menu_input_binds.begin - MENU_SETTINGS_BIND_BEGIN) - ); - single_bind_delay++; - } - else - snprintf(bind->s, bind->len, - "[%s]\npress keyboard or joypad\n(timeout %d %s)", - input_config_bind_map_get_desc( - menu_input_binds.begin - MENU_SETTINGS_BIND_BEGIN), - rarch_timer_get_timeout(&menu_input_binds.timer), - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SECONDS)); - - if (single_bind_delay == 2) - { - single_bind_delay = 0; - return true; - } + snprintf(bind->s, bind->len, + "[%s]\npress keyboard or joypad\n(timeout %d %s)", + input_config_bind_map_get_desc( + menu_input_binds.begin - MENU_SETTINGS_BIND_BEGIN), + rarch_timer_get_timeout(&menu_input_binds.timer), + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_SECONDS)); /* binds.begin is updated in keyboard_press callback. */ if (menu_input_binds.begin > menu_input_binds.last) @@ -439,13 +417,6 @@ bool menu_input_key_bind_iterate(menu_input_ctx_bind_t *bind) if (timed_out) input_keyboard_ctl(RARCH_INPUT_KEYBOARD_CTL_CANCEL_WAIT_KEYS, NULL); - /* If this is a single bind, add another delay of one second */ - if (!timed_out && (binds.begin == binds.last)) - { - single_bind_delay = 1; - return false; - } - return true; } @@ -454,23 +425,14 @@ bool menu_input_key_bind_iterate(menu_input_ctx_bind_t *bind) input_driver_keyboard_mapping_set_block(true); menu_input_key_bind_poll_bind_state(&binds, menu_bind_port, timed_out); - if (single_bind_delay == 0) - trigger_found = menu_input_key_bind_poll_find_trigger(&menu_input_binds, &binds); - - if ((binds.skip && !menu_input_binds.skip) || trigger_found) + if ((binds.skip && !menu_input_binds.skip) || + menu_input_key_bind_poll_find_trigger(&menu_input_binds, &binds)) { input_driver_keyboard_mapping_set_block(false); /* Avoid new binds triggering things right away. */ input_driver_set_flushing_input(); - /* If this is a single bind, add a latching delay */ - if (binds.begin == binds.last) - { - single_bind_delay = 1; - return false; - } - binds.begin++; if (binds.begin > binds.last) From b3642df33fbe94ee9ce6e858ecba408956888821 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 22:34:36 +0100 Subject: [PATCH 16/61] (ui_cocoa.m) Cleanups --- ui/drivers/ui_cocoa.m | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/ui/drivers/ui_cocoa.m b/ui/drivers/ui_cocoa.m index f22d355be4..f86ceca170 100644 --- a/ui/drivers/ui_cocoa.m +++ b/ui/drivers/ui_cocoa.m @@ -109,9 +109,10 @@ static void app_terminate(void) case NSFlagsChanged: { static uint32_t old_flags = 0; - uint32_t new_flags = event.modifierFlags; - bool down = (new_flags & old_flags) == old_flags; - old_flags = new_flags; + uint32_t new_flags = event.modifierFlags; + bool down = (new_flags & old_flags) == old_flags; + + old_flags = new_flags; apple_input_keyboard_event(down, event.keyCode, 0, event.modifierFlags, RETRO_DEVICE_KEYBOARD); @@ -148,27 +149,27 @@ static void app_terminate(void) case NSLeftMouseDown: case NSRightMouseDown: case NSOtherMouseDown: - { - NSPoint pos = [[CocoaView get] convertPoint:[event locationInWindow] fromView:nil]; - apple = (cocoa_input_data_t*)input_driver_get_data(); - if (!apple || pos.y < 0) - return; - apple->mouse_buttons |= 1 << event.buttonNumber; - - apple->touch_count = 1; - } + { + NSPoint pos = [[CocoaView get] convertPoint:[event locationInWindow] fromView:nil]; + apple = (cocoa_input_data_t*)input_driver_get_data(); + if (!apple || pos.y < 0) + return; + apple->mouse_buttons |= 1 << event.buttonNumber; + + apple->touch_count = 1; + } break; case NSLeftMouseUp: case NSRightMouseUp: case NSOtherMouseUp: - { - NSPoint pos = [[CocoaView get] convertPoint:[event locationInWindow] fromView:nil]; - apple = (cocoa_input_data_t*)input_driver_get_data(); - if (!apple || pos.y < 0) - return; - apple->mouse_buttons &= ~(1 << event.buttonNumber); - apple->touch_count = 0; - } + { + NSPoint pos = [[CocoaView get] convertPoint:[event locationInWindow] fromView:nil]; + apple = (cocoa_input_data_t*)input_driver_get_data(); + if (!apple || pos.y < 0) + return; + apple->mouse_buttons &= ~(1 << event.buttonNumber); + apple->touch_count = 0; + } break; } } From 57e5af646113755ebc729f8ec33f5f4d93ddb835 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 16:42:39 -0500 Subject: [PATCH 17/61] update JP translation --- intl/msg_hash_ja.h | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 40541cdcec..76b3dda148 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -484,6 +484,8 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_HISTORY_SIZE, "履歴リストのサイズ" ) +MSG_HASH(MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE, + "エントリー削除を許す") MSG_HASH(MENU_ENUM_LABEL_VALUE_CONTENT_SETTINGS, "クイックメニュー" ) @@ -1318,7 +1320,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_STATUS, MSG_HASH(MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE, "stdinコマンド") MSG_HASH(MENU_ENUM_LABEL_VALUE_SUPPORTED_CORES, - "対応するコア") + "提案するコア") MSG_HASH(MENU_ENUM_LABEL_VALUE_SUSPEND_SCREENSAVER_ENABLE, "スクリーンセーバーをサスペンド") MSG_HASH(MENU_ENUM_LABEL_VALUE_SYSTEM_BGM_ENABLE, @@ -1538,7 +1540,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ALLOW_ROTATE, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_AUTO, "自動アスペクト比") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, - "アスペクト比のインデックス") + "アスペクト比") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, "黒いフレームを挿入") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_CROP_OVERSCAN, @@ -1590,7 +1592,7 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_POST_FILTER_RECORD, MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE, "リフレッシュレート") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO, - "モニタの予想フレームレート") + "画面の予想フレームレート") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_ROTATION, "回転") MSG_HASH(MENU_ENUM_LABEL_VALUE_VIDEO_SCALE, @@ -1798,7 +1800,7 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_WINDOW_SCALE, MSG_HASH(MENU_ENUM_SUBLABEL_USER_LANGUAGE, "インタフェースの言語を変更する。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, - "フレームの間で黒フレームを挿入する。60Hzコンテンツを120Hzモニターでやることを役に立つ。") + "フレームの間で黒フレームを挿入する。60Hzコンテンツを120Hz画面でやることを役に立つ。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_FRAME_DELAY, "遅延が減るけどビデオ途切れの危険率が増す。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, @@ -1806,9 +1808,9 @@ MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_HARD_SYNC_FRAMES, MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MAX_SWAPCHAIN_IMAGES, "指定するバッファーモードをビデオドライバに伝える。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_MONITOR_INDEX, - "希望するモニターを選択する。") + "希望する画面を選択する。") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_AUTO, - "モニターの正確な推定のモニターリフレッシュレート") + "画面の正確な推定のリフレッシュレート") MSG_HASH(MENU_ENUM_SUBLABEL_VIDEO_SETTINGS, "ビデオ出力の設定を変える。") MSG_HASH(MENU_ENUM_SUBLABEL_WIFI_SETTINGS, @@ -2370,15 +2372,15 @@ MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, "コンテンツをロードする後にネットプレイは開始します。") MSG_HASH( MENU_ENUM_LABEL_VALUE_BROWSE_URL_LIST, - "Browse URL" + "URLを参照" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BROWSE_URL, - "URL Path" + "URLのパス" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BROWSE_START, - "Start" + "スタート" ) MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, - "Bokeh") + "ボケ") From 1f3409dba80b9bdf4ef2738a322c234032487477 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 23:27:55 +0100 Subject: [PATCH 18/61] (ui_win32.c) Some minor cleanups --- ui/drivers/ui_win32.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index 0fe7a67ae1..b20cea7c5c 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -115,12 +115,15 @@ typedef struct static shader_dlg_t g_shader_dlg = {{0}}; -static void shader_dlg_refresh_trackbar_label(int index) +static bool shader_dlg_refresh_trackbar_label(int index) { video_shader_ctx_t shader_info; char val_buffer[32] = {0}; video_shader_driver_get_current_shader(&shader_info); + + if (!shader_info.data) + return false; if (floorf(shader_info.data->parameters[index].current) == shader_info.data->parameters[index].current) @@ -133,6 +136,7 @@ static void shader_dlg_refresh_trackbar_label(int index) SendMessage(g_shader_dlg.controls[index].trackbar.label_val, WM_SETTEXT, 0, (LPARAM)val_buffer); + return true; } static void shader_dlg_params_refresh(void) @@ -153,14 +157,15 @@ static void shader_dlg_params_refresh(void) { case SHADER_PARAM_CTRL_CHECKBOX: { - bool checked = + bool checked = shader_info.data ? (shader_info.data->parameters[i].current == - shader_info.data->parameters[i].maximum); + shader_info.data->parameters[i].maximum) : false; SendMessage(control->checkbox.hwnd, BM_SETCHECK, checked, 0); } break; case SHADER_PARAM_CTRL_TRACKBAR: - shader_dlg_refresh_trackbar_label(i); + if (!shader_dlg_refresh_trackbar_label(i)) + break; SendMessage(control->trackbar.hwnd, TBM_SETRANGEMIN, (WPARAM)TRUE, (LPARAM)0); @@ -219,10 +224,11 @@ void shader_dlg_params_reload(void) int i, pos_x, pos_y; video_shader_ctx_t shader_info; const ui_window_t *window = ui_companion_driver_get_window_ptr(); - video_shader_driver_get_current_shader(&shader_info); shader_dlg_params_clear(); + video_shader_driver_get_current_shader(&shader_info); + if (!shader_info.data) return; if (shader_info.data->num_parameters > GFX_MAX_PARAMETERS) From 1709b6889ff4ea979e9b3d16884476c0cbcae050 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 23:32:28 +0100 Subject: [PATCH 19/61] (ui_win32.c) Use stdstring.c --- ui/drivers/ui_win32.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index b20cea7c5c..20a09d880f 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include "../ui_companion_driver.h" @@ -543,7 +544,7 @@ static bool win32_browser( new_title[0] = '\0'; new_file[0] = '\0'; - if (title && *title) + if (!string_is_empty(title)) strlcpy(new_title, title, sizeof(new_title)); if (filename && *filename) From 864df4f55d046a7727970fb7b885d6da879e18dc Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 16 Jan 2017 23:38:46 +0100 Subject: [PATCH 20/61] Move local variable --- menu/drivers/xmb.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 2a436e6fbd..79d066ba1c 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -1048,7 +1048,7 @@ static void xmb_update_savestate_thumbnail_image(void *data) static void xmb_selection_pointer_changed( xmb_handle_t *xmb, bool allow_animations) { - unsigned i, end, height, depth; + unsigned i, end, height; menu_animation_ctx_tag_t tag; size_t selection, num = 0; int threshold = 0; @@ -1088,10 +1088,11 @@ static void xmb_selection_pointer_changed( if (i == selection) { - ia = xmb->items.active.alpha; - iz = xmb->items.active.zoom; + unsigned depth = xmb_list_get_size(xmb, MENU_LIST_PLAIN); + + ia = xmb->items.active.alpha; + iz = xmb->items.active.zoom; - depth = xmb_list_get_size(xmb, MENU_LIST_PLAIN); if (!string_is_equal(xmb_thumbnails_ident(), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) && (depth == 1 || xmb->categories.selection_ptr == 0)) From aae2b2a276423e770bae9e0c798a87d5e9875d11 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Tue, 17 Jan 2017 00:59:29 +0100 Subject: [PATCH 21/61] (ui_win32.c) Further cleanups --- ui/drivers/ui_win32.c | 112 ++++++++++++++++++++++-------------------- 1 file changed, 59 insertions(+), 53 deletions(-) diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index 20a09d880f..5e530da392 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -116,23 +116,18 @@ typedef struct static shader_dlg_t g_shader_dlg = {{0}}; -static bool shader_dlg_refresh_trackbar_label(int index) +static bool shader_dlg_refresh_trackbar_label(int index, + video_shader_ctx_t *shader_info) { - video_shader_ctx_t shader_info; char val_buffer[32] = {0}; - video_shader_driver_get_current_shader(&shader_info); - - if (!shader_info.data) - return false; - - if (floorf(shader_info.data->parameters[index].current) - == shader_info.data->parameters[index].current) + if (floorf(shader_info->data->parameters[index].current) + == shader_info->data->parameters[index].current) snprintf(val_buffer, sizeof(val_buffer), "%.0f", - shader_info.data->parameters[index].current); + shader_info->data->parameters[index].current); else snprintf(val_buffer, sizeof(val_buffer), "%.2f", - shader_info.data->parameters[index].current); + shader_info->data->parameters[index].current); SendMessage(g_shader_dlg.controls[index].trackbar.label_val, WM_SETTEXT, 0, (LPARAM)val_buffer); @@ -143,9 +138,6 @@ static bool shader_dlg_refresh_trackbar_label(int index) static void shader_dlg_params_refresh(void) { int i; - video_shader_ctx_t shader_info; - - video_shader_driver_get_current_shader(&shader_info); for (i = 0; i < GFX_MAX_PARAMETERS; i++) { @@ -158,6 +150,9 @@ static void shader_dlg_params_refresh(void) { case SHADER_PARAM_CTRL_CHECKBOX: { + video_shader_ctx_t shader_info; + video_shader_driver_get_current_shader(&shader_info); + bool checked = shader_info.data ? (shader_info.data->parameters[i].current == shader_info.data->parameters[i].maximum) : false; @@ -165,20 +160,27 @@ static void shader_dlg_params_refresh(void) } break; case SHADER_PARAM_CTRL_TRACKBAR: - if (!shader_dlg_refresh_trackbar_label(i)) - break; + { + video_shader_ctx_t shader_info; + video_shader_driver_get_current_shader(&shader_info); + if (shader_info.data && !shader_dlg_refresh_trackbar_label(i, &shader_info)) + break; - SendMessage(control->trackbar.hwnd, - TBM_SETRANGEMIN, (WPARAM)TRUE, (LPARAM)0); - SendMessage(control->trackbar.hwnd, - TBM_SETRANGEMAX, (WPARAM)TRUE, - (LPARAM)((shader_info.data->parameters[i].maximum - - shader_info.data->parameters[i].minimum) - / shader_info.data->parameters[i].step)); - SendMessage(control->trackbar.hwnd, TBM_SETPOS, (WPARAM)TRUE, - (LPARAM)((shader_info.data->parameters[i].current - - shader_info.data->parameters[i].minimum) / - shader_info.data->parameters[i].step)); + if (shader_info.data) + { + SendMessage(control->trackbar.hwnd, + TBM_SETRANGEMIN, (WPARAM)TRUE, (LPARAM)0); + SendMessage(control->trackbar.hwnd, + TBM_SETRANGEMAX, (WPARAM)TRUE, + (LPARAM)((shader_info.data->parameters[i].maximum - + shader_info.data->parameters[i].minimum) + / shader_info.data->parameters[i].step)); + SendMessage(control->trackbar.hwnd, TBM_SETPOS, (WPARAM)TRUE, + (LPARAM)((shader_info.data->parameters[i].current - + shader_info.data->parameters[i].minimum) / + shader_info.data->parameters[i].step)); + } + } break; case SHADER_PARAM_CTRL_NONE: default: @@ -193,10 +195,9 @@ static void shader_dlg_params_clear(void) for (i = 0; i < GFX_MAX_PARAMETERS; i++) { - const ui_window_t *window = ui_companion_driver_get_window_ptr(); shader_param_ctrl_t*control = &g_shader_dlg.controls[i]; - if (control->type == SHADER_PARAM_CTRL_NONE) + if (!control || control->type == SHADER_PARAM_CTRL_NONE) break; switch (control->type) @@ -204,8 +205,11 @@ static void shader_dlg_params_clear(void) case SHADER_PARAM_CTRL_NONE: break; case SHADER_PARAM_CTRL_CHECKBOX: - if (window) - window->destroy(&control->checkbox); + { + const ui_window_t *window = ui_companion_driver_get_window_ptr(); + if (window) + window->destroy(&control->checkbox); + } break; case SHADER_PARAM_CTRL_TRACKBAR: DestroyWindow(control->trackbar.label_title); @@ -224,20 +228,19 @@ void shader_dlg_params_reload(void) RECT parent_rect; int i, pos_x, pos_y; video_shader_ctx_t shader_info; - const ui_window_t *window = ui_companion_driver_get_window_ptr(); - + const ui_window_t *window = NULL; + shader_dlg_params_clear(); video_shader_driver_get_current_shader(&shader_info); - if (!shader_info.data) - return; - if (shader_info.data->num_parameters > GFX_MAX_PARAMETERS) + if (!shader_info.data || shader_info.data->num_parameters > GFX_MAX_PARAMETERS) return; - hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); - pos_y = g_shader_dlg.parameters_start_y; - pos_x = SHADER_DLG_CTRL_X; + window = ui_companion_driver_get_window_ptr(); + hFont = (HFONT)GetStockObject(DEFAULT_GUI_FONT); + pos_y = g_shader_dlg.parameters_start_y; + pos_x = SHADER_DLG_CTRL_X; for (i = 0; i < (int)shader_info.data->num_parameters; i++) { @@ -409,25 +412,28 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message, break; case WM_HSCROLL: - i = GetWindowLong((HWND)lparam, GWL_ID); - - if (i >= GFX_MAX_PARAMETERS) - break; - - if (g_shader_dlg.controls[i].type != SHADER_PARAM_CTRL_TRACKBAR) - break; - - pos = (int)SendMessage(g_shader_dlg.controls[i].trackbar.hwnd, TBM_GETPOS, 0, 0); - { video_shader_ctx_t shader_info; video_shader_driver_get_current_shader(&shader_info); + i = GetWindowLong((HWND)lparam, GWL_ID); - shader_info.data->parameters[i].current = - shader_info.data->parameters[i].minimum + pos * shader_info.data->parameters[i].step; + if (i >= GFX_MAX_PARAMETERS) + break; + + if (g_shader_dlg.controls[i].type != SHADER_PARAM_CTRL_TRACKBAR) + break; + + pos = (int)SendMessage(g_shader_dlg.controls[i].trackbar.hwnd, TBM_GETPOS, 0, 0); + + { + + shader_info.data->parameters[i].current = + shader_info.data->parameters[i].minimum + pos * shader_info.data->parameters[i].step; + } + + if (shader_info.data) + shader_dlg_refresh_trackbar_label(i, &shader_info); } - - shader_dlg_refresh_trackbar_label(i); break; } From a9c3837cdb5adb17e8d66b059b7d31b880364833 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Andr=C3=A9=20Santoni?= Date: Tue, 17 Jan 2017 01:02:15 +0100 Subject: [PATCH 22/61] Display image thumbnail in the menu background selector --- menu/drivers/xmb.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index 79d066ba1c..ad1aabcfff 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -890,7 +890,7 @@ static void xmb_update_thumbnail_path(void *data, unsigned i) menu_entry_get(&entry, 0, i, NULL, true); - if (entry.type == FILE_TYPE_IMAGEVIEWER) + if (entry.type == FILE_TYPE_IMAGEVIEWER || entry.type == FILE_TYPE_IMAGE) { file_list_t *selection_buf = menu_entries_get_selection_buf_ptr(0); xmb_node_t *node = (xmb_node_t*) @@ -907,7 +907,7 @@ static void xmb_update_thumbnail_path(void *data, unsigned i) return; } } - else if (xmb_list_get_selection(xmb) == 0) + else if (xmb_list_get_selection(xmb) <= XMB_SYSTEM_TAB_SETTINGS) { xmb->thumbnail_file_path[0] = '\0'; xmb->thumbnail = 0; @@ -1095,7 +1095,7 @@ static void xmb_selection_pointer_changed( if (!string_is_equal(xmb_thumbnails_ident(), msg_hash_to_str(MENU_ENUM_LABEL_VALUE_OFF)) - && (depth == 1 || xmb->categories.selection_ptr == 0)) + && (depth == 1 || xmb_list_get_selection(xmb) <= XMB_SYSTEM_TAB_SETTINGS)) { xmb_update_thumbnail_path(xmb, i); xmb_update_thumbnail_image(xmb); @@ -1273,7 +1273,7 @@ static void xmb_list_open_new(xmb_handle_t *xmb, xmb->old_depth = xmb->depth; menu_entries_ctl(MENU_ENTRIES_CTL_SET_START, &skip); - if (xmb_list_get_selection(xmb) == 0) + if (xmb_list_get_selection(xmb) <= XMB_SYSTEM_TAB_SETTINGS) xmb_update_thumbnail_path(xmb, 0); } From c283c1eaf429b34186c1f9a449b383d19f5cd6fb Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 19:26:19 -0500 Subject: [PATCH 23/61] disable shader dialog until video_threaded issues are fixed --- gfx/drivers/gl.c | 3 ++- media/rarch.rc | 3 ++- media/rarch_ja.rc | 3 ++- ui/drivers/ui_win32.c | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 160427cba2..5c42dcce36 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -2330,7 +2330,8 @@ static bool gl_set_shader(void *data, gl_set_shader_viewport(gl, 1); context_bind_hw_render(true); #if defined(_WIN32) && !defined(_XBOX) - shader_dlg_params_reload(); + /* Shader dialog is disabled for now, until video_threaded issues are fixed. + shader_dlg_params_reload();*/ #endif #endif diff --git a/media/rarch.rc b/media/rarch.rc index 57758d4aec..5bad253138 100644 --- a/media/rarch.rc +++ b/media/rarch.rc @@ -69,7 +69,8 @@ IDR_MENU MENU MENUITEM "10x", ID_M_WINDOW_SCALE_10X } MENUITEM "Toggle Exclusive Full Screen", ID_M_FULL_SCREEN - MENUITEM "Shader Parameters", ID_M_SHADER_PARAMETERS + // Shader dialog is disabled for now, until video_threaded issues are fixed. + //MENUITEM "Shader Parameters", ID_M_SHADER_PARAMETERS } } diff --git a/media/rarch_ja.rc b/media/rarch_ja.rc index d479e651ad..45f5423ba5 100644 --- a/media/rarch_ja.rc +++ b/media/rarch_ja.rc @@ -65,7 +65,8 @@ IDR_MENU MENU MENUITEM "10x", ID_M_WINDOW_SCALE_10X } MENUITEM "rIȃtXN[؂ւ", ID_M_FULL_SCREEN - MENUITEM "VF[_[̃p[^", ID_M_SHADER_PARAMETERS + // Shader dialog is disabled for now, until video_threaded issues are fixed. + //MENUITEM "VF[_[̃p[^", ID_M_SHADER_PARAMETERS } } diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index 5e530da392..b83d23dcfd 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -467,8 +467,9 @@ bool win32_window_init(WNDCLASSEX *wndclass, if (class_name != NULL) return true; + /* Shader dialog is disabled for now, until video_threaded issues are fixed. if (!win32_shader_dlg_init()) - RARCH_ERR("[WGL]: wgl_shader_dlg_init() failed.\n"); + RARCH_ERR("[WGL]: wgl_shader_dlg_init() failed.\n");*/ return true; } From 05c37bd39fb27102055dac54b213af406adb0dd4 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 4 Jan 2017 02:07:19 -0500 Subject: [PATCH 24/61] initial GDI driver skeleton --- Makefile.common | 5 + config.def.h | 4 + configuration.c | 4 + gfx/common/gdi_common.h | 26 ++ gfx/common/win32_common.cpp | 1 + gfx/drivers/gdi_gfx.c | 304 ++++++++++++++++++++++ gfx/drivers_context/gdi_ctx.cpp | 325 ++++++++++++++++++++++++ gfx/drivers_font/gdi_font.c | 133 ++++++++++ gfx/font_driver.c | 34 +++ gfx/font_driver.h | 4 +- gfx/video_context_driver.c | 3 + gfx/video_context_driver.h | 1 + gfx/video_driver.c | 3 + gfx/video_driver.h | 1 + griffin/griffin.c | 7 + menu/drivers_display/menu_display_gdi.c | 101 ++++++++ menu/menu_display.c | 7 + menu/menu_display.h | 4 +- 18 files changed, 965 insertions(+), 2 deletions(-) create mode 100644 gfx/common/gdi_common.h create mode 100644 gfx/drivers/gdi_gfx.c create mode 100644 gfx/drivers_context/gdi_ctx.cpp create mode 100644 gfx/drivers_font/gdi_font.c create mode 100644 menu/drivers_display/menu_display_gdi.c diff --git a/Makefile.common b/Makefile.common index 15374c1dca..e6b455f8a3 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1164,6 +1164,11 @@ ifneq ($(findstring Win32,$(OS)),) input/drivers_keyboard/keyboard_event_win32.o \ gfx/common/win32_common.o \ frontend/drivers/platform_win32.o + + OBJ += gfx/drivers/gdi_gfx.o \ + gfx/drivers_context/gdi_ctx.o \ + gfx/drivers_font/gdi_font.o \ + menu/drivers_display/menu_display_gdi.o endif ifeq ($(HAVE_AVFOUNDATION), 1) diff --git a/config.def.h b/config.def.h index dc5b14d610..28ed46adef 100644 --- a/config.def.h +++ b/config.def.h @@ -51,6 +51,8 @@ enum video_driver_enum VIDEO_EXYNOS, VIDEO_SUNXI, VIDEO_DISPMANX, + VIDEO_CACA, + VIDEO_GDI, VIDEO_NULL }; @@ -209,6 +211,8 @@ enum record_driver_enum #define VIDEO_DEFAULT_DRIVER VIDEO_SDL #elif defined(HAVE_SDL2) #define VIDEO_DEFAULT_DRIVER VIDEO_SDL2 +#elif defined(_WIN32) && !defined(_XBOX) +#define VIDEO_DEFAULT_DRIVER VIDEO_GDI #elif defined(HAVE_DYLIB) && !defined(ANDROID) #define VIDEO_DEFAULT_DRIVER VIDEO_EXT #else diff --git a/configuration.c b/configuration.c index 00edc333da..76d2271c77 100644 --- a/configuration.c +++ b/configuration.c @@ -310,6 +310,10 @@ const char *config_get_default_video(void) return "dispmanx"; case VIDEO_SUNXI: return "sunxi"; + case VIDEO_CACA: + return "caca"; + case VIDEO_GDI: + return "gdi"; case VIDEO_NULL: break; } diff --git a/gfx/common/gdi_common.h b/gfx/common/gdi_common.h new file mode 100644 index 0000000000..31334cfb74 --- /dev/null +++ b/gfx/common/gdi_common.h @@ -0,0 +1,26 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * copyright (c) 2011-2015 - Daniel De Matteis + * copyright (c) 2016 - Brad Parker + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#ifndef __GDI_COMMON_H +#define __GDI_COMMON_H + +typedef struct gdi +{ + bool test; +} gdi_t; + +#endif diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 2179dd7d17..7a8da43e08 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -57,6 +57,7 @@ LRESULT win32_menu_loop(HWND owner, WPARAM wparam); extern "C" bool dinput_handle_message(void *dinput, UINT message, WPARAM wParam, LPARAM lParam); +extern void *dinput_gdi; extern void *dinput_wgl; extern void *dinput; diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c new file mode 100644 index 0000000000..2009aa0c0b --- /dev/null +++ b/gfx/drivers/gdi_gfx.c @@ -0,0 +1,304 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2016 - Daniel De Matteis + * Copyright (C) 2016 - Brad Parker + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include + +#include "../../driver.h" +#include "../../configuration.h" +#include "../../verbosity.h" +#include "../../menu/menu_driver.h" +#include "../common/gdi_common.h" + +static unsigned char *gdi_menu_frame = NULL; +static unsigned gdi_menu_width = 0; +static unsigned gdi_menu_height = 0; +static unsigned gdi_menu_pitch = 0; +static unsigned gdi_video_width = 0; +static unsigned gdi_video_height = 0; +static unsigned gdi_video_pitch = 0; +static bool gdi_rgb32 = 0; + +static void gdi_gfx_free(void *data); + +static void gdi_gfx_create() +{ + if(!gdi_video_width || !gdi_video_height) + { + printf("***** GDI: no width or height!\n"); + } + + //video_driver_set_size(&gdi_video_width, &gdi_video_height); +} + +static void *gdi_gfx_init(const video_info_t *video, + const input_driver_t **input, void **input_data) +{ + settings_t *settings = config_get_ptr(); + gdi_t *gdi = (gdi_t*)calloc(1, sizeof(*gdi)); + + *input = NULL; + *input_data = NULL; + + gdi_video_width = video->width; + gdi_video_height = video->height; + gdi_rgb32 = video->rgb32; + + if (video->rgb32) + gdi_video_pitch = video->width * 4; + else + gdi_video_pitch = video->width * 2; + + gdi_gfx_create(); + + if (settings->video.font_enable) + font_driver_init_osd(NULL, false, FONT_DRIVER_RENDER_GDI); + + return gdi; +} + +static bool gdi_gfx_frame(void *data, const void *frame, + unsigned frame_width, unsigned frame_height, uint64_t frame_count, + unsigned pitch, const char *msg) +{ + const void *frame_to_copy = frame; + unsigned width = 0; + unsigned height = 0; + bool draw = true; + + (void)data; + (void)frame; + (void)frame_width; + (void)frame_height; + (void)pitch; + (void)msg; + + if (!frame || !frame_width || !frame_height) + return true; + + if (gdi_video_width != frame_width || gdi_video_height != frame_height || gdi_video_pitch != pitch) + { + if (frame_width > 4 && frame_height > 4) + { + gdi_video_width = frame_width; + gdi_video_height = frame_height; + gdi_video_pitch = pitch; + gdi_gfx_free(NULL); + gdi_gfx_create(); + } + } + + if (gdi_menu_frame) + frame_to_copy = gdi_menu_frame; + + //width = gdi_get_canvas_width(gdi_cv); + //height = gdi_get_canvas_height(gdi_cv); + width = frame_width; + height = frame_height; + + if (frame_to_copy == frame && frame_width == 4 && frame_height == 4 && (frame_width < width && frame_height < height)) + draw = false; + +#ifdef HAVE_MENU + menu_driver_ctl(RARCH_MENU_CTL_FRAME, NULL); +#endif + + if (msg) + font_driver_render_msg(NULL, msg, NULL); + + if (draw) + { + /*gdi_dither_bitmap(gdi_cv, 0, 0, + width, + height, + gdi_dither, frame_to_copy);*/ + } + + return true; +} + +static void gdi_gfx_set_nonblock_state(void *data, bool toggle) +{ + (void)data; + (void)toggle; +} + +static bool gdi_gfx_alive(void *data) +{ + (void)data; + video_driver_set_size(&gdi_video_width, &gdi_video_height); + return true; +} + +static bool gdi_gfx_focus(void *data) +{ + (void)data; + return true; +} + +static bool gdi_gfx_suppress_screensaver(void *data, bool enable) +{ + (void)data; + (void)enable; + return false; +} + +static bool gdi_gfx_has_windowed(void *data) +{ + (void)data; + return true; +} + +static void gdi_gfx_free(void *data) +{ + (void)data; + + if (gdi_menu_frame) + { + free(gdi_menu_frame); + gdi_menu_frame = NULL; + } +} + +static bool gdi_gfx_set_shader(void *data, + enum rarch_shader_type type, const char *path) +{ + (void)data; + (void)type; + (void)path; + + return false; +} + +static void gdi_gfx_set_rotation(void *data, + unsigned rotation) +{ + (void)data; + (void)rotation; +} + +static void gdi_gfx_viewport_info(void *data, + struct video_viewport *vp) +{ + (void)data; + (void)vp; +} + +static bool gdi_gfx_read_viewport(void *data, uint8_t *buffer) +{ + (void)data; + (void)buffer; + + return true; +} + +static void gdi_set_texture_frame(void *data, + const void *frame, bool rgb32, unsigned width, unsigned height, + float alpha) +{ + unsigned pitch = width * 2; + + if (rgb32) + pitch = width * 4; + + if (gdi_menu_frame) + { + free(gdi_menu_frame); + gdi_menu_frame = NULL; + } + + if (!gdi_menu_frame || gdi_menu_width != width || gdi_menu_height != height || gdi_menu_pitch != pitch) + if (pitch && height) + gdi_menu_frame = (unsigned char*)malloc(pitch * height); + + if (gdi_menu_frame && frame && pitch && height) + memcpy(gdi_menu_frame, frame, pitch * height); +} + +static void gdi_set_osd_msg(void *data, const char *msg, + const struct font_params *params, void *font) +{ + font_driver_render_msg(font, msg, params); +} + +static const video_poke_interface_t gdi_poke_interface = { + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, + NULL, +#ifdef HAVE_FBO + NULL, +#else + NULL, +#endif + NULL, + NULL, + NULL, +#if defined(HAVE_MENU) + gdi_set_texture_frame, + NULL, + gdi_set_osd_msg, + NULL, +#else + NULL, + NULL, + NULL, + NULL, +#endif + + NULL, +#ifdef HAVE_MENU + NULL, +#endif +}; + +static void gdi_gfx_get_poke_interface(void *data, + const video_poke_interface_t **iface) +{ + (void)data; + *iface = &gdi_poke_interface; +} + +static void gdi_gfx_set_viewport(void *data, unsigned viewport_width, + unsigned viewport_height, bool force_full, bool allow_rotate) +{ +} + +video_driver_t video_gdi = { + gdi_gfx_init, + gdi_gfx_frame, + gdi_gfx_set_nonblock_state, + gdi_gfx_alive, + gdi_gfx_focus, + gdi_gfx_suppress_screensaver, + gdi_gfx_has_windowed, + gdi_gfx_set_shader, + gdi_gfx_free, + "gdi", + gdi_gfx_set_viewport, + gdi_gfx_set_rotation, + gdi_gfx_viewport_info, + gdi_gfx_read_viewport, + NULL, /* read_frame_raw */ + +#ifdef HAVE_OVERLAY + NULL, /* overlay_interface */ +#endif + gdi_gfx_get_poke_interface, +}; diff --git a/gfx/drivers_context/gdi_ctx.cpp b/gfx/drivers_context/gdi_ctx.cpp new file mode 100644 index 0000000000..4ea4baadca --- /dev/null +++ b/gfx/drivers_context/gdi_ctx.cpp @@ -0,0 +1,325 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2016 - Daniel De Matteis + * Copyright (C) 2016 - Brad Parker + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +/* Win32/GDI context. */ + +/* necessary for mingw32 multimon defines: */ +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0500 //_WIN32_WINNT_WIN2K +#endif + +#include +#include + +#include +#include + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#include "../../configuration.h" +#include "../../dynamic.h" +#include "../../runloop.h" +#include "../../verbosity.h" +#include "../video_context_driver.h" + +#include "../common/win32_common.h" + +static HDC win32_hdc; + +static unsigned win32_major = 0; +static unsigned win32_minor = 0; +static unsigned win32_interval = 0; +static enum gfx_ctx_api win32_api = GFX_CTX_NONE; + +void *dinput_gdi; + +/*static void setup_pixel_format(HDC hdc) +{ + PIXELFORMATDESCRIPTOR pfd = {0}; + pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); + pfd.nVersion = 1; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.iPixelType = PFD_TYPE_RGBA; + pfd.cColorBits = 32; + pfd.cDepthBits = 0; + pfd.cStencilBits = 0; + pfd.iLayerType = PFD_MAIN_PLANE; + + SetPixelFormat(hdc, ChoosePixelFormat(hdc, &pfd), &pfd); +}*/ + +static void gfx_ctx_gdi_check_window(void *data, bool *quit, + bool *resize, unsigned *width, unsigned *height, unsigned frame_count) +{ + win32_check_window(quit, resize, width, height); +} + +static bool gfx_ctx_gdi_set_resize(void *data, + unsigned width, unsigned height) +{ + (void)data; + (void)width; + (void)height; + + switch (win32_api) + { + case GFX_CTX_NONE: + default: + break; + } + + return false; +} + +static void gfx_ctx_gdi_update_window_title(void *data) +{ + char buf[128]; + char buf_fps[128]; + settings_t *settings = config_get_ptr(); + const ui_window_t *window = ui_companion_driver_get_window_ptr(); + + buf[0] = buf_fps[0] = '\0'; + + if (window && video_monitor_get_fps(buf, sizeof(buf), + buf_fps, sizeof(buf_fps))) + window->set_title(&main_window, buf); + if (settings->fps_show) + runloop_msg_queue_push(buf_fps, 1, 1, false); +} + +static void gfx_ctx_gdi_get_video_size(void *data, + unsigned *width, unsigned *height) +{ + (void)data; + HWND window = win32_get_window(); + + if (!window) + { + RECT mon_rect; + MONITORINFOEX current_mon; + unsigned mon_id = 0; + HMONITOR hm_to_use = NULL; + + win32_monitor_info(¤t_mon, &hm_to_use, &mon_id); + mon_rect = current_mon.rcMonitor; + *width = mon_rect.right - mon_rect.left; + *height = mon_rect.bottom - mon_rect.top; + } + else + { + *width = g_resize_width; + *height = g_resize_height; + } +} + +static void *gfx_ctx_gdi_init(void *video_driver) +{ + WNDCLASSEX wndclass = {0}; + + (void)video_driver; + + if (g_inited) + return NULL; + + win32_window_reset(); + win32_monitor_init(); + + wndclass.lpfnWndProc = WndProcGL; + if (!win32_window_init(&wndclass, true, NULL)) + return NULL; + + switch (win32_api) + { + case GFX_CTX_NONE: + default: + break; + } + + return (void*)"gdi"; +} + +static void gfx_ctx_gdi_destroy(void *data) +{ + HWND window = win32_get_window(); + + (void)data; + + switch (win32_api) + { + case GFX_CTX_NONE: + default: + break; + } + + if (window && win32_hdc) + { + ReleaseDC(window, win32_hdc); + win32_hdc = NULL; + } + + if (window) + { + win32_monitor_from_window(); + win32_destroy_window(); + } + + if (g_restore_desktop) + { + win32_monitor_get_info(); + g_restore_desktop = false; + } + + g_inited = false; + win32_major = 0; + win32_minor = 0; +} + +static bool gfx_ctx_gdi_set_video_mode(void *data, + unsigned width, unsigned height, + bool fullscreen) +{ + if (!win32_set_video_mode(NULL, width, height, fullscreen)) + { + RARCH_ERR("[GDI]: win32_set_video_mode failed.\n"); + goto error; + } + + switch (win32_api) + { + case GFX_CTX_NONE: + default: + break; + } + + return true; + +error: + gfx_ctx_gdi_destroy(data); + return false; +} + + +static void gfx_ctx_gdi_input_driver(void *data, + const input_driver_t **input, void **input_data) +{ + (void)data; + + dinput_gdi = input_dinput.init(); + + *input = dinput_gdi ? &input_dinput : NULL; + *input_data = dinput_gdi; +} + +static bool gfx_ctx_gdi_has_focus(void *data) +{ + return win32_has_focus(); +} + +static bool gfx_ctx_gdi_suppress_screensaver(void *data, bool enable) +{ + return win32_suppress_screensaver(data, enable); +} + +static bool gfx_ctx_gdi_has_windowed(void *data) +{ + (void)data; + + return true; +} + +static bool gfx_ctx_gdi_get_metrics(void *data, + enum display_metric_types type, float *value) +{ + return win32_get_metrics(data, type, value); +} + +static bool gfx_ctx_gdi_bind_api(void *data, + enum gfx_ctx_api api, unsigned major, unsigned minor) +{ + (void)data; + + win32_major = major; + win32_minor = minor; + win32_api = api; + + return true; +} + +static void gfx_ctx_gdi_show_mouse(void *data, bool state) +{ + (void)data; + win32_show_cursor(state); +} + +static void gfx_ctx_gdi_swap_interval(void *data, unsigned interval) +{ + (void)data; + (void)interval; +} + +static void gfx_ctx_gdi_set_flags(void *data, uint32_t flags) +{ + (void)data; + (void)flags; +} + +static uint32_t gfx_ctx_gdi_get_flags(void *data) +{ + uint32_t flags = 0; + BIT32_SET(flags, GFX_CTX_FLAGS_NONE); + return flags; +} + +static void gfx_ctx_gdi_swap_buffers(void *data) +{ + (void)data; +} + +const gfx_ctx_driver_t gfx_ctx_gdi = { + gfx_ctx_gdi_init, + gfx_ctx_gdi_destroy, + gfx_ctx_gdi_bind_api, + gfx_ctx_gdi_swap_interval, + gfx_ctx_gdi_set_video_mode, + gfx_ctx_gdi_get_video_size, + NULL, /* get_video_output_size */ + NULL, /* get_video_output_prev */ + NULL, /* get_video_output_next */ + gfx_ctx_gdi_get_metrics, + NULL, + gfx_ctx_gdi_update_window_title, + gfx_ctx_gdi_check_window, + gfx_ctx_gdi_set_resize, + gfx_ctx_gdi_has_focus, + gfx_ctx_gdi_suppress_screensaver, + gfx_ctx_gdi_has_windowed, + gfx_ctx_gdi_swap_buffers, + gfx_ctx_gdi_input_driver, + NULL, + NULL, + NULL, + gfx_ctx_gdi_show_mouse, + "gdi", + gfx_ctx_gdi_get_flags, + gfx_ctx_gdi_set_flags, + NULL, + NULL, + NULL +}; + diff --git a/gfx/drivers_font/gdi_font.c b/gfx/drivers_font/gdi_font.c new file mode 100644 index 0000000000..2ca5c627ec --- /dev/null +++ b/gfx/drivers_font/gdi_font.c @@ -0,0 +1,133 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2016 - Daniel De Matteis + * Copyright (C) 2016 - Brad Parker + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include +#include + +#ifdef HAVE_CONFIG_H +#include "../../config.h" +#endif + +#include "../font_driver.h" +#include "../../configuration.h" +#include "../../verbosity.h" +#include "../common/gdi_common.h" + +typedef struct +{ + const font_renderer_driver_t *gdi_font_driver; + void *gdi_font_data; + gdi_t *gdi; +} gdi_raster_t; + +static void *gdi_init_font(void *data, + const char *font_path, float font_size) +{ + gdi_raster_t *font = (gdi_raster_t*)calloc(1, sizeof(*font)); + + if (!font) + return NULL; + + font->gdi = (gdi_t*)data; + + font_size = 1; + + if (!font_renderer_create_default((const void**)&font->gdi_font_driver, + &font->gdi_font_data, font_path, font_size)) + { + RARCH_WARN("Couldn't initialize font renderer.\n"); + return NULL; + } + + return font; +} + +static void gdi_render_free_font(void *data) +{ + +} + +static int gdi_get_message_width(void *data, const char *msg, + unsigned msg_len, float scale) +{ + return 0; +} + +static const struct font_glyph *gdi_font_get_glyph( + void *data, uint32_t code) +{ + return NULL; +} + +static void gdi_render_msg(void *data, const char *msg, + const void *userdata) +{ + gdi_raster_t *font = (gdi_raster_t*)data; + float x, y; + unsigned width = 0, height = 0; + unsigned newX, newY; + settings_t *settings = config_get_ptr(); + const struct font_params *params = (const struct font_params*)userdata; + + if (!font || string_is_empty(msg)) + return; + + if (params) + { + x = params->x; + y = params->y; + } + else + { + x = settings->video.msg_pos_x; + y = settings->video.msg_pos_y; + } + + if (!font->gdi) + return; + + newX = x * width; + newY = height - (y * height); + + if (strlen(msg) + newX > width) + newX -= strlen(msg) + newX - width; + + //gdi_put_str(*font->gdi->gdi_cv, newX, newY, msg); + + //gdi_refresh_display(*font->gdi->gdi_display); +} + +static void gdi_font_flush_block(void* data) +{ + (void)data; +} + +static void gdi_font_bind_block(void* data, void* userdata) +{ + (void)data; +} + +font_renderer_t gdi_font = { + gdi_init_font, + gdi_render_free_font, + gdi_render_msg, + "gdi font", + gdi_font_get_glyph, /* get_glyph */ + gdi_font_bind_block, /* bind_block */ + gdi_font_flush_block, /* flush */ + gdi_get_message_width /* get_message_width */ +}; diff --git a/gfx/font_driver.c b/gfx/font_driver.c index 9b6900121f..5fd85f93d0 100644 --- a/gfx/font_driver.c +++ b/gfx/font_driver.c @@ -178,6 +178,35 @@ static bool caca_font_init_first( } #endif +#if defined(_WIN32) && !defined(_XBOX) +static const font_renderer_t *gdi_font_backends[] = { + &gdi_font, + NULL, +}; + +static bool gdi_font_init_first( + const void **font_driver, void **font_handle, + void *video_data, const char *font_path, float font_size) +{ + unsigned i; + + for (i = 0; gdi_font_backends[i]; i++) + { + void *data = gdi_font_backends[i]->init( + video_data, font_path, font_size); + + if (!data) + continue; + + *font_driver = gdi_font_backends[i]; + *font_handle = data; + return true; + } + + return false; +} +#endif + #ifdef HAVE_VULKAN static const font_renderer_t *vulkan_font_backends[] = { &vulkan_raster_font, @@ -301,6 +330,11 @@ static bool font_init_first( case FONT_DRIVER_RENDER_CACA: return caca_font_init_first(font_driver, font_handle, video_data, font_path, font_size); +#endif +#if defined(_WIN32) && !defined(_XBOX) + case FONT_DRIVER_RENDER_GDI: + return gdi_font_init_first(font_driver, font_handle, + video_data, font_path, font_size); #endif case FONT_DRIVER_RENDER_DONT_CARE: /* TODO/FIXME - lookup graphics driver's 'API' */ diff --git a/gfx/font_driver.h b/gfx/font_driver.h index 6d3e374780..f2484db51f 100644 --- a/gfx/font_driver.h +++ b/gfx/font_driver.h @@ -32,7 +32,8 @@ enum font_driver_render_api FONT_DRIVER_RENDER_VITA2D, FONT_DRIVER_RENDER_CTR, FONT_DRIVER_RENDER_VULKAN_API, - FONT_DRIVER_RENDER_CACA + FONT_DRIVER_RENDER_CACA, + FONT_DRIVER_RENDER_GDI }; enum text_alignment @@ -164,6 +165,7 @@ extern font_renderer_t vita2d_vita_font; extern font_renderer_t ctr_font; extern font_renderer_t vulkan_raster_font; extern font_renderer_t caca_font; +extern font_renderer_t gdi_font; extern font_renderer_driver_t stb_font_renderer; extern font_renderer_driver_t stb_unicode_font_renderer; diff --git a/gfx/video_context_driver.c b/gfx/video_context_driver.c index f1b114ee61..59e223224b 100644 --- a/gfx/video_context_driver.c +++ b/gfx/video_context_driver.c @@ -88,6 +88,9 @@ static const gfx_ctx_driver_t *gfx_ctx_drivers[] = { #endif #if defined(HAVE_VULKAN) && defined(HAVE_VULKAN_DISPLAY) &gfx_ctx_khr_display, +#endif +#if defined(_WIN32) && !defined(_XBOX) + &gfx_ctx_gdi, #endif &gfx_ctx_null, NULL diff --git a/gfx/video_context_driver.h b/gfx/video_context_driver.h index 3b78e72a0a..63426451e7 100644 --- a/gfx/video_context_driver.h +++ b/gfx/video_context_driver.h @@ -249,6 +249,7 @@ extern const gfx_ctx_driver_t gfx_ctx_cocoagl; extern const gfx_ctx_driver_t gfx_ctx_emscripten; extern const gfx_ctx_driver_t gfx_ctx_opendingux_fbdev; extern const gfx_ctx_driver_t gfx_ctx_khr_display; +extern const gfx_ctx_driver_t gfx_ctx_gdi; extern const gfx_ctx_driver_t gfx_ctx_null; /** diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 30148ebd0c..ef7380267c 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -227,6 +227,9 @@ static const video_driver_t *video_drivers[] = { #ifdef HAVE_XSHM &video_xshm, #endif +#if defined(_WIN32) && !defined(_XBOX) + &video_gdi, +#endif #ifdef HAVE_CACA &video_caca, #endif diff --git a/gfx/video_driver.h b/gfx/video_driver.h index e6f83c1a21..6efb630b8b 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -563,6 +563,7 @@ extern video_driver_t video_sunxi; extern video_driver_t video_drm; extern video_driver_t video_xshm; extern video_driver_t video_caca; +extern video_driver_t video_gdi; extern video_driver_t video_null; extern const void *frame_cache_data; diff --git a/griffin/griffin.c b/griffin/griffin.c index 041d9b92c9..bd09df0a0a 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -402,6 +402,9 @@ FONTS #include "../gfx/drivers_font/caca_font.c" #endif +#if defined(_WIN32) && !defined(_XBOX) +#include "../gfx/drivers_font/gdi_font.c" +#endif #if defined(HAVE_VULKAN) #include "../gfx/drivers_font/vulkan_raster_font.c" @@ -994,6 +997,10 @@ MENU #include "../menu/drivers_display/menu_display_caca.c" #endif +#if defined(_WIN32) && !defined(_XBOX) +#include "../menu/drivers_display/menu_display_gdi.c" +#endif + #endif diff --git a/menu/drivers_display/menu_display_gdi.c b/menu/drivers_display/menu_display_gdi.c new file mode 100644 index 0000000000..18c804c22d --- /dev/null +++ b/menu/drivers_display/menu_display_gdi.c @@ -0,0 +1,101 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2011-2016 - Daniel De Matteis + * Copyright (C) 2016 - Brad Parker + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include + +#include +#include + +#include "../../config.def.h" +#include "../../gfx/font_driver.h" +#include "../../gfx/video_context_driver.h" + +#include "../menu_display.h" + +static void *menu_display_gdi_get_default_mvp(void) +{ + return NULL; +} + +static void menu_display_gdi_blend_begin(void) +{ +} + +static void menu_display_gdi_blend_end(void) +{ +} + +static void menu_display_gdi_draw(void *data) +{ + (void)data; +} + +static void menu_display_gdi_draw_pipeline(void *data) +{ + (void)data; +} + +static void menu_display_gdi_viewport(void *data) +{ + (void)data; +} + +static void menu_display_gdi_restore_clear_color(void) +{ +} + +static void menu_display_gdi_clear_color(menu_display_ctx_clearcolor_t *clearcolor) +{ + (void)clearcolor; +} + +static bool menu_display_gdi_font_init_first( + void **font_handle, void *video_data, + const char *font_path, float font_size) +{ + font_data_t **handle = (font_data_t**)font_handle; + *handle = font_driver_init_first(video_data, + font_path, font_size, true, FONT_DRIVER_RENDER_GDI); + return *handle; +} + +static const float *menu_display_gdi_get_default_vertices(void) +{ + static float dummy[16] = {0.0f}; + return &dummy[0]; +} + +static const float *menu_display_gdi_get_default_tex_coords(void) +{ + static float dummy[16] = {0.0f}; + return &dummy[0]; +} + +menu_display_ctx_driver_t menu_display_ctx_gdi = { + menu_display_gdi_draw, + menu_display_gdi_draw_pipeline, + menu_display_gdi_viewport, + menu_display_gdi_blend_begin, + menu_display_gdi_blend_end, + menu_display_gdi_restore_clear_color, + menu_display_gdi_clear_color, + menu_display_gdi_get_default_mvp, + menu_display_gdi_get_default_vertices, + menu_display_gdi_get_default_tex_coords, + menu_display_gdi_font_init_first, + MENU_VIDEO_DRIVER_GDI, + "menu_display_gdi", +}; diff --git a/menu/menu_display.c b/menu/menu_display.c index d2eaf151e0..6e45e1fbc7 100644 --- a/menu/menu_display.c +++ b/menu/menu_display.c @@ -82,6 +82,9 @@ static menu_display_ctx_driver_t *menu_display_ctx_drivers[] = { #endif #ifdef HAVE_CACA &menu_display_ctx_caca, +#endif +#if defined(_WIN32) && !defined(_XBOX) + &menu_display_ctx_gdi, #endif &menu_display_ctx_null, NULL, @@ -140,6 +143,10 @@ static bool menu_display_check_compatibility( if (string_is_equal(video_driver, "caca")) return true; break; + case MENU_VIDEO_DRIVER_GDI: + if (string_is_equal(video_driver, "gdi")) + return true; + break; } return false; diff --git a/menu/menu_display.h b/menu/menu_display.h index d58c00df12..6e7faa5c42 100644 --- a/menu/menu_display.h +++ b/menu/menu_display.h @@ -95,7 +95,8 @@ enum menu_display_driver_type MENU_VIDEO_DRIVER_DIRECT3D, MENU_VIDEO_DRIVER_VITA2D, MENU_VIDEO_DRIVER_CTR, - MENU_VIDEO_DRIVER_CACA + MENU_VIDEO_DRIVER_CACA, + MENU_VIDEO_DRIVER_GDI }; typedef struct menu_display_ctx_clearcolor @@ -294,6 +295,7 @@ extern menu_display_ctx_driver_t menu_display_ctx_d3d; extern menu_display_ctx_driver_t menu_display_ctx_vita2d; extern menu_display_ctx_driver_t menu_display_ctx_ctr; extern menu_display_ctx_driver_t menu_display_ctx_caca; +extern menu_display_ctx_driver_t menu_display_ctx_gdi; extern menu_display_ctx_driver_t menu_display_ctx_null; RETRO_END_DECLS From e6d7116da0edc020d97ad1809893e41e8c40eabe Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 4 Jan 2017 14:03:01 -0500 Subject: [PATCH 25/61] create GDI window --- gfx/common/gdi_common.h | 2 +- gfx/drivers/gdi_gfx.c | 85 ++++++++++++++++++++++++++++++++++++++ gfx/video_context_driver.h | 3 +- 3 files changed, 88 insertions(+), 2 deletions(-) diff --git a/gfx/common/gdi_common.h b/gfx/common/gdi_common.h index 31334cfb74..b4acb0afb5 100644 --- a/gfx/common/gdi_common.h +++ b/gfx/common/gdi_common.h @@ -20,7 +20,7 @@ typedef struct gdi { - bool test; + WNDCLASSEX wndclass; } gdi_t; #endif diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 2009aa0c0b..afac35945f 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -47,8 +47,12 @@ static void gdi_gfx_create() static void *gdi_gfx_init(const video_info_t *video, const input_driver_t **input, void **input_data) { + unsigned full_x, full_y; settings_t *settings = config_get_ptr(); gdi_t *gdi = (gdi_t*)calloc(1, sizeof(*gdi)); + const gfx_ctx_driver_t *ctx_driver = NULL; + gfx_ctx_input_t inp; + gfx_ctx_mode_t mode; *input = NULL; *input_data = NULL; @@ -64,10 +68,91 @@ static void *gdi_gfx_init(const video_info_t *video, gdi_gfx_create(); + ctx_driver = video_context_driver_init_first(gdi, + settings->video.context_driver, + GFX_CTX_GDI_API, 1, 0, false); + if (!ctx_driver) + goto error; + + video_context_driver_set((const gfx_ctx_driver_t*)ctx_driver); + +#ifdef HAVE_WINDOW + win32_window_init(&gdi->wndclass, true, NULL); +#endif + +#ifdef HAVE_MONITOR + bool windowed_full; + RECT mon_rect; + MONITORINFOEX current_mon; + HMONITOR hm_to_use; + + win32_monitor_info(¤t_mon, &hm_to_use, &d3d->cur_mon_id); + mon_rect = current_mon.rcMonitor; + g_resize_width = video->width; + g_resize_height = video->height; + + windowed_full = settings->video.windowed_fullscreen; + + full_x = (windowed_full || video->width == 0) ? + (mon_rect.right - mon_rect.left) : video->width; + full_y = (windowed_full || video->height == 0) ? + (mon_rect.bottom - mon_rect.top) : video->height; + RARCH_LOG("[GDI]: Monitor size: %dx%d.\n", + (int)(mon_rect.right - mon_rect.left), + (int)(mon_rect.bottom - mon_rect.top)); +#else + { + video_context_driver_get_video_size(&mode); + + full_x = mode.width; + full_y = mode.height; + } +#endif + { + unsigned new_width = video->fullscreen ? full_x : video->width; + unsigned new_height = video->fullscreen ? full_y : video->height; + mode.width = new_width; + mode.height = new_height; + mode.fullscreen = video->fullscreen; + + video_context_driver_set_video_mode(&mode); + video_driver_set_size(&new_width, &new_height); + } + +#ifdef HAVE_WINDOW + DWORD style; + unsigned win_width, win_height; + RECT rect = {0}; + + video_driver_get_size(&win_width, &win_height); + + win32_set_style(¤t_mon, &hm_to_use, &win_width, &win_height, + video->fullscreen, windowed_full, &rect, &mon_rect, &style); + + win32_window_create(gdi, style, &mon_rect, win_width, + win_height, video->fullscreen); + + win32_set_window(&win_width, &win_height, video->fullscreen, + windowed_full, &rect); +#endif + if (settings->video.font_enable) font_driver_init_osd(NULL, false, FONT_DRIVER_RENDER_GDI); + inp.input = input; + inp.input_data = input_data; + + video_context_driver_input_driver(&inp); + + RARCH_LOG("[GDI]: Init complete.\n"); + return gdi; + +error: + video_context_driver_destroy(); + if (gdi) + free(gdi); + return NULL; } static bool gdi_gfx_frame(void *data, const void *frame, diff --git a/gfx/video_context_driver.h b/gfx/video_context_driver.h index 63426451e7..55a150c177 100644 --- a/gfx/video_context_driver.h +++ b/gfx/video_context_driver.h @@ -37,7 +37,8 @@ enum gfx_ctx_api GFX_CTX_DIRECT3D8_API, GFX_CTX_DIRECT3D9_API, GFX_CTX_OPENVG_API, - GFX_CTX_VULKAN_API + GFX_CTX_VULKAN_API, + GFX_CTX_GDI_API }; enum display_metric_types From 2c6a24653cad173d0fc6d9be8c21c5c48e1db1d6 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 4 Jan 2017 14:36:32 -0500 Subject: [PATCH 26/61] testing --- gfx/drivers/gdi_gfx.c | 103 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 95 insertions(+), 8 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index afac35945f..7686be526a 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -53,6 +53,8 @@ static void *gdi_gfx_init(const video_info_t *video, const gfx_ctx_driver_t *ctx_driver = NULL; gfx_ctx_input_t inp; gfx_ctx_mode_t mode; + unsigned win_width = 0, win_height = 0; + unsigned temp_width = 0, temp_height = 0; *input = NULL; *input_data = NULL; @@ -76,7 +78,9 @@ static void *gdi_gfx_init(const video_info_t *video, video_context_driver_set((const gfx_ctx_driver_t*)ctx_driver); -#ifdef HAVE_WINDOW + RARCH_LOG("Found GDI context: %s\n", ctx_driver->ident); + +/*#ifdef HAVE_WINDOW win32_window_init(&gdi->wndclass, true, NULL); #endif @@ -135,15 +139,60 @@ static void *gdi_gfx_init(const video_info_t *video, win32_set_window(&win_width, &win_height, video->fullscreen, windowed_full, &rect); #endif +*/ - if (settings->video.font_enable) - font_driver_init_osd(NULL, false, FONT_DRIVER_RENDER_GDI); + video_context_driver_get_video_size(&mode); + + full_x = mode.width; + full_y = mode.height; + mode.width = 0; + mode.height = 0; + + RARCH_LOG("Detecting screen resolution %ux%u.\n", full_x, full_y); + + win_width = video->width; + win_height = video->height; + + if (video->fullscreen && (win_width == 0) && (win_height == 0)) + { + win_width = full_x; + win_height = full_y; + } + + mode.width = win_width; + mode.height = win_height; + mode.fullscreen = video->fullscreen; + + if (!video_context_driver_set_video_mode(&mode)) + goto error; + + mode.width = 0; + mode.height = 0; + + video_context_driver_get_video_size(&mode); + + temp_width = mode.width; + temp_height = mode.height; + mode.width = 0; + mode.height = 0; + + /* Get real known video size, which might have been altered by context. */ + + if (temp_width != 0 && temp_height != 0) + video_driver_set_size(&temp_width, &temp_height); + + video_driver_get_size(&temp_width, &temp_height); + + RARCH_LOG("GDI: Using resolution %ux%u\n", temp_width, temp_height); inp.input = input; inp.input_data = input_data; video_context_driver_input_driver(&inp); + if (settings->video.font_enable) + font_driver_init_osd(NULL, false, FONT_DRIVER_RENDER_GDI); + RARCH_LOG("[GDI]: Init complete.\n"); return gdi; @@ -249,13 +298,20 @@ static bool gdi_gfx_has_windowed(void *data) static void gdi_gfx_free(void *data) { - (void)data; + gdi_t *gdi = (gdi_t*)data; if (gdi_menu_frame) { free(gdi_menu_frame); gdi_menu_frame = NULL; } + + if (!gdi) + return; + + font_driver_free_osd(); + video_context_driver_free(); + free(gdi); } static bool gdi_gfx_set_shader(void *data, @@ -319,14 +375,45 @@ static void gdi_set_osd_msg(void *data, const char *msg, font_driver_render_msg(font, msg, params); } +static void gdi_get_video_output_size(void *data, + unsigned *width, unsigned *height) +{ + gfx_ctx_size_t size_data; + size_data.width = width; + size_data.height = height; + video_context_driver_get_video_output_size(&size_data); +} + +static void gdi_get_video_output_prev(void *data) +{ + video_context_driver_get_video_output_prev(); +} + +static void gdi_get_video_output_next(void *data) +{ + video_context_driver_get_video_output_next(); +} + +static void gdi_set_video_mode(void *data, unsigned width, unsigned height, + bool fullscreen) +{ + gfx_ctx_mode_t mode; + + mode.width = width; + mode.height = height; + mode.fullscreen = fullscreen; + + video_context_driver_set_video_mode(&mode); +} + static const video_poke_interface_t gdi_poke_interface = { NULL, NULL, + gdi_set_video_mode, NULL, - NULL, - NULL, - NULL, - NULL, + gdi_get_video_output_size, + gdi_get_video_output_prev, + gdi_get_video_output_next, #ifdef HAVE_FBO NULL, #else From a7a1f093c0db373579f5cda0e8b1a9b02cd18cd1 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 4 Jan 2017 22:57:00 -0500 Subject: [PATCH 27/61] add GDI message loop --- gfx/common/win32_common.cpp | 61 ++++++++++++++++++++++++++++++--- gfx/common/win32_common.h | 3 ++ gfx/drivers_context/gdi_ctx.cpp | 2 +- 3 files changed, 61 insertions(+), 5 deletions(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 7a8da43e08..d7f5607e53 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -510,6 +510,50 @@ LRESULT CALLBACK WndProcGL(HWND hwnd, UINT message, return DefWindowProc(hwnd, message, wparam, lparam); } +LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, + WPARAM wparam, LPARAM lparam) +{ + LRESULT ret; + bool quit = false; + + if (message == WM_NCLBUTTONDBLCLK) + doubleclick_on_titlebar = true; + + switch (message) + { + case WM_DROPFILES: + case WM_SYSCOMMAND: + case WM_CHAR: + case WM_KEYDOWN: + case WM_KEYUP: + case WM_SYSKEYUP: + case WM_SYSKEYDOWN: + case WM_CLOSE: + case WM_DESTROY: + case WM_QUIT: + case WM_SIZE: + case WM_COMMAND: + ret = WndProcCommon(&quit, hwnd, message, wparam, lparam); + if (quit) + return ret; + break; + case WM_CREATE: + { + ui_window_win32_t win32_window; + win32_window.hwnd = hwnd; + + g_inited = true; + + ui_window_win32_set_droppable(&win32_window, true); + } + return 0; + } + + if (dinput_gdi && dinput_handle_message(dinput_gdi, message, wparam, lparam)) + return 0; + return DefWindowProc(hwnd, message, wparam, lparam); +} + bool win32_window_create(void *data, unsigned style, RECT *mon_rect, unsigned width, unsigned height, bool fullscreen) @@ -781,6 +825,7 @@ bool win32_set_video_mode(void *data, RECT rect = {0}; HMONITOR hm_to_use = NULL; settings_t *settings = config_get_ptr(); + int res = 0; win32_monitor_info(¤t_mon, &hm_to_use, &mon_id); @@ -798,11 +843,19 @@ bool win32_set_video_mode(void *data, win32_set_window(&width, &height, fullscreen, windowed_full, &rect); - /* Wait until context is created (or failed to do so ...) */ - while (!g_inited && !g_quit && GetMessage(&msg, main_window.hwnd, 0, 0)) + /* Wait until context is created (or failed to do so ...). + * Please don't remove the (res = ) as GetMessage can return -1. */ + while (!g_inited && !g_quit && (res = GetMessage(&msg, main_window.hwnd, 0, 0)) != 0) { - TranslateMessage(&msg); - DispatchMessage(&msg); + if (res == -1) + { + RARCH_ERR("GetMessage error code %d\n", GetLastError()); + } + else + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } } if (g_quit) diff --git a/gfx/common/win32_common.h b/gfx/common/win32_common.h index 6e41231600..b1d7542f74 100644 --- a/gfx/common/win32_common.h +++ b/gfx/common/win32_common.h @@ -111,6 +111,9 @@ LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message, LRESULT CALLBACK WndProcGL(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); +LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, + WPARAM wparam, LPARAM lparam); + #ifdef _XBOX BOOL IsIconic(HWND hwnd); #endif diff --git a/gfx/drivers_context/gdi_ctx.cpp b/gfx/drivers_context/gdi_ctx.cpp index 4ea4baadca..61a3b0973e 100644 --- a/gfx/drivers_context/gdi_ctx.cpp +++ b/gfx/drivers_context/gdi_ctx.cpp @@ -140,7 +140,7 @@ static void *gfx_ctx_gdi_init(void *video_driver) win32_window_reset(); win32_monitor_init(); - wndclass.lpfnWndProc = WndProcGL; + wndclass.lpfnWndProc = WndProcGDI; if (!win32_window_init(&wndclass, true, NULL)) return NULL; From 33520fca6f877b751971c63740597a5c5f2a8e1d Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 4 Jan 2017 23:13:08 -0500 Subject: [PATCH 28/61] set win32_hdc for gdi --- gfx/common/win32_common.cpp | 2 +- gfx/common/win32_common.h | 1 + gfx/drivers_context/gdi_ctx.cpp | 7 +++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index d7f5607e53..05beed2ea6 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -542,7 +542,7 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, ui_window_win32_t win32_window; win32_window.hwnd = hwnd; - g_inited = true; + create_gdi_context(hwnd, &g_quit); ui_window_win32_set_droppable(&win32_window, true); } diff --git a/gfx/common/win32_common.h b/gfx/common/win32_common.h index b1d7542f74..c35306a0c3 100644 --- a/gfx/common/win32_common.h +++ b/gfx/common/win32_common.h @@ -51,6 +51,7 @@ void win32_monitor_get_info(void); void win32_monitor_info(void *data, void *hm_data, unsigned *mon_id); void create_graphics_context(HWND hwnd, bool *quit); +void create_gdi_context(HWND hwnd, bool *quit); bool win32_shader_dlg_init(void); void shader_dlg_show(HWND parent_hwnd); diff --git a/gfx/drivers_context/gdi_ctx.cpp b/gfx/drivers_context/gdi_ctx.cpp index 61a3b0973e..a71e63ab26 100644 --- a/gfx/drivers_context/gdi_ctx.cpp +++ b/gfx/drivers_context/gdi_ctx.cpp @@ -291,6 +291,13 @@ static void gfx_ctx_gdi_swap_buffers(void *data) (void)data; } +void create_gdi_context(HWND hwnd, bool *quit) +{ + (void)quit; + win32_hdc = GetDC(hwnd); + g_inited = true; +} + const gfx_ctx_driver_t gfx_ctx_gdi = { gfx_ctx_gdi_init, gfx_ctx_gdi_destroy, From fb7c3f4c37c58727444928f7dade6e88d49a5150 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 4 Jan 2017 23:30:37 -0500 Subject: [PATCH 29/61] set pixel format for GDI driver --- gfx/drivers_context/gdi_ctx.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/gfx/drivers_context/gdi_ctx.cpp b/gfx/drivers_context/gdi_ctx.cpp index a71e63ab26..3a8706e0d1 100644 --- a/gfx/drivers_context/gdi_ctx.cpp +++ b/gfx/drivers_context/gdi_ctx.cpp @@ -49,12 +49,12 @@ static enum gfx_ctx_api win32_api = GFX_CTX_NONE; void *dinput_gdi; -/*static void setup_pixel_format(HDC hdc) +static void setup_pixel_format(HDC hdc) { PIXELFORMATDESCRIPTOR pfd = {0}; pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); pfd.nVersion = 1; - pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER; + pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_DOUBLEBUFFER; pfd.iPixelType = PFD_TYPE_RGBA; pfd.cColorBits = 32; pfd.cDepthBits = 0; @@ -62,7 +62,7 @@ void *dinput_gdi; pfd.iLayerType = PFD_MAIN_PLANE; SetPixelFormat(hdc, ChoosePixelFormat(hdc, &pfd), &pfd); -}*/ +} static void gfx_ctx_gdi_check_window(void *data, bool *quit, bool *resize, unsigned *width, unsigned *height, unsigned frame_count) @@ -295,6 +295,9 @@ void create_gdi_context(HWND hwnd, bool *quit) { (void)quit; win32_hdc = GetDC(hwnd); + + setup_pixel_format(win32_hdc); + g_inited = true; } From bc8f9f7f3fb4aedf2c307a7133aa1834d6ad0fc6 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 4 Jan 2017 23:35:13 -0500 Subject: [PATCH 30/61] add SwapBuffers() for gdi --- gfx/drivers_context/gdi_ctx.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/gfx/drivers_context/gdi_ctx.cpp b/gfx/drivers_context/gdi_ctx.cpp index 3a8706e0d1..4d93578a38 100644 --- a/gfx/drivers_context/gdi_ctx.cpp +++ b/gfx/drivers_context/gdi_ctx.cpp @@ -289,6 +289,8 @@ static uint32_t gfx_ctx_gdi_get_flags(void *data) static void gfx_ctx_gdi_swap_buffers(void *data) { (void)data; + + SwapBuffers(win32_hdc); } void create_gdi_context(HWND hwnd, bool *quit) From 6df175bd31768f1c594336a945a49179de87f015 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 4 Jan 2017 23:50:59 -0500 Subject: [PATCH 31/61] GDI paint test --- gfx/common/win32_common.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 05beed2ea6..8337d1f179 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -521,6 +521,12 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, switch (message) { + case WM_PAINT: + PAINTSTRUCT ps; + HDC hdc = BeginPaint(hwnd, &ps); + TextOut(hdc, 0, 0, "Hello, Windows!", 15); + EndPaint(hwnd, &ps); + break; case WM_DROPFILES: case WM_SYSCOMMAND: case WM_CHAR: From 49d7be98139b22b802f02380851b72566d30c85e Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Thu, 5 Jan 2017 17:21:13 -0500 Subject: [PATCH 32/61] MSVC GDI buildfix --- gfx/common/win32_common.cpp | 17 +++++++++---- gfx/common/win32_common.h | 7 +++++- gfx/drivers/gdi_gfx.c | 12 +++++++++- gfx/drivers_context/gdi_ctx.cpp | 42 ++++++++++++++++----------------- griffin/griffin.c | 5 +++- griffin/griffin_cpp.cpp | 4 ++++ 6 files changed, 59 insertions(+), 28 deletions(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 8337d1f179..4adff55e2f 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -515,6 +515,10 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, { LRESULT ret; bool quit = false; + PAINTSTRUCT ps; + HDC hdc; + RECT rc; + POINT aptStar[6] = {50,2, 2,98, 98,33, 2,33, 98,98, 50,2}; if (message == WM_NCLBUTTONDBLCLK) doubleclick_on_titlebar = true; @@ -522,11 +526,15 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, switch (message) { case WM_PAINT: - PAINTSTRUCT ps; - HDC hdc = BeginPaint(hwnd, &ps); - TextOut(hdc, 0, 0, "Hello, Windows!", 15); + hdc = BeginPaint(hwnd, &ps); + //TextOut(hdc, 0, 0, "Hello, Windows!", 15); + GetClientRect(hwnd, &rc); + SetMapMode(hdc, MM_ANISOTROPIC); + SetWindowExtEx(hdc, 100, 100, NULL); + SetViewportExtEx(hdc, rc.right, rc.bottom, NULL); + Polyline(hdc, aptStar, 6); EndPaint(hwnd, &ps); - break; + return 0L; case WM_DROPFILES: case WM_SYSCOMMAND: case WM_CHAR: @@ -856,6 +864,7 @@ bool win32_set_video_mode(void *data, if (res == -1) { RARCH_ERR("GetMessage error code %d\n", GetLastError()); + break; } else { diff --git a/gfx/common/win32_common.h b/gfx/common/win32_common.h index c35306a0c3..37dbd6efbc 100644 --- a/gfx/common/win32_common.h +++ b/gfx/common/win32_common.h @@ -85,7 +85,13 @@ bool win32_get_metrics(void *data, void win32_show_cursor(bool state); +#ifdef __cplusplus +extern "C" { +#endif HWND win32_get_window(void); +#ifdef __cplusplus +} +#endif bool win32_has_focus(void); @@ -96,7 +102,6 @@ void win32_set_window(unsigned *width, unsigned *height, bool fullscreen, bool windowed_full, void *rect_data); #ifndef _XBOX -/* FIXME: It should not be necessary to add the W after MONITORINFOEX, but linking fails without it. */ void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use, unsigned *width, unsigned *height, bool fullscreen, bool windowed_full, RECT *rect, RECT *mon_rect, DWORD *style); diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 7686be526a..93ff82e2fc 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -23,6 +23,10 @@ #include "../../menu/menu_driver.h" #include "../common/gdi_common.h" +#if defined(_WIN32) && !defined(_XBOX) +#include "../common/win32_common.h" +#endif + static unsigned char *gdi_menu_frame = NULL; static unsigned gdi_menu_width = 0; static unsigned gdi_menu_height = 0; @@ -212,8 +216,8 @@ static bool gdi_gfx_frame(void *data, const void *frame, unsigned width = 0; unsigned height = 0; bool draw = true; + gdi_t *gdi = (gdi_t*)data; - (void)data; (void)frame; (void)frame_width; (void)frame_height; @@ -253,6 +257,10 @@ static bool gdi_gfx_frame(void *data, const void *frame, if (msg) font_driver_render_msg(NULL, msg, NULL); + video_context_driver_update_window_title(); + + video_context_driver_swap_buffers(); + if (draw) { /*gdi_dither_bitmap(gdi_cv, 0, 0, @@ -261,6 +269,8 @@ static bool gdi_gfx_frame(void *data, const void *frame, gdi_dither, frame_to_copy);*/ } + //UpdateWindow(win32_get_window()); + return true; } diff --git a/gfx/drivers_context/gdi_ctx.cpp b/gfx/drivers_context/gdi_ctx.cpp index 4d93578a38..a2a8c12abb 100644 --- a/gfx/drivers_context/gdi_ctx.cpp +++ b/gfx/drivers_context/gdi_ctx.cpp @@ -40,16 +40,16 @@ #include "../common/win32_common.h" -static HDC win32_hdc; +static HDC win32_gdi_hdc; -static unsigned win32_major = 0; -static unsigned win32_minor = 0; -static unsigned win32_interval = 0; -static enum gfx_ctx_api win32_api = GFX_CTX_NONE; +static unsigned win32_gdi_major = 0; +static unsigned win32_gdi_minor = 0; +static unsigned win32_gdi_interval = 0; +static enum gfx_ctx_api win32_gdi_api = GFX_CTX_NONE; void *dinput_gdi; -static void setup_pixel_format(HDC hdc) +static void setup_gdi_pixel_format(HDC hdc) { PIXELFORMATDESCRIPTOR pfd = {0}; pfd.nSize = sizeof(PIXELFORMATDESCRIPTOR); @@ -77,7 +77,7 @@ static bool gfx_ctx_gdi_set_resize(void *data, (void)width; (void)height; - switch (win32_api) + switch (win32_gdi_api) { case GFX_CTX_NONE: default: @@ -144,7 +144,7 @@ static void *gfx_ctx_gdi_init(void *video_driver) if (!win32_window_init(&wndclass, true, NULL)) return NULL; - switch (win32_api) + switch (win32_gdi_api) { case GFX_CTX_NONE: default: @@ -160,17 +160,17 @@ static void gfx_ctx_gdi_destroy(void *data) (void)data; - switch (win32_api) + switch (win32_gdi_api) { case GFX_CTX_NONE: default: break; } - if (window && win32_hdc) + if (window && win32_gdi_hdc) { - ReleaseDC(window, win32_hdc); - win32_hdc = NULL; + ReleaseDC(window, win32_gdi_hdc); + win32_gdi_hdc = NULL; } if (window) @@ -186,8 +186,8 @@ static void gfx_ctx_gdi_destroy(void *data) } g_inited = false; - win32_major = 0; - win32_minor = 0; + win32_gdi_major = 0; + win32_gdi_minor = 0; } static bool gfx_ctx_gdi_set_video_mode(void *data, @@ -200,7 +200,7 @@ static bool gfx_ctx_gdi_set_video_mode(void *data, goto error; } - switch (win32_api) + switch (win32_gdi_api) { case GFX_CTX_NONE: default: @@ -254,9 +254,9 @@ static bool gfx_ctx_gdi_bind_api(void *data, { (void)data; - win32_major = major; - win32_minor = minor; - win32_api = api; + win32_gdi_major = major; + win32_gdi_minor = minor; + win32_gdi_api = api; return true; } @@ -290,15 +290,15 @@ static void gfx_ctx_gdi_swap_buffers(void *data) { (void)data; - SwapBuffers(win32_hdc); + SwapBuffers(win32_gdi_hdc); } void create_gdi_context(HWND hwnd, bool *quit) { (void)quit; - win32_hdc = GetDC(hwnd); + win32_gdi_hdc = GetDC(hwnd); - setup_pixel_format(win32_hdc); + setup_gdi_pixel_format(win32_gdi_hdc); g_inited = true; } diff --git a/griffin/griffin.c b/griffin/griffin.c index bd09df0a0a..8a2942388b 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -221,7 +221,6 @@ VIDEO CONTEXT #endif - /*============================================================ VIDEO SHADERS ============================================================ */ @@ -358,6 +357,10 @@ VIDEO DRIVER #endif #include "../gfx/drivers/nullgfx.c" +#if defined(_WIN32) && !defined(_XBOX) +#include "../gfx/drivers/gdi_gfx.c" +#endif + /*============================================================ FONTS ============================================================ */ diff --git a/griffin/griffin_cpp.cpp b/griffin/griffin_cpp.cpp index 0207179676..e01399c174 100644 --- a/griffin/griffin_cpp.cpp +++ b/griffin/griffin_cpp.cpp @@ -115,6 +115,10 @@ UI COMMON CONTEXT #include "../gfx/drivers_context/wgl_ctx.cpp" #endif +#if defined(_WIN32) && !defined(_XBOX) +#include "../gfx/drivers_context/gdi_ctx.cpp" +#endif + #if defined(HAVE_FFMPEG) #if defined(HAVE_OPENGL) || defined(HAVE_OPENGLES3) #include "../cores/libretro-ffmpeg/fft/fft.cpp" From dd2778fb3289b9829d7f91e400aefd82e153be0a Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Thu, 5 Jan 2017 22:17:48 -0500 Subject: [PATCH 33/61] GDI text testing --- gfx/common/win32_common.cpp | 14 -------------- gfx/drivers_font/gdi_font.c | 23 +++++++++++++++++++---- 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 4adff55e2f..82af6fe650 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -515,26 +515,12 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, { LRESULT ret; bool quit = false; - PAINTSTRUCT ps; - HDC hdc; - RECT rc; - POINT aptStar[6] = {50,2, 2,98, 98,33, 2,33, 98,98, 50,2}; if (message == WM_NCLBUTTONDBLCLK) doubleclick_on_titlebar = true; switch (message) { - case WM_PAINT: - hdc = BeginPaint(hwnd, &ps); - //TextOut(hdc, 0, 0, "Hello, Windows!", 15); - GetClientRect(hwnd, &rc); - SetMapMode(hdc, MM_ANISOTROPIC); - SetWindowExtEx(hdc, 100, 100, NULL); - SetViewportExtEx(hdc, rc.right, rc.bottom, NULL); - Polyline(hdc, aptStar, 6); - EndPaint(hwnd, &ps); - return 0L; case WM_DROPFILES: case WM_SYSCOMMAND: case WM_CHAR: diff --git a/gfx/drivers_font/gdi_font.c b/gfx/drivers_font/gdi_font.c index 2ca5c627ec..e7ae5a74a1 100644 --- a/gfx/drivers_font/gdi_font.c +++ b/gfx/drivers_font/gdi_font.c @@ -17,6 +17,7 @@ #include #include +#include #ifdef HAVE_CONFIG_H #include "../../config.h" @@ -26,6 +27,10 @@ #include "../../configuration.h" #include "../../verbosity.h" #include "../common/gdi_common.h" +#include "../common/win32_common.h" + +#include +#include typedef struct { @@ -82,6 +87,8 @@ static void gdi_render_msg(void *data, const char *msg, unsigned newX, newY; settings_t *settings = config_get_ptr(); const struct font_params *params = (const struct font_params*)userdata; + HDC hdc; + HWND hwnd = win32_get_window(); if (!font || string_is_empty(msg)) return; @@ -100,15 +107,23 @@ static void gdi_render_msg(void *data, const char *msg, if (!font->gdi) return; - newX = x * width; - newY = height - (y * height); + newX = x;//x * width; + newY = y;//height - (y * height); - if (strlen(msg) + newX > width) - newX -= strlen(msg) + newX - width; + //if (strlen(msg) + newX > width) + // newX -= strlen(msg) + newX - width; //gdi_put_str(*font->gdi->gdi_cv, newX, newY, msg); //gdi_refresh_display(*font->gdi->gdi_display); + + printf("drawing text: %s at %d x %d\n", msg, newX, newY); + + hdc = GetDC(hwnd); + TextOut(hdc, newX, newY, msg, utf8len(msg)); + ReleaseDC(hwnd, hdc); + + UpdateWindow(hwnd); } static void gdi_font_flush_block(void* data) From 177d8114754fd67b9c9079cf53cdc8dab4f77f04 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 6 Jan 2017 19:55:28 -0500 Subject: [PATCH 34/61] GDI driver partially visible with RGUI/game now, need to figure out why it isn't totally visible. Also need to stretch the frame, swap red/blue and flip vertically. --- gfx/drivers/gdi_gfx.c | 38 ++++++++++++++++++++++++++----------- gfx/drivers_font/gdi_font.c | 18 +++++------------- 2 files changed, 32 insertions(+), 24 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 93ff82e2fc..20804a772a 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -34,6 +34,7 @@ static unsigned gdi_menu_pitch = 0; static unsigned gdi_video_width = 0; static unsigned gdi_video_height = 0; static unsigned gdi_video_pitch = 0; +static unsigned gdi_video_bits = 0; static bool gdi_rgb32 = 0; static void gdi_gfx_free(void *data); @@ -67,6 +68,8 @@ static void *gdi_gfx_init(const video_info_t *video, gdi_video_height = video->height; gdi_rgb32 = video->rgb32; + gdi_video_bits = video->rgb32 ? 32 : 16; + if (video->rgb32) gdi_video_pitch = video->width * 4; else @@ -141,7 +144,7 @@ static void *gdi_gfx_init(const video_info_t *video, win_height, video->fullscreen); win32_set_window(&win_width, &win_height, video->fullscreen, - windowed_full, &rect); + windowed_full, &rect); #endif */ @@ -218,12 +221,6 @@ static bool gdi_gfx_frame(void *data, const void *frame, bool draw = true; gdi_t *gdi = (gdi_t*)data; - (void)frame; - (void)frame_width; - (void)frame_height; - (void)pitch; - (void)msg; - if (!frame || !frame_width || !frame_height) return true; @@ -257,18 +254,37 @@ static bool gdi_gfx_frame(void *data, const void *frame, if (msg) font_driver_render_msg(NULL, msg, NULL); - video_context_driver_update_window_title(); - - video_context_driver_swap_buffers(); - if (draw) { /*gdi_dither_bitmap(gdi_cv, 0, 0, width, height, gdi_dither, frame_to_copy);*/ + unsigned win_width, win_height; + HWND hwnd = win32_get_window(); + HDC dc = GetDC(hwnd); + BITMAPINFO info; + + video_driver_get_size(&win_width, &win_height); + + ZeroMemory(&info, sizeof(BITMAPINFO)); + info.bmiHeader.biBitCount = gdi_video_bits; + info.bmiHeader.biWidth = width; + info.bmiHeader.biHeight = height; + info.bmiHeader.biPlanes = 1; + info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); + info.bmiHeader.biSizeImage = pitch * height; + info.bmiHeader.biCompression = BI_RGB; + + StretchDIBits(dc, 0, 0, win_width, win_height, 0, 0, width, height, + frame_to_copy, &info, DIB_RGB_COLORS, SRCCOPY); + ReleaseDC(hwnd, dc); } + video_context_driver_update_window_title(); + + video_context_driver_swap_buffers(); + //UpdateWindow(win32_get_window()); return true; diff --git a/gfx/drivers_font/gdi_font.c b/gfx/drivers_font/gdi_font.c index e7ae5a74a1..b1f2cab663 100644 --- a/gfx/drivers_font/gdi_font.c +++ b/gfx/drivers_font/gdi_font.c @@ -24,6 +24,7 @@ #endif #include "../font_driver.h" +#include "../video_driver.h" #include "../../configuration.h" #include "../../verbosity.h" #include "../common/gdi_common.h" @@ -93,6 +94,8 @@ static void gdi_render_msg(void *data, const char *msg, if (!font || string_is_empty(msg)) return; + video_driver_get_size(&width, &height); + if (params) { x = params->x; @@ -107,23 +110,12 @@ static void gdi_render_msg(void *data, const char *msg, if (!font->gdi) return; - newX = x;//x * width; - newY = y;//height - (y * height); - - //if (strlen(msg) + newX > width) - // newX -= strlen(msg) + newX - width; - - //gdi_put_str(*font->gdi->gdi_cv, newX, newY, msg); - - //gdi_refresh_display(*font->gdi->gdi_display); - - printf("drawing text: %s at %d x %d\n", msg, newX, newY); + newX = x * width; + newY = height - (y * height); hdc = GetDC(hwnd); TextOut(hdc, newX, newY, msg, utf8len(msg)); ReleaseDC(hwnd, hdc); - - UpdateWindow(hwnd); } static void gdi_font_flush_block(void* data) From 90ef57948c618134eeb5dfa8296fb4c294b19b2d Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sat, 7 Jan 2017 01:00:13 -0500 Subject: [PATCH 35/61] GDI testing --- gfx/drivers/gdi_gfx.c | 44 +++++++++++++++++++++++++++++++++++++------ 1 file changed, 38 insertions(+), 6 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 20804a772a..373b6a30bc 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -256,16 +256,13 @@ static bool gdi_gfx_frame(void *data, const void *frame, if (draw) { - /*gdi_dither_bitmap(gdi_cv, 0, 0, - width, - height, - gdi_dither, frame_to_copy);*/ unsigned win_width, win_height; HWND hwnd = win32_get_window(); HDC dc = GetDC(hwnd); BITMAPINFO info; + gfx_ctx_mode_t mode; - video_driver_get_size(&win_width, &win_height); + video_context_driver_get_video_size(&mode); ZeroMemory(&info, sizeof(BITMAPINFO)); info.bmiHeader.biBitCount = gdi_video_bits; @@ -275,8 +272,43 @@ static bool gdi_gfx_frame(void *data, const void *frame, info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); info.bmiHeader.biSizeImage = pitch * height; info.bmiHeader.biCompression = BI_RGB; +/* + if (gdi_rgb32) + { + info.bmiColors[0].rgbBlue = 0xFF; + info.bmiColors[0].rgbGreen = 0x00; + info.bmiColors[0].rgbRed = 0x00; + info.bmiColors[0].rgbReserved = 0x00; - StretchDIBits(dc, 0, 0, win_width, win_height, 0, 0, width, height, + info.bmiColors[1].rgbBlue = 0x00; + info.bmiColors[1].rgbGreen = 0xFF; + info.bmiColors[1].rgbRed = 0x00; + info.bmiColors[1].rgbReserved = 0x00; + + info.bmiColors[2].rgbBlue = 0x00; + info.bmiColors[2].rgbGreen = 0x00; + info.bmiColors[2].rgbRed = 0xFF; + info.bmiColors[2].rgbReserved = 0x00; + } + else + { + info.bmiColors[0].rgbBlue = 0x1F; + info.bmiColors[0].rgbGreen = 0x00; + info.bmiColors[0].rgbRed = 0x00; + info.bmiColors[0].rgbReserved = 0x00; + + info.bmiColors[1].rgbBlue = 0x00; + info.bmiColors[1].rgbGreen = 0x1F; + info.bmiColors[1].rgbRed = 0x00; + info.bmiColors[1].rgbReserved = 0x00; + + info.bmiColors[2].rgbBlue = 0x00; + info.bmiColors[2].rgbGreen = 0x00; + info.bmiColors[2].rgbRed = 0x1F; + info.bmiColors[2].rgbReserved = 0x00; + } +*/ + StretchDIBits(dc, 0, 0, mode.width, mode.height, 0, 0, width, height, frame_to_copy, &info, DIB_RGB_COLORS, SRCCOPY); ReleaseDC(hwnd, dc); } From 8eba18a54fda9d683128b37e6bfa35ef80097910 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sun, 8 Jan 2017 15:27:51 -0500 Subject: [PATCH 36/61] GDI: xmb draws for a few seconds and then freezes --- gfx/common/win32_common.cpp | 14 ++++++++++++++ gfx/drivers/gdi_gfx.c | 17 +++++++++++------ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 82af6fe650..60e67122a6 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -521,6 +521,20 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, switch (message) { + case WM_PAINT: + { + PAINTSTRUCT ps; + HDC hdc = BeginPaint(hwnd, &ps); + + // All painting occurs here, between BeginPaint and EndPaint. + + FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1)); + + EndPaint(hwnd, &ps); + break; + } + case WM_ERASEBKGND: + break; case WM_DROPFILES: case WM_SYSCOMMAND: case WM_CHAR: diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 373b6a30bc..6ed6baf16e 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -220,6 +220,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, unsigned height = 0; bool draw = true; gdi_t *gdi = (gdi_t*)data; + HWND hwnd = win32_get_window(); if (!frame || !frame_width || !frame_height) return true; @@ -256,12 +257,14 @@ static bool gdi_gfx_frame(void *data, const void *frame, if (draw) { - unsigned win_width, win_height; - HWND hwnd = win32_get_window(); - HDC dc = GetDC(hwnd); + HDC winDC = GetDC(hwnd); + HDC dc = CreateCompatibleDC(winDC); + HBITMAP bmp = CreateCompatibleBitmap(winDC, width, height); BITMAPINFO info; gfx_ctx_mode_t mode; + SelectObject(dc, bmp); + video_context_driver_get_video_size(&mode); ZeroMemory(&info, sizeof(BITMAPINFO)); @@ -310,15 +313,17 @@ static bool gdi_gfx_frame(void *data, const void *frame, */ StretchDIBits(dc, 0, 0, mode.width, mode.height, 0, 0, width, height, frame_to_copy, &info, DIB_RGB_COLORS, SRCCOPY); - ReleaseDC(hwnd, dc); + DeleteObject(bmp); + DeleteDC(dc); + ReleaseDC(hwnd, winDC); } + InvalidateRect(hwnd, NULL, true); + video_context_driver_update_window_title(); video_context_driver_swap_buffers(); - //UpdateWindow(win32_get_window()); - return true; } From 6fe2a974a5e996fb6d6ea68ee254220eab154fcc Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sun, 8 Jan 2017 22:20:43 -0500 Subject: [PATCH 37/61] GDI: does not freeze after a few seconds anymore, but the window still freezes when moving the mouse into it --- gfx/common/win32_common.cpp | 5 ++--- gfx/drivers/gdi_gfx.c | 29 ++++++++++++++++++++++++----- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 60e67122a6..d283b72f69 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -528,13 +528,12 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, // All painting occurs here, between BeginPaint and EndPaint. - FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1)); + //FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1)); EndPaint(hwnd, &ps); + return 0; break; } - case WM_ERASEBKGND: - break; case WM_DROPFILES: case WM_SYSCOMMAND: case WM_CHAR: diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 6ed6baf16e..023b536446 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -258,12 +258,23 @@ static bool gdi_gfx_frame(void *data, const void *frame, if (draw) { HDC winDC = GetDC(hwnd); - HDC dc = CreateCompatibleDC(winDC); + HDC memDC = CreateCompatibleDC(winDC); HBITMAP bmp = CreateCompatibleBitmap(winDC, width, height); + HBITMAP bmp_old; BITMAPINFO info; gfx_ctx_mode_t mode; + RECT rect; + HBRUSH brush; - SelectObject(dc, bmp); + GetClientRect(hwnd, &rect); + + bmp_old = SelectObject(memDC, bmp); + + brush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); + + FillRect(memDC, &rect, brush); + + DeleteObject(brush); video_context_driver_get_video_size(&mode); @@ -311,14 +322,22 @@ static bool gdi_gfx_frame(void *data, const void *frame, info.bmiColors[2].rgbReserved = 0x00; } */ - StretchDIBits(dc, 0, 0, mode.width, mode.height, 0, 0, width, height, + StretchDIBits(memDC, 0, 0, mode.width, mode.height, 0, 0, width, height, frame_to_copy, &info, DIB_RGB_COLORS, SRCCOPY); + + BitBlt(winDC, + rect.left, rect.top, + rect.right - rect.left, rect.bottom - rect.top, + memDC, 0, 0, SRCCOPY); + + SelectObject(memDC, bmp_old); + DeleteObject(bmp); - DeleteDC(dc); + DeleteDC(memDC); ReleaseDC(hwnd, winDC); } - InvalidateRect(hwnd, NULL, true); + //InvalidateRect(hwnd, NULL, true); video_context_driver_update_window_title(); From bdc68e679f138311b876ddfb85bbeef3ddfe73ac Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 9 Jan 2017 00:52:36 -0500 Subject: [PATCH 38/61] GDI: flip image and render text after other graphics --- gfx/drivers/gdi_gfx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 023b536446..af297d301a 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -252,9 +252,6 @@ static bool gdi_gfx_frame(void *data, const void *frame, menu_driver_ctl(RARCH_MENU_CTL_FRAME, NULL); #endif - if (msg) - font_driver_render_msg(NULL, msg, NULL); - if (draw) { HDC winDC = GetDC(hwnd); @@ -281,7 +278,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, ZeroMemory(&info, sizeof(BITMAPINFO)); info.bmiHeader.biBitCount = gdi_video_bits; info.bmiHeader.biWidth = width; - info.bmiHeader.biHeight = height; + info.bmiHeader.biHeight = -height; info.bmiHeader.biPlanes = 1; info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); info.bmiHeader.biSizeImage = pitch * height; @@ -337,6 +334,9 @@ static bool gdi_gfx_frame(void *data, const void *frame, ReleaseDC(hwnd, winDC); } + if (msg) + font_driver_render_msg(NULL, msg, NULL); + //InvalidateRect(hwnd, NULL, true); video_context_driver_update_window_title(); From 6c62901ae5e218db6ef570929299b2dcf1d7101a Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Tue, 10 Jan 2017 23:46:12 -0500 Subject: [PATCH 39/61] GDI: fix window not responding, but menu corruption still happens if set_gdi_pixel_format is called --- gfx/common/win32_common.cpp | 17 +++++++++-------- gfx/drivers/gdi_gfx.c | 21 +++++++++++++++++++-- gfx/drivers_context/gdi_ctx.cpp | 2 +- 3 files changed, 29 insertions(+), 11 deletions(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index d283b72f69..8e609e3463 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -521,19 +521,20 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, switch (message) { - case WM_PAINT: - { - PAINTSTRUCT ps; + //case WM_PAINT: + //{ + /*PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // All painting occurs here, between BeginPaint and EndPaint. - //FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1)); + FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1)); - EndPaint(hwnd, &ps); - return 0; - break; - } + EndPaint(hwnd, &ps);*/ + //return DefWindowProc(hwnd, message, wparam, lparam); + //return 0; + //break; + //} case WM_DROPFILES: case WM_SYSCOMMAND: case WM_CHAR: diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index af297d301a..ef59184017 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -354,8 +354,25 @@ static void gdi_gfx_set_nonblock_state(void *data, bool toggle) static bool gdi_gfx_alive(void *data) { - (void)data; - video_driver_set_size(&gdi_video_width, &gdi_video_height); + gfx_ctx_size_t size_data; + unsigned temp_width = 0; + unsigned temp_height = 0; + bool quit = false; + bool resize = false; + + /* Needed because some context drivers don't track their sizes */ + video_driver_get_size(&temp_width, &temp_height); + + size_data.quit = &quit; + size_data.resize = &resize; + size_data.width = &temp_width; + size_data.height = &temp_height; + + video_context_driver_check_window(&size_data); + + if (temp_width != 0 && temp_height != 0) + video_driver_set_size(&temp_width, &temp_height); + return true; } diff --git a/gfx/drivers_context/gdi_ctx.cpp b/gfx/drivers_context/gdi_ctx.cpp index a2a8c12abb..d7a5d95b98 100644 --- a/gfx/drivers_context/gdi_ctx.cpp +++ b/gfx/drivers_context/gdi_ctx.cpp @@ -298,7 +298,7 @@ void create_gdi_context(HWND hwnd, bool *quit) (void)quit; win32_gdi_hdc = GetDC(hwnd); - setup_gdi_pixel_format(win32_gdi_hdc); + //setup_gdi_pixel_format(win32_gdi_hdc); g_inited = true; } From 69bac11f029bdfc464f45c314218c103342e578f Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Wed, 11 Jan 2017 00:44:34 -0500 Subject: [PATCH 40/61] GDI: fix window not clearing on every frame, requires both FillRect calls and InvalidateRect --- gfx/common/win32_common.cpp | 14 +++++++------- gfx/drivers/gdi_gfx.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 8e609e3463..655f2c40d3 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -521,20 +521,20 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, switch (message) { - //case WM_PAINT: - //{ - /*PAINTSTRUCT ps; + case WM_PAINT: + { + PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // All painting occurs here, between BeginPaint and EndPaint. - FillRect(hdc, &ps.rcPaint, (HBRUSH) (COLOR_WINDOW+1)); + FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); - EndPaint(hwnd, &ps);*/ + EndPaint(hwnd, &ps); //return DefWindowProc(hwnd, message, wparam, lparam); //return 0; - //break; - //} + break; + } case WM_DROPFILES: case WM_SYSCOMMAND: case WM_CHAR: diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index ef59184017..aa783fad3a 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -337,7 +337,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, if (msg) font_driver_render_msg(NULL, msg, NULL); - //InvalidateRect(hwnd, NULL, true); + InvalidateRect(hwnd, NULL, true); video_context_driver_update_window_title(); From acd6826df93745b9a302ffdb2f443823745905e6 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Thu, 12 Jan 2017 15:03:27 -0500 Subject: [PATCH 41/61] GDI: stretch video output to fill window --- gfx/common/win32_common.cpp | 12 +++-- gfx/common/win32_common.h | 9 ++++ gfx/drivers/gdi_gfx.c | 85 ++++++++++++++++++++++----------- gfx/drivers_context/gdi_ctx.cpp | 2 +- 4 files changed, 75 insertions(+), 33 deletions(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 655f2c40d3..19928d2c65 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -43,6 +43,11 @@ #include "../../retroarch.h" #include "../video_thread_wrapper.h" #include + +#ifdef HAVE_MENU +#include "../../menu/menu_driver.h" +#endif + #ifndef _MSC_VER extern "C" { #endif @@ -526,9 +531,10 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); - // All painting occurs here, between BeginPaint and EndPaint. - - FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); +#ifdef HAVE_MENU + if (menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL))// || gdi_has_menu_frame()) + FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); +#endif EndPaint(hwnd, &ps); //return DefWindowProc(hwnd, message, wparam, lparam); diff --git a/gfx/common/win32_common.h b/gfx/common/win32_common.h index 37dbd6efbc..ffd27fc17f 100644 --- a/gfx/common/win32_common.h +++ b/gfx/common/win32_common.h @@ -51,8 +51,17 @@ void win32_monitor_get_info(void); void win32_monitor_info(void *data, void *hm_data, unsigned *mon_id); void create_graphics_context(HWND hwnd, bool *quit); + void create_gdi_context(HWND hwnd, bool *quit); +#ifdef __cplusplus +extern "C" { +#endif +bool gdi_has_menu_frame(void); +#ifdef __cplusplus +} +#endif + bool win32_shader_dlg_init(void); void shader_dlg_show(HWND parent_hwnd); void shader_dlg_params_reload(void); diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index aa783fad3a..dcea853531 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -35,7 +35,9 @@ static unsigned gdi_video_width = 0; static unsigned gdi_video_height = 0; static unsigned gdi_video_pitch = 0; static unsigned gdi_video_bits = 0; -static bool gdi_rgb32 = 0; +static unsigned gdi_menu_bits = 0; +static bool gdi_rgb32 = false; +static bool gdi_menu_rgb32 = false; static void gdi_gfx_free(void *data); @@ -218,13 +220,20 @@ static bool gdi_gfx_frame(void *data, const void *frame, const void *frame_to_copy = frame; unsigned width = 0; unsigned height = 0; + unsigned bits = gdi_video_bits; bool draw = true; gdi_t *gdi = (gdi_t*)data; + gfx_ctx_mode_t mode; HWND hwnd = win32_get_window(); + RECT rect; if (!frame || !frame_width || !frame_height) return true; +#ifdef HAVE_MENU + menu_driver_ctl(RARCH_MENU_CTL_FRAME, NULL); +#endif + if (gdi_video_width != frame_width || gdi_video_height != frame_height || gdi_video_pitch != pitch) { if (frame_width > 4 && frame_height > 4) @@ -232,25 +241,33 @@ static bool gdi_gfx_frame(void *data, const void *frame, gdi_video_width = frame_width; gdi_video_height = frame_height; gdi_video_pitch = pitch; - gdi_gfx_free(NULL); - gdi_gfx_create(); + //gdi_gfx_free(NULL); + //gdi_gfx_create(); } } if (gdi_menu_frame) + { frame_to_copy = gdi_menu_frame; + width = gdi_menu_width; + height = gdi_menu_height; + pitch = gdi_menu_pitch; + bits = gdi_menu_bits; + } + else + { + width = gdi_video_width; + height = gdi_video_height; + pitch = gdi_video_pitch; - //width = gdi_get_canvas_width(gdi_cv); - //height = gdi_get_canvas_height(gdi_cv); - width = frame_width; - height = frame_height; + if (frame_width == 4 && frame_height == 4 && (frame_width < width && frame_height < height)) + draw = false; + } - if (frame_to_copy == frame && frame_width == 4 && frame_height == 4 && (frame_width < width && frame_height < height)) - draw = false; + GetClientRect(hwnd, &rect); + video_context_driver_get_video_size(&mode); -#ifdef HAVE_MENU - menu_driver_ctl(RARCH_MENU_CTL_FRAME, NULL); -#endif + //printf("left %d top %d right %d bottom %d mode %d x %d size %d x %d\n", rect.left, rect.top, rect.right, rect.bottom, mode.width, mode.height, width, height); if (draw) { @@ -259,29 +276,24 @@ static bool gdi_gfx_frame(void *data, const void *frame, HBITMAP bmp = CreateCompatibleBitmap(winDC, width, height); HBITMAP bmp_old; BITMAPINFO info; - gfx_ctx_mode_t mode; - RECT rect; - HBRUSH brush; - - GetClientRect(hwnd, &rect); + //HBRUSH brush; + int ret = 0; bmp_old = SelectObject(memDC, bmp); - brush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); + //brush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); - FillRect(memDC, &rect, brush); + //FillRect(memDC, &rect, brush); - DeleteObject(brush); - - video_context_driver_get_video_size(&mode); + //DeleteObject(brush); ZeroMemory(&info, sizeof(BITMAPINFO)); - info.bmiHeader.biBitCount = gdi_video_bits; + info.bmiHeader.biBitCount = bits; info.bmiHeader.biWidth = width; info.bmiHeader.biHeight = -height; info.bmiHeader.biPlanes = 1; info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - info.bmiHeader.biSizeImage = pitch * height; + info.bmiHeader.biSizeImage = 0;//pitch * height; info.bmiHeader.biCompression = BI_RGB; /* if (gdi_rgb32) @@ -319,13 +331,17 @@ static bool gdi_gfx_frame(void *data, const void *frame, info.bmiColors[2].rgbReserved = 0x00; } */ - StretchDIBits(memDC, 0, 0, mode.width, mode.height, 0, 0, width, height, + ret = StretchDIBits(memDC, 0, 0, width, height, 0, 0, width, height, frame_to_copy, &info, DIB_RGB_COLORS, SRCCOPY); - BitBlt(winDC, - rect.left, rect.top, - rect.right - rect.left, rect.bottom - rect.top, - memDC, 0, 0, SRCCOPY); + //printf("StretchDIBits: %d\n", ret); + + ret = StretchBlt(winDC, + 0, 0, + mode.width, mode.height, + memDC, 0, 0, width, height, SRCCOPY); + + //printf("BitBlt: %d\n", ret); SelectObject(memDC, bmp_old); @@ -465,7 +481,13 @@ static void gdi_set_texture_frame(void *data, gdi_menu_frame = (unsigned char*)malloc(pitch * height); if (gdi_menu_frame && frame && pitch && height) + { memcpy(gdi_menu_frame, frame, pitch * height); + gdi_menu_width = width; + gdi_menu_height = height; + gdi_menu_pitch = pitch; + gdi_menu_bits = rgb32 ? 32 : 16; + } } static void gdi_set_osd_msg(void *data, const char *msg, @@ -551,6 +573,11 @@ static void gdi_gfx_set_viewport(void *data, unsigned viewport_width, { } +bool gdi_has_menu_frame() +{ + return (gdi_menu_frame != NULL); +} + video_driver_t video_gdi = { gdi_gfx_init, gdi_gfx_frame, diff --git a/gfx/drivers_context/gdi_ctx.cpp b/gfx/drivers_context/gdi_ctx.cpp index d7a5d95b98..a2a8c12abb 100644 --- a/gfx/drivers_context/gdi_ctx.cpp +++ b/gfx/drivers_context/gdi_ctx.cpp @@ -298,7 +298,7 @@ void create_gdi_context(HWND hwnd, bool *quit) (void)quit; win32_gdi_hdc = GetDC(hwnd); - //setup_gdi_pixel_format(win32_gdi_hdc); + setup_gdi_pixel_format(win32_gdi_hdc); g_inited = true; } From 6b89064242e1d589dff852eb17657464448cec82 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Thu, 12 Jan 2017 15:25:06 -0500 Subject: [PATCH 42/61] GDI: no more alternating black lines, but now video only takes up half the window --- gfx/drivers/gdi_gfx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index dcea853531..f4ca0e9d63 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -267,7 +267,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, GetClientRect(hwnd, &rect); video_context_driver_get_video_size(&mode); - //printf("left %d top %d right %d bottom %d mode %d x %d size %d x %d\n", rect.left, rect.top, rect.right, rect.bottom, mode.width, mode.height, width, height); + //printf("left %d top %d right %d bottom %d mode %d x %d size %d x %d pitch %d\n", rect.left, rect.top, rect.right, rect.bottom, mode.width, mode.height, width, height, pitch); if (draw) { @@ -289,11 +289,11 @@ static bool gdi_gfx_frame(void *data, const void *frame, ZeroMemory(&info, sizeof(BITMAPINFO)); info.bmiHeader.biBitCount = bits; - info.bmiHeader.biWidth = width; + info.bmiHeader.biWidth = pitch; info.bmiHeader.biHeight = -height; info.bmiHeader.biPlanes = 1; info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - info.bmiHeader.biSizeImage = 0;//pitch * height; + info.bmiHeader.biSizeImage = 0; info.bmiHeader.biCompression = BI_RGB; /* if (gdi_rgb32) From f51472395a507b490dd374ab877cefdeb66548e8 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Thu, 12 Jan 2017 17:44:24 -0500 Subject: [PATCH 43/61] GDI: fix bad color due to reading as RGB555 instead of 565 --- gfx/drivers/gdi_gfx.c | 61 ++++++++++++++----------------------------- 1 file changed, 20 insertions(+), 41 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index f4ca0e9d63..6927592898 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -267,7 +267,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, GetClientRect(hwnd, &rect); video_context_driver_get_video_size(&mode); - //printf("left %d top %d right %d bottom %d mode %d x %d size %d x %d pitch %d\n", rect.left, rect.top, rect.right, rect.bottom, mode.width, mode.height, width, height, pitch); + //printf("left %d top %d right %d bottom %d mode %d x %d size %d x %d pitch %d bits %d\n", rect.left, rect.top, rect.right, rect.bottom, mode.width, mode.height, width, height, pitch, bits); if (draw) { @@ -275,7 +275,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, HDC memDC = CreateCompatibleDC(winDC); HBITMAP bmp = CreateCompatibleBitmap(winDC, width, height); HBITMAP bmp_old; - BITMAPINFO info; + BITMAPINFO *info = (BITMAPINFO*)calloc(1, sizeof(*info) + (3 * sizeof(RGBQUAD))); //HBRUSH brush; int ret = 0; @@ -287,52 +287,29 @@ static bool gdi_gfx_frame(void *data, const void *frame, //DeleteObject(brush); - ZeroMemory(&info, sizeof(BITMAPINFO)); - info.bmiHeader.biBitCount = bits; - info.bmiHeader.biWidth = pitch; - info.bmiHeader.biHeight = -height; - info.bmiHeader.biPlanes = 1; - info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - info.bmiHeader.biSizeImage = 0; - info.bmiHeader.biCompression = BI_RGB; -/* - if (gdi_rgb32) + info->bmiHeader.biBitCount = bits; + info->bmiHeader.biWidth = pitch; + info->bmiHeader.biHeight = -height; + info->bmiHeader.biPlanes = 1; + info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER) + (3 * sizeof(RGBQUAD)); + info->bmiHeader.biSizeImage = 0; + + if (bits == 16) { - info.bmiColors[0].rgbBlue = 0xFF; - info.bmiColors[0].rgbGreen = 0x00; - info.bmiColors[0].rgbRed = 0x00; - info.bmiColors[0].rgbReserved = 0x00; + unsigned *masks = (unsigned*)info->bmiColors; - info.bmiColors[1].rgbBlue = 0x00; - info.bmiColors[1].rgbGreen = 0xFF; - info.bmiColors[1].rgbRed = 0x00; - info.bmiColors[1].rgbReserved = 0x00; + info->bmiHeader.biCompression = BI_BITFIELDS; - info.bmiColors[2].rgbBlue = 0x00; - info.bmiColors[2].rgbGreen = 0x00; - info.bmiColors[2].rgbRed = 0xFF; - info.bmiColors[2].rgbReserved = 0x00; + /* map RGB565 color bits, default is 555 */ + masks[0] = 0xF800; + masks[1] = 0x07E0; + masks[2] = 0x1F; } else - { - info.bmiColors[0].rgbBlue = 0x1F; - info.bmiColors[0].rgbGreen = 0x00; - info.bmiColors[0].rgbRed = 0x00; - info.bmiColors[0].rgbReserved = 0x00; + info->bmiHeader.biCompression = BI_RGB; - info.bmiColors[1].rgbBlue = 0x00; - info.bmiColors[1].rgbGreen = 0x1F; - info.bmiColors[1].rgbRed = 0x00; - info.bmiColors[1].rgbReserved = 0x00; - - info.bmiColors[2].rgbBlue = 0x00; - info.bmiColors[2].rgbGreen = 0x00; - info.bmiColors[2].rgbRed = 0x1F; - info.bmiColors[2].rgbReserved = 0x00; - } -*/ ret = StretchDIBits(memDC, 0, 0, width, height, 0, 0, width, height, - frame_to_copy, &info, DIB_RGB_COLORS, SRCCOPY); + frame_to_copy, info, DIB_RGB_COLORS, SRCCOPY); //printf("StretchDIBits: %d\n", ret); @@ -348,6 +325,8 @@ static bool gdi_gfx_frame(void *data, const void *frame, DeleteObject(bmp); DeleteDC(memDC); ReleaseDC(hwnd, winDC); + + free(info); } if (msg) From 0ee3f39d76855e87b769acac59b59952c313d00b Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Thu, 12 Jan 2017 20:12:55 -0500 Subject: [PATCH 44/61] GDI: no more flicker --- gfx/drivers/gdi_gfx.c | 4 ++-- menu/drivers_display/menu_display_gdi.c | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 6927592898..84a5fce764 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -332,11 +332,11 @@ static bool gdi_gfx_frame(void *data, const void *frame, if (msg) font_driver_render_msg(NULL, msg, NULL); - InvalidateRect(hwnd, NULL, true); + InvalidateRect(hwnd, NULL, false); video_context_driver_update_window_title(); - video_context_driver_swap_buffers(); + //video_context_driver_swap_buffers(); return true; } diff --git a/menu/drivers_display/menu_display_gdi.c b/menu/drivers_display/menu_display_gdi.c index 18c804c22d..1a49da97a3 100644 --- a/menu/drivers_display/menu_display_gdi.c +++ b/menu/drivers_display/menu_display_gdi.c @@ -25,6 +25,10 @@ #include "../menu_display.h" +#if defined(_WIN32) && !defined(_XBOX) +#include "../common/win32_common.h" +#endif + static void *menu_display_gdi_get_default_mvp(void) { return NULL; @@ -55,11 +59,25 @@ static void menu_display_gdi_viewport(void *data) static void menu_display_gdi_restore_clear_color(void) { + /*HBRUSH brush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); + RECT rect; + HWND hwnd = win32_get_window(); + HDC hdc = GetDC(hwnd); + + GetClientRect(hwnd, &rect); + + FillRect(hdc, &rect, brush); + + DeleteObject(brush); + + ReleaseDC(hwnd, hdc);*/ } static void menu_display_gdi_clear_color(menu_display_ctx_clearcolor_t *clearcolor) { (void)clearcolor; + + menu_display_gdi_restore_clear_color(); } static bool menu_display_gdi_font_init_first( From d6300a7946e43bc75aae4a7d67a44fc7c164b567 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 13 Jan 2017 00:52:55 -0500 Subject: [PATCH 45/61] GDI: video correctly fills the screen now, but resolution is poor. why is it scaled down by half? --- gfx/drivers/gdi_gfx.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 84a5fce764..89725e7b42 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -273,7 +273,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, { HDC winDC = GetDC(hwnd); HDC memDC = CreateCompatibleDC(winDC); - HBITMAP bmp = CreateCompatibleBitmap(winDC, width, height); + HBITMAP bmp = CreateCompatibleBitmap(winDC, pitch, height); HBITMAP bmp_old; BITMAPINFO *info = (BITMAPINFO*)calloc(1, sizeof(*info) + (3 * sizeof(RGBQUAD))); //HBRUSH brush; @@ -308,7 +308,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, else info->bmiHeader.biCompression = BI_RGB; - ret = StretchDIBits(memDC, 0, 0, width, height, 0, 0, width, height, + ret = StretchDIBits(memDC, 0, 0, pitch, height, 0, 0, pitch, height, frame_to_copy, info, DIB_RGB_COLORS, SRCCOPY); //printf("StretchDIBits: %d\n", ret); @@ -316,7 +316,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, ret = StretchBlt(winDC, 0, 0, mode.width, mode.height, - memDC, 0, 0, width, height, SRCCOPY); + memDC, 0, 0, width, height / 2, SRCCOPY); //printf("BitBlt: %d\n", ret); From c09996cd22307eaf50000d730331219fc9a99b7e Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 13 Jan 2017 00:54:38 -0500 Subject: [PATCH 46/61] GDI: don't need to store the padding --- gfx/drivers/gdi_gfx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 89725e7b42..b010ac4ea4 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -273,7 +273,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, { HDC winDC = GetDC(hwnd); HDC memDC = CreateCompatibleDC(winDC); - HBITMAP bmp = CreateCompatibleBitmap(winDC, pitch, height); + HBITMAP bmp = CreateCompatibleBitmap(winDC, width, height); HBITMAP bmp_old; BITMAPINFO *info = (BITMAPINFO*)calloc(1, sizeof(*info) + (3 * sizeof(RGBQUAD))); //HBRUSH brush; @@ -308,7 +308,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, else info->bmiHeader.biCompression = BI_RGB; - ret = StretchDIBits(memDC, 0, 0, pitch, height, 0, 0, pitch, height, + ret = StretchDIBits(memDC, 0, 0, width, height, 0, 0, width, height, frame_to_copy, info, DIB_RGB_COLORS, SRCCOPY); //printf("StretchDIBits: %d\n", ret); From 8d9a43eec6be5f55cc4dd78844a14f93f7c41866 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 13 Jan 2017 14:00:49 -0500 Subject: [PATCH 47/61] GDI: pitch seems to be reported wrong? this looks correct now --- gfx/drivers/gdi_gfx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index b010ac4ea4..bf1e8b4c99 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -288,7 +288,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, //DeleteObject(brush); info->bmiHeader.biBitCount = bits; - info->bmiHeader.biWidth = pitch; + info->bmiHeader.biWidth = pitch / 2; info->bmiHeader.biHeight = -height; info->bmiHeader.biPlanes = 1; info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER) + (3 * sizeof(RGBQUAD)); @@ -316,7 +316,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, ret = StretchBlt(winDC, 0, 0, mode.width, mode.height, - memDC, 0, 0, width, height / 2, SRCCOPY); + memDC, 0, 0, width, height, SRCCOPY); //printf("BitBlt: %d\n", ret); From 69ce5bdd652167c3a454b9421e2f5013657a875c Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 13 Jan 2017 14:07:00 -0500 Subject: [PATCH 48/61] GDI: allow menu drivers to be built without acceleration --- qb/config.libs.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 06298da402..937649064c 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -451,13 +451,17 @@ if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH" if [ "$HAVE_RGUI" = 'no' ]; then HAVE_MATERIALUI=no HAVE_XMB=no - HAVE_ZARCH=no + HAVE_ZARCH=no echo "Notice: RGUI not available, MaterialUI, XMB and ZARCH will also be disabled." elif [ "$HAVE_OPENGL" = 'no' ] && [ "$HAVE_OPENGLES" = 'no' ] && [ "$HAVE_VULKAN" = 'no' ]; then - HAVE_MATERIALUI=no - HAVE_XMB=no + if [ "$OS" = 'Win32' ]; then + echo "Notice: Hardware rendering context not available, the GDI video driver must be used." + else + HAVE_MATERIALUI=no + HAVE_XMB=no HAVE_ZARCH=no - echo "Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled." + echo "Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled." + fi fi fi From 7c6bf6aaf74aa124f023bd1cccada42bbbee55c4 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 13 Jan 2017 14:31:36 -0500 Subject: [PATCH 49/61] fix msys2 compilation when opengl, vulkan and d3d9 are disabled --- gfx/common/win32_common.cpp | 12 ++++++++++++ gfx/common/win32_common.h | 4 ++++ menu/drivers_display/menu_display_gdi.c | 2 +- qb/config.libs.sh | 4 +++- ui/drivers/ui_win32.c | 5 ++++- 5 files changed, 24 insertions(+), 3 deletions(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 19928d2c65..3274a77c15 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -60,11 +60,13 @@ LRESULT win32_menu_loop(HWND owner, WPARAM wparam); } #endif +#ifdef HAVE_D3D9 extern "C" bool dinput_handle_message(void *dinput, UINT message, WPARAM wParam, LPARAM lParam); extern void *dinput_gdi; extern void *dinput_wgl; extern void *dinput; +#endif unsigned g_resize_width = 0; unsigned g_resize_height = 0; @@ -426,6 +428,7 @@ static LRESULT CALLBACK WndProcCommon(bool *quit, HWND hwnd, UINT message, extern void ui_window_win32_set_droppable(void *data, bool droppable); +#ifdef HAVE_D3D9 LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { @@ -466,11 +469,15 @@ LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message, return 0; } +#ifdef HAVE_D3D9 if (dinput && dinput_handle_message(dinput, message, wparam, lparam)) return 0; +#endif return DefWindowProc(hwnd, message, wparam, lparam); } +#endif +#if defined(HAVE_OPENGL) || defined(HAVE_VULKAN) LRESULT CALLBACK WndProcGL(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { @@ -510,10 +517,13 @@ LRESULT CALLBACK WndProcGL(HWND hwnd, UINT message, return 0; } +#ifdef HAVE_D3D9 if (dinput_wgl && dinput_handle_message(dinput_wgl, message, wparam, lparam)) return 0; +#endif return DefWindowProc(hwnd, message, wparam, lparam); } +#endif LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) @@ -569,8 +579,10 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, return 0; } +#ifdef HAVE_D3D9 if (dinput_gdi && dinput_handle_message(dinput_gdi, message, wparam, lparam)) return 0; +#endif return DefWindowProc(hwnd, message, wparam, lparam); } diff --git a/gfx/common/win32_common.h b/gfx/common/win32_common.h index ffd27fc17f..61aa2849b7 100644 --- a/gfx/common/win32_common.h +++ b/gfx/common/win32_common.h @@ -120,11 +120,15 @@ void win32_window_reset(void); void win32_destroy_window(void); +#ifdef HAVE_D3D9 LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); +#endif +#if defined(HAVE_OPENGL) || defined(HAVE_VULKAN) LRESULT CALLBACK WndProcGL(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); +#endif LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam); diff --git a/menu/drivers_display/menu_display_gdi.c b/menu/drivers_display/menu_display_gdi.c index 1a49da97a3..e04541c9ea 100644 --- a/menu/drivers_display/menu_display_gdi.c +++ b/menu/drivers_display/menu_display_gdi.c @@ -26,7 +26,7 @@ #include "../menu_display.h" #if defined(_WIN32) && !defined(_XBOX) -#include "../common/win32_common.h" +#include "../../gfx/common/win32_common.h" #endif static void *menu_display_gdi_get_default_mvp(void) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 937649064c..d20d7efe1b 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -455,7 +455,9 @@ if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH" echo "Notice: RGUI not available, MaterialUI, XMB and ZARCH will also be disabled." elif [ "$HAVE_OPENGL" = 'no' ] && [ "$HAVE_OPENGLES" = 'no' ] && [ "$HAVE_VULKAN" = 'no' ]; then if [ "$OS" = 'Win32' ]; then - echo "Notice: Hardware rendering context not available, the GDI video driver must be used." + HAVE_SHADERPIPELINE=no + HAVE_VULKAN=no + echo "Notice: Hardware rendering context not available." else HAVE_MATERIALUI=no HAVE_XMB=no diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index b83d23dcfd..42777b92ea 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -364,6 +364,7 @@ void shader_dlg_show(HWND parent_hwnd) window->set_focused(&g_shader_dlg.window); } +#if defined(HAVE_OPENGL) || defined(HAVE_VULKAN) static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) { @@ -440,6 +441,7 @@ static LRESULT CALLBACK ShaderDlgWndProc(HWND hwnd, UINT message, return DefWindowProc(hwnd, message, wparam, lparam); } +#endif bool win32_window_init(WNDCLASSEX *wndclass, bool fullscreen, const char *class_name) @@ -475,6 +477,7 @@ bool win32_window_init(WNDCLASSEX *wndclass, bool win32_shader_dlg_init(void) { +#if defined(HAVE_OPENGL) || defined(HAVE_VULKAN) static bool inited = false; int pos_y; HFONT hFont; @@ -522,7 +525,7 @@ bool win32_shader_dlg_init(void) pos_y += SHADER_DLG_SEPARATOR_HEIGHT + SHADER_DLG_CTRL_MARGIN; g_shader_dlg.parameters_start_y = pos_y; - +#endif return true; } From 7acfa39fb938e9ff1642e6726e5ccb335c610585 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 13 Jan 2017 14:37:24 -0500 Subject: [PATCH 50/61] GDI: MSVC2010 build fix --- gfx/drivers/gdi_gfx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index bf1e8b4c99..5681ffa212 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -279,7 +279,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, //HBRUSH brush; int ret = 0; - bmp_old = SelectObject(memDC, bmp); + bmp_old = (HBITMAP)SelectObject(memDC, bmp); //brush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); From 061c13b84c7571a55b2ff62c78ea07037a3bd7df Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Fri, 13 Jan 2017 23:54:21 -0500 Subject: [PATCH 51/61] fix XP runtime error with MinGW --- ui/drivers/ui_win32.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index 42777b92ea..7514a0a5a5 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -613,7 +613,12 @@ LRESULT win32_menu_loop(HWND owner, WPARAM wparam) * This is needed for proper multi-byte string display until Unicode is fully supported. */ MultiByteToWideChar(CP_UTF8, 0, title, -1, title_wide, sizeof(title_wide) / sizeof(title_wide[0])); +#if !defined(_MSC_VER) && (_WIN32_WINNT > _WIN32_WINNT_WINXP) + /* MinGW does not define wcstombs_s for XP, but MSVC does */ wcstombs_s(&converted, title_cp, sizeof(title_cp), title_wide, sizeof(title_cp) - 1); +#else + wcstombs(title_cp, title_wide, sizeof(title_cp) - 1); +#endif if (!win32_browser(owner, win32_file, extensions, title_cp, initial_dir)) From e1f4db8081b083501d9c1c92a1b6b743bd2c6669 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sat, 14 Jan 2017 04:06:56 -0500 Subject: [PATCH 52/61] Win2000 buildfixes --- audio/drivers/xaudio.cpp | 5 +++++ file_path_special.c | 2 +- frontend/drivers/platform_win32.c | 4 ++-- gfx/common/win32_common.cpp | 5 +++++ gfx/drivers/d3d.cpp | 8 ++++---- gfx/drivers_font/d3d_w32_font.cpp | 2 +- griffin/griffin.c | 2 +- intl/msg_hash_chs.c | 1 + intl/msg_hash_pl.c | 1 + libretro-common/net/net_ifinfo.c | 8 ++++---- libretro-common/rthreads/rthreads.c | 3 +++ menu/drivers/xmb.c | 2 +- ui/drivers/ui_win32.c | 3 ++- 13 files changed, 31 insertions(+), 15 deletions(-) diff --git a/audio/drivers/xaudio.cpp b/audio/drivers/xaudio.cpp index 36de2720ed..c47cb07fd4 100644 --- a/audio/drivers/xaudio.cpp +++ b/audio/drivers/xaudio.cpp @@ -29,6 +29,11 @@ #include #include +#if defined(_MSC_VER) && (_WIN32_WINNT <= _WIN32_WINNT_WIN2K) +/* needed for CoInitializeEx */ +#define _WIN32_DCOM +#endif + #include "xaudio.h" #include "../audio_driver.h" diff --git a/file_path_special.c b/file_path_special.c index 2957c0d444..fb96d87d21 100644 --- a/file_path_special.c +++ b/file_path_special.c @@ -285,7 +285,7 @@ void fill_pathname_application_path(char *s, size_t len) #endif #ifdef HAVE_XMB -const char *xmb_theme_ident(void); +const char* xmb_theme_ident(void); #endif void fill_pathname_application_special(char *s, size_t len, enum application_special_type type) diff --git a/frontend/drivers/platform_win32.c b/frontend/drivers/platform_win32.c index b7da98da6d..03e79a1054 100644 --- a/frontend/drivers/platform_win32.c +++ b/frontend/drivers/platform_win32.c @@ -328,7 +328,7 @@ static uint64_t frontend_win32_get_mem_used(void) static void frontend_win32_attach_console(void) { #ifdef _WIN32 -#if(_WIN32_WINNT >= 0x0500) +#ifdef _WIN32_WINNT_WINXP if (!AttachConsole(ATTACH_PARENT_PROCESS)) { AllocConsole(); @@ -343,7 +343,7 @@ static void frontend_win32_attach_console(void) static void frontend_win32_detach_console(void) { #if defined(_WIN32) && !defined(_XBOX) -#if(_WIN32_WINNT >= 0x0500) +#ifdef _WIN32_WINNT_WINXP if (!AttachConsole(ATTACH_PARENT_PROCESS)) { HWND wnd = GetConsoleWindow(); diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 3274a77c15..625b6d1a72 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -114,7 +114,9 @@ typedef enum _POWER_REQUEST_TYPE #define POWER_REQUEST_CONTEXT_DETAILED_STRING 2 #endif +#ifdef _WIN32_WINNT_WIN7 typedef REASON_CONTEXT POWER_REQUEST_CONTEXT, *PPOWER_REQUEST_CONTEXT, *LPPOWER_REQUEST_CONTEXT; +#endif #ifndef MAX_MONITORS #define MAX_MONITORS 9 @@ -585,6 +587,7 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, #endif return DefWindowProc(hwnd, message, wparam, lparam); } +#endif bool win32_window_create(void *data, unsigned style, RECT *mon_rect, unsigned width, @@ -724,6 +727,7 @@ bool win32_suppress_screensaver(void *data, bool enable) if (major*100+minor >= 601) { +#ifdef _WIN32_WINNT_WIN7 /* Windows 7, 8, 10 codepath */ typedef HANDLE (WINAPI * PowerCreateRequestPtr)(REASON_CONTEXT *context); typedef BOOL (WINAPI * PowerSetRequestPtr)(HANDLE PowerRequest, @@ -748,6 +752,7 @@ bool win32_suppress_screensaver(void *data, bool enable) powerSetRequest( Request, PowerRequestDisplayRequired); return true; } +#endif } else { diff --git a/gfx/drivers/d3d.cpp b/gfx/drivers/d3d.cpp index 9503a0cdf3..46e706e675 100644 --- a/gfx/drivers/d3d.cpp +++ b/gfx/drivers/d3d.cpp @@ -259,18 +259,18 @@ static bool d3d_init_multipass(d3d_video_t *d3d) } memset(&d3d->shader, 0, sizeof(d3d->shader)); - +#ifdef HAVE_SHADERPIPELINE if (!video_shader_read_conf_cgp(conf, &d3d->shader)) { config_file_free(conf); RARCH_ERR("Failed to parse CGP file.\n"); return false; } - +#endif config_file_free(conf); - +#ifdef HAVE_SHADERPIPELINE video_shader_resolve_relative(&d3d->shader, d3d->shader_path.c_str()); - +#endif RARCH_LOG("[D3D9 Meta-Cg] Found %u shaders.\n", d3d->shader.passes); for (i = 0; i < d3d->shader.passes; i++) diff --git a/gfx/drivers_font/d3d_w32_font.cpp b/gfx/drivers_font/d3d_w32_font.cpp index 1fd5065782..88ad1b5912 100644 --- a/gfx/drivers_font/d3d_w32_font.cpp +++ b/gfx/drivers_font/d3d_w32_font.cpp @@ -46,7 +46,7 @@ static void *d3dfonts_w32_init_font(void *video_data, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_PITCH, -#ifdef _MSC_VER /* MSVC needs w_char* */ +#if defined(_MSC_VER) && _WIN32_WINNT > 0x0500 /* MSVC needs w_char* starting with XP */ L"Verdana" /* Hardcode FTL */ #else "Verdana" diff --git a/griffin/griffin.c b/griffin/griffin.c index 8a2942388b..2b040232cc 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -1011,7 +1011,7 @@ MENU #include "../menu/drivers/rgui.c" #endif -#if defined(HAVE_OPENGL) || defined(HAVE_VITA2D) || defined(_3DS) +#if defined(HAVE_OPENGL) || defined(HAVE_VITA2D) || defined(_3DS) || defined(_MSC_VER) #ifdef HAVE_XMB #include "../menu/drivers/xmb.c" #endif diff --git a/intl/msg_hash_chs.c b/intl/msg_hash_chs.c index 5afbaa8a9e..b0505b3990 100644 --- a/intl/msg_hash_chs.c +++ b/intl/msg_hash_chs.c @@ -26,6 +26,7 @@ #if defined(_MSC_VER) && !defined(_XBOX) /* https://support.microsoft.com/en-us/kb/980263 */ #pragma execution_character_set("utf-8") +#pragma warning( disable : 4566 ) #endif int menu_hash_get_help_chs_enum(enum msg_hash_enums msg, char *s, size_t len) diff --git a/intl/msg_hash_pl.c b/intl/msg_hash_pl.c index ec477cd01c..edd84cdf75 100644 --- a/intl/msg_hash_pl.c +++ b/intl/msg_hash_pl.c @@ -20,6 +20,7 @@ #if defined(_MSC_VER) && !defined(_XBOX) /* https://support.microsoft.com/en-us/kb/980263 */ #pragma execution_character_set("utf-8") +#pragma warning( disable: 4566 ) #endif int menu_hash_get_help_pl_enum(enum msg_hash_enums msg, char *s, size_t len) diff --git a/libretro-common/net/net_ifinfo.c b/libretro-common/net/net_ifinfo.c index 5432f5a73d..8cec6432bf 100644 --- a/libretro-common/net/net_ifinfo.c +++ b/libretro-common/net/net_ifinfo.c @@ -71,10 +71,10 @@ bool net_ifinfo_new(net_ifinfo_t *list) { unsigned k = 0; #if defined(_WIN32) && !defined(_XBOX) + PIP_ADAPTER_ADDRESSES adapter_addresses = NULL, aa = NULL; + PIP_ADAPTER_UNICAST_ADDRESS ua = NULL; +#ifdef _WIN32_WINNT_WINXP DWORD size; - PIP_ADAPTER_ADDRESSES adapter_addresses, aa; - PIP_ADAPTER_UNICAST_ADDRESS ua; - DWORD rv = GetAdaptersAddresses(AF_UNSPEC, GAA_FLAG_INCLUDE_PREFIX, NULL, NULL, &size); adapter_addresses = (PIP_ADAPTER_ADDRESSES)malloc(size); @@ -85,7 +85,7 @@ bool net_ifinfo_new(net_ifinfo_t *list) if (rv != ERROR_SUCCESS) goto error; - +#endif for (aa = adapter_addresses; aa != NULL; aa = aa->Next) { char name[PATH_MAX_LENGTH]; diff --git a/libretro-common/rthreads/rthreads.c b/libretro-common/rthreads/rthreads.c index 1744705642..1043199135 100644 --- a/libretro-common/rthreads/rthreads.c +++ b/libretro-common/rthreads/rthreads.c @@ -37,6 +37,9 @@ #include #else #define WIN32_LEAN_AND_MEAN +#ifndef _WIN32_WINNT +#define _WIN32_WINNT 0x0500 /*_WIN32_WINNT_WIN2K */ +#endif #include #endif #elif defined(GEKKO) diff --git a/menu/drivers/xmb.c b/menu/drivers/xmb.c index ad1aabcfff..faa82f3e0d 100644 --- a/menu/drivers/xmb.c +++ b/menu/drivers/xmb.c @@ -376,7 +376,7 @@ float gradient_dark[16] = { 0.0, 0.0, 0.0, 1.00, }; -const char *xmb_theme_ident(void) +const char* xmb_theme_ident(void) { settings_t *settings = config_get_ptr(); switch (settings->menu.xmb.theme) diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index 7514a0a5a5..8194e30433 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -224,6 +224,7 @@ static void shader_dlg_params_clear(void) void shader_dlg_params_reload(void) { +#ifdef HAVE_SHADERPIPELINE HFONT hFont; RECT parent_rect; int i, pos_x, pos_y; @@ -325,7 +326,7 @@ void shader_dlg_params_reload(void) (pos_x - SHADER_DLG_CTRL_X) + SHADER_DLG_WIDTH, (pos_x == SHADER_DLG_CTRL_X) ? pos_y + 30 : SHADER_DLG_MAX_HEIGHT, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - +#endif } static void shader_dlg_update_on_top_state(void) From e0f71928cadf1410cba732a86794df4ed458fe5f Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sat, 14 Jan 2017 04:09:06 -0500 Subject: [PATCH 53/61] add msvc2005 project files for Win2000 --- pkg/msvc/RetroArch-msvc2005.sln | 19 ++ pkg/msvc/msvc-2005/RetroArch-msvc2005.vcproj | 223 +++++++++++++++++++ 2 files changed, 242 insertions(+) create mode 100644 pkg/msvc/RetroArch-msvc2005.sln create mode 100644 pkg/msvc/msvc-2005/RetroArch-msvc2005.vcproj diff --git a/pkg/msvc/RetroArch-msvc2005.sln b/pkg/msvc/RetroArch-msvc2005.sln new file mode 100644 index 0000000000..8fd5a544c9 --- /dev/null +++ b/pkg/msvc/RetroArch-msvc2005.sln @@ -0,0 +1,19 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual C++ Express 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RetroArch-msvc2005", "msvc-2005\RetroArch-msvc2005.vcproj", "{1FEFA874-F6A6-4CE6-9DB4-3B291A364CE5}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1FEFA874-F6A6-4CE6-9DB4-3B291A364CE5}.Debug|Win32.ActiveCfg = Debug|Win32 + {1FEFA874-F6A6-4CE6-9DB4-3B291A364CE5}.Debug|Win32.Build.0 = Debug|Win32 + {1FEFA874-F6A6-4CE6-9DB4-3B291A364CE5}.Release|Win32.ActiveCfg = Release|Win32 + {1FEFA874-F6A6-4CE6-9DB4-3B291A364CE5}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/pkg/msvc/msvc-2005/RetroArch-msvc2005.vcproj b/pkg/msvc/msvc-2005/RetroArch-msvc2005.vcproj new file mode 100644 index 0000000000..d4788aad7a --- /dev/null +++ b/pkg/msvc/msvc-2005/RetroArch-msvc2005.vcproj @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 240b43e0ba93dd13cf6e485f9878414e513e05d1 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Sat, 14 Jan 2017 04:10:34 -0500 Subject: [PATCH 54/61] windows buildfix --- gfx/common/win32_common.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 625b6d1a72..30672a2374 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -471,10 +471,8 @@ LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message, return 0; } -#ifdef HAVE_D3D9 if (dinput && dinput_handle_message(dinput, message, wparam, lparam)) return 0; -#endif return DefWindowProc(hwnd, message, wparam, lparam); } #endif @@ -587,7 +585,6 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, #endif return DefWindowProc(hwnd, message, wparam, lparam); } -#endif bool win32_window_create(void *data, unsigned style, RECT *mon_rect, unsigned width, From 493b7372bd616b44e07e17ed98d6b1270137d29a Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 16:53:19 -0500 Subject: [PATCH 55/61] only disable glui/xmb/zarch if GL/ES/Vulkan AND libcaca is not enabled --- qb/config.libs.sh | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/qb/config.libs.sh b/qb/config.libs.sh index d20d7efe1b..f000fe40b4 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -459,10 +459,14 @@ if [ "$HAVE_MATERIALUI" != 'no' ] || [ "$HAVE_XMB" != 'no' ] || [ "$HAVE_ZARCH" HAVE_VULKAN=no echo "Notice: Hardware rendering context not available." else - HAVE_MATERIALUI=no - HAVE_XMB=no - HAVE_ZARCH=no - echo "Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled." + if [ "$HAVE_CACA" = 'yes' ]; then + echo "Notice: Hardware rendering context not available." + else + HAVE_MATERIALUI=no + HAVE_XMB=no + HAVE_ZARCH=no + echo "Notice: Hardware rendering context not available, XMB, MaterialUI and ZARCH will also be disabled." + fi fi fi fi From e4bdc5ce8b8a80e95647fee305410105013adec3 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 17:37:19 -0500 Subject: [PATCH 56/61] GDI: remove unused code and fix menu toggle in rgui and xmb --- gfx/drivers/gdi_gfx.c | 98 +++------------------------------ gfx/drivers_context/gdi_ctx.cpp | 15 ++--- 2 files changed, 16 insertions(+), 97 deletions(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 5681ffa212..087ad2ee7b 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -43,12 +43,6 @@ static void gdi_gfx_free(void *data); static void gdi_gfx_create() { - if(!gdi_video_width || !gdi_video_height) - { - printf("***** GDI: no width or height!\n"); - } - - //video_driver_set_size(&gdi_video_width, &gdi_video_height); } static void *gdi_gfx_init(const video_info_t *video, @@ -89,67 +83,6 @@ static void *gdi_gfx_init(const video_info_t *video, RARCH_LOG("Found GDI context: %s\n", ctx_driver->ident); -/*#ifdef HAVE_WINDOW - win32_window_init(&gdi->wndclass, true, NULL); -#endif - -#ifdef HAVE_MONITOR - bool windowed_full; - RECT mon_rect; - MONITORINFOEX current_mon; - HMONITOR hm_to_use; - - win32_monitor_info(¤t_mon, &hm_to_use, &d3d->cur_mon_id); - mon_rect = current_mon.rcMonitor; - g_resize_width = video->width; - g_resize_height = video->height; - - windowed_full = settings->video.windowed_fullscreen; - - full_x = (windowed_full || video->width == 0) ? - (mon_rect.right - mon_rect.left) : video->width; - full_y = (windowed_full || video->height == 0) ? - (mon_rect.bottom - mon_rect.top) : video->height; - RARCH_LOG("[GDI]: Monitor size: %dx%d.\n", - (int)(mon_rect.right - mon_rect.left), - (int)(mon_rect.bottom - mon_rect.top)); -#else - { - video_context_driver_get_video_size(&mode); - - full_x = mode.width; - full_y = mode.height; - } -#endif - { - unsigned new_width = video->fullscreen ? full_x : video->width; - unsigned new_height = video->fullscreen ? full_y : video->height; - mode.width = new_width; - mode.height = new_height; - mode.fullscreen = video->fullscreen; - - video_context_driver_set_video_mode(&mode); - video_driver_set_size(&new_width, &new_height); - } - -#ifdef HAVE_WINDOW - DWORD style; - unsigned win_width, win_height; - RECT rect = {0}; - - video_driver_get_size(&win_width, &win_height); - - win32_set_style(¤t_mon, &hm_to_use, &win_width, &win_height, - video->fullscreen, windowed_full, &rect, &mon_rect, &style); - - win32_window_create(gdi, style, &mon_rect, win_width, - win_height, video->fullscreen); - - win32_set_window(&win_width, &win_height, video->fullscreen, - windowed_full, &rect); -#endif -*/ - video_context_driver_get_video_size(&mode); full_x = mode.width; @@ -215,7 +148,7 @@ error: static bool gdi_gfx_frame(void *data, const void *frame, unsigned frame_width, unsigned frame_height, uint64_t frame_count, - unsigned pitch, const char *msg) + unsigned pitch, const char *msg, video_frame_info_t video_info) { const void *frame_to_copy = frame; unsigned width = 0; @@ -241,12 +174,10 @@ static bool gdi_gfx_frame(void *data, const void *frame, gdi_video_width = frame_width; gdi_video_height = frame_height; gdi_video_pitch = pitch; - //gdi_gfx_free(NULL); - //gdi_gfx_create(); } } - if (gdi_menu_frame) + if (gdi_menu_frame && menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL)) { frame_to_copy = gdi_menu_frame; width = gdi_menu_width; @@ -262,13 +193,14 @@ static bool gdi_gfx_frame(void *data, const void *frame, if (frame_width == 4 && frame_height == 4 && (frame_width < width && frame_height < height)) draw = false; + + if (menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL)) + draw = false; } GetClientRect(hwnd, &rect); video_context_driver_get_video_size(&mode); - //printf("left %d top %d right %d bottom %d mode %d x %d size %d x %d pitch %d bits %d\n", rect.left, rect.top, rect.right, rect.bottom, mode.width, mode.height, width, height, pitch, bits); - if (draw) { HDC winDC = GetDC(hwnd); @@ -276,17 +208,9 @@ static bool gdi_gfx_frame(void *data, const void *frame, HBITMAP bmp = CreateCompatibleBitmap(winDC, width, height); HBITMAP bmp_old; BITMAPINFO *info = (BITMAPINFO*)calloc(1, sizeof(*info) + (3 * sizeof(RGBQUAD))); - //HBRUSH brush; - int ret = 0; bmp_old = (HBITMAP)SelectObject(memDC, bmp); - //brush = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); - - //FillRect(memDC, &rect, brush); - - //DeleteObject(brush); - info->bmiHeader.biBitCount = bits; info->bmiHeader.biWidth = pitch / 2; info->bmiHeader.biHeight = -height; @@ -308,18 +232,14 @@ static bool gdi_gfx_frame(void *data, const void *frame, else info->bmiHeader.biCompression = BI_RGB; - ret = StretchDIBits(memDC, 0, 0, width, height, 0, 0, width, height, + StretchDIBits(memDC, 0, 0, width, height, 0, 0, width, height, frame_to_copy, info, DIB_RGB_COLORS, SRCCOPY); - //printf("StretchDIBits: %d\n", ret); - - ret = StretchBlt(winDC, + StretchBlt(winDC, 0, 0, mode.width, mode.height, memDC, 0, 0, width, height, SRCCOPY); - //printf("BitBlt: %d\n", ret); - SelectObject(memDC, bmp_old); DeleteObject(bmp); @@ -334,9 +254,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, InvalidateRect(hwnd, NULL, false); - video_context_driver_update_window_title(); - - //video_context_driver_swap_buffers(); + video_context_driver_update_window_title(video_info); return true; } diff --git a/gfx/drivers_context/gdi_ctx.cpp b/gfx/drivers_context/gdi_ctx.cpp index a2a8c12abb..7f35a5a993 100644 --- a/gfx/drivers_context/gdi_ctx.cpp +++ b/gfx/drivers_context/gdi_ctx.cpp @@ -87,19 +87,18 @@ static bool gfx_ctx_gdi_set_resize(void *data, return false; } -static void gfx_ctx_gdi_update_window_title(void *data) +static void gfx_ctx_gdi_update_window_title(void *data, video_frame_info_t video_info) { char buf[128]; char buf_fps[128]; - settings_t *settings = config_get_ptr(); const ui_window_t *window = ui_companion_driver_get_window_ptr(); buf[0] = buf_fps[0] = '\0'; - if (window && video_monitor_get_fps(buf, sizeof(buf), + if (window && video_monitor_get_fps(video_info, buf, sizeof(buf), buf_fps, sizeof(buf_fps))) window->set_title(&main_window, buf); - if (settings->fps_show) + if (video_info.fps_show) runloop_msg_queue_push(buf_fps, 1, 1, false); } @@ -128,7 +127,7 @@ static void gfx_ctx_gdi_get_video_size(void *data, } } -static void *gfx_ctx_gdi_init(void *video_driver) +static void *gfx_ctx_gdi_init(video_frame_info_t video_info, void *video_driver) { WNDCLASSEX wndclass = {0}; @@ -191,6 +190,7 @@ static void gfx_ctx_gdi_destroy(void *data) } static bool gfx_ctx_gdi_set_video_mode(void *data, + video_frame_info_t video_info, unsigned width, unsigned height, bool fullscreen) { @@ -216,11 +216,12 @@ error: static void gfx_ctx_gdi_input_driver(void *data, + const char *joypad_name, const input_driver_t **input, void **input_data) { (void)data; - dinput_gdi = input_dinput.init(); + dinput_gdi = input_dinput.init(joypad_name); *input = dinput_gdi ? &input_dinput : NULL; *input_data = dinput_gdi; @@ -286,7 +287,7 @@ static uint32_t gfx_ctx_gdi_get_flags(void *data) return flags; } -static void gfx_ctx_gdi_swap_buffers(void *data) +static void gfx_ctx_gdi_swap_buffers(void *data, video_frame_info_t video_info) { (void)data; From 5eaf00b39d56678fee20dbe31792a4d074ee73ee Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 19:53:46 -0500 Subject: [PATCH 57/61] GDI: fix rendering of 32-bit color cores --- gfx/drivers/gdi_gfx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gfx/drivers/gdi_gfx.c b/gfx/drivers/gdi_gfx.c index 087ad2ee7b..5100759dee 100644 --- a/gfx/drivers/gdi_gfx.c +++ b/gfx/drivers/gdi_gfx.c @@ -212,7 +212,7 @@ static bool gdi_gfx_frame(void *data, const void *frame, bmp_old = (HBITMAP)SelectObject(memDC, bmp); info->bmiHeader.biBitCount = bits; - info->bmiHeader.biWidth = pitch / 2; + info->bmiHeader.biWidth = pitch / (bits / 8); info->bmiHeader.biHeight = -height; info->bmiHeader.biPlanes = 1; info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER) + (3 * sizeof(RGBQUAD)); From afb94e2b96485f3276a686bb4331fe35a673ba0b Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 20:40:43 -0500 Subject: [PATCH 58/61] GDI: draw a gradient background for xmb --- Makefile.common | 2 ++ gfx/common/win32_common.cpp | 52 ++++++++++++++++++++++++++----------- gfx/drivers_font/gdi_font.c | 7 +++-- 3 files changed, 44 insertions(+), 17 deletions(-) diff --git a/Makefile.common b/Makefile.common index e6b455f8a3..2bf94f9dba 100644 --- a/Makefile.common +++ b/Makefile.common @@ -1169,6 +1169,8 @@ ifneq ($(findstring Win32,$(OS)),) gfx/drivers_context/gdi_ctx.o \ gfx/drivers_font/gdi_font.o \ menu/drivers_display/menu_display_gdi.o + + LIBS += -lmsimg32 endif ifeq ($(HAVE_AVFOUNDATION), 1) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index 30672a2374..ef2827e4f3 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -128,10 +128,10 @@ static unsigned win32_monitor_count = 0; extern "C" { - bool doubleclick_on_titlebar_pressed(void) - { - return doubleclick_on_titlebar; - } + bool doubleclick_on_titlebar_pressed(void) + { + return doubleclick_on_titlebar; + } void unset_doubleclick_on_titlebar(void) { @@ -287,8 +287,8 @@ static int win32_drag_query_file(HWND hwnd, WPARAM wparam) core_info_get_list(&core_info_list); - if (!core_info_list) - return 0; + if (!core_info_list) + return 0; core_info_list_get_supported_cores(core_info_list, (const char*)szFilename, &core_info, &list_size); @@ -417,7 +417,7 @@ static LRESULT CALLBACK WndProcCommon(bool *quit, HWND hwnd, UINT message, } *quit = true; break; - case WM_COMMAND: + case WM_COMMAND: { settings_t *settings = config_get_ptr(); if (settings->ui.menubar_enable) @@ -542,13 +542,35 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, HDC hdc = BeginPaint(hwnd, &ps); #ifdef HAVE_MENU - if (menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL))// || gdi_has_menu_frame()) - FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1)); + if (menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL)) + { + RECT rect; + GetClientRect(hwnd, &rect); + + TRIVERTEX vertex[2]; + vertex[0].x = rect.left; + vertex[0].y = rect.top; + vertex[0].Red = 1 << 8; + vertex[0].Green = 81 << 8; + vertex[0].Blue = 127 << 8; + vertex[0].Alpha = 0; + + vertex[1].x = rect.right; + vertex[1].y = rect.bottom; + vertex[1].Red = 0; + vertex[1].Green = 1 << 8; + vertex[1].Blue = 33 << 8; + vertex[1].Alpha = 0; + + GRADIENT_RECT gRect; + gRect.LowerRight = 0; + gRect.UpperLeft = 1; + + GradientFill(hdc, vertex, 2, &gRect, 1, GRADIENT_FILL_RECT_V); + } #endif EndPaint(hwnd, &ps); - //return DefWindowProc(hwnd, message, wparam, lparam); - //return 0; break; } case WM_DROPFILES: @@ -609,7 +631,7 @@ bool win32_window_create(void *data, unsigned style, #endif bool win32_get_metrics(void *data, - enum display_metric_types type, float *value) + enum display_metric_types type, float *value) { #ifdef _XBOX return false; @@ -765,8 +787,8 @@ bool win32_suppress_screensaver(void *data, bool enable) /* FIXME: It should not be necessary to add the W after MONITORINFOEX, but linking fails without it. */ void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use, - unsigned *width, unsigned *height, bool fullscreen, bool windowed_full, - RECT *rect, RECT *mon_rect, DWORD *style) + unsigned *width, unsigned *height, bool fullscreen, bool windowed_full, + RECT *rect, RECT *mon_rect, DWORD *style) { #ifndef _XBOX settings_t *settings = config_get_ptr(); @@ -793,7 +815,7 @@ void win32_set_style(MONITORINFOEX *current_mon, HMONITOR *hm_to_use, if (!win32_monitor_set_fullscreen(*width, *height, refresh, current_mon->szDevice)) - {} + {} /* Display settings might have changed, get new coordinates. */ GetMonitorInfo(*hm_to_use, (MONITORINFOEX*)current_mon); diff --git a/gfx/drivers_font/gdi_font.c b/gfx/drivers_font/gdi_font.c index b1f2cab663..8b84baaad2 100644 --- a/gfx/drivers_font/gdi_font.c +++ b/gfx/drivers_font/gdi_font.c @@ -85,7 +85,7 @@ static void gdi_render_msg(void *data, const char *msg, gdi_raster_t *font = (gdi_raster_t*)data; float x, y; unsigned width = 0, height = 0; - unsigned newX, newY; + unsigned newX, newY, len; settings_t *settings = config_get_ptr(); const struct font_params *params = (const struct font_params*)userdata; HDC hdc; @@ -110,11 +110,14 @@ static void gdi_render_msg(void *data, const char *msg, if (!font->gdi) return; + len = utf8len(msg); newX = x * width; newY = height - (y * height); hdc = GetDC(hwnd); - TextOut(hdc, newX, newY, msg, utf8len(msg)); + SetBkMode(hdc, TRANSPARENT); + SetTextColor(hdc, RGB(255,255,255)); + TextOut(hdc, newX, newY, msg, len); ReleaseDC(hwnd, hdc); } From 7b057fd43f5fefad2b6b13a25b2748c8e1383a41 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 20:56:32 -0500 Subject: [PATCH 59/61] GDI: add msimg32 library to msvc2010 project --- pkg/msvc/RetroArch-msvc2010.sln | 14 +++++--------- pkg/msvc/msvc-2010/RetroArch-msvc2010.vcxproj | 18 +++++++++--------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/pkg/msvc/RetroArch-msvc2010.sln b/pkg/msvc/RetroArch-msvc2010.sln index f72b91f832..8e5df75e23 100644 --- a/pkg/msvc/RetroArch-msvc2010.sln +++ b/pkg/msvc/RetroArch-msvc2010.sln @@ -1,6 +1,6 @@  Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 +# Visual C++ Express 2010 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RetroArch-msvc2010", "msvc-2010\RetroArch-msvc2010.vcxproj", "{27FF7CE1-4059-4AA1-8062-FD529560FA54}" EndProject Global @@ -17,20 +17,16 @@ Global GlobalSection(ProjectConfigurationPlatforms) = postSolution {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Debug Cg|Win32.ActiveCfg = Debug Cg|Win32 {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Debug Cg|Win32.Build.0 = Debug Cg|Win32 - {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Debug Cg|x64.ActiveCfg = Debug Cg|x64 - {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Debug Cg|x64.Build.0 = Debug Cg|x64 + {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Debug Cg|x64.ActiveCfg = Debug Cg|Win32 {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Debug|Win32.ActiveCfg = Debug|Win32 {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Debug|Win32.Build.0 = Debug|Win32 - {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Debug|x64.ActiveCfg = Debug|x64 - {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Debug|x64.Build.0 = Debug|x64 + {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Debug|x64.ActiveCfg = Debug|Win32 {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Release Cg|Win32.ActiveCfg = Release Cg|Win32 {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Release Cg|Win32.Build.0 = Release Cg|Win32 - {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Release Cg|x64.ActiveCfg = Release Cg|x64 - {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Release Cg|x64.Build.0 = Release Cg|x64 + {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Release Cg|x64.ActiveCfg = Release Cg|Win32 {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Release|Win32.ActiveCfg = Release|Win32 {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Release|Win32.Build.0 = Release|Win32 - {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Release|x64.ActiveCfg = Release|x64 - {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Release|x64.Build.0 = Release|x64 + {27FF7CE1-4059-4AA1-8062-FD529560FA54}.Release|x64.ActiveCfg = Release|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/pkg/msvc/msvc-2010/RetroArch-msvc2010.vcxproj b/pkg/msvc/msvc-2010/RetroArch-msvc2010.vcxproj index 77486ca2c9..9cf3332eed 100644 --- a/pkg/msvc/msvc-2010/RetroArch-msvc2010.vcxproj +++ b/pkg/msvc/msvc-2010/RetroArch-msvc2010.vcxproj @@ -1,4 +1,4 @@ - + @@ -192,7 +192,7 @@ Console true - winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) + msimg32.lib;winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) @@ -211,7 +211,7 @@ Console true - winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) + msimg32.lib;winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) $(CG_LIB_PATH) @@ -231,7 +231,7 @@ Console true - winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) + msimg32.lib;winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) @@ -250,7 +250,7 @@ Console true - winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) + msimg32.lib;winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) $(CG_LIB64_PATH) @@ -275,7 +275,7 @@ true true true - winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) + msimg32.lib;winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) @@ -299,7 +299,7 @@ true true true - winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) + msimg32.lib;winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) $(CG_LIB_PATH) @@ -324,7 +324,7 @@ true true true - winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) + msimg32.lib;winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) @@ -348,7 +348,7 @@ true true true - winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) + msimg32.lib;winmm.lib;Dinput8.lib;dxguid.lib;Iphlpapi.lib;%(AdditionalDependencies) $(CG_LIB64_PATH) From 7dc558344bcd8bc6522aafe60110ae99e8b9ae85 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 21:11:47 -0500 Subject: [PATCH 60/61] GDI: do not draw background with rgui --- gfx/common/win32_common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gfx/common/win32_common.cpp b/gfx/common/win32_common.cpp index ef2827e4f3..beb959cc6f 100644 --- a/gfx/common/win32_common.cpp +++ b/gfx/common/win32_common.cpp @@ -542,7 +542,7 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, HDC hdc = BeginPaint(hwnd, &ps); #ifdef HAVE_MENU - if (menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL)) + if (menu_driver_ctl(RARCH_MENU_CTL_IS_ALIVE, NULL) && !gdi_has_menu_frame()) { RECT rect; GetClientRect(hwnd, &rect); From 76b7235dc5a436c72e86ee5f8efab602359ba6c0 Mon Sep 17 00:00:00 2001 From: Brad Parker Date: Mon, 16 Jan 2017 22:20:59 -0500 Subject: [PATCH 61/61] msvc2005 buildfix --- gfx/drivers_font/d3d_w32_font.cpp | 2 +- pkg/msvc/msvc-2005/RetroArch-msvc2005.vcproj | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/gfx/drivers_font/d3d_w32_font.cpp b/gfx/drivers_font/d3d_w32_font.cpp index 88ad1b5912..593dee0bff 100644 --- a/gfx/drivers_font/d3d_w32_font.cpp +++ b/gfx/drivers_font/d3d_w32_font.cpp @@ -46,7 +46,7 @@ static void *d3dfonts_w32_init_font(void *video_data, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_PITCH, -#if defined(_MSC_VER) && _WIN32_WINNT > 0x0500 /* MSVC needs w_char* starting with XP */ +#if defined(_MSC_VER) /* MSVC needs w_char* */ L"Verdana" /* Hardcode FTL */ #else "Verdana" diff --git a/pkg/msvc/msvc-2005/RetroArch-msvc2005.vcproj b/pkg/msvc/msvc-2005/RetroArch-msvc2005.vcproj index d4788aad7a..cd6fe31110 100644 --- a/pkg/msvc/msvc-2005/RetroArch-msvc2005.vcproj +++ b/pkg/msvc/msvc-2005/RetroArch-msvc2005.vcproj @@ -42,7 +42,7 @@ Name="VCCLCompilerTool" Optimization="0" AdditionalIncludeDirectories=""$(SolutionDir)\..\..\libretro-common\include";"$(SolutionDir)\..\..\libretro-common\include\compat\msvc";"$(SolutionDir)\..\..\gfx\include"" - PreprocessorDefinitions="_WIN32_WINNT=0x0500;_WIN32;RARCH_INTERNAL;HAVE_THREADS;HAVE_CC_RESAMPLER;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;WANT_ZLIB;HAVE_DINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_RTHREADS;HAVE_DYNAMIC;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;__STDC_CONSTANT_MACROS" + PreprocessorDefinitions="_WIN32_WINNT=0x0500;_WIN32;RARCH_INTERNAL;HAVE_THREADS;HAVE_D3D;HAVE_D3D9;HAVE_GLSL;HAVE_SHADERPIPELINE;HAVE_OPENGL;HAVE_CC_RESAMPLER;HAVE_GRIFFIN;HAVE_LANGEXTRA;HAVE_FBO;HAVE_ZLIB;HAVE_RPNG;HAVE_RJPEG;HAVE_RBMP;HAVE_RTGA;HAVE_IMAGEVIEWER;HAVE_XMB;WANT_ZLIB;HAVE_DINPUT;HAVE_XAUDIO;HAVE_DSOUND;HAVE_DYLIB;HAVE_NETWORKING;HAVE_NETWORK_CMD;HAVE_COMMAND;HAVE_STDIN_CMD;HAVE_RTHREADS;HAVE_DYNAMIC;HAVE_OVERLAY;HAVE_RGUI;HAVE_GL_SYNC;HAVE_MENU;HAVE_7ZIP;HAVE_MATERIALUI;HAVE_LIBRETRODB;HAVE_STB_FONT;__STDC_CONSTANT_MACROS" MinimalRebuild="true" BasicRuntimeChecks="3" RuntimeLibrary="1" @@ -62,6 +62,7 @@ />