mirror of
https://github.com/libretro/RetroArch
synced 2025-03-10 16:14:03 +00:00
OpenDingux Beta: Add 50Hz support
This commit is contained in:
parent
5e432a6586
commit
c23e32a047
17
config.def.h
17
config.def.h
@ -37,7 +37,8 @@
|
|||||||
#include "gfx/common/ctr_common.h"
|
#include "gfx/common/ctr_common.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Required for OpenDingux IPU filter setting */
|
/* Required for OpenDingux IPU filter + refresh
|
||||||
|
* rate settings */
|
||||||
#if defined(DINGUX)
|
#if defined(DINGUX)
|
||||||
#include "dingux/dingux_utils.h"
|
#include "dingux/dingux_utils.h"
|
||||||
#endif
|
#endif
|
||||||
@ -383,6 +384,11 @@
|
|||||||
/* Sets image filtering method when using the
|
/* Sets image filtering method when using the
|
||||||
* IPU hardware scaler in Dingux devices */
|
* IPU hardware scaler in Dingux devices */
|
||||||
#define DEFAULT_DINGUX_IPU_FILTER_TYPE DINGUX_IPU_FILTER_BICUBIC
|
#define DEFAULT_DINGUX_IPU_FILTER_TYPE DINGUX_IPU_FILTER_BICUBIC
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
/* Sets refresh rate of integral LCD panel
|
||||||
|
* in Dingux devices */
|
||||||
|
#define DEFAULT_DINGUX_REFRESH_RATE DINGUX_REFRESH_RATE_60HZ
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Save configuration file on exit. */
|
/* Save configuration file on exit. */
|
||||||
@ -875,8 +881,15 @@ static const bool audio_enable_menu_bgm = false;
|
|||||||
#define DEFAULT_NOTIFICATION_SHOW_SCREENSHOT_FLASH 0
|
#define DEFAULT_NOTIFICATION_SHOW_SCREENSHOT_FLASH 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*Display a notification when setting the refresh rate*/
|
/* Display a notification when setting the refresh rate*/
|
||||||
|
#if defined(_3DS) || (defined(DINGUX) && defined(DINGUX_BETA))
|
||||||
|
/* 3DS and OpenDingux Beta devices set refresh rate
|
||||||
|
* on gfx driver init - set default notification
|
||||||
|
* state to 'false' in order to avoid OSD log spam */
|
||||||
|
#define DEFAULT_NOTIFICATION_SHOW_REFRESH_RATE false
|
||||||
|
#else
|
||||||
#define DEFAULT_NOTIFICATION_SHOW_REFRESH_RATE true
|
#define DEFAULT_NOTIFICATION_SHOW_REFRESH_RATE true
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Output samplerate. */
|
/* Output samplerate. */
|
||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
|
@ -2049,6 +2049,9 @@ static struct config_uint_setting *populate_settings_uint(
|
|||||||
|
|
||||||
#if defined(DINGUX)
|
#if defined(DINGUX)
|
||||||
SETTING_UINT("video_dingux_ipu_filter_type", &settings->uints.video_dingux_ipu_filter_type, true, DEFAULT_DINGUX_IPU_FILTER_TYPE, false);
|
SETTING_UINT("video_dingux_ipu_filter_type", &settings->uints.video_dingux_ipu_filter_type, true, DEFAULT_DINGUX_IPU_FILTER_TYPE, false);
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
SETTING_UINT("video_dingux_refresh_rate", &settings->uints.video_dingux_refresh_rate, true, DEFAULT_DINGUX_REFRESH_RATE, false);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_MENU
|
#ifdef HAVE_MENU
|
||||||
|
@ -201,6 +201,7 @@ typedef struct settings
|
|||||||
unsigned video_stream_scale_factor;
|
unsigned video_stream_scale_factor;
|
||||||
unsigned video_3ds_display_mode;
|
unsigned video_3ds_display_mode;
|
||||||
unsigned video_dingux_ipu_filter_type;
|
unsigned video_dingux_ipu_filter_type;
|
||||||
|
unsigned video_dingux_refresh_rate;
|
||||||
#ifdef HAVE_VIDEO_LAYOUT
|
#ifdef HAVE_VIDEO_LAYOUT
|
||||||
unsigned video_layout_selected_view;
|
unsigned video_layout_selected_view;
|
||||||
#endif
|
#endif
|
||||||
|
@ -19,6 +19,7 @@
|
|||||||
#include <streams/file_stream.h>
|
#include <streams/file_stream.h>
|
||||||
|
|
||||||
#if defined(DINGUX_BETA)
|
#if defined(DINGUX_BETA)
|
||||||
|
#include <string/stdstring.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -37,6 +38,7 @@
|
|||||||
#define DINGUX_BATTERY_VOLTAGE_NOW "/sys/class/power_supply/jz-battery/voltage_now"
|
#define DINGUX_BATTERY_VOLTAGE_NOW "/sys/class/power_supply/jz-battery/voltage_now"
|
||||||
#define DINGUX_SCALING_MODE_ENVAR "SDL_VIDEO_KMSDRM_SCALING_MODE"
|
#define DINGUX_SCALING_MODE_ENVAR "SDL_VIDEO_KMSDRM_SCALING_MODE"
|
||||||
#define DINGUX_SCALING_SHARPNESS_ENVAR "SDL_VIDEO_KMSDRM_SCALING_SHARPNESS"
|
#define DINGUX_SCALING_SHARPNESS_ENVAR "SDL_VIDEO_KMSDRM_SCALING_SHARPNESS"
|
||||||
|
#define DINGUX_VIDEO_REFRESHRATE_ENVAR "SDL_VIDEO_REFRESHRATE"
|
||||||
|
|
||||||
/* Enables/disables downscaling when using
|
/* Enables/disables downscaling when using
|
||||||
* the IPU hardware scaler */
|
* the IPU hardware scaler */
|
||||||
@ -162,6 +164,63 @@ bool dingux_ipu_set_filter_type(enum dingux_ipu_filter_type filter_type)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
/* Sets the refresh rate of the integral LCD panel.
|
||||||
|
* If specified value is invalid, will set refresh
|
||||||
|
* rate to 60 Hz.
|
||||||
|
* Returns a floating point representation of the
|
||||||
|
* resultant hardware refresh rate. In the event
|
||||||
|
* that a refresh rate cannot be set (i.e. hardware
|
||||||
|
* error), returns 0.0 */
|
||||||
|
float dingux_set_video_refresh_rate(enum dingux_refresh_rate refresh_rate)
|
||||||
|
{
|
||||||
|
float refresh_rate_float = 60.0f;
|
||||||
|
const char *refresh_rate_str = "60";
|
||||||
|
|
||||||
|
/* Check filter type */
|
||||||
|
switch (refresh_rate)
|
||||||
|
{
|
||||||
|
case DINGUX_REFRESH_RATE_50HZ:
|
||||||
|
refresh_rate_float = 50.0f;
|
||||||
|
refresh_rate_str = "50";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
/* Refresh rate is already set to 60 Hz
|
||||||
|
* by default */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (setenv(DINGUX_VIDEO_REFRESHRATE_ENVAR, refresh_rate_str, 1) != 0)
|
||||||
|
refresh_rate_float = 0.0f;
|
||||||
|
|
||||||
|
return refresh_rate_float;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Gets the currently set refresh rate of the
|
||||||
|
* integral LCD panel. */
|
||||||
|
bool dingux_get_video_refresh_rate(enum dingux_refresh_rate *refresh_rate)
|
||||||
|
{
|
||||||
|
const char *refresh_rate_str = getenv(DINGUX_VIDEO_REFRESHRATE_ENVAR);
|
||||||
|
|
||||||
|
/* If environment variable is unset, refresh
|
||||||
|
* rate defaults to 60 Hz */
|
||||||
|
if (!refresh_rate_str)
|
||||||
|
{
|
||||||
|
*refresh_rate = DINGUX_REFRESH_RATE_60HZ;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (string_is_equal(refresh_rate_str, "60"))
|
||||||
|
*refresh_rate = DINGUX_REFRESH_RATE_60HZ;
|
||||||
|
else if (string_is_equal(refresh_rate_str, "50"))
|
||||||
|
*refresh_rate = DINGUX_REFRESH_RATE_50HZ;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Resets the IPU hardware scaler to the
|
/* Resets the IPU hardware scaler to the
|
||||||
* default configuration */
|
* default configuration */
|
||||||
bool dingux_ipu_reset(void)
|
bool dingux_ipu_reset(void)
|
||||||
@ -169,6 +228,7 @@ bool dingux_ipu_reset(void)
|
|||||||
#if defined(DINGUX_BETA)
|
#if defined(DINGUX_BETA)
|
||||||
unsetenv(DINGUX_SCALING_MODE_ENVAR);
|
unsetenv(DINGUX_SCALING_MODE_ENVAR);
|
||||||
unsetenv(DINGUX_SCALING_SHARPNESS_ENVAR);
|
unsetenv(DINGUX_SCALING_SHARPNESS_ENVAR);
|
||||||
|
unsetenv(DINGUX_VIDEO_REFRESHRATE_ENVAR);
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
return dingux_ipu_set_scaling_mode(true, false) &&
|
return dingux_ipu_set_scaling_mode(true, false) &&
|
||||||
|
@ -38,6 +38,17 @@ enum dingux_ipu_filter_type
|
|||||||
DINGUX_IPU_FILTER_LAST
|
DINGUX_IPU_FILTER_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
/* Specifies all video refresh rates supported
|
||||||
|
* by OpenDingux Beta */
|
||||||
|
enum dingux_refresh_rate
|
||||||
|
{
|
||||||
|
DINGUX_REFRESH_RATE_60HZ = 0,
|
||||||
|
DINGUX_REFRESH_RATE_50HZ,
|
||||||
|
DINGUX_REFRESH_RATE_LAST
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Enables/disables downscaling when using
|
/* Enables/disables downscaling when using
|
||||||
* the IPU hardware scaler */
|
* the IPU hardware scaler */
|
||||||
bool dingux_ipu_set_downscaling_enable(bool enable);
|
bool dingux_ipu_set_downscaling_enable(bool enable);
|
||||||
@ -66,6 +77,23 @@ bool dingux_ipu_set_scaling_mode(bool keep_aspect, bool integer_scale);
|
|||||||
* using the IPU hardware scaler */
|
* using the IPU hardware scaler */
|
||||||
bool dingux_ipu_set_filter_type(enum dingux_ipu_filter_type filter_type);
|
bool dingux_ipu_set_filter_type(enum dingux_ipu_filter_type filter_type);
|
||||||
|
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
/* Sets the refresh rate of the integral LCD panel.
|
||||||
|
* If specified value is invalid, will set refresh
|
||||||
|
* rate to 60 Hz.
|
||||||
|
* Returns a floating point representation of the
|
||||||
|
* resultant hardware refresh rate. In the event
|
||||||
|
* that a refresh rate cannot be set (i.e. hardware
|
||||||
|
* error), returns 0.0 */
|
||||||
|
float dingux_set_video_refresh_rate(enum dingux_refresh_rate refresh_rate);
|
||||||
|
|
||||||
|
/* Gets the currently set refresh rate of the
|
||||||
|
* integral LCD panel.
|
||||||
|
* Returns false if hardware is in an undefined
|
||||||
|
* state. */
|
||||||
|
bool dingux_get_video_refresh_rate(enum dingux_refresh_rate *refresh_rate);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Resets the IPU hardware scaler to the
|
/* Resets the IPU hardware scaler to the
|
||||||
* default configuration */
|
* default configuration */
|
||||||
bool dingux_ipu_reset(void);
|
bool dingux_ipu_reset(void);
|
||||||
|
@ -42,6 +42,9 @@
|
|||||||
#include "../../gfx/drivers_font_renderer/bitmap.h"
|
#include "../../gfx/drivers_font_renderer/bitmap.h"
|
||||||
#include "../../configuration.h"
|
#include "../../configuration.h"
|
||||||
#include "../../retroarch.h"
|
#include "../../retroarch.h"
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
#include "../../driver.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#define likely(x) __builtin_expect(!!(x), 1)
|
#define likely(x) __builtin_expect(!!(x), 1)
|
||||||
#define unlikely(x) __builtin_expect(!!(x), 0)
|
#define unlikely(x) __builtin_expect(!!(x), 0)
|
||||||
@ -51,11 +54,10 @@
|
|||||||
|
|
||||||
#define SDL_DINGUX_NUM_FONT_GLYPHS 256
|
#define SDL_DINGUX_NUM_FONT_GLYPHS 256
|
||||||
|
|
||||||
#define SDL_DINGUX_FF_FRAME_TIME_MIN 16667
|
|
||||||
|
|
||||||
typedef struct sdl_dingux_video
|
typedef struct sdl_dingux_video
|
||||||
{
|
{
|
||||||
retro_time_t last_frame_time;
|
retro_time_t last_frame_time;
|
||||||
|
retro_time_t ff_frame_time_min;
|
||||||
SDL_Surface *screen;
|
SDL_Surface *screen;
|
||||||
bitmapfont_lut_t *osd_font;
|
bitmapfont_lut_t *osd_font;
|
||||||
unsigned frame_width;
|
unsigned frame_width;
|
||||||
@ -63,6 +65,9 @@ typedef struct sdl_dingux_video
|
|||||||
unsigned frame_padding_x;
|
unsigned frame_padding_x;
|
||||||
unsigned frame_padding_y;
|
unsigned frame_padding_y;
|
||||||
enum dingux_ipu_filter_type filter_type;
|
enum dingux_ipu_filter_type filter_type;
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
enum dingux_refresh_rate refresh_rate;
|
||||||
|
#endif
|
||||||
uint32_t font_colour32;
|
uint32_t font_colour32;
|
||||||
uint16_t font_colour16;
|
uint16_t font_colour16;
|
||||||
uint16_t menu_texture[SDL_DINGUX_MENU_WIDTH * SDL_DINGUX_MENU_HEIGHT];
|
uint16_t menu_texture[SDL_DINGUX_MENU_WIDTH * SDL_DINGUX_MENU_HEIGHT];
|
||||||
@ -402,16 +407,23 @@ static void sdl_dingux_input_driver_init(
|
|||||||
static void *sdl_dingux_gfx_init(const video_info_t *video,
|
static void *sdl_dingux_gfx_init(const video_info_t *video,
|
||||||
input_driver_t **input, void **input_data)
|
input_driver_t **input, void **input_data)
|
||||||
{
|
{
|
||||||
sdl_dingux_video_t *vid = NULL;
|
sdl_dingux_video_t *vid = NULL;
|
||||||
uint32_t sdl_subsystem_flags = SDL_WasInit(0);
|
uint32_t sdl_subsystem_flags = SDL_WasInit(0);
|
||||||
settings_t *settings = config_get_ptr();
|
settings_t *settings = config_get_ptr();
|
||||||
bool ipu_keep_aspect = settings->bools.video_dingux_ipu_keep_aspect;
|
bool ipu_keep_aspect = settings->bools.video_dingux_ipu_keep_aspect;
|
||||||
bool ipu_integer_scaling = settings->bools.video_scale_integer;
|
bool ipu_integer_scaling = settings->bools.video_scale_integer;
|
||||||
enum dingux_ipu_filter_type ipu_filter_type = (enum dingux_ipu_filter_type)
|
#if defined(DINGUX_BETA)
|
||||||
|
enum dingux_refresh_rate current_refresh_rate = DINGUX_REFRESH_RATE_60HZ;
|
||||||
|
enum dingux_refresh_rate target_refresh_rate = (enum dingux_refresh_rate)
|
||||||
|
settings->uints.video_dingux_refresh_rate;
|
||||||
|
bool refresh_rate_valid = false;
|
||||||
|
float hw_refresh_rate = 0.0f;
|
||||||
|
#endif
|
||||||
|
enum dingux_ipu_filter_type ipu_filter_type = (enum dingux_ipu_filter_type)
|
||||||
settings->uints.video_dingux_ipu_filter_type;
|
settings->uints.video_dingux_ipu_filter_type;
|
||||||
const char *input_driver_name = settings->arrays.input_driver;
|
const char *input_driver_name = settings->arrays.input_driver;
|
||||||
const char *joypad_driver_name = settings->arrays.input_joypad_driver;
|
const char *joypad_driver_name = settings->arrays.input_joypad_driver;
|
||||||
uint32_t surface_flags = (video->vsync) ?
|
uint32_t surface_flags = (video->vsync) ?
|
||||||
(SDL_HWSURFACE | SDL_TRIPLEBUF | SDL_FULLSCREEN) :
|
(SDL_HWSURFACE | SDL_TRIPLEBUF | SDL_FULLSCREEN) :
|
||||||
(SDL_HWSURFACE | SDL_FULLSCREEN);
|
(SDL_HWSURFACE | SDL_FULLSCREEN);
|
||||||
|
|
||||||
@ -434,6 +446,50 @@ static void *sdl_dingux_gfx_init(const video_info_t *video,
|
|||||||
dingux_ipu_set_downscaling_enable(true);
|
dingux_ipu_set_downscaling_enable(true);
|
||||||
dingux_ipu_set_scaling_mode(ipu_keep_aspect, ipu_integer_scaling);
|
dingux_ipu_set_scaling_mode(ipu_keep_aspect, ipu_integer_scaling);
|
||||||
dingux_ipu_set_filter_type(ipu_filter_type);
|
dingux_ipu_set_filter_type(ipu_filter_type);
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
/* Get current refresh rate */
|
||||||
|
refresh_rate_valid = dingux_get_video_refresh_rate(¤t_refresh_rate);
|
||||||
|
|
||||||
|
/* Check if refresh rate needs to be updated */
|
||||||
|
if (!refresh_rate_valid ||
|
||||||
|
(current_refresh_rate != target_refresh_rate))
|
||||||
|
hw_refresh_rate = dingux_set_video_refresh_rate(target_refresh_rate);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Correct refresh rate is already set,
|
||||||
|
* just convert to float */
|
||||||
|
switch (current_refresh_rate)
|
||||||
|
{
|
||||||
|
case DINGUX_REFRESH_RATE_50HZ:
|
||||||
|
hw_refresh_rate = 50.0f;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
hw_refresh_rate = 60.0f;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hw_refresh_rate == 0.0f)
|
||||||
|
{
|
||||||
|
RARCH_ERR("[SDL1]: Failed to set video refresh rate\n");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
vid->refresh_rate = target_refresh_rate;
|
||||||
|
switch (target_refresh_rate)
|
||||||
|
{
|
||||||
|
case DINGUX_REFRESH_RATE_50HZ:
|
||||||
|
vid->ff_frame_time_min = 20000;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
vid->ff_frame_time_min = 16667;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
driver_ctl(RARCH_DRIVER_CTL_SET_REFRESH_RATE, &hw_refresh_rate);
|
||||||
|
#else
|
||||||
|
vid->ff_frame_time_min = 16667;
|
||||||
|
#endif
|
||||||
|
|
||||||
vid->screen = SDL_SetVideoMode(
|
vid->screen = SDL_SetVideoMode(
|
||||||
SDL_DINGUX_MENU_WIDTH, SDL_DINGUX_MENU_HEIGHT,
|
SDL_DINGUX_MENU_WIDTH, SDL_DINGUX_MENU_HEIGHT,
|
||||||
@ -710,7 +766,8 @@ static bool sdl_dingux_gfx_frame(void *data, const void *frame,
|
|||||||
|
|
||||||
/* If fast forward is currently active, we may
|
/* If fast forward is currently active, we may
|
||||||
* push frames at an 'unlimited' rate. Since the
|
* push frames at an 'unlimited' rate. Since the
|
||||||
* display has a fixed refresh rate of 60 Hz, this
|
* display has a fixed refresh rate of 60 Hz (or
|
||||||
|
* potentially 50 Hz on OpenDingux Beta), this
|
||||||
* represents wasted effort. We therefore drop any
|
* represents wasted effort. We therefore drop any
|
||||||
* 'excess' frames in this case.
|
* 'excess' frames in this case.
|
||||||
* (Note that we *only* do this when fast forwarding.
|
* (Note that we *only* do this when fast forwarding.
|
||||||
@ -721,7 +778,7 @@ static bool sdl_dingux_gfx_frame(void *data, const void *frame,
|
|||||||
retro_time_t current_time = cpu_features_get_time_usec();
|
retro_time_t current_time = cpu_features_get_time_usec();
|
||||||
|
|
||||||
if ((current_time - vid->last_frame_time) <
|
if ((current_time - vid->last_frame_time) <
|
||||||
SDL_DINGUX_FF_FRAME_TIME_MIN)
|
vid->ff_frame_time_min)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
vid->last_frame_time = current_time;
|
vid->last_frame_time = current_time;
|
||||||
@ -932,6 +989,26 @@ static void sdl_dingux_gfx_viewport_info(void *data, struct video_viewport *vp)
|
|||||||
vp->height = vp->full_height = vid->frame_height;
|
vp->height = vp->full_height = vid->frame_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static float sdl_dingux_get_refresh_rate(void *data)
|
||||||
|
{
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
|
||||||
|
|
||||||
|
if (!vid)
|
||||||
|
return 0.0f;
|
||||||
|
|
||||||
|
switch (vid->refresh_rate)
|
||||||
|
{
|
||||||
|
case DINGUX_REFRESH_RATE_50HZ:
|
||||||
|
return 50.0f;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 60.0f;
|
||||||
|
}
|
||||||
|
|
||||||
static void sdl_dingux_set_filtering(void *data, unsigned index, bool smooth, bool ctx_scaling)
|
static void sdl_dingux_set_filtering(void *data, unsigned index, bool smooth, bool ctx_scaling)
|
||||||
{
|
{
|
||||||
sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
|
sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
|
||||||
@ -1000,7 +1077,7 @@ static const video_poke_interface_t sdl_dingux_poke_interface = {
|
|||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL,
|
NULL,
|
||||||
NULL, /* get_refresh_rate */
|
sdl_dingux_get_refresh_rate,
|
||||||
sdl_dingux_set_filtering,
|
sdl_dingux_set_filtering,
|
||||||
NULL, /* get_video_output_size */
|
NULL, /* get_video_output_size */
|
||||||
NULL, /* get_video_output_prev */
|
NULL, /* get_video_output_prev */
|
||||||
|
@ -3135,6 +3135,12 @@ MSG_HASH(
|
|||||||
MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_FILTER_TYPE,
|
MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_FILTER_TYPE,
|
||||||
"video_dingux_ipu_filter_type"
|
"video_dingux_ipu_filter_type"
|
||||||
)
|
)
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE,
|
||||||
|
"video_dingux_refresh_rate"
|
||||||
|
)
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
MSG_HASH(
|
MSG_HASH(
|
||||||
MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION,
|
MENU_ENUM_LABEL_VIDEO_BLACK_FRAME_INSERTION,
|
||||||
|
@ -1500,6 +1500,24 @@ MSG_HASH(
|
|||||||
MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_POLLED,
|
MENU_ENUM_SUBLABEL_VIDEO_REFRESH_RATE_POLLED,
|
||||||
"The refresh rate as reported by the display driver."
|
"The refresh rate as reported by the display driver."
|
||||||
)
|
)
|
||||||
|
#if defined(DINGUX) && defined(DINGUX_BETA)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE,
|
||||||
|
"Vertical Refresh Rate"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_SUBLABEL_VIDEO_DINGUX_REFRESH_RATE,
|
||||||
|
"Set vertical refresh rate of the display. '50 Hz' will enable smooth video when running PAL content."
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_60HZ,
|
||||||
|
"60 Hz"
|
||||||
|
)
|
||||||
|
MSG_HASH(
|
||||||
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_50HZ,
|
||||||
|
"50 Hz"
|
||||||
|
)
|
||||||
|
#endif
|
||||||
MSG_HASH(
|
MSG_HASH(
|
||||||
MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE,
|
MENU_ENUM_LABEL_VALUE_VIDEO_FORCE_SRGB_DISABLE,
|
||||||
"Force-Disable sRGB FBO"
|
"Force-Disable sRGB FBO"
|
||||||
|
@ -856,6 +856,9 @@ DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_aspect_ratio,
|
|||||||
#if defined(DINGUX)
|
#if defined(DINGUX)
|
||||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_dingux_ipu_keep_aspect, MENU_ENUM_SUBLABEL_VIDEO_DINGUX_IPU_KEEP_ASPECT)
|
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_dingux_ipu_keep_aspect, MENU_ENUM_SUBLABEL_VIDEO_DINGUX_IPU_KEEP_ASPECT)
|
||||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_dingux_ipu_filter_type, MENU_ENUM_SUBLABEL_VIDEO_DINGUX_IPU_FILTER_TYPE)
|
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_dingux_ipu_filter_type, MENU_ENUM_SUBLABEL_VIDEO_DINGUX_IPU_FILTER_TYPE)
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_dingux_refresh_rate, MENU_ENUM_SUBLABEL_VIDEO_DINGUX_REFRESH_RATE)
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_height, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT)
|
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_height, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT)
|
||||||
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_width, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH)
|
DEFAULT_SUBLABEL_MACRO(action_bind_sublabel_video_viewport_custom_width, MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH)
|
||||||
@ -1860,6 +1863,11 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs,
|
|||||||
case MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_FILTER_TYPE:
|
case MENU_ENUM_LABEL_VIDEO_DINGUX_IPU_FILTER_TYPE:
|
||||||
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_dingux_ipu_filter_type);
|
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_dingux_ipu_filter_type);
|
||||||
break;
|
break;
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
case MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE:
|
||||||
|
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_video_dingux_refresh_rate);
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
case MENU_ENUM_LABEL_CORE_INFORMATION:
|
case MENU_ENUM_LABEL_CORE_INFORMATION:
|
||||||
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_information);
|
BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_core_information);
|
||||||
|
@ -7478,6 +7478,12 @@ unsigned menu_displaylist_build_list(
|
|||||||
MENU_ENUM_LABEL_VIDEO_GPU_INDEX,
|
MENU_ENUM_LABEL_VIDEO_GPU_INDEX,
|
||||||
PARSE_ONLY_INT, false) == 0)
|
PARSE_ONLY_INT, false) == 0)
|
||||||
count++;
|
count++;
|
||||||
|
#if defined(DINGUX) && defined(DINGUX_BETA)
|
||||||
|
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
|
||||||
|
MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE,
|
||||||
|
PARSE_ONLY_UINT, false) == 0)
|
||||||
|
count++;
|
||||||
|
#endif
|
||||||
if (threaded && !*threaded)
|
if (threaded && !*threaded)
|
||||||
{
|
{
|
||||||
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
|
if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list,
|
||||||
|
@ -5177,6 +5177,31 @@ static void setting_get_string_representation_uint_video_dingux_ipu_filter_type(
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
static void setting_get_string_representation_uint_video_dingux_refresh_rate(
|
||||||
|
rarch_setting_t *setting,
|
||||||
|
char *s, size_t len)
|
||||||
|
{
|
||||||
|
if (!setting)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (*setting->value.target.unsigned_integer)
|
||||||
|
{
|
||||||
|
case DINGUX_REFRESH_RATE_60HZ:
|
||||||
|
strlcpy(s,
|
||||||
|
msg_hash_to_str(
|
||||||
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_60HZ),
|
||||||
|
len);
|
||||||
|
break;
|
||||||
|
case DINGUX_REFRESH_RATE_50HZ:
|
||||||
|
strlcpy(s,
|
||||||
|
msg_hash_to_str(
|
||||||
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_50HZ),
|
||||||
|
len);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void setting_get_string_representation_uint_input_auto_game_focus(
|
static void setting_get_string_representation_uint_input_auto_game_focus(
|
||||||
@ -7249,6 +7274,46 @@ static void general_write_handler(rarch_setting_t *setting)
|
|||||||
/* In case refresh rate update forced non-block video. */
|
/* In case refresh rate update forced non-block video. */
|
||||||
rarch_cmd = CMD_EVENT_VIDEO_SET_BLOCKING_STATE;
|
rarch_cmd = CMD_EVENT_VIDEO_SET_BLOCKING_STATE;
|
||||||
break;
|
break;
|
||||||
|
#if defined(DINGUX) && defined(DINGUX_BETA)
|
||||||
|
case MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE:
|
||||||
|
{
|
||||||
|
enum dingux_refresh_rate current_refresh_rate = DINGUX_REFRESH_RATE_60HZ;
|
||||||
|
enum dingux_refresh_rate target_refresh_rate =
|
||||||
|
(enum dingux_refresh_rate)settings->uints.video_dingux_refresh_rate;
|
||||||
|
bool refresh_rate_valid = false;
|
||||||
|
|
||||||
|
/* Get current refresh rate */
|
||||||
|
refresh_rate_valid = dingux_get_video_refresh_rate(¤t_refresh_rate);
|
||||||
|
|
||||||
|
/* Check if refresh rate has changed */
|
||||||
|
if (!refresh_rate_valid ||
|
||||||
|
(current_refresh_rate != target_refresh_rate))
|
||||||
|
{
|
||||||
|
/* Get floating point representation of
|
||||||
|
* new refresh rate */
|
||||||
|
float hw_refresh_rate = 60.0f;
|
||||||
|
|
||||||
|
switch (target_refresh_rate)
|
||||||
|
{
|
||||||
|
case DINGUX_REFRESH_RATE_50HZ:
|
||||||
|
hw_refresh_rate = 50.0f;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Manually update 'settings->floats.video_refresh_rate'
|
||||||
|
* (required for correct timing adjustments when
|
||||||
|
* reinitialising drivers) */
|
||||||
|
configuration_set_float(settings,
|
||||||
|
settings->floats.video_refresh_rate,
|
||||||
|
hw_refresh_rate);
|
||||||
|
|
||||||
|
/* Trigger driver reinitialisation */
|
||||||
|
rarch_cmd = CMD_EVENT_REINIT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
case MENU_ENUM_LABEL_VIDEO_SCALE:
|
case MENU_ENUM_LABEL_VIDEO_SCALE:
|
||||||
settings->modified = true;
|
settings->modified = true;
|
||||||
settings->floats.video_scale = roundf(*setting->value.target.fraction);
|
settings->floats.video_scale = roundf(*setting->value.target.fraction);
|
||||||
@ -10528,42 +10593,65 @@ static bool setting_append_list(
|
|||||||
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
|
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_ADVANCED);
|
||||||
}
|
}
|
||||||
|
|
||||||
CONFIG_FLOAT(
|
#if defined(DINGUX) && defined(DINGUX_BETA)
|
||||||
list, list_info,
|
if (string_is_equal(settings->arrays.video_driver, "sdl_dingux"))
|
||||||
&settings->floats.video_refresh_rate,
|
{
|
||||||
MENU_ENUM_LABEL_VIDEO_REFRESH_RATE,
|
CONFIG_UINT(
|
||||||
MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE,
|
list, list_info,
|
||||||
DEFAULT_REFRESH_RATE,
|
&settings->uints.video_dingux_refresh_rate,
|
||||||
"%.3f Hz",
|
MENU_ENUM_LABEL_VIDEO_DINGUX_REFRESH_RATE,
|
||||||
&group_info,
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE,
|
||||||
&subgroup_info,
|
DEFAULT_DINGUX_REFRESH_RATE,
|
||||||
parent_group,
|
&group_info,
|
||||||
general_write_handler,
|
&subgroup_info,
|
||||||
general_read_handler);
|
parent_group,
|
||||||
menu_settings_list_current_add_range(list, list_info, 0, 0, 0.001, true, false);
|
general_write_handler,
|
||||||
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
|
general_read_handler);
|
||||||
|
(*list)[list_info->index - 1].action_ok = &setting_action_ok_uint;
|
||||||
CONFIG_FLOAT(
|
(*list)[list_info->index - 1].get_string_representation =
|
||||||
list, list_info,
|
&setting_get_string_representation_uint_video_dingux_refresh_rate;
|
||||||
&settings->floats.video_refresh_rate,
|
menu_settings_list_current_add_range(list, list_info, 0, DINGUX_REFRESH_RATE_LAST - 1, 1, true, true);
|
||||||
MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO,
|
(*list)[list_info->index - 1].ui_type = ST_UI_TYPE_UINT_COMBOBOX;
|
||||||
MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO,
|
}
|
||||||
DEFAULT_REFRESH_RATE,
|
else
|
||||||
"%.3f Hz",
|
#endif
|
||||||
&group_info,
|
|
||||||
&subgroup_info,
|
|
||||||
parent_group,
|
|
||||||
general_write_handler,
|
|
||||||
general_read_handler);
|
|
||||||
(*list)[list_info->index - 1].action_start = &setting_action_start_video_refresh_rate_auto;
|
|
||||||
(*list)[list_info->index - 1].action_ok = &setting_action_ok_video_refresh_rate_auto;
|
|
||||||
(*list)[list_info->index - 1].action_select = &setting_action_ok_video_refresh_rate_auto;
|
|
||||||
(*list)[list_info->index - 1].get_string_representation =
|
|
||||||
&setting_get_string_representation_st_float_video_refresh_rate_auto;
|
|
||||||
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
|
|
||||||
|
|
||||||
{
|
{
|
||||||
float actual_refresh_rate = video_driver_get_refresh_rate();
|
float actual_refresh_rate = video_driver_get_refresh_rate();
|
||||||
|
|
||||||
|
CONFIG_FLOAT(
|
||||||
|
list, list_info,
|
||||||
|
&settings->floats.video_refresh_rate,
|
||||||
|
MENU_ENUM_LABEL_VIDEO_REFRESH_RATE,
|
||||||
|
MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE,
|
||||||
|
DEFAULT_REFRESH_RATE,
|
||||||
|
"%.3f Hz",
|
||||||
|
&group_info,
|
||||||
|
&subgroup_info,
|
||||||
|
parent_group,
|
||||||
|
general_write_handler,
|
||||||
|
general_read_handler);
|
||||||
|
menu_settings_list_current_add_range(list, list_info, 0, 0, 0.001, true, false);
|
||||||
|
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
|
||||||
|
|
||||||
|
CONFIG_FLOAT(
|
||||||
|
list, list_info,
|
||||||
|
&settings->floats.video_refresh_rate,
|
||||||
|
MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO,
|
||||||
|
MENU_ENUM_LABEL_VALUE_VIDEO_REFRESH_RATE_AUTO,
|
||||||
|
DEFAULT_REFRESH_RATE,
|
||||||
|
"%.3f Hz",
|
||||||
|
&group_info,
|
||||||
|
&subgroup_info,
|
||||||
|
parent_group,
|
||||||
|
general_write_handler,
|
||||||
|
general_read_handler);
|
||||||
|
(*list)[list_info->index - 1].action_start = &setting_action_start_video_refresh_rate_auto;
|
||||||
|
(*list)[list_info->index - 1].action_ok = &setting_action_ok_video_refresh_rate_auto;
|
||||||
|
(*list)[list_info->index - 1].action_select = &setting_action_ok_video_refresh_rate_auto;
|
||||||
|
(*list)[list_info->index - 1].get_string_representation =
|
||||||
|
&setting_get_string_representation_st_float_video_refresh_rate_auto;
|
||||||
|
SETTINGS_DATA_LIST_CURRENT_ADD_FLAGS(list, list_info, SD_FLAG_LAKKA_ADVANCED);
|
||||||
|
|
||||||
if (actual_refresh_rate > 0.0)
|
if (actual_refresh_rate > 0.0)
|
||||||
{
|
{
|
||||||
CONFIG_FLOAT(
|
CONFIG_FLOAT(
|
||||||
|
@ -2427,6 +2427,12 @@ enum msg_hash_enums
|
|||||||
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_BICUBIC,
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_BICUBIC,
|
||||||
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_BILINEAR,
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_BILINEAR,
|
||||||
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_NEAREST,
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_NEAREST,
|
||||||
|
#if defined(DINGUX_BETA)
|
||||||
|
MENU_LABEL(VIDEO_DINGUX_REFRESH_RATE),
|
||||||
|
|
||||||
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_60HZ,
|
||||||
|
MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_REFRESH_RATE_50HZ,
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
MENU_LABEL(VIDEO_VFILTER),
|
MENU_LABEL(VIDEO_VFILTER),
|
||||||
MENU_LABEL(VIDEO_GPU_RECORD),
|
MENU_LABEL(VIDEO_GPU_RECORD),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user