diff --git a/Makefile.common b/Makefile.common
index ed3f35036a..dbeb65b5d7 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -1299,6 +1299,12 @@ else ifeq ($(HAVE_SDL), 1)
OBJ += gfx/drivers/sdl_gfx.o
DEF_FLAGS += $(SDL_CFLAGS)
LIBS += $(SDL_LIBS)
+else ifeq ($(HAVE_SDL_DINGUX), 1)
+ HAVE_SDL_COMMON = 1
+ DEFINES += -DHAVE_SDL -DHAVE_SDL_DINGUX
+ OBJ += gfx/drivers/sdl_dingux_gfx.o
+ DEF_FLAGS += $(SDL_DINGUX_CFLAGS)
+ LIBS += $(SDL_DINGUX_LIBS)
endif
ifeq ($(HAVE_SDL_COMMON), 1)
diff --git a/Makefile.dingux b/Makefile.dingux
new file mode 100644
index 0000000000..01d0d176f4
--- /dev/null
+++ b/Makefile.dingux
@@ -0,0 +1,189 @@
+CC = /opt/gcw0-toolchain/usr/bin/mipsel-gcw0-linux-uclibc-gcc
+CXX = /opt/gcw0-toolchain/usr/bin/mipsel-gcw0-linux-uclibc-g++
+PACKAGE_NAME = retroarch
+
+HAVE_7ZIP = 1
+HAVE_AL = 1
+# this freezes when switching back from menu
+HAVE_ALSA = 0
+HAVE_BUILTINMBEDTLS = 1
+HAVE_BUILTINZLIB = 1
+HAVE_C99 = 1
+HAVE_CC = 1
+HAVE_CC_RESAMPLER = 1
+HAVE_CHD = 1
+HAVE_CHEEVOS = 1
+HAVE_COMMAND = 1
+HAVE_CXX = 1
+HAVE_DR_MP3 = 1
+HAVE_DYNAMIC = 1
+HAVE_EGL = 1
+HAVE_FREETYPE = 1
+HAVE_GDI = 1
+HAVE_GETADDRINFO = 1
+HAVE_GETOPT_LONG = 1
+HAVE_GLSL = 1
+HAVE_HID = 1
+HAVE_IBXM = 1
+HAVE_IMAGEVIEWER = 1
+HAVE_LANGEXTRA = 1
+HAVE_LIBRETRODB = 1
+HAVE_MENU = 1
+HAVE_MENU_COMMON = 1
+HAVE_MENU_WIDGETS = 1
+HAVE_MMAP = 1
+HAVE_NETWORKING = 1
+HAVE_OPENDINGUX_FBDEV = 1
+HAVE_OPENGL = 1
+HAVE_OPENGL1 = 0
+HAVE_OPENGLES = 1
+HAVE_OPENGLES3 = 0
+HAVE_OPENGL_CORE = 0
+HAVE_OPENSSL = 1
+HAVE_OVERLAY = 1
+HAVE_RBMP = 1
+HAVE_RJPEG = 1
+HAVE_RPILED = 1
+HAVE_RPNG = 1
+HAVE_RUNAHEAD = 1
+HAVE_SDL_DINGUX = 1
+HAVE_SHADERPIPELINE = 1
+HAVE_STB_FONT = 1
+HAVE_STB_IMAGE = 1
+HAVE_STB_VORBIS = 1
+HAVE_STDIN_CMD = 1
+HAVE_STRCASESTR = 1
+HAVE_THREADS = 1
+HAVE_TRANSLATE = 1
+HAVE_UDEV = 1
+HAVE_VIDEO_LAYOUT = 1
+HAVE_XMB = 1
+HAVE_ZLIB = 1
+
+OS = Linux
+TARGET = retroarch
+OPK_NAME = retroarch.opk
+
+OBJ :=
+LINK := $(CXX)
+DEF_FLAGS := -march=mips32 -mtune=mips32r2 -mhard-float -ffast-math -fomit-frame-pointer -fdata-sections
+DEF_FLAGS += -I. -Ideps -Ideps/stb -DDINGUX=1 -MMD
+DEF_FLAGS += -Wall -Wno-unused-variable
+DEF_FLAGS += -std=gnu99 -D_GNU_SOURCE
+LIBS := -ldl -lz -lrt -lcrypto -lssl -ludev -pthread
+CFLAGS :=
+CXXFLAGS := -fno-exceptions -fno-rtti -std=c++11 -D__STDC_CONSTANT_MACROS
+ASFLAGS :=
+LDFLAGS := -flto
+INCLUDE_DIRS = -I/opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/include
+LIBRARY_DIRS = -L/opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/lib
+DEFINES := -DRARCH_INTERNAL -D_FILE_OFFSET_BITS=64 -UHAVE_STATIC_DUMMY
+DEFINES += -DHAVE_C99=1 -DHAVE_CXX=1 -DHAVE_OPENDINGUX_FBDEV=1
+DEFINES += -DHAVE_GETOPT_LONG=1 -DHAVE_STRCASESTR=1 -DHAVE_DYNAMIC=1
+DEFINES += -DHAVE_AL=1
+DEFINES += -DHAVE_ONLINE_UPDATER=1
+DEFINES += -DHAVE_UPDATE_ASSETS=1
+DEFINES += -DHAVE_UDEV=1
+
+SDL_DINGUX_CFLAGS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/sdl-config --cflags)
+SDL_DINGUX_LIBS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/sdl-config --libs)
+FREETYPE_CFLAGS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/freetype-config --cflags)
+FREETYPE_LIBS := $(shell /opt/gcw0-toolchain/usr/mipsel-gcw0-linux-uclibc/sysroot/usr/bin/freetype-config --libs)
+AL_LIBS := -lopenal
+OPENGLES_CFLAGS := -DMESA_EGL_NO_X11_HEADERS
+OPENGLES_LIBS := -lGLESv2 -lEGL
+MMAP_LIBS = -lc
+
+OBJDIR_BASE := obj-unix
+
+ifeq ($(DEBUG), 1)
+ OBJDIR := $(OBJDIR_BASE)/debug
+ CFLAGS ?= -O0 -g
+ CXXFLAGS ?= -O0 -g
+ DEFINES += -DDEBUG -D_DEBUG
+else
+ OBJDIR := $(OBJDIR_BASE)/release
+ CFLAGS ?= -O2
+ CXXFLAGS ?= -O2
+endif
+
+include Makefile.common
+
+DEF_FLAGS += $(INCLUDE_DIRS)
+CFLAGS += $(DEF_FLAGS)
+CXXFLAGS += $(DEF_FLAGS)
+
+HEADERS = $(wildcard */*/*.h) $(wildcard */*.h) $(wildcard *.h)
+
+Q := @
+
+RARCH_OBJ := $(addprefix $(OBJDIR)/,$(OBJ))
+
+define DESKTOP_ENTRY
+[Desktop Entry]
+Name=retroarch
+Comment=Retroarch
+Exec=retroarch
+Terminal=false
+Type=Application
+StartupNotify=true
+Icon=retroarch
+Categories=emulators;
+X-OD-NeedsDownscaling=true
+endef
+export DESKTOP_ENTRY
+
+all: $(TARGET) opk
+
+-include $(RARCH_OBJ:.o=.d)
+
+SYMBOL_MAP := -Wl,-Map=output.map
+
+$(TARGET): $(RARCH_OBJ)
+ @$(if $(Q), $(shell echo echo LD $@),)
+ $(LINK) -o $@ $(RARCH_OBJ) $(LIBS) $(LDFLAGS) $(LIBRARY_DIRS)
+
+$(OBJDIR)/%.o: %.c
+ @mkdir -p $(dir $@)
+ @$(if $(Q), $(shell echo echo CC $<),)
+ $(CC) $(CPPFLAGS) $(CFLAGS) $(DEFINES) -c -o $@ $<
+
+$(OBJDIR)/%.o: %.cpp
+ @mkdir -p $(dir $@)
+ @$(if $(Q), $(shell echo echo CXX $<),)
+ $(CXX) $(CPPFLAGS) $(CXXFLAGS) $(DEFINES) -MMD -c -o $@ $<
+
+$(OBJDIR)/%.o: %.m
+ @mkdir -p $(dir $@)
+ @$(if $(Q), $(shell echo echo OBJC $<),)
+ $(CXX) $(OBJCFLAGS) $(DEFINES) -MMD -c -o $@ $<
+
+.FORCE:
+
+$(OBJDIR)/git_version.o: git_version.c .FORCE
+ @mkdir -p $(dir $@)
+ @$(if $(Q), $(shell echo echo CC $<),)
+ $(CC) $(CFLAGS) $(DEFINES) -MMD -c -o $@ $<
+
+$(OBJDIR)/%.o: %.S $(HEADERS)
+ @mkdir -p $(dir $@)
+ @$(if $(Q), $(shell echo echo AS $<),)
+ $(CC) $(CFLAGS) $(ASFLAGS) $(DEFINES) -c -o $@ $<
+
+clean:
+ rm -rf $(OBJDIR_BASE)
+ rm -f $(TARGET)
+ rm -f *.d
+ rm -rf $(OPK_NAME)
+
+opk: $(TARGET)
+ echo "$$DESKTOP_ENTRY" > default.gcw0.desktop
+ rm -f $(OPK_NAME)
+ cp media/ico_src/icon32.png retroarch.png
+ mksquashfs retroarch default.gcw0.desktop retroarch.png $(OPK_NAME) -all-root -no-xattrs -noappend -no-exports
+ rm -f default.gcw0.desktop retroarch.png
+
+.PHONY: all clean opk
+
+print-%:
+ @echo '$*=$($*)'
diff --git a/config.def.h b/config.def.h
index 9a10753805..366bcd0b18 100644
--- a/config.def.h
+++ b/config.def.h
@@ -89,6 +89,8 @@
#define DEFAULT_MAX_PADS 4
#elif defined(HAVE_XINPUT) && !defined(HAVE_DINPUT)
#define DEFAULT_MAX_PADS 4
+#elif defined(DINGUX)
+#define DEFAULT_MAX_PADS 2
#else
#define DEFAULT_MAX_PADS 16
#endif
@@ -592,7 +594,7 @@ static bool default_savefiles_in_content_dir = false;
static bool default_systemfiles_in_content_dir = false;
static bool default_screenshots_in_content_dir = false;
-#if defined(__CELLOS_LV2__) || defined(_XBOX1) || defined(_XBOX360)
+#if defined(__CELLOS_LV2__) || defined(_XBOX1) || defined(_XBOX360) || defined(DINGUX)
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_L3_R3;
#elif defined(PS2) || defined(PSP)
static unsigned menu_toggle_gamepad_combo = INPUT_TOGGLE_HOLD_START;
@@ -631,7 +633,12 @@ static unsigned input_backtouch_toggle = false;
#define DEFAULT_CROP_OVERSCAN true
/* Font size for on-screen messages. */
+#if defined(DINGUX)
+#define DEFAULT_FONT_SIZE 12
+#else
#define DEFAULT_FONT_SIZE 32
+#endif
+
/* Offset for where messages will be placed on-screen.
* Values are in range [0.0, 1.0]. */
@@ -1045,7 +1052,7 @@ static const bool content_runtime_log_aggregate = false;
#if defined(__QNX__) || defined(_XBOX1) || defined(_XBOX360) || defined(__CELLOS_LV2__) || (defined(__MACH__) && defined(IOS)) || defined(ANDROID) || defined(WIIU) || defined(HAVE_NEON) || defined(GEKKO) || defined(__ARM_NEON__)
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWER;
-#elif defined(PSP) || defined(_3DS) || defined(VITA) || defined(PS2)
+#elif defined(PSP) || defined(_3DS) || defined(VITA) || defined(PS2) || defined(DINGUX)
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_LOWEST;
#else
static enum resampler_quality audio_resampler_quality_level = RESAMPLER_QUALITY_NORMAL;
diff --git a/config.def.keybinds.h b/config.def.keybinds.h
index 791f4c071c..5271b3a068 100644
--- a/config.def.keybinds.h
+++ b/config.def.keybinds.h
@@ -105,6 +105,88 @@ static const struct retro_keybind retro_keybinds_1[] = {
{ true, RARCH_RECORDING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
{ true, RARCH_STREAMING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
{ true, RARCH_AI_SERVICE, MENU_ENUM_LABEL_VALUE_INPUT_META_AI_SERVICE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+#elif defined(DINGUX)
+ { true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_LALT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_LSHIFT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_SELECT, RETROK_ESCAPE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_START, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_START, RETROK_RETURN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_UP, RETROK_UP, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_DOWN, RETROK_DOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT, RETROK_LEFT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_RIGHT, RETROK_RIGHT, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_A, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, RETROK_LCTRL, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_X, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, RETROK_SPACE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_L, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L, RETROK_TAB, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_R, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R, RETROK_BACKSPACE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_L2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L2, RETROK_PAGEUP, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_R2, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R2, RETROK_PAGEDOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_L3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_L3, RETROK_KP_DIVIDE, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RETRO_DEVICE_ID_JOYPAD_R3, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_R3, RETROK_KP_PERIOD, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+
+ { true, RARCH_ANALOG_LEFT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_ANALOG_LEFT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_ANALOG_LEFT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_ANALOG_LEFT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_ANALOG_RIGHT_X_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_ANALOG_RIGHT_X_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_X_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_ANALOG_RIGHT_Y_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_ANALOG_RIGHT_Y_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_RIGHT_Y_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+
+ { true, RARCH_LIGHTGUN_TRIGGER, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_TRIGGER, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LIGHTGUN_RELOAD, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_RELOAD, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LIGHTGUN_AUX_A, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_A, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LIGHTGUN_AUX_B, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_B, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LIGHTGUN_AUX_C, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_AUX_C, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LIGHTGUN_START, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_START, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LIGHTGUN_SELECT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_SELECT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LIGHTGUN_DPAD_UP, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LIGHTGUN_DPAD_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LIGHTGUN_DPAD_LEFT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_LEFT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LIGHTGUN_DPAD_RIGHT, MENU_ENUM_LABEL_VALUE_INPUT_LIGHTGUN_DPAD_RIGHT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+
+ { true, RARCH_TURBO_ENABLE, MENU_ENUM_LABEL_VALUE_INPUT_TURBO_ENABLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+
+ { true, RARCH_FAST_FORWARD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_FAST_FORWARD_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FAST_FORWARD_HOLD_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_SLOWMOTION_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_SLOWMOTION_HOLD_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SLOWMOTION_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_LOAD_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_LOAD_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_SAVE_STATE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_SAVE_STATE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_FULLSCREEN_TOGGLE_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_FULLSCREEN_TOGGLE_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_QUIT_KEY, MENU_ENUM_LABEL_VALUE_INPUT_META_QUIT_KEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_STATE_SLOT_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_STATE_SLOT_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_STATE_SLOT_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_REWIND, MENU_ENUM_LABEL_VALUE_INPUT_META_REWIND, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_BSV_RECORD_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_BSV_RECORD_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_PAUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_PAUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_FRAMEADVANCE, MENU_ENUM_LABEL_VALUE_INPUT_META_FRAMEADVANCE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_RESET, MENU_ENUM_LABEL_VALUE_INPUT_META_RESET, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_SHADER_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_SHADER_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_SHADER_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_CHEAT_INDEX_PLUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_PLUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_CHEAT_INDEX_MINUS, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_INDEX_MINUS, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_CHEAT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_CHEAT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_SCREENSHOT, MENU_ENUM_LABEL_VALUE_INPUT_META_SCREENSHOT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_MUTE, MENU_ENUM_LABEL_VALUE_INPUT_META_MUTE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_OSK, MENU_ENUM_LABEL_VALUE_INPUT_META_OSK, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_FPS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_FPS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_SEND_DEBUG_INFO, MENU_ENUM_LABEL_VALUE_INPUT_META_SEND_DEBUG_INFO, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_NETPLAY_HOST_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_HOST_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_NETPLAY_GAME_WATCH, MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_ENABLE_HOTKEY, MENU_ENUM_LABEL_VALUE_INPUT_META_ENABLE_HOTKEY, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_VOLUME_UP, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_UP, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_VOLUME_DOWN, MENU_ENUM_LABEL_VALUE_INPUT_META_VOLUME_DOWN, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_OVERLAY_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_OVERLAY_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_DISK_EJECT_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_EJECT_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_DISK_NEXT, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_NEXT, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_DISK_PREV, MENU_ENUM_LABEL_VALUE_INPUT_META_DISK_PREV, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_GRAB_MOUSE_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GRAB_MOUSE_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_GAME_FOCUS_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_GAME_FOCUS_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_UI_COMPANION_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_UI_COMPANION_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_MENU_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_MENU_TOGGLE, RETROK_HOME, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_RECORDING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_RECORDING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_STREAMING_TOGGLE, MENU_ENUM_LABEL_VALUE_INPUT_META_STREAMING_TOGGLE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
+ { true, RARCH_AI_SERVICE, MENU_ENUM_LABEL_VALUE_INPUT_META_AI_SERVICE, RETROK_UNKNOWN, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
#else
{ true, RETRO_DEVICE_ID_JOYPAD_B, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, RETROK_z, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
{ true, RETRO_DEVICE_ID_JOYPAD_Y, MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, RETROK_a, NO_BTN, NO_BTN, 0, AXIS_NONE, AXIS_NONE, AXIS_NONE, NULL, NULL },
diff --git a/config.features.h b/config.features.h
index 3fb618a332..9f9bec8df0 100644
--- a/config.features.h
+++ b/config.features.h
@@ -50,7 +50,7 @@
#define SUPPORTS_LIBUSB false
#endif
-#ifdef HAVE_SDL
+#if defined(HAVE_SDL)
#define SUPPORTS_SDL true
#else
#define SUPPORTS_SDL false
diff --git a/configuration.c b/configuration.c
index 7ab3ba0d36..7f3ed3fe31 100644
--- a/configuration.c
+++ b/configuration.c
@@ -144,6 +144,7 @@ enum video_driver_enum
VIDEO_XVIDEO,
VIDEO_SDL,
VIDEO_SDL2,
+ VIDEO_SDL_DINGUX,
VIDEO_EXT,
VIDEO_WII,
VIDEO_WIIU,
@@ -357,10 +358,12 @@ static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_CTR;
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_SWITCH;
#elif defined(HAVE_XVIDEO)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_XVIDEO;
-#elif defined(HAVE_SDL)
+#elif defined(HAVE_SDL) && !defined(HAVE_SDL_DINGUX)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_SDL;
#elif defined(HAVE_SDL2)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_SDL2;
+#elif defined(HAVE_SDL_DINGUX)
+static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_SDL_DINGUX;
#elif defined(_WIN32) && !defined(_XBOX)
static enum video_driver_enum VIDEO_DEFAULT_DRIVER = VIDEO_GDI;
#elif defined(DJGPP)
diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c
index f0b8aaed03..d2dfa0e85a 100644
--- a/gfx/drivers/gl.c
+++ b/gfx/drivers/gl.c
@@ -3629,7 +3629,10 @@ static void *gl2_init(const video_info_t *video,
RARCH_LOG("[GL]: Found GL context: %s\n", ctx_driver->ident);
video_context_driver_get_video_size(&mode);
-
+#if defined(DINGUX)
+ mode.width = 320;
+ mode.height = 240;
+#endif
full_x = mode.width;
full_y = mode.height;
mode.width = 0;
@@ -3774,6 +3777,10 @@ static void *gl2_init(const video_info_t *video,
video_context_driver_get_video_size(&mode);
+#if defined(DINGUX)
+ mode.width = 320;
+ mode.height = 240;
+#endif
temp_width = mode.width;
temp_height = mode.height;
mode.width = 0;
diff --git a/gfx/drivers/sdl_dingux_gfx.c b/gfx/drivers/sdl_dingux_gfx.c
new file mode 100644
index 0000000000..b1b18a9bec
--- /dev/null
+++ b/gfx/drivers/sdl_dingux_gfx.c
@@ -0,0 +1,359 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2017 - Daniel De Matteis
+ * Copyright (C) 2011-2017 - Higor Euripedes
+ *
+ * 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
+#include
+#include "../../verbosity.h"
+
+#ifdef HAVE_CONFIG_H
+#include "../../config.h"
+#endif
+
+#ifdef HAVE_MENU
+#include "../../menu/menu_driver.h"
+#endif
+
+#include
+#include
+
+#include "../../configuration.h"
+#include "../../retroarch.h"
+
+#define likely(x) __builtin_expect(!!(x), 1)
+#define unlikely(x) __builtin_expect(!!(x), 0)
+
+#define VERBOSE 0
+
+typedef struct sdl_dingux_video
+{
+ SDL_Surface *screen;
+ bool rgb;
+ bool menu_active;
+ bool was_in_menu;
+ bool quitting;
+ char menu_frame[320*240*32];
+
+} sdl_dingux_video_t;
+
+static void sdl_dingux_gfx_free(void *data)
+{
+ sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
+ if (!vid)
+ return;
+
+ SDL_QuitSubSystem(SDL_INIT_VIDEO);
+
+ free(vid);
+}
+
+static void *sdl_dingux_gfx_init(const video_info_t *video,
+ input_driver_t **input, void **input_data)
+{
+ sdl_dingux_video_t *vid = NULL;
+ settings_t *settings = config_get_ptr();
+
+ FILE* f = fopen("/sys/devices/platform/jz-lcd.0/allow_downscaling", "w");
+ if (f) {
+ fprintf(f, "%d", 1);
+ fclose(f);
+ }
+
+ if (SDL_WasInit(0) == 0)
+ {
+ if (SDL_Init(SDL_INIT_VIDEO) < 0)
+ return NULL;
+ }
+ else if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0)
+ return NULL;
+
+ vid = (sdl_dingux_video_t*)calloc(1, sizeof(*vid));
+ if (!vid)
+ return NULL;
+
+#ifdef VERBOSE
+ printf("sdl_dingux_gfx_init video %dx%d rgb32 %d smooth %d input_scale %u force_aspect %d fullscreen %d\n",
+ video->width, video->height, video->rgb32, video->smooth, video->input_scale, video->force_aspect, video->fullscreen);
+#endif
+
+ vid->screen = SDL_SetVideoMode(320, 240, video->rgb32 ? 32 : 16, SDL_HWSURFACE | SDL_TRIPLEBUF | SDL_FULLSCREEN);
+ if (!vid->screen)
+ {
+ RARCH_ERR("[SDL1]: Failed to init SDL surface: %s\n", SDL_GetError());
+ goto error;
+ }
+
+ vid->rgb = video->rgb32;
+ vid->menu_active = false;
+ vid->was_in_menu = false;
+
+ SDL_ShowCursor(SDL_DISABLE);
+
+ if (input && input_data)
+ {
+ void *sdl_input = input_sdl.init(settings->arrays.input_joypad_driver);
+
+ if (sdl_input)
+ {
+ *input = &input_sdl;
+ *input_data = sdl_input;
+ }
+ else
+ {
+ *input = NULL;
+ *input_data = NULL;
+ }
+ }
+
+ return vid;
+
+error:
+ sdl_dingux_gfx_free(vid);
+ return NULL;
+}
+
+static void clear_screen(void* data)
+{
+ sdl_dingux_video_t* vid = (sdl_dingux_video_t*)data;
+ SDL_FillRect(vid->screen, 0, 0);
+ SDL_Flip(vid->screen);
+ SDL_FillRect(vid->screen, 0, 0);
+ SDL_Flip(vid->screen);
+ SDL_FillRect(vid->screen, 0, 0);
+ SDL_Flip(vid->screen);
+}
+
+static void set_output(sdl_dingux_video_t* vid, int width, int height, int pitch, bool rgb)
+{
+#ifdef VERBOSE
+ printf("set_output current w %d h %d pitch %d new_w %d new_h %d pitch %d rgb %d\n",
+ vid->screen->w, vid->screen->h, vid->screen->pitch, width, height, pitch, (int)vid->rgb);
+#endif
+
+ vid->screen = SDL_SetVideoMode(width, height, rgb ? 32 : 16, SDL_HWSURFACE | SDL_TRIPLEBUF | SDL_FULLSCREEN);
+ if (!vid->screen)
+ RARCH_ERR("[SDL1]: Failed to init SDL surface: %s\n", SDL_GetError());
+}
+
+static void blit(uint32_t* d, uint32_t* s, int width, int height, int pitch)
+{
+ int skip = pitch/4 - width;
+ for (int i = 0; i < height; i++)
+ {
+ for (int j = 0; j < width; j++)
+ *(d++) = *(s++);
+ s += skip;
+ }
+}
+
+static bool sdl_dingux_gfx_frame(void *data, const void *frame, unsigned width,
+ unsigned height, uint64_t frame_count,
+ unsigned pitch, const char *msg, video_frame_info_t *video_info)
+{
+// printf("sdl_gfx_frame width %d height %d pitch %d frame_count %lu\n", width, height, pitch, frame_count);
+ sdl_dingux_video_t* vid = (sdl_dingux_video_t*)data;
+
+ if (unlikely(!frame))
+ return true;
+
+ if (unlikely((vid->screen->w != width || vid->screen->h != height) && !vid->menu_active))
+ {
+ set_output(vid, width, height, pitch, vid->rgb);
+ }
+
+ menu_driver_frame(video_info);
+
+ if (likely(!vid->menu_active))
+ {
+ blit((uint32_t*)vid->screen->pixels, (uint32_t*)frame, vid->rgb ? width : width/2, height, pitch);
+ if (unlikely(vid->was_in_menu))
+ vid->was_in_menu = false;
+ }
+ else
+ {
+ if (!vid->was_in_menu)
+ {
+ set_output(vid, 320, 240, 320*2, false);
+ vid->was_in_menu = true;
+ }
+ memcpy(vid->screen->pixels, vid->menu_frame, 320*240*2);
+ }
+
+ SDL_Flip(vid->screen);
+
+ return true;
+}
+
+static void sdl_dingux_set_texture_enable(void *data, bool state, bool full_screen)
+{
+ sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
+ (void)full_screen;
+
+ if (vid->menu_active != state)
+ {
+ vid->menu_active = state;
+ }
+}
+
+static void sdl_dingux_set_texture_frame(void *data, const void *frame, bool rgb32,
+ unsigned width, unsigned height, float alpha)
+{
+ sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
+
+ int len = width * height * 2;
+ memcpy(vid->menu_frame, frame, len);
+}
+
+
+static void sdl_dingux_gfx_set_nonblock_state(void *data, bool state)
+{
+ (void)data; /* Can SDL even do this? */
+ (void)state;
+}
+
+static void sdl_dingux_gfx_check_window(sdl_dingux_video_t *vid)
+{
+ SDL_Event event;
+
+ SDL_PumpEvents();
+ while (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_QUITMASK))
+ {
+ if (event.type != SDL_QUIT)
+ continue;
+
+ vid->quitting = true;
+ break;
+ }
+}
+
+static bool sdl_dingux_gfx_alive(void *data)
+{
+ sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
+ sdl_dingux_gfx_check_window(vid);
+ return !vid->quitting;
+}
+
+static bool sdl_dingux_gfx_focus(void *data)
+{
+ (void)data;
+ return true;
+}
+
+static bool sdl_dingux_gfx_suppress_screensaver(void *data, bool enable)
+{
+ (void)data;
+ (void)enable;
+ return false;
+}
+
+static bool sdl_dingux_gfx_has_windowed(void *data)
+{
+ (void)data;
+ return false;
+}
+
+static void sdl_dingux_gfx_viewport_info(void *data, struct video_viewport *vp)
+{
+ sdl_dingux_video_t *vid = (sdl_dingux_video_t*)data;
+ vp->x = 0;
+ vp->y = 0;
+ vp->width = vp->full_width = vid->screen->w;
+ vp->height = vp->full_height = vid->screen->h;
+}
+
+static void sdl_dingux_set_filtering(void *data, unsigned index, bool smooth)
+{
+ (void)data;
+}
+
+static void sdl_dingux_apply_state_changes(void *data)
+{
+ (void)data;
+}
+
+static uint32_t sdl_dingux_get_flags(void *data)
+{
+ (void)data;
+ return 0;
+}
+
+static const video_poke_interface_t sdl_dingux_poke_interface = {
+ sdl_dingux_get_flags,
+ NULL,
+ NULL,
+ NULL,
+ NULL, /* get_refresh_rate */
+ sdl_dingux_set_filtering,
+ NULL, /* get_video_output_size */
+ NULL, /* get_video_output_prev */
+ NULL, /* get_video_output_next */
+ NULL, /* get_current_framebuffer */
+ NULL, /* get_proc_address */
+ NULL,
+ sdl_dingux_apply_state_changes,
+ sdl_dingux_set_texture_frame,
+ sdl_dingux_set_texture_enable,
+ NULL,
+ NULL,//sdl_show_mouse,
+ NULL,//sdl_grab_mouse_toggle,
+ NULL, /* get_current_shader */
+ NULL, /* get_current_software_framebuffer */
+ NULL /* get_hw_render_interface */
+};
+
+static void sdl_dingux_get_poke_interface(void *data, const video_poke_interface_t **iface)
+{
+ (void)data;
+ *iface = &sdl_dingux_poke_interface;
+}
+
+static bool sdl_dingux_gfx_set_shader(void *data,
+ enum rarch_shader_type type, const char *path)
+{
+ (void)data;
+ (void)type;
+ (void)path;
+ return false;
+}
+
+video_driver_t video_sdl_dingux = {
+ sdl_dingux_gfx_init,
+ sdl_dingux_gfx_frame,
+ sdl_dingux_gfx_set_nonblock_state,
+ sdl_dingux_gfx_alive,
+ sdl_dingux_gfx_focus,
+ sdl_dingux_gfx_suppress_screensaver,
+ sdl_dingux_gfx_has_windowed,
+ sdl_dingux_gfx_set_shader,
+ sdl_dingux_gfx_free,
+ "sdl_dingux",
+ NULL,
+ NULL, /* set_rotation */
+ sdl_dingux_gfx_viewport_info,
+ NULL, /* read_viewport */
+ NULL, /* read_frame_raw */
+#ifdef HAVE_OVERLAY
+ NULL,
+#endif
+#ifdef HAVE_VIDEO_LAYOUT
+ NULL,
+#endif
+ sdl_dingux_get_poke_interface
+};
diff --git a/gfx/drivers_context/opendingux_fbdev_ctx.c b/gfx/drivers_context/opendingux_fbdev_ctx.c
index 6db8c4abf3..fd01e66e2a 100644
--- a/gfx/drivers_context/opendingux_fbdev_ctx.c
+++ b/gfx/drivers_context/opendingux_fbdev_ctx.c
@@ -15,6 +15,7 @@
*/
#include
+#include
#ifdef HAVE_CONFIG_H
#include "../../config.h"
@@ -97,8 +98,8 @@ static void *gfx_ctx_opendingux_init(video_frame_info_t *video_info, void *video
return viv;
-error:
#ifdef HAVE_EGL
+error:
RARCH_ERR("[opendingux fbdev]: EGL error: %d.\n", eglGetError());
#endif
gfx_ctx_opendingux_destroy(viv);
@@ -122,7 +123,6 @@ static void gfx_ctx_opendingux_check_window(void *data, bool *quit,
#ifdef HAVE_EGL
egl_get_video_size(&viv->egl, &new_width, &new_height);
-#endif
if (new_width != *width || new_height != *height)
{
@@ -130,6 +130,7 @@ static void gfx_ctx_opendingux_check_window(void *data, bool *quit,
*height = new_height;
*resize = true;
}
+#endif
*quit = (bool)frontend_driver_get_signal_handler_state();
}
@@ -170,8 +171,8 @@ static bool gfx_ctx_opendingux_set_video_mode(void *data,
return true;
-error:
#ifdef HAVE_EGL
+error:
RARCH_ERR("[opendingux fbdev]: EGL error: %d.\n", eglGetError());
#endif
gfx_ctx_opendingux_destroy(data);
@@ -235,12 +236,12 @@ static void gfx_ctx_opendingux_set_swap_interval(
#endif
}
+#ifdef HAVE_EGL
static gfx_ctx_proc_t gfx_ctx_opendingux_get_proc_address(const char *symbol)
{
-#ifdef HAVE_EGL
return egl_get_proc_address(symbol);
-#endif
}
+#endif
static void gfx_ctx_opendingux_bind_hw_render(void *data, bool enable)
{
@@ -287,7 +288,11 @@ const gfx_ctx_driver_t gfx_ctx_opendingux_fbdev = {
false, /* has_windowed */
gfx_ctx_opendingux_swap_buffers,
gfx_ctx_opendingux_input_driver,
+#ifdef HAVE_EGL
gfx_ctx_opendingux_get_proc_address,
+#else
+ NULL,
+#endif
NULL,
NULL,
NULL,
diff --git a/retroarch.c b/retroarch.c
index d331514cc1..20dcc909c5 100644
--- a/retroarch.c
+++ b/retroarch.c
@@ -29,6 +29,12 @@
#endif
#endif
+#if defined(DINGUX)
+#include
+#include
+#include
+#endif
+
#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX)
#ifndef LEGACY_WIN32
#define LEGACY_WIN32
@@ -389,12 +395,15 @@ static const video_driver_t *video_drivers[] = {
#ifdef SWITCH
&video_switch,
#endif
-#ifdef HAVE_SDL
+#if defined(HAVE_SDL) && !defined(HAVE_SDL_DINGUX)
&video_sdl,
#endif
#ifdef HAVE_SDL2
&video_sdl2,
#endif
+#ifdef HAVE_SDL_DINGUX
+ &video_sdl_dingux,
+#endif
#ifdef HAVE_XVIDEO
&video_xvideo,
#endif
diff --git a/retroarch.h b/retroarch.h
index 2d94072136..8560dec790 100644
--- a/retroarch.h
+++ b/retroarch.h
@@ -1886,6 +1886,7 @@ extern video_driver_t video_xenon360;
extern video_driver_t video_xvideo;
extern video_driver_t video_sdl;
extern video_driver_t video_sdl2;
+extern video_driver_t video_sdl_dingux;
extern video_driver_t video_vg;
extern video_driver_t video_omap;
extern video_driver_t video_exynos;