From ee3208ac393ea18e8d5aa62f2366930eef2db1af Mon Sep 17 00:00:00 2001 From: twinaphex Date: Mon, 17 Jun 2019 15:10:22 +0200 Subject: [PATCH] Integrate video_driver.c into retroarch.c --- .vscode/settings.json | 4 +- Makefile.common | 1 - command.c | 1 - configuration.c | 1 - core_impl.c | 1 - dynamic.c | 1 - frontend/drivers/platform_emscripten.c | 1 - frontend/drivers/platform_wiiu.c | 3 +- gfx/common/d3d10_common.h | 2 +- gfx/common/d3d11_common.h | 2 +- gfx/common/d3d12_common.h | 2 +- gfx/common/d3d8_common.h | 2 +- gfx/common/d3d9_common.h | 2 +- gfx/common/d3d_common.c | 2 + gfx/common/d3d_common.h | 2 +- gfx/common/drm_common.h | 2 +- gfx/common/dxgi_common.c | 2 +- gfx/common/dxgi_common.h | 2 +- gfx/common/egl_common.h | 2 +- gfx/common/gl1_common.h | 3 +- gfx/common/gl_common.h | 2 +- gfx/common/gl_core_common.h | 2 +- gfx/common/vita2d_common.h | 2 +- gfx/common/vulkan_common.h | 1 - gfx/common/win32_common.c | 2 +- gfx/common/win32_common.h | 2 +- gfx/common/x11_common.h | 2 +- gfx/display_servers/dispserv_win32.c | 2 +- gfx/display_servers/dispserv_x11.c | 2 +- gfx/drivers/d3d10.c | 1 - gfx/drivers/d3d11.c | 1 - gfx/drivers/d3d12.c | 1 - gfx/drivers/d3d8.c | 2 +- gfx/drivers/d3d9.c | 1 - gfx/drivers/nullgfx.c | 3 +- gfx/drivers/ps2_gfx.c | 10 +- gfx/drivers/sdl_gfx.c | 2 +- gfx/drivers_context/cgl_ctx.c | 2 +- gfx/drivers_context/cocoa_gl_ctx.m | 2 +- gfx/drivers_context/emscriptenegl_ctx.c | 2 +- gfx/drivers_context/gdi_ctx.c | 4 +- gfx/drivers_context/gfx_null_ctx.c | 2 +- gfx/drivers_context/khr_display_ctx.c | 3 +- gfx/drivers_context/mali_fbdev_ctx.c | 3 +- gfx/drivers_context/ps3_ctx.c | 2 +- gfx/drivers_context/sixel_ctx.c | 2 +- gfx/drivers_context/vc_egl_ctx.c | 2 +- gfx/drivers_context/wgl_ctx.c | 2 +- gfx/drivers_font/ctr_font.c | 2 +- gfx/drivers_font/d3d10_font.c | 2 +- gfx/drivers_font/d3d11_font.c | 2 +- gfx/drivers_font/d3d12_font.c | 2 +- gfx/drivers_font/gdi_font.c | 2 +- gfx/drivers_font/gl1_raster_font.c | 2 +- gfx/drivers_font/gl_core_raster_font.c | 2 +- gfx/drivers_font/gl_raster_font.c | 2 +- gfx/drivers_font/switch_font.c | 2 +- gfx/drivers_font/wiiu_font.c | 12 +- gfx/drivers_font_renderer/freetype.c | 1 + gfx/drivers_renderchain/d3d9_cg_renderchain.c | 2 +- .../d3d9_hlsl_renderchain.c | 2 - gfx/drivers_shader/shader_gl_cg.c | 2 +- gfx/drivers_shader/shader_gl_core.cpp | 3 +- gfx/drivers_shader/shader_glsl.h | 3 +- gfx/drivers_shader/shader_vulkan.cpp | 2 +- gfx/drivers_shader/slang_preprocess.h | 3 +- gfx/font_driver.c | 2 + gfx/font_driver.h | 2 +- gfx/video_crt_switch.c | 2 +- gfx/video_display_server.c | 2 +- gfx/video_driver.c | 3318 ---------------- gfx/video_driver.h | 1300 ------- gfx/video_layout.c | 10 +- gfx/video_shader_parse.c | 4 +- gfx/video_thread_wrapper.c | 1 + gfx/video_thread_wrapper.h | 1 - griffin/griffin.c | 1 - input/drivers/android_input.c | 2 +- input/drivers/cocoa_input.c | 2 +- input/drivers/dinput.c | 3 +- input/drivers/qnx_input.c | 2 +- input/drivers/rwebinput_input.c | 2 +- input/drivers/sdl_input.c | 2 +- input/drivers/udev_input.c | 4 +- input/drivers/wayland_input.c | 2 +- input/drivers/winraw_input.c | 2 +- input/drivers/x11_input.c | 2 +- input/drivers_joypad/dinput_joypad.c | 2 +- input/include/wiiu/input.h | 1 - input/input_overlay.c | 2 +- led/drivers/led_overlay.c | 5 +- list_special.c | 1 - managers/core_option_manager.h | 2 +- menu/cbs/menu_cbs_left.c | 1 - menu/cbs/menu_cbs_start.c | 2 - menu/drivers/xui.cpp | 2 - menu/drivers_display/menu_display_caca.c | 2 +- menu/drivers_display/menu_display_ctr.c | 1 - menu/drivers_display/menu_display_d3d10.c | 1 - menu/drivers_display/menu_display_d3d11.c | 1 - menu/drivers_display/menu_display_d3d12.c | 1 - menu/drivers_display/menu_display_d3d8.c | 2 +- menu/drivers_display/menu_display_d3d9.c | 2 +- menu/drivers_display/menu_display_gdi.c | 2 +- menu/drivers_display/menu_display_gl.c | 1 - menu/drivers_display/menu_display_gl1.c | 1 - menu/drivers_display/menu_display_gl_core.c | 3 +- menu/drivers_display/menu_display_metal.m | 2 +- menu/drivers_display/menu_display_null.c | 2 +- menu/drivers_display/menu_display_sixel.c | 2 +- menu/drivers_display/menu_display_switch.c | 2 +- menu/drivers_display/menu_display_vga.c | 2 +- menu/drivers_display/menu_display_vita2d.c | 1 - menu/drivers_display/menu_display_vulkan.c | 2 +- menu/drivers_display/menu_display_wiiu.c | 13 +- menu/menu_displaylist.c | 1 - menu/menu_driver.c | 2 - menu/menu_shader.h | 2 +- menu/widgets/menu_widgets.h | 4 +- network/httpserver/httpserver.c | 1 - record/drivers/record_ffmpeg.c | 2 +- record/record_driver.c | 1 - retroarch.c | 3452 ++++++++++++++++- retroarch.h | 1272 +++++- runahead/run_ahead.c | 1 - tasks/task_overlay.c | 2 +- tasks/task_save.c | 1 - tasks/task_screenshot.c | 2 - translation/translation_service.c | 1 - translation/translation_service.h | 2 + ui/drivers/qt/options/video.cpp | 2 +- ui/drivers/qt/shaderparamsdialog.cpp | 1 + ui/drivers/ui_qt.h | 2 +- ui/drivers/ui_win32.c | 1 - 134 files changed, 4781 insertions(+), 4848 deletions(-) delete mode 100644 gfx/video_driver.h diff --git a/.vscode/settings.json b/.vscode/settings.json index c2e6cabd58..4b90361db0 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -23,7 +23,6 @@ "ios": "c", "list": "c", "input_driver.h": "c", - "video_driver.h": "c", "menu_driver.h": "c", "file_path.h": "c", "unordered_map": "c", @@ -54,7 +53,6 @@ "verbosity.h": "c", "retroarch.h": "c", "menu_animation.h": "c", - "audio_driver.h": "c", "netplay.h": "c", "scaler.h": "c", "deque": "c", @@ -71,4 +69,4 @@ "badges.h": "c" }, "C_Cpp.dimInactiveRegions": false, -} \ No newline at end of file +} diff --git a/Makefile.common b/Makefile.common index cdb17952b4..cebbe3c2f2 100644 --- a/Makefile.common +++ b/Makefile.common @@ -213,7 +213,6 @@ OBJ += frontend/frontend.o \ led/drivers/led_null.o \ gfx/video_coord_array.o \ gfx/video_display_server.o \ - gfx/video_driver.o \ gfx/video_crt_switch.o \ wifi/wifi_driver.o \ configuration.o \ diff --git a/command.c b/command.c index b80f4ef1a8..5ad95c1561 100755 --- a/command.c +++ b/command.c @@ -91,7 +91,6 @@ #include "ui/ui_companion_driver.h" #include "tasks/task_content.h" #include "tasks/tasks_internal.h" -#include "gfx/video_driver.h" #include "list_special.h" #include "core.h" diff --git a/configuration.c b/configuration.c index e94edd2c59..4370531762 100644 --- a/configuration.c +++ b/configuration.c @@ -33,7 +33,6 @@ #endif #include "file_path_special.h" -#include "gfx/video_driver.h" #include "input/input_driver.h" #include "configuration.h" #include "content.h" diff --git a/core_impl.c b/core_impl.c index 21e554fede..5719422500 100644 --- a/core_impl.c +++ b/core_impl.c @@ -41,7 +41,6 @@ #include "msg_hash.h" #include "managers/state_manager.h" #include "verbosity.h" -#include "gfx/video_driver.h" #include "retroarch.h" #include "tasks/tasks_internal.h" diff --git a/dynamic.c b/dynamic.c index 583a12eab3..acbbd91697 100644 --- a/dynamic.c +++ b/dynamic.c @@ -55,7 +55,6 @@ #include "record/record_driver.h" #include "driver.h" #include "performance_counters.h" -#include "gfx/video_driver.h" #include "led/led_driver.h" #include "midi/midi_driver.h" diff --git a/frontend/drivers/platform_emscripten.c b/frontend/drivers/platform_emscripten.c index e8e11e3df0..949fab0d2b 100644 --- a/frontend/drivers/platform_emscripten.c +++ b/frontend/drivers/platform_emscripten.c @@ -37,7 +37,6 @@ #include "../frontend.h" #include "../frontend_driver.h" -#include "../../gfx/video_driver.h" #include "../../configuration.h" #include "../../defaults.h" #include "../../content.h" diff --git a/frontend/drivers/platform_wiiu.c b/frontend/drivers/platform_wiiu.c index cf4bc15edc..eff3388f85 100644 --- a/frontend/drivers/platform_wiiu.c +++ b/frontend/drivers/platform_wiiu.c @@ -45,9 +45,8 @@ #include "../frontend_driver.h" #include "../../defaults.h" #include "../../paths.h" -#include "../../verbosity.h" #include "../../retroarch.h" -#include "../../gfx/video_driver.h" +#include "../../verbosity.h" #include "hbl.h" #include "wiiu_dbg.h" diff --git a/gfx/common/d3d10_common.h b/gfx/common/d3d10_common.h index 1784c33a8c..e2924bd5b6 100644 --- a/gfx/common/d3d10_common.h +++ b/gfx/common/d3d10_common.h @@ -1060,7 +1060,7 @@ static INLINE HRESULT D3D10CreateTexture2DShaderResourceView( #include #include -#include "../video_driver.h" +#include "../../retroarch.h" typedef struct d3d10_vertex_t { diff --git a/gfx/common/d3d11_common.h b/gfx/common/d3d11_common.h index ac6332d227..dc3394908f 100644 --- a/gfx/common/d3d11_common.h +++ b/gfx/common/d3d11_common.h @@ -2426,7 +2426,7 @@ D3D11UnmapBuffer(D3D11DeviceContext device_context, D3D11Buffer buffer, UINT sub #include #include #include -#include "../video_driver.h" +#include "../../retroarch.h" #include "../drivers_shader/slang_process.h" typedef struct d3d11_vertex_t diff --git a/gfx/common/d3d12_common.h b/gfx/common/d3d12_common.h index d9381dd5a9..707701abf0 100644 --- a/gfx/common/d3d12_common.h +++ b/gfx/common/d3d12_common.h @@ -1260,7 +1260,7 @@ D3D12GetGPUDescriptorHandleForHeapStart(D3D12DescriptorHeap descriptor_heap) #include #include "../common/d3dcompiler_common.h" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../drivers_shader/slang_process.h" typedef struct d3d12_vertex_t diff --git a/gfx/common/d3d8_common.h b/gfx/common/d3d8_common.h index 3d956a667b..1e6aae534e 100644 --- a/gfx/common/d3d8_common.h +++ b/gfx/common/d3d8_common.h @@ -22,7 +22,7 @@ #include -#include "../video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" RETRO_BEGIN_DECLS diff --git a/gfx/common/d3d9_common.h b/gfx/common/d3d9_common.h index 56128981a0..552b7fb858 100644 --- a/gfx/common/d3d9_common.h +++ b/gfx/common/d3d9_common.h @@ -24,7 +24,7 @@ #include #include "d3d_common.h" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" #define D3D9_DECL_FVF_TEXCOORD(stream, offset, index) \ diff --git a/gfx/common/d3d_common.c b/gfx/common/d3d_common.c index f18cb2235c..a757a49157 100644 --- a/gfx/common/d3d_common.c +++ b/gfx/common/d3d_common.c @@ -12,6 +12,8 @@ * You should have received a copy of the GNU General Public License along with RetroArch. * If not, see . */ +#include + #include #include "../../configuration.h" diff --git a/gfx/common/d3d_common.h b/gfx/common/d3d_common.h index c5306bb435..139f956914 100644 --- a/gfx/common/d3d_common.h +++ b/gfx/common/d3d_common.h @@ -36,7 +36,7 @@ #include #include "../font_driver.h" -#include "../video_driver.h" +#include "../../retroarch.h" RETRO_BEGIN_DECLS diff --git a/gfx/common/drm_common.h b/gfx/common/drm_common.h index e8cb3ac411..6baca96ab7 100644 --- a/gfx/common/drm_common.h +++ b/gfx/common/drm_common.h @@ -27,7 +27,7 @@ #include #include -#include "../video_driver.h" +#include "../../retroarch.h" RETRO_BEGIN_DECLS diff --git a/gfx/common/dxgi_common.c b/gfx/common/dxgi_common.c index 7d53283b40..18e879e2bd 100644 --- a/gfx/common/dxgi_common.c +++ b/gfx/common/dxgi_common.c @@ -27,7 +27,7 @@ #include "../../configuration.h" #include "../../verbosity.h" #include "../../ui/ui_companion_driver.h" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../frontend/frontend_driver.h" #include "win32_common.h" diff --git a/gfx/common/dxgi_common.h b/gfx/common/dxgi_common.h index 485142b099..b1ce06ae8d 100644 --- a/gfx/common/dxgi_common.h +++ b/gfx/common/dxgi_common.h @@ -786,7 +786,7 @@ static INLINE HRESULT DXGICreateFactory2(DXGIFactory2* factory) /* internal */ -#include "../video_driver.h" +#include "../../retroarch.h" #include "../drivers_shader/glslang_util.h" #define DXGI_COLOR_RGBA(r, g, b, a) (((UINT32)(a) << 24) | ((UINT32)(b) << 16) | ((UINT32)(g) << 8) | ((UINT32)(r) << 0)) diff --git a/gfx/common/egl_common.h b/gfx/common/egl_common.h index 5fe4bec6e8..f02d42551a 100644 --- a/gfx/common/egl_common.h +++ b/gfx/common/egl_common.h @@ -26,7 +26,7 @@ #include #include -#include "../video_driver.h" +#include "../../retroarch.h" #ifndef EGL_CONTEXT_FLAGS_KHR #define EGL_CONTEXT_FLAGS_KHR 0x30FC diff --git a/gfx/common/gl1_common.h b/gfx/common/gl1_common.h index c855dca3cb..7e569da43a 100644 --- a/gfx/common/gl1_common.h +++ b/gfx/common/gl1_common.h @@ -20,6 +20,7 @@ #include #include +#include #if defined(__APPLE__) #include @@ -33,7 +34,7 @@ #include #endif -#include "../video_driver.h" +#include "../../retroarch.h" #define RARCH_GL1_INTERNAL_FORMAT32 GL_RGBA8 #define RARCH_GL1_TEXTURE_TYPE32 GL_BGRA_EXT diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 4cd4e7459a..e00941ed11 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -33,7 +33,7 @@ #include #include "../video_coord_array.h" -#include "../video_driver.h" +#include "../../retroarch.h" RETRO_BEGIN_DECLS diff --git a/gfx/common/gl_core_common.h b/gfx/common/gl_core_common.h index c2c5fcd4c8..68b9489b26 100644 --- a/gfx/common/gl_core_common.h +++ b/gfx/common/gl_core_common.h @@ -33,7 +33,7 @@ #include #include "../video_coord_array.h" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../drivers_shader/shader_gl_core.h" RETRO_BEGIN_DECLS diff --git a/gfx/common/vita2d_common.h b/gfx/common/vita2d_common.h index 39006586a8..eb3efbd398 100644 --- a/gfx/common/vita2d_common.h +++ b/gfx/common/vita2d_common.h @@ -25,7 +25,7 @@ #include "../../defines/psp_defines.h" #include "../../driver.h" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../video_coord_array.h" typedef struct vita_menu_frame diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 8a6440147d..81375be60b 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -46,7 +46,6 @@ #include "../../retroarch.h" #include "../../verbosity.h" #include "../font_driver.h" -#include "../video_driver.h" #include "../drivers_shader/shader_vulkan.h" #include "../include/vulkan/vulkan.h" diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index de38989f89..ac5f8bf5b0 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -56,7 +56,7 @@ #include "../../input/input_keymaps.h" #include "../video_thread_wrapper.h" #include "../video_display_server.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include #ifdef HAVE_MENU diff --git a/gfx/common/win32_common.h b/gfx/common/win32_common.h index f2a758079e..59c0fc3832 100644 --- a/gfx/common/win32_common.h +++ b/gfx/common/win32_common.h @@ -34,7 +34,7 @@ #include #include #include "../../driver.h" -#include "../video_driver.h" +#include "../../retroarch.h" #ifndef _XBOX #include "../../ui/drivers/ui_win32_resource.h" diff --git a/gfx/common/x11_common.h b/gfx/common/x11_common.h index 06cd512cd8..6e2b3b06bb 100644 --- a/gfx/common/x11_common.h +++ b/gfx/common/x11_common.h @@ -21,7 +21,7 @@ #include -#include "../video_driver.h" +#include "../../retroarch.h" extern Window g_x11_win; extern Display *g_x11_dpy; diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c index 8ac89d4575..4bd4cf5ec6 100644 --- a/gfx/display_servers/dispserv_win32.c +++ b/gfx/display_servers/dispserv_win32.c @@ -37,8 +37,8 @@ #include "../video_display_server.h" #include "../common/win32_common.h" +#include "../../retroarch.h" #include "../../verbosity.h" -#include "../video_driver.h" /* needed to set refresh rate in set resolution */ #ifdef __ITaskbarList3_INTERFACE_DEFINED__ #define HAS_TASKBAR_EXT diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index 41395dbaf3..e80fc89fdc 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -36,7 +36,7 @@ #include "../video_display_server.h" #include "../common/x11_common.h" #include "../../configuration.h" -#include "../video_driver.h" /* needed to set refresh rate in set resolution */ +#include "../../retroarch.h" #include "../video_crt_switch.h" /* needed to set aspect for low res in linux */ #ifdef HAVE_XRANDR diff --git a/gfx/drivers/d3d10.c b/gfx/drivers/d3d10.c index a6e9ea4cf3..d09aca89f7 100644 --- a/gfx/drivers/d3d10.c +++ b/gfx/drivers/d3d10.c @@ -29,7 +29,6 @@ #include "../../retroarch.h" #include "../../managers/state_manager.h" -#include "../video_driver.h" #include "../font_driver.h" #include "../common/d3d_common.h" #include "../common/win32_common.h" diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index 1d14983cb1..872935d8e4 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -36,7 +36,6 @@ #include "../../verbosity.h" #include "../../configuration.h" #include "../../retroarch.h" -#include "../video_driver.h" #include "../font_driver.h" #include "../common/win32_common.h" #include "../../performance_counters.h" diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index ae72de6213..e436490ea9 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -20,7 +20,6 @@ #include #include -#include "../video_driver.h" #include "../font_driver.h" #include "../common/d3d_common.h" #include "../common/win32_common.h" diff --git a/gfx/drivers/d3d8.c b/gfx/drivers/d3d8.c index a8a0d888fe..3fa4e2d9c1 100644 --- a/gfx/drivers/d3d8.c +++ b/gfx/drivers/d3d8.c @@ -36,9 +36,9 @@ #include "../common/d3d_common.h" #include "../video_coord_array.h" #include "../../configuration.h" +#include "../../retroarch.h" #include "../../dynamic.h" #include "../../frontend/frontend_driver.h" -#include "../video_driver.h" #ifdef HAVE_THREADS #include "../video_thread_wrapper.h" diff --git a/gfx/drivers/d3d9.c b/gfx/drivers/d3d9.c index 992db64138..68dd2c0eba 100644 --- a/gfx/drivers/d3d9.c +++ b/gfx/drivers/d3d9.c @@ -37,7 +37,6 @@ #include "../video_coord_array.h" #include "../../configuration.h" #include "../../dynamic.h" -#include "../video_driver.h" #include "../../ui/ui_companion_driver.h" #include "../../frontend/frontend_driver.h" diff --git a/gfx/drivers/nullgfx.c b/gfx/drivers/nullgfx.c index 82de4f29dc..8a71bf6da7 100644 --- a/gfx/drivers/nullgfx.c +++ b/gfx/drivers/nullgfx.c @@ -14,9 +14,8 @@ * If not, see . */ -#include "../video_driver.h" - #include "../../driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" static void *null_gfx_init(const video_info_t *video, diff --git a/gfx/drivers/ps2_gfx.c b/gfx/drivers/ps2_gfx.c index ab1a549f32..212d5304f1 100644 --- a/gfx/drivers/ps2_gfx.c +++ b/gfx/drivers/ps2_gfx.c @@ -13,14 +13,14 @@ * If not, see . */ -#include "../video_driver.h" - -#include "../../driver.h" -#include "../../verbosity.h" - #include #include #include + +#include "../../driver.h" +#include "../../retroarch.h" +#include "../../verbosity.h" + #include "../../libretro-common/include/libretro_gskit_ps2.h" #define GS_TEXT GS_SETREG_RGBAQ(0x80,0x80,0x80,0x80,0x00) // turn white GS Screen diff --git a/gfx/drivers/sdl_gfx.c b/gfx/drivers/sdl_gfx.c index d7948e3f1c..cd3d0c96f6 100644 --- a/gfx/drivers/sdl_gfx.c +++ b/gfx/drivers/sdl_gfx.c @@ -40,9 +40,9 @@ #include "SDL_syswm.h" #include "../font_driver.h" -#include "../video_driver.h" #include "../../configuration.h" +#include "../../retroarch.h" typedef struct sdl_menu_frame { diff --git a/gfx/drivers_context/cgl_ctx.c b/gfx/drivers_context/cgl_ctx.c index 21cf40ed32..aa58b430dc 100644 --- a/gfx/drivers_context/cgl_ctx.c +++ b/gfx/drivers_context/cgl_ctx.c @@ -29,7 +29,7 @@ #include #include -#include "../video_driver.h" +#include "../../retroarch.h" typedef int CGSConnectionID; typedef int CGSWindowID; diff --git a/gfx/drivers_context/cocoa_gl_ctx.m b/gfx/drivers_context/cocoa_gl_ctx.m index 05b0c1185b..a2a415d2c0 100644 --- a/gfx/drivers_context/cocoa_gl_ctx.m +++ b/gfx/drivers_context/cocoa_gl_ctx.m @@ -38,8 +38,8 @@ #include "../../ui/drivers/ui_cocoa.h" #include "../../ui/drivers/cocoa/cocoa_common.h" -#include "../video_driver.h" #include "../../configuration.h" +#include "../../retroarch.h" #include "../../verbosity.h" #ifdef HAVE_VULKAN #include "../common/vulkan_common.h" diff --git a/gfx/drivers_context/emscriptenegl_ctx.c b/gfx/drivers_context/emscriptenegl_ctx.c index 3d0748ab82..40bb51b5a5 100644 --- a/gfx/drivers_context/emscriptenegl_ctx.c +++ b/gfx/drivers_context/emscriptenegl_ctx.c @@ -26,7 +26,7 @@ #include "../../config.h" #endif -#include "../video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" #ifdef HAVE_EGL diff --git a/gfx/drivers_context/gdi_ctx.c b/gfx/drivers_context/gdi_ctx.c index d9ed11a035..2dc25e79bc 100644 --- a/gfx/drivers_context/gdi_ctx.c +++ b/gfx/drivers_context/gdi_ctx.c @@ -34,11 +34,11 @@ #include "../../config.h" #endif -#include "../../configuration.h" #include "../../dynamic.h" +#include "../../configuration.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../frontend/frontend_driver.h" -#include "../video_driver.h" #include "../common/win32_common.h" diff --git a/gfx/drivers_context/gfx_null_ctx.c b/gfx/drivers_context/gfx_null_ctx.c index f0bf58c5a7..9b950126c3 100644 --- a/gfx/drivers_context/gfx_null_ctx.c +++ b/gfx/drivers_context/gfx_null_ctx.c @@ -16,7 +16,7 @@ /* Null context. */ -#include "../video_driver.h" +#include "../../retroarch.h" static void gfx_ctx_null_swap_interval(void *data, int interval) { diff --git a/gfx/drivers_context/khr_display_ctx.c b/gfx/drivers_context/khr_display_ctx.c index 28c4eb5270..f82656225d 100644 --- a/gfx/drivers_context/khr_display_ctx.c +++ b/gfx/drivers_context/khr_display_ctx.c @@ -58,7 +58,8 @@ static void gfx_ctx_khr_display_get_video_size(void *data, *height = khr->height; } -static void *gfx_ctx_khr_display_init(video_frame_info_t *video_info, void *video_driver) +static void *gfx_ctx_khr_display_init(video_frame_info_t *video_info, + void *video_driver) { khr_display_ctx_data_t *khr = (khr_display_ctx_data_t*)calloc(1, sizeof(*khr)); if (!khr) diff --git a/gfx/drivers_context/mali_fbdev_ctx.c b/gfx/drivers_context/mali_fbdev_ctx.c index 80cbb3c4d1..f82c0a2067 100644 --- a/gfx/drivers_context/mali_fbdev_ctx.c +++ b/gfx/drivers_context/mali_fbdev_ctx.c @@ -92,7 +92,8 @@ static void gfx_ctx_mali_fbdev_get_video_size(void *data, *height = mali->height; } -static void *gfx_ctx_mali_fbdev_init(video_frame_info_t *video_info, void *video_driver) +static void *gfx_ctx_mali_fbdev_init(video_frame_info_t *video_info, + void *video_driver) { #ifdef HAVE_EGL EGLint n; diff --git a/gfx/drivers_context/ps3_ctx.c b/gfx/drivers_context/ps3_ctx.c index 3a7141fce2..ed03e298fa 100644 --- a/gfx/drivers_context/ps3_ctx.c +++ b/gfx/drivers_context/ps3_ctx.c @@ -33,11 +33,11 @@ #include #include "../../configuration.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../defines/ps3_defines.h" #include "../../frontend/frontend_driver.h" #include "../common/gl_common.h" -#include "../video_driver.h" typedef struct gfx_ctx_ps3_data { diff --git a/gfx/drivers_context/sixel_ctx.c b/gfx/drivers_context/sixel_ctx.c index c63e78add9..21bb0f9b69 100644 --- a/gfx/drivers_context/sixel_ctx.c +++ b/gfx/drivers_context/sixel_ctx.c @@ -23,9 +23,9 @@ #include "../../configuration.h" #include "../../dynamic.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../ui/ui_companion_driver.h" -#include "../video_driver.h" #if defined(_WIN32) && !defined(_XBOX) #include "../common/win32_common.h" diff --git a/gfx/drivers_context/vc_egl_ctx.c b/gfx/drivers_context/vc_egl_ctx.c index ed62d22a0f..9fa6b64356 100644 --- a/gfx/drivers_context/vc_egl_ctx.c +++ b/gfx/drivers_context/vc_egl_ctx.c @@ -33,7 +33,7 @@ #include #include "../../configuration.h" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../../frontend/frontend_driver.h" diff --git a/gfx/drivers_context/wgl_ctx.c b/gfx/drivers_context/wgl_ctx.c index 433d657710..0f7b98e961 100644 --- a/gfx/drivers_context/wgl_ctx.c +++ b/gfx/drivers_context/wgl_ctx.c @@ -41,9 +41,9 @@ #include "../../configuration.h" #include "../../dynamic.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../frontend/frontend_driver.h" -#include "../video_driver.h" #include "../common/win32_common.h" diff --git a/gfx/drivers_font/ctr_font.c b/gfx/drivers_font/ctr_font.c index fda8f70d21..eda1809bc1 100644 --- a/gfx/drivers_font/ctr_font.c +++ b/gfx/drivers_font/ctr_font.c @@ -24,11 +24,11 @@ #include #include "../font_driver.h" -#include "../video_driver.h" #include "../common/ctr_common.h" #include "../drivers/ctr_gu.h" #include "../../ctr/gpu_old.h" +#include "../../retroarch.h" #include "../../verbosity.h" /* FIXME: this is just a workaround to avoid diff --git a/gfx/drivers_font/d3d10_font.c b/gfx/drivers_font/d3d10_font.c index 0efe989ab9..06556dabfa 100644 --- a/gfx/drivers_font/d3d10_font.c +++ b/gfx/drivers_font/d3d10_font.c @@ -23,9 +23,9 @@ #include #include "../font_driver.h" -#include "../video_driver.h" #include "../common/d3d10_common.h" +#include "../../retroarch.h" #include "../../verbosity.h" typedef struct diff --git a/gfx/drivers_font/d3d11_font.c b/gfx/drivers_font/d3d11_font.c index 15f370e772..ebce7e43d8 100644 --- a/gfx/drivers_font/d3d11_font.c +++ b/gfx/drivers_font/d3d11_font.c @@ -22,9 +22,9 @@ #include #include "../font_driver.h" -#include "../video_driver.h" #include "../common/d3d11_common.h" +#include "../../retroarch.h" #include "../../verbosity.h" typedef struct diff --git a/gfx/drivers_font/d3d12_font.c b/gfx/drivers_font/d3d12_font.c index 741ea953b0..fdcf5b53b9 100644 --- a/gfx/drivers_font/d3d12_font.c +++ b/gfx/drivers_font/d3d12_font.c @@ -22,9 +22,9 @@ #include #include "../font_driver.h" -#include "../video_driver.h" #include "../common/d3d12_common.h" +#include "../../retroarch.h" #include "../../verbosity.h" typedef struct diff --git a/gfx/drivers_font/gdi_font.c b/gfx/drivers_font/gdi_font.c index eb5ee65f38..3f1ad8db0b 100644 --- a/gfx/drivers_font/gdi_font.c +++ b/gfx/drivers_font/gdi_font.c @@ -25,8 +25,8 @@ #endif #include "../font_driver.h" -#include "../video_driver.h" #include "../../configuration.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../common/gdi_common.h" #include "../common/win32_common.h" diff --git a/gfx/drivers_font/gl1_raster_font.c b/gfx/drivers_font/gl1_raster_font.c index 658c4f9b49..ff82c45738 100644 --- a/gfx/drivers_font/gl1_raster_font.c +++ b/gfx/drivers_font/gl1_raster_font.c @@ -23,7 +23,7 @@ #include "../common/gl1_common.h" #include "../font_driver.h" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" /* TODO: Move viewport side effects to the caller: it's a source of bugs. */ diff --git a/gfx/drivers_font/gl_core_raster_font.c b/gfx/drivers_font/gl_core_raster_font.c index 28ad8c27c1..8eb597b306 100644 --- a/gfx/drivers_font/gl_core_raster_font.c +++ b/gfx/drivers_font/gl_core_raster_font.c @@ -24,7 +24,7 @@ #include "../common/gl_core_common.h" #include "../font_driver.h" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" /* TODO: Move viewport side effects to the caller: it's a source of bugs. */ diff --git a/gfx/drivers_font/gl_raster_font.c b/gfx/drivers_font/gl_raster_font.c index 3f1fb18b51..24f7ade148 100644 --- a/gfx/drivers_font/gl_raster_font.c +++ b/gfx/drivers_font/gl_raster_font.c @@ -23,7 +23,7 @@ #include "../common/gl_common.h" #include "../font_driver.h" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" /* TODO: Move viewport side effects to the caller: it's a source of bugs. */ diff --git a/gfx/drivers_font/switch_font.c b/gfx/drivers_font/switch_font.c index 313f31d4d5..1e9de648fa 100644 --- a/gfx/drivers_font/switch_font.c +++ b/gfx/drivers_font/switch_font.c @@ -24,8 +24,8 @@ #include #include "../font_driver.h" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../common/switch_common.h" diff --git a/gfx/drivers_font/wiiu_font.c b/gfx/drivers_font/wiiu_font.c index dcc908a065..be6c991655 100644 --- a/gfx/drivers_font/wiiu_font.c +++ b/gfx/drivers_font/wiiu_font.c @@ -21,13 +21,13 @@ #include #include -#include "gfx/font_driver.h" -#include "gfx/video_driver.h" -#include "gfx/common/gx2_common.h" -#include "system/memory.h" -#include "wiiu/wiiu_dbg.h" +#include "../font_driver.h" +#include "../common/gx2_common.h" +#include "../../wiiu/system/memory.h" +#include "../../wiiu/wiiu_dbg.h" -#include "verbosity.h" +#include "../../retroarch.h" +#include "../../verbosity.h" typedef struct { diff --git a/gfx/drivers_font_renderer/freetype.c b/gfx/drivers_font_renderer/freetype.c index 69f2f80c21..bfdd6fec58 100644 --- a/gfx/drivers_font_renderer/freetype.c +++ b/gfx/drivers_font_renderer/freetype.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include diff --git a/gfx/drivers_renderchain/d3d9_cg_renderchain.c b/gfx/drivers_renderchain/d3d9_cg_renderchain.c index 001d42a124..e24c93c78e 100644 --- a/gfx/drivers_renderchain/d3d9_cg_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_cg_renderchain.c @@ -34,8 +34,8 @@ #include "../common/d3d_common.h" #include "../drivers/d3d_shaders/opaque.cg.d3d9.h" -#include "../video_driver.h" #include "../../configuration.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "d3d9_renderchain.h" diff --git a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c index 3b51024352..8a86cd66a2 100644 --- a/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c +++ b/gfx/drivers_renderchain/d3d9_hlsl_renderchain.c @@ -32,8 +32,6 @@ #include "../common/d3d_common.h" #include "../common/d3d9_common.h" -#include "../video_driver.h" - #include "../video_shader_parse.h" #include "../../managers/state_manager.h" #include "../../configuration.h" diff --git a/gfx/drivers_shader/shader_gl_cg.c b/gfx/drivers_shader/shader_gl_cg.c index 77d9a32e01..00304c0560 100644 --- a/gfx/drivers_shader/shader_gl_cg.c +++ b/gfx/drivers_shader/shader_gl_cg.c @@ -45,9 +45,9 @@ #include "../include/Cg/cg.h" -#include "../video_driver.h" #include "../video_shader_parse.h" #include "../../core.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../managers/state_manager.h" diff --git a/gfx/drivers_shader/shader_gl_core.cpp b/gfx/drivers_shader/shader_gl_core.cpp index 888552641a..74f4b9d6d1 100644 --- a/gfx/drivers_shader/shader_gl_core.cpp +++ b/gfx/drivers_shader/shader_gl_core.cpp @@ -20,6 +20,7 @@ #include #include #include +#include #include #include @@ -30,7 +31,7 @@ #include "slang_reflection.hpp" #include "spirv_glsl.hpp" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../msg_hash.h" diff --git a/gfx/drivers_shader/shader_glsl.h b/gfx/drivers_shader/shader_glsl.h index 8633a77f26..c8a84db4c9 100644 --- a/gfx/drivers_shader/shader_glsl.h +++ b/gfx/drivers_shader/shader_glsl.h @@ -18,7 +18,8 @@ #define __RARCH_GLSL_H #include -#include "../video_driver.h" + +#include "../../retroarch.h" void gl_glsl_set_get_proc_address(gfx_ctx_proc_t (*proc)(const char*)); diff --git a/gfx/drivers_shader/shader_vulkan.cpp b/gfx/drivers_shader/shader_vulkan.cpp index 879b18ff35..88d6536559 100644 --- a/gfx/drivers_shader/shader_vulkan.cpp +++ b/gfx/drivers_shader/shader_vulkan.cpp @@ -30,7 +30,7 @@ #include "slang_reflection.h" #include "slang_reflection.hpp" -#include "../video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../msg_hash.h" diff --git a/gfx/drivers_shader/slang_preprocess.h b/gfx/drivers_shader/slang_preprocess.h index f5592492d6..b730582ffe 100644 --- a/gfx/drivers_shader/slang_preprocess.h +++ b/gfx/drivers_shader/slang_preprocess.h @@ -18,7 +18,8 @@ #include #include -#include "../video_driver.h" + +#include "../../retroarch.h" RETRO_BEGIN_DECLS diff --git a/gfx/font_driver.c b/gfx/font_driver.c index 8f09655b47..ab5b9eb5fa 100644 --- a/gfx/font_driver.c +++ b/gfx/font_driver.c @@ -15,6 +15,7 @@ */ #include +#include #ifdef HAVE_CONFIG_H #include "../config.h" @@ -24,6 +25,7 @@ #include "video_thread_wrapper.h" #include "../configuration.h" +#include "../retroarch.h" #include "../verbosity.h" static const font_renderer_driver_t *font_backends[] = { diff --git a/gfx/font_driver.h b/gfx/font_driver.h index 97cbc69b05..97d73ddfdd 100644 --- a/gfx/font_driver.h +++ b/gfx/font_driver.h @@ -22,7 +22,7 @@ #include #include -#include "video_driver.h" +#include "../retroarch.h" RETRO_BEGIN_DECLS diff --git a/gfx/video_crt_switch.c b/gfx/video_crt_switch.c index cf35952fd1..9a337d735b 100644 --- a/gfx/video_crt_switch.c +++ b/gfx/video_crt_switch.c @@ -20,7 +20,7 @@ #include #include -#include "video_driver.h" +#include "../retroarch.h" #include "video_crt_switch.h" #include "video_display_server.h" diff --git a/gfx/video_display_server.c b/gfx/video_display_server.c index d1a849e911..e8827291fa 100644 --- a/gfx/video_display_server.c +++ b/gfx/video_display_server.c @@ -17,7 +17,7 @@ #include #include "video_display_server.h" -#include "video_driver.h" +#include "../retroarch.h" #include "../verbosity.h" static const video_display_server_t *current_display_server = &dispserv_null; diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 03fa524212..9aceff6ee3 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -73,3321 +73,3 @@ #include "../command.h" #include "../msg_hash.h" #include "../verbosity.h" - -#define MEASURE_FRAME_TIME_SAMPLES_COUNT (2 * 1024) - -#define TIME_TO_FPS(last_time, new_time, frames) ((1000000.0f * (frames)) / ((new_time) - (last_time))) - -#define FPS_UPDATE_INTERVAL 256 - -#ifdef HAVE_THREADS -#define video_driver_is_threaded_internal() ((!video_driver_is_hw_context() && video_driver_threaded) ? true : false) -#else -#define video_driver_is_threaded_internal() (false) -#endif - -#ifdef HAVE_THREADS -#define video_driver_lock() \ - if (display_lock) \ - slock_lock(display_lock) - -#define video_driver_unlock() \ - if (display_lock) \ - slock_unlock(display_lock) - -#define video_driver_context_lock() \ - if (context_lock) \ - slock_lock(context_lock) - -#define video_driver_context_unlock() \ - if (context_lock) \ - slock_unlock(context_lock) - -#define video_driver_lock_free() \ - slock_free(display_lock); \ - slock_free(context_lock); \ - display_lock = NULL; \ - context_lock = NULL - -#define video_driver_threaded_lock(is_threaded) \ - if (is_threaded) \ - video_driver_lock() - -#define video_driver_threaded_unlock(is_threaded) \ - if (is_threaded) \ - video_driver_unlock() -#else -#define video_driver_lock() ((void)0) -#define video_driver_unlock() ((void)0) -#define video_driver_lock_free() ((void)0) -#define video_driver_threaded_lock(is_threaded) ((void)0) -#define video_driver_threaded_unlock(is_threaded) ((void)0) -#define video_driver_context_lock() ((void)0) -#define video_driver_context_unlock() ((void)0) -#endif - -typedef struct video_pixel_scaler -{ - struct scaler_ctx *scaler; - void *scaler_out; -} video_pixel_scaler_t; - -bool (*video_driver_cb_has_focus)(void); - -/* Opaque handles to currently running window. - * Used by e.g. input drivers which bind to a window. - * Drivers are responsible for setting these if an input driver - * could potentially make use of this. */ -static uintptr_t video_driver_display = 0; -static uintptr_t video_driver_window = 0; - -static rarch_softfilter_t *video_driver_state_filter = NULL; -static void *video_driver_state_buffer = NULL; -static unsigned video_driver_state_scale = 0; -static unsigned video_driver_state_out_bpp = 0; -static bool video_driver_state_out_rgb32 = false; -static bool video_driver_crt_switching_active = false; -static bool video_driver_crt_dynamic_super_width = false; - -static struct retro_system_av_info video_driver_av_info; - -static enum retro_pixel_format video_driver_pix_fmt = RETRO_PIXEL_FORMAT_0RGB1555; - -static const void *frame_cache_data = NULL; -static unsigned frame_cache_width = 0; -static unsigned frame_cache_height = 0; -static size_t frame_cache_pitch = 0; -static bool video_driver_threaded = false; - -static float video_driver_core_hz = 0.0f; -static float video_driver_aspect_ratio = 0.0f; -static unsigned video_driver_width = 0; -static unsigned video_driver_height = 0; - -static enum rarch_display_type video_driver_display_type = RARCH_DISPLAY_NONE; -static char video_driver_title_buf[64] = {0}; -static char video_driver_window_title[512] = {0}; -static bool video_driver_window_title_update = true; - -static retro_time_t video_driver_frame_time_samples[MEASURE_FRAME_TIME_SAMPLES_COUNT]; -static uint64_t video_driver_frame_time_count = 0; -static uint64_t video_driver_frame_count = 0; - -static void *video_driver_data = NULL; -static video_driver_t *current_video = NULL; - -/* Interface for "poking". */ -static const video_poke_interface_t *video_driver_poke = NULL; - -/* Used for 15-bit -> 16-bit conversions that take place before - * being passed to video driver. */ -static video_pixel_scaler_t *video_driver_scaler_ptr = NULL; - -static struct retro_hw_render_callback hw_render; - -static const struct -retro_hw_render_context_negotiation_interface * -hw_render_context_negotiation = NULL; - -/* Graphics driver requires RGBA byte order data (ABGR on little-endian) - * for 32-bit. - * This takes effect for overlay and shader cores that wants to load - * data into graphics driver. Kinda hackish to place it here, it is only - * used for GLES. - * TODO: Refactor this better. */ -static bool video_driver_use_rgba = false; -static bool video_driver_active = false; - -static video_driver_frame_t frame_bak = NULL; - -/* If set during context deinit, the driver should keep - * graphics context alive to avoid having to reset all - * context state. */ -static bool video_driver_cache_context = false; - -/* Set to true by driver if context caching succeeded. */ -static bool video_driver_cache_context_ack = false; -static uint8_t *video_driver_record_gpu_buffer = NULL; - -#ifdef HAVE_THREADS -static slock_t *display_lock = NULL; -static slock_t *context_lock = NULL; -#endif - -static gfx_ctx_driver_t current_video_context; - -static void *video_context_data = NULL; - -/** - * dynamic.c:dynamic_request_hw_context will try to set flag data when the context - * is in the middle of being rebuilt; in these cases we will save flag - * data and set this to true. - * When the context is reinit, it checks this, reads from - * deferred_flag_data and cleans it. - * - * TODO - Dirty hack, fix it better - */ -static bool deferred_video_context_driver_set_flags = false; -static gfx_ctx_flags_t deferred_flag_data = {0}; - -static bool video_started_fullscreen = false; - -static char video_driver_gpu_device_string[128] = {0}; -static char video_driver_gpu_api_version_string[128] = {0}; - -struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END] = { - { "4:3", 1.3333f }, - { "16:9", 1.7778f }, - { "16:10", 1.6f }, - { "16:15", 16.0f / 15.0f }, - { "21:9", 21.0f / 9.0f }, - { "1:1", 1.0f }, - { "2:1", 2.0f }, - { "3:2", 1.5f }, - { "3:4", 0.75f }, - { "4:1", 4.0f }, - { "9:16", 0.5625f }, - { "5:4", 1.25f }, - { "6:5", 1.2f }, - { "7:9", 0.7777f }, - { "8:3", 2.6666f }, - { "8:7", 1.1428f }, - { "19:12", 1.5833f }, - { "19:14", 1.3571f }, - { "30:17", 1.7647f }, - { "32:9", 3.5555f }, - { "Config", 0.0f }, - { "Square pixel", 1.0f }, - { "Core provided", 1.0f }, - { "Custom", 0.0f } -}; - -static const video_driver_t *video_drivers[] = { -#ifdef HAVE_OPENGL - &video_gl2, -#endif -#if defined(HAVE_OPENGL_CORE) - &video_gl_core, -#endif -#ifdef HAVE_OPENGL1 - &video_gl1, -#endif -#ifdef HAVE_VULKAN - &video_vulkan, -#endif -#ifdef HAVE_METAL - &video_metal, -#endif -#ifdef XENON - &video_xenon360, -#endif -#if defined(HAVE_D3D12) - &video_d3d12, -#endif -#if defined(HAVE_D3D11) - &video_d3d11, -#endif -#if defined(HAVE_D3D10) - &video_d3d10, -#endif -#if defined(HAVE_D3D9) - &video_d3d9, -#endif -#if defined(HAVE_D3D8) - &video_d3d8, -#endif -#ifdef HAVE_VITA2D - &video_vita2d, -#endif -#ifdef PSP - &video_psp1, -#endif -#ifdef PS2 - &video_ps2, -#endif -#ifdef _3DS - &video_ctr, -#endif -#ifdef SWITCH - &video_switch, -#endif -#ifdef HAVE_SDL - &video_sdl, -#endif -#ifdef HAVE_SDL2 - &video_sdl2, -#endif -#ifdef HAVE_XVIDEO - &video_xvideo, -#endif -#ifdef GEKKO - &video_gx, -#endif -#ifdef WIIU - &video_wiiu, -#endif -#ifdef HAVE_VG - &video_vg, -#endif -#ifdef HAVE_OMAP - &video_omap, -#endif -#ifdef HAVE_EXYNOS - &video_exynos, -#endif -#ifdef HAVE_DISPMANX - &video_dispmanx, -#endif -#ifdef HAVE_SUNXI - &video_sunxi, -#endif -#ifdef HAVE_PLAIN_DRM - &video_drm, -#endif -#ifdef HAVE_XSHM - &video_xshm, -#endif -#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) - &video_gdi, -#endif -#ifdef DJGPP - &video_vga, -#endif -#ifdef HAVE_SIXEL - &video_sixel, -#endif -#ifdef HAVE_CACA - &video_caca, -#endif - &video_null, - NULL, -}; - -static const gfx_ctx_driver_t *gfx_ctx_drivers[] = { -#if defined(ORBIS) - &orbis_ctx, -#endif -#if defined(HAVE_LIBNX) && defined(HAVE_OPENGL) - &switch_ctx, -#endif -#if defined(__CELLOS_LV2__) - &gfx_ctx_ps3, -#endif -#if defined(HAVE_VIDEOCORE) - &gfx_ctx_videocore, -#endif -#if defined(HAVE_MALI_FBDEV) - &gfx_ctx_mali_fbdev, -#endif -#if defined(HAVE_VIVANTE_FBDEV) - &gfx_ctx_vivante_fbdev, -#endif -#if defined(HAVE_OPENDINGUX_FBDEV) - &gfx_ctx_opendingux_fbdev, -#endif -#if defined(_WIN32) && (defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE) || defined(HAVE_VULKAN)) - &gfx_ctx_wgl, -#endif -#if defined(HAVE_WAYLAND) - &gfx_ctx_wayland, -#endif -#if defined(HAVE_X11) && !defined(HAVE_OPENGLES) -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE) || defined(HAVE_VULKAN) - &gfx_ctx_x, -#endif -#endif -#if defined(HAVE_X11) && defined(HAVE_OPENGL) && defined(HAVE_EGL) - &gfx_ctx_x_egl, -#endif -#if defined(HAVE_KMS) - &gfx_ctx_drm, -#endif -#if defined(ANDROID) - &gfx_ctx_android, -#endif -#if defined(__QNX__) - &gfx_ctx_qnx, -#endif -#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) || defined(HAVE_COCOA_METAL) - &gfx_ctx_cocoagl, -#endif -#if defined(__APPLE__) && !defined(TARGET_IPHONE_SIMULATOR) && !defined(TARGET_OS_IPHONE) - &gfx_ctx_cgl, -#endif -#if (defined(HAVE_SDL) || defined(HAVE_SDL2)) && (defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE)) - &gfx_ctx_sdl_gl, -#endif -#ifdef HAVE_OSMESA - &gfx_ctx_osmesa, -#endif -#ifdef EMSCRIPTEN - &gfx_ctx_emscripten, -#endif -#if defined(HAVE_VULKAN) && defined(HAVE_VULKAN_DISPLAY) - &gfx_ctx_khr_display, -#endif -#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) - &gfx_ctx_gdi, -#endif -#ifdef HAVE_SIXEL - &gfx_ctx_sixel, -#endif - &gfx_ctx_null, - NULL -}; - -typedef struct { - enum gfx_ctx_api api; - struct string_list *list; -} gfx_api_gpu_map; - -static gfx_api_gpu_map gpu_map[] = { - { GFX_CTX_VULKAN_API, NULL } -}; - -bool video_driver_started_fullscreen(void) -{ - return video_started_fullscreen; -} - -/* Stub functions */ - -static void update_window_title_null(void *data, void *data2) -{ -} - -static void swap_buffers_null(void *data, void *data2) -{ -} - -static bool get_metrics_null(void *data, enum display_metric_types type, - float *value) -{ - return false; -} - -static bool set_resize_null(void *a, unsigned b, unsigned c) -{ - return false; -} - -/** - * video_driver_find_handle: - * @idx : index of driver to get handle to. - * - * Returns: handle to video driver at index. Can be NULL - * if nothing found. - **/ -const void *video_driver_find_handle(int idx) -{ - const void *drv = video_drivers[idx]; - if (!drv) - return NULL; - return drv; -} - -/** - * video_driver_find_ident: - * @idx : index of driver to get handle to. - * - * Returns: Human-readable identifier of video driver at index. Can be NULL - * if nothing found. - **/ -const char *video_driver_find_ident(int idx) -{ - const video_driver_t *drv = video_drivers[idx]; - if (!drv) - return NULL; - return drv->ident; -} - -/** - * config_get_video_driver_options: - * - * Get an enumerated list of all video driver names, separated by '|'. - * - * Returns: string listing of all video driver names, separated by '|'. - **/ -const char* config_get_video_driver_options(void) -{ - return char_list_new_special(STRING_LIST_VIDEO_DRIVERS, NULL); -} - -bool video_driver_is_threaded(void) -{ - return video_driver_is_threaded_internal(); -} - -#ifdef HAVE_VULKAN -static bool hw_render_context_is_vulkan(enum retro_hw_context_type type) -{ - return type == RETRO_HW_CONTEXT_VULKAN; -} -#endif - -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGL_CORE) -static bool hw_render_context_is_gl(enum retro_hw_context_type type) -{ - switch (type) - { - case RETRO_HW_CONTEXT_OPENGL: - case RETRO_HW_CONTEXT_OPENGLES2: - case RETRO_HW_CONTEXT_OPENGL_CORE: - case RETRO_HW_CONTEXT_OPENGLES3: - case RETRO_HW_CONTEXT_OPENGLES_VERSION: - return true; - default: - break; - } - - return false; -} -#endif - -bool *video_driver_get_threaded(void) -{ - return &video_driver_threaded; -} - -void video_driver_set_threaded(bool val) -{ - video_driver_threaded = val; -} - -/** - * video_driver_get_ptr: - * - * Use this if you need the real video driver - * and driver data pointers. - * - * Returns: video driver's userdata. - **/ -void *video_driver_get_ptr(bool force_nonthreaded_data) -{ -#ifdef HAVE_THREADS - if (video_driver_is_threaded_internal() && !force_nonthreaded_data) - return video_thread_get_ptr(NULL); -#endif - - return video_driver_data; -} - -const char *video_driver_get_ident(void) -{ - return (current_video) ? current_video->ident : NULL; -} - -const video_poke_interface_t *video_driver_get_poke(void) -{ - return video_driver_poke; -} - -static bool video_context_has_focus(void) -{ - return current_video_context.has_focus && current_video_context.has_focus(video_context_data); -} - -static bool video_driver_has_focus(void) -{ - return current_video && current_video->focus && current_video->focus(video_driver_data); -} - -static bool null_driver_has_focus(void) -{ - return true; -} - -static void video_context_driver_reset(void) -{ - if (!current_video_context.get_metrics) - current_video_context.get_metrics = get_metrics_null; - - if (!current_video_context.update_window_title) - current_video_context.update_window_title = update_window_title_null; - - if (!current_video_context.set_resize) - current_video_context.set_resize = set_resize_null; - - if (!current_video_context.swap_buffers) - current_video_context.swap_buffers = swap_buffers_null; - - if (current_video_context.has_focus) - video_driver_cb_has_focus = video_context_has_focus; - -} - -bool video_context_driver_set(const gfx_ctx_driver_t *data) -{ - if (!data) - return false; - current_video_context = *data; - video_context_driver_reset(); - return true; -} - -void video_context_driver_destroy(void) -{ - current_video_context.init = NULL; - current_video_context.bind_api = NULL; - current_video_context.swap_interval = NULL; - current_video_context.set_video_mode = NULL; - current_video_context.get_video_size = NULL; - current_video_context.get_video_output_size = NULL; - current_video_context.get_video_output_prev = NULL; - current_video_context.get_video_output_next = NULL; - current_video_context.get_metrics = get_metrics_null; - current_video_context.translate_aspect = NULL; - current_video_context.update_window_title = update_window_title_null; - current_video_context.check_window = NULL; - current_video_context.set_resize = set_resize_null; - current_video_context.has_focus = NULL; - current_video_context.suppress_screensaver = NULL; - current_video_context.has_windowed = NULL; - current_video_context.swap_buffers = swap_buffers_null; - current_video_context.input_driver = NULL; - current_video_context.get_proc_address = NULL; - current_video_context.image_buffer_init = NULL; - current_video_context.image_buffer_write = NULL; - current_video_context.show_mouse = NULL; - current_video_context.ident = NULL; - current_video_context.get_flags = NULL; - current_video_context.set_flags = NULL; - current_video_context.bind_hw_render = NULL; - current_video_context.get_context_data = NULL; - current_video_context.make_current = NULL; -} - -/** - * video_driver_get_current_framebuffer: - * - * Gets pointer to current hardware renderer framebuffer object. - * Used by RETRO_ENVIRONMENT_SET_HW_RENDER. - * - * Returns: pointer to hardware framebuffer object, otherwise 0. - **/ -uintptr_t video_driver_get_current_framebuffer(void) -{ - if (video_driver_poke && video_driver_poke->get_current_framebuffer) - return video_driver_poke->get_current_framebuffer(video_driver_data); - return 0; -} - -retro_proc_address_t video_driver_get_proc_address(const char *sym) -{ - if (video_driver_poke && video_driver_poke->get_proc_address) - return video_driver_poke->get_proc_address(video_driver_data, sym); - return NULL; -} - -bool video_driver_set_shader(enum rarch_shader_type type, - const char *path) -{ - if (current_video->set_shader) - return current_video->set_shader(video_driver_data, type, path); - return false; -} - -static void video_driver_filter_free(void) -{ - if (video_driver_state_filter) - rarch_softfilter_free(video_driver_state_filter); - video_driver_state_filter = NULL; - - if (video_driver_state_buffer) - { -#ifdef _3DS - linearFree(video_driver_state_buffer); -#else - free(video_driver_state_buffer); -#endif - } - video_driver_state_buffer = NULL; - - video_driver_state_scale = 0; - video_driver_state_out_bpp = 0; - video_driver_state_out_rgb32 = false; -} - -static void video_driver_init_filter(enum retro_pixel_format colfmt_int) -{ - unsigned pow2_x, pow2_y, maxsize; - void *buf = NULL; - settings_t *settings = config_get_ptr(); - struct retro_game_geometry *geom = &video_driver_av_info.geometry; - unsigned width = geom->max_width; - unsigned height = geom->max_height; - /* Deprecated format. Gets pre-converted. */ - enum retro_pixel_format colfmt = - (colfmt_int == RETRO_PIXEL_FORMAT_0RGB1555) ? - RETRO_PIXEL_FORMAT_RGB565 : colfmt_int; - - if (video_driver_is_hw_context()) - { - RARCH_WARN("Cannot use CPU filters when hardware rendering is used.\n"); - return; - } - - video_driver_state_filter = rarch_softfilter_new( - settings->paths.path_softfilter_plugin, - RARCH_SOFTFILTER_THREADS_AUTO, colfmt, width, height); - - if (!video_driver_state_filter) - { - RARCH_ERR("[Video]: Failed to load filter.\n"); - return; - } - - rarch_softfilter_get_max_output_size(video_driver_state_filter, - &width, &height); - - pow2_x = next_pow2(width); - pow2_y = next_pow2(height); - maxsize = MAX(pow2_x, pow2_y); - video_driver_state_scale = maxsize / RARCH_SCALE_BASE; - video_driver_state_out_rgb32 = rarch_softfilter_get_output_format( - video_driver_state_filter) == - RETRO_PIXEL_FORMAT_XRGB8888; - - video_driver_state_out_bpp = video_driver_state_out_rgb32 ? - sizeof(uint32_t) : - sizeof(uint16_t); - - /* TODO: Aligned output. */ -#ifdef _3DS - buf = linearMemAlign( - width * height * video_driver_state_out_bpp, 0x80); -#else - buf = malloc( - width * height * video_driver_state_out_bpp); -#endif - if (!buf) - { - RARCH_ERR("[Video]: Softfilter initialization failed.\n"); - video_driver_filter_free(); - return; - } - - video_driver_state_buffer = buf; -} - -static void video_driver_init_input(const input_driver_t *tmp) -{ - const input_driver_t **input = input_get_double_ptr(); - if (*input) - return; - - /* Video driver didn't provide an input driver, - * so we use configured one. */ - RARCH_LOG("[Video]: Graphics driver did not initialize an input driver." - " Attempting to pick a suitable driver.\n"); - - if (tmp) - *input = tmp; - else - input_driver_find_driver(); - - /* This should never really happen as tmp (driver.input) is always - * found before this in find_driver_input(), or we have aborted - * in a similar fashion anyways. */ - if (!input_get_ptr()) - goto error; - - if (input_driver_init()) - return; - -error: - RARCH_ERR("[Video]: Cannot initialize input driver. Exiting ...\n"); - retroarch_fail(1, "video_driver_init_input()"); -} - -/** - * video_driver_monitor_compute_fps_statistics: - * - * Computes monitor FPS statistics. - **/ -static void video_driver_monitor_compute_fps_statistics(void) -{ - double avg_fps = 0.0; - double stddev = 0.0; - unsigned samples = 0; - - if (video_driver_frame_time_count < - (2 * MEASURE_FRAME_TIME_SAMPLES_COUNT)) - { - RARCH_LOG( - "[Video]: Does not have enough samples for monitor refresh rate" - " estimation. Requires to run for at least %u frames.\n", - 2 * MEASURE_FRAME_TIME_SAMPLES_COUNT); - return; - } - - if (video_monitor_fps_statistics(&avg_fps, &stddev, &samples)) - { - RARCH_LOG("[Video]: Average monitor Hz: %.6f Hz. (%.3f %% frame time" - " deviation, based on %u last samples).\n", - avg_fps, 100.0 * stddev, samples); - } -} - -static void video_driver_pixel_converter_free(void) -{ - if (!video_driver_scaler_ptr) - return; - - scaler_ctx_gen_reset(video_driver_scaler_ptr->scaler); - - if (video_driver_scaler_ptr->scaler) - free(video_driver_scaler_ptr->scaler); - video_driver_scaler_ptr->scaler = NULL; - - if (video_driver_scaler_ptr->scaler_out) - free(video_driver_scaler_ptr->scaler_out); - video_driver_scaler_ptr->scaler_out = NULL; - - if (video_driver_scaler_ptr) - free(video_driver_scaler_ptr); - video_driver_scaler_ptr = NULL; -} - -static void video_driver_free_internal(void) -{ -#ifdef HAVE_THREADS - bool is_threaded = video_driver_is_threaded_internal(); -#endif - -#ifdef HAVE_VIDEO_LAYOUT - video_layout_deinit(); -#endif - - command_event(CMD_EVENT_OVERLAY_DEINIT, NULL); - - if (!video_driver_is_video_cache_context()) - video_driver_free_hw_context(); - - if (!input_driver_is_data_ptr_same(video_driver_data)) - input_driver_deinit(); - - if (video_driver_data - && current_video && current_video->free - ) - current_video->free(video_driver_data); - - video_driver_pixel_converter_free(); - video_driver_filter_free(); - - command_event(CMD_EVENT_SHADER_DIR_DEINIT, NULL); - -#ifdef HAVE_THREADS - if (is_threaded) - return; -#endif - - video_driver_monitor_compute_fps_statistics(); -} - -static bool video_driver_pixel_converter_init(unsigned size) -{ - struct retro_hw_render_callback *hwr = - video_driver_get_hw_context(); - void *scalr_out = NULL; - video_pixel_scaler_t *scalr = NULL; - struct scaler_ctx *scalr_ctx = NULL; - - /* If pixel format is not 0RGB1555, we don't need to do - * any internal pixel conversion. */ - if (video_driver_pix_fmt != RETRO_PIXEL_FORMAT_0RGB1555) - return true; - - /* No need to perform pixel conversion for HW rendering contexts. */ - if (hwr && hwr->context_type != RETRO_HW_CONTEXT_NONE) - return true; - - RARCH_WARN("0RGB1555 pixel format is deprecated," - " and will be slower. For 15/16-bit, RGB565" - " format is preferred.\n"); - - scalr = (video_pixel_scaler_t*)calloc(1, sizeof(*scalr)); - - if (!scalr) - goto error; - - video_driver_scaler_ptr = scalr; - - scalr_ctx = (struct scaler_ctx*)calloc(1, sizeof(*scalr_ctx)); - - if (!scalr_ctx) - goto error; - - video_driver_scaler_ptr->scaler = scalr_ctx; - video_driver_scaler_ptr->scaler->scaler_type = SCALER_TYPE_POINT; - video_driver_scaler_ptr->scaler->in_fmt = SCALER_FMT_0RGB1555; - - /* TODO: Pick either ARGB8888 or RGB565 depending on driver. */ - video_driver_scaler_ptr->scaler->out_fmt = SCALER_FMT_RGB565; - - if (!scaler_ctx_gen_filter(scalr_ctx)) - goto error; - - scalr_out = calloc(sizeof(uint16_t), size * size); - - if (!scalr_out) - goto error; - - video_driver_scaler_ptr->scaler_out = scalr_out; - - return true; - -error: - video_driver_pixel_converter_free(); - video_driver_filter_free(); - - return false; -} - -static bool video_driver_init_internal(bool *video_is_threaded) -{ - video_info_t video; - unsigned max_dim, scale, width, height; - video_viewport_t *custom_vp = NULL; - const input_driver_t *tmp = NULL; - rarch_system_info_t *system = NULL; - static uint16_t dummy_pixels[32] = {0}; - settings_t *settings = config_get_ptr(); - struct retro_game_geometry *geom = &video_driver_av_info.geometry; - - if (!string_is_empty(settings->paths.path_softfilter_plugin)) - video_driver_init_filter(video_driver_pix_fmt); - - max_dim = MAX(geom->max_width, geom->max_height); - scale = next_pow2(max_dim) / RARCH_SCALE_BASE; - scale = MAX(scale, 1); - - if (video_driver_state_filter) - scale = video_driver_state_scale; - - /* Update core-dependent aspect ratio values. */ - video_driver_set_viewport_square_pixel(); - video_driver_set_viewport_core(); - video_driver_set_viewport_config(); - - /* Update CUSTOM viewport. */ - custom_vp = video_viewport_get_custom(); - - if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM) - { - float default_aspect = aspectratio_lut[ASPECT_RATIO_CORE].value; - aspectratio_lut[ASPECT_RATIO_CUSTOM].value = - (custom_vp->width && custom_vp->height) ? - (float)custom_vp->width / custom_vp->height : default_aspect; - } - - video_driver_set_aspect_ratio_value( - aspectratio_lut[settings->uints.video_aspect_ratio_idx].value); - - if (settings->bools.video_fullscreen|| retroarch_is_forced_fullscreen()) - { - width = settings->uints.video_fullscreen_x; - height = settings->uints.video_fullscreen_y; - } - else - { - /* To-Do: remove when the new window resizing core is hooked */ - if (settings->bools.video_window_save_positions && - (settings->uints.window_position_width || settings->uints.window_position_height)) - { - width = settings->uints.window_position_width; - height = settings->uints.window_position_height; - } - else - { - if (settings->bools.video_force_aspect) - { - /* Do rounding here to simplify integer scale correctness. */ - unsigned base_width = - roundf(geom->base_height * video_driver_get_aspect_ratio()); - width = roundf(base_width * settings->floats.video_scale); - } - else - width = roundf(geom->base_width * settings->floats.video_scale); - height = roundf(geom->base_height * settings->floats.video_scale); - } - } - - if (width && height) - RARCH_LOG("[Video]: Video @ %ux%u\n", width, height); - else - RARCH_LOG("[Video]: Video @ fullscreen\n"); - - video_driver_display_type_set(RARCH_DISPLAY_NONE); - video_driver_display_set(0); - video_driver_window_set(0); - - if (!video_driver_pixel_converter_init(RARCH_SCALE_BASE * scale)) - { - RARCH_ERR("[Video]: Failed to initialize pixel converter.\n"); - goto error; - } - - video.width = width; - video.height = height; - video.fullscreen = settings->bools.video_fullscreen || retroarch_is_forced_fullscreen(); - video.vsync = settings->bools.video_vsync && !rarch_ctl(RARCH_CTL_IS_NONBLOCK_FORCED, NULL); - video.force_aspect = settings->bools.video_force_aspect; - video.font_enable = settings->bools.video_font_enable; - video.swap_interval = settings->uints.video_swap_interval; -#ifdef GEKKO - video.viwidth = settings->uints.video_viwidth; - video.vfilter = settings->bools.video_vfilter; -#endif - video.smooth = settings->bools.video_smooth; - video.input_scale = scale; - video.rgb32 = video_driver_state_filter ? - video_driver_state_out_rgb32 : - (video_driver_pix_fmt == RETRO_PIXEL_FORMAT_XRGB8888); - video.parent = 0; - - video_started_fullscreen = video.fullscreen; - - /* Reset video frame count */ - video_driver_frame_count = 0; - - tmp = input_get_ptr(); - /* Need to grab the "real" video driver interface on a reinit. */ - video_driver_find_driver(); - -#ifdef HAVE_THREADS - video.is_threaded = video_driver_is_threaded_internal(); - *video_is_threaded = video.is_threaded; - - if (video.is_threaded) - { - /* Can't do hardware rendering with threaded driver currently. */ - RARCH_LOG("[Video]: Starting threaded video driver ...\n"); - - 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)) - { - RARCH_ERR("[Video]: Cannot open threaded video driver ... Exiting ...\n"); - goto error; - } - } - else -#endif - video_driver_data = current_video->init( - &video, input_get_double_ptr(), - input_driver_get_data_ptr()); - - if (!video_driver_data) - { - RARCH_ERR("[Video]: Cannot open video driver ... Exiting ...\n"); - goto error; - } - - if (current_video->focus) - video_driver_cb_has_focus = video_driver_has_focus; - - video_driver_poke = NULL; - if (current_video->poke_interface) - current_video->poke_interface(video_driver_data, &video_driver_poke); - - if (current_video->viewport_info && - (!custom_vp->width || - !custom_vp->height)) - { - /* Force custom viewport to have sane parameters. */ - custom_vp->width = width; - custom_vp->height = height; - - video_driver_get_viewport_info(custom_vp); - } - - system = runloop_get_system_info(); - - video_driver_set_rotation( - (settings->uints.video_rotation + system->rotation) % 4); - - current_video->suppress_screensaver(video_driver_data, - settings->bools.ui_suspend_screensaver_enable); - - video_driver_init_input(tmp); - - command_event(CMD_EVENT_OVERLAY_DEINIT, NULL); - command_event(CMD_EVENT_OVERLAY_INIT, NULL); - -#ifdef HAVE_VIDEO_LAYOUT - if(settings->bools.video_layout_enable) - { - video_layout_init(video_driver_data, video_driver_layout_render_interface()); - video_layout_load(settings->paths.path_video_layout); - video_layout_view_select(settings->uints.video_layout_selected_view); - } -#endif - - if (!core_is_game_loaded()) - video_driver_cached_frame_set(&dummy_pixels, 4, 4, 8); - -#if defined(PSP) - video_driver_set_texture_frame(&dummy_pixels, false, 1, 1, 1.0f); -#endif - - video_context_driver_reset(); - - video_display_server_init(); - - if ((enum rotation)settings->uints.screen_orientation != ORIENTATION_NORMAL) - video_display_server_set_screen_orientation((enum rotation)settings->uints.screen_orientation); - - command_event(CMD_EVENT_SHADER_DIR_INIT, NULL); - - return true; - -error: - retroarch_fail(1, "init_video()"); - return false; -} - -bool video_driver_set_viewport(unsigned width, unsigned height, - bool force_fullscreen, bool allow_rotate) -{ - if (!current_video || !current_video->set_viewport) - return false; - current_video->set_viewport(video_driver_data, width, height, - force_fullscreen, allow_rotate); - return true; -} - -bool video_driver_set_rotation(unsigned rotation) -{ - if (!current_video || !current_video->set_rotation) - return false; - current_video->set_rotation(video_driver_data, rotation); - return true; -} - -bool video_driver_set_video_mode(unsigned width, - unsigned height, bool fullscreen) -{ - gfx_ctx_mode_t mode; - - if (video_driver_poke && video_driver_poke->set_video_mode) - { - video_driver_poke->set_video_mode(video_driver_data, - width, height, fullscreen); - return true; - } - - mode.width = width; - mode.height = height; - mode.fullscreen = fullscreen; - - return video_context_driver_set_video_mode(&mode); -} - -bool video_driver_get_video_output_size(unsigned *width, unsigned *height) -{ - if (!video_driver_poke || !video_driver_poke->get_video_output_size) - return false; - video_driver_poke->get_video_output_size(video_driver_data, - width, height); - return true; -} - -void video_driver_set_osd_msg(const char *msg, const void *data, void *font) -{ - video_frame_info_t video_info; - video_driver_build_info(&video_info); - if (video_driver_poke && video_driver_poke->set_osd_msg) - video_driver_poke->set_osd_msg(video_driver_data, &video_info, msg, data, font); -} - -void video_driver_set_texture_enable(bool enable, bool fullscreen) -{ - if (video_driver_poke && video_driver_poke->set_texture_enable) - video_driver_poke->set_texture_enable(video_driver_data, - enable, fullscreen); -} - -void video_driver_set_texture_frame(const void *frame, bool rgb32, - unsigned width, unsigned height, float alpha) -{ - if (video_driver_poke && video_driver_poke->set_texture_frame) - video_driver_poke->set_texture_frame(video_driver_data, - frame, rgb32, width, height, alpha); -} - -#ifdef HAVE_OVERLAY -bool video_driver_overlay_interface(const video_overlay_interface_t **iface) -{ - if (!current_video || !current_video->overlay_interface) - return false; - current_video->overlay_interface(video_driver_data, iface); - return true; -} -#endif - -#ifdef HAVE_VIDEO_LAYOUT -const video_layout_render_interface_t *video_driver_layout_render_interface(void) -{ - if (!current_video || !current_video->video_layout_render_interface) - return NULL; - - return current_video->video_layout_render_interface(video_driver_data); -} -#endif - -void *video_driver_read_frame_raw(unsigned *width, - unsigned *height, size_t *pitch) -{ - if (!current_video || !current_video->read_frame_raw) - return NULL; - return current_video->read_frame_raw(video_driver_data, width, - height, pitch); -} - -void video_driver_set_filtering(unsigned index, bool smooth) -{ - if (video_driver_poke && video_driver_poke->set_filtering) - video_driver_poke->set_filtering(video_driver_data, index, smooth); -} - -void video_driver_cached_frame_set(const void *data, unsigned width, - unsigned height, size_t pitch) -{ - if (data) - frame_cache_data = data; - frame_cache_width = width; - frame_cache_height = height; - frame_cache_pitch = pitch; -} - -void video_driver_cached_frame_get(const void **data, unsigned *width, - unsigned *height, size_t *pitch) -{ - if (data) - *data = frame_cache_data; - if (width) - *width = frame_cache_width; - if (height) - *height = frame_cache_height; - if (pitch) - *pitch = frame_cache_pitch; -} - -void video_driver_get_size(unsigned *width, unsigned *height) -{ -#ifdef HAVE_THREADS - bool is_threaded = video_driver_is_threaded_internal(); - video_driver_threaded_lock(is_threaded); -#endif - if (width) - *width = video_driver_width; - if (height) - *height = video_driver_height; -#ifdef HAVE_THREADS - video_driver_threaded_unlock(is_threaded); -#endif -} - -void video_driver_set_size(unsigned *width, unsigned *height) -{ -#ifdef HAVE_THREADS - bool is_threaded = video_driver_is_threaded_internal(); - video_driver_threaded_lock(is_threaded); -#endif - if (width) - video_driver_width = *width; - if (height) - video_driver_height = *height; -#ifdef HAVE_THREADS - video_driver_threaded_unlock(is_threaded); -#endif -} - -/** - * video_monitor_set_refresh_rate: - * @hz : New refresh rate for monitor. - * - * Sets monitor refresh rate to new value. - **/ -void video_monitor_set_refresh_rate(float hz) -{ - char msg[128]; - settings_t *settings = config_get_ptr(); - - snprintf(msg, sizeof(msg), - "Setting refresh rate to: %.3f Hz.", hz); - runloop_msg_queue_push(msg, 1, 180, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - RARCH_LOG("%s\n", msg); - - configuration_set_float(settings, - settings->floats.video_refresh_rate, - hz); -} - -/** - * video_monitor_fps_statistics - * @refresh_rate : Monitor refresh rate. - * @deviation : Deviation from measured refresh rate. - * @sample_points : Amount of sampled points. - * - * Gets the monitor FPS statistics based on the current - * runtime. - * - * Returns: true (1) on success. - * false (0) if: - * a) threaded video mode is enabled - * b) less than 2 frame time samples. - * c) FPS monitor enable is off. - **/ -bool video_monitor_fps_statistics(double *refresh_rate, - double *deviation, unsigned *sample_points) -{ - unsigned i; - retro_time_t accum = 0; - retro_time_t avg = 0; - retro_time_t accum_var = 0; - unsigned samples = 0; - -#ifdef HAVE_THREADS - if (video_driver_is_threaded_internal()) - return false; -#endif - - samples = MIN(MEASURE_FRAME_TIME_SAMPLES_COUNT, - (unsigned)video_driver_frame_time_count); - - if (samples < 2) - return false; - - /* Measure statistics on frame time (microsecs), *not* FPS. */ - for (i = 0; i < samples; i++) - { - accum += video_driver_frame_time_samples[i]; -#if 0 - RARCH_LOG("[Video]: Interval #%u: %d usec / frame.\n", - i, (int)frame_time_samples[i]); -#endif - } - - avg = accum / samples; - - /* Drop first measurement. It is likely to be bad. */ - for (i = 0; i < samples; i++) - { - retro_time_t diff = video_driver_frame_time_samples[i] - avg; - accum_var += diff * diff; - } - - *deviation = sqrt((double)accum_var / (samples - 1)) / avg; - - if (refresh_rate) - *refresh_rate = 1000000.0 / avg; - - if (sample_points) - *sample_points = samples; - - return true; -} - -float video_driver_get_aspect_ratio(void) -{ - return video_driver_aspect_ratio; -} - -void video_driver_set_aspect_ratio_value(float value) -{ - video_driver_aspect_ratio = value; -} - -rarch_softfilter_t *video_driver_frame_filter_get_ptr(void) -{ - return video_driver_state_filter; -} - -enum retro_pixel_format video_driver_get_pixel_format(void) -{ - return video_driver_pix_fmt; -} - -void video_driver_set_pixel_format(enum retro_pixel_format fmt) -{ - video_driver_pix_fmt = fmt; -} - -/** - * video_driver_cached_frame: - * - * Renders the current video frame. - **/ -bool video_driver_cached_frame(void) -{ - void *recording = recording_driver_get_data_ptr(); - - /* Cannot allow recording when pushing duped frames. */ - recording_data = NULL; - - retro_ctx.frame_cb( - (frame_cache_data != RETRO_HW_FRAME_BUFFER_VALID) - ? frame_cache_data : NULL, - frame_cache_width, - frame_cache_height, frame_cache_pitch); - - recording_data = recording; - - return true; -} - -void video_driver_monitor_adjust_system_rates(void) -{ - float timing_skew = 0.0f; - settings_t *settings = config_get_ptr(); - float video_refresh_rate = settings->floats.video_refresh_rate; - float timing_skew_hz = video_refresh_rate; - const struct retro_system_timing *info = (const struct retro_system_timing*)&video_driver_av_info.timing; - - rarch_ctl(RARCH_CTL_UNSET_NONBLOCK_FORCED, NULL); - - if (!info || info->fps <= 0.0) - return; - - video_driver_core_hz = info->fps; - - if (video_driver_crt_switching_active) - timing_skew_hz = video_driver_core_hz; - timing_skew = fabs( - 1.0f - info->fps / timing_skew_hz); - - if (!settings->bools.vrr_runloop_enable) - { - /* We don't want to adjust pitch too much. If we have extreme cases, - * just don't readjust at all. */ - if (timing_skew <= settings->floats.audio_max_timing_skew) - return; - - RARCH_LOG("[Video]: Timings deviate too much. Will not adjust." - " (Display = %.2f Hz, Game = %.2f Hz)\n", - video_refresh_rate, - (float)info->fps); - } - - if (info->fps <= timing_skew_hz) - return; - - /* We won't be able to do VSync reliably when game FPS > monitor FPS. */ - rarch_ctl(RARCH_CTL_SET_NONBLOCK_FORCED, NULL); - RARCH_LOG("[Video]: Game FPS > Monitor FPS. Cannot rely on VSync.\n"); -} - -static void video_driver_lock_new(void) -{ - video_driver_lock_free(); -#ifdef HAVE_THREADS - if (!display_lock) - display_lock = slock_new(); - retro_assert(display_lock); - - if (!context_lock) - context_lock = slock_new(); - retro_assert(context_lock); -#endif -} - -void video_driver_destroy(void) -{ - video_display_server_destroy(); - crt_video_restore(); - - video_driver_cb_has_focus = null_driver_has_focus; - video_driver_use_rgba = false; - video_driver_active = false; - video_driver_cache_context = false; - video_driver_cache_context_ack = false; - video_driver_record_gpu_buffer = NULL; - current_video = NULL; - video_driver_set_cached_frame_ptr(NULL); -} - -void video_driver_set_cached_frame_ptr(const void *data) -{ - if (data) - frame_cache_data = data; -} - -void video_driver_set_stub_frame(void) -{ - frame_bak = current_video->frame; - current_video->frame = video_null.frame; -} - -void video_driver_unset_stub_frame(void) -{ - if (frame_bak != NULL) - current_video->frame = frame_bak; - - frame_bak = NULL; -} - -bool video_driver_is_stub_frame(void) -{ - return current_video->frame == video_null.frame; -} - -bool video_driver_supports_recording(void) -{ - settings_t *settings = config_get_ptr(); - return settings->bools.video_gpu_record - && current_video->read_viewport; -} - -bool video_driver_supports_viewport_read(void) -{ - return current_video->read_viewport && current_video->viewport_info; -} - -bool video_driver_prefer_viewport_read(void) -{ - settings_t *settings = config_get_ptr(); - return settings->bools.video_gpu_screenshot || - (video_driver_is_hw_context() && !current_video->read_frame_raw); -} - -bool video_driver_supports_read_frame_raw(void) -{ - if (current_video->read_frame_raw) - return true; - return false; -} - -void video_driver_set_viewport_config(void) -{ - settings_t *settings = config_get_ptr(); - - if (settings->floats.video_aspect_ratio < 0.0f) - { - struct retro_game_geometry *geom = &video_driver_av_info.geometry; - - if (geom->aspect_ratio > 0.0f && - settings->bools.video_aspect_ratio_auto) - aspectratio_lut[ASPECT_RATIO_CONFIG].value = geom->aspect_ratio; - else - { - unsigned base_width = geom->base_width; - unsigned base_height = geom->base_height; - - /* Get around division by zero errors */ - if (base_width == 0) - base_width = 1; - if (base_height == 0) - base_height = 1; - aspectratio_lut[ASPECT_RATIO_CONFIG].value = - (float)base_width / base_height; /* 1:1 PAR. */ - } - } - else - { - aspectratio_lut[ASPECT_RATIO_CONFIG].value = - settings->floats.video_aspect_ratio; - } -} - -void video_driver_set_viewport_square_pixel(void) -{ - unsigned len, highest, i, aspect_x, aspect_y; - struct retro_game_geometry *geom = &video_driver_av_info.geometry; - unsigned width = geom->base_width; - unsigned height = geom->base_height; - - if (width == 0 || height == 0) - return; - - len = MIN(width, height); - highest = 1; - - for (i = 1; i < len; i++) - { - if ((width % i) == 0 && (height % i) == 0) - highest = i; - } - - aspect_x = width / highest; - aspect_y = height / highest; - - snprintf(aspectratio_lut[ASPECT_RATIO_SQUARE].name, - sizeof(aspectratio_lut[ASPECT_RATIO_SQUARE].name), - "1:1 PAR (%u:%u DAR)", aspect_x, aspect_y); - - aspectratio_lut[ASPECT_RATIO_SQUARE].value = (float)aspect_x / aspect_y; -} - -void video_driver_set_viewport_core(void) -{ - struct retro_game_geometry *geom = &video_driver_av_info.geometry; - - if (!geom || geom->base_width <= 0.0f || geom->base_height <= 0.0f) - return; - - /* Fallback to 1:1 pixel ratio if none provided */ - if (geom->aspect_ratio > 0.0f) - aspectratio_lut[ASPECT_RATIO_CORE].value = geom->aspect_ratio; - else - aspectratio_lut[ASPECT_RATIO_CORE].value = - (float)geom->base_width / geom->base_height; -} - -void video_driver_reset_custom_viewport(void) -{ - struct video_viewport *custom_vp = video_viewport_get_custom(); - - custom_vp->width = 0; - custom_vp->height = 0; - custom_vp->x = 0; - custom_vp->y = 0; -} - -void video_driver_set_rgba(void) -{ - video_driver_lock(); - video_driver_use_rgba = true; - video_driver_unlock(); -} - -void video_driver_unset_rgba(void) -{ - video_driver_lock(); - video_driver_use_rgba = false; - video_driver_unlock(); -} - -bool video_driver_supports_rgba(void) -{ - bool tmp; - video_driver_lock(); - tmp = video_driver_use_rgba; - video_driver_unlock(); - return tmp; -} - -bool video_driver_get_next_video_out(void) -{ - if (!video_driver_poke) - return false; - - if (!video_driver_poke->get_video_output_next) - return video_context_driver_get_video_output_next(); - video_driver_poke->get_video_output_next(video_driver_data); - return true; -} - -bool video_driver_get_prev_video_out(void) -{ - if (!video_driver_poke) - return false; - - if (!video_driver_poke->get_video_output_prev) - return video_context_driver_get_video_output_prev(); - video_driver_poke->get_video_output_prev(video_driver_data); - return true; -} - -bool video_driver_init(bool *video_is_threaded) -{ - video_driver_lock_new(); - video_driver_filter_free(); - video_driver_set_cached_frame_ptr(NULL); - return video_driver_init_internal(video_is_threaded); -} - -void video_driver_destroy_data(void) -{ - video_driver_data = NULL; -} - -void video_driver_free(void) -{ - video_driver_free_internal(); - video_driver_lock_free(); - video_driver_data = NULL; - video_driver_set_cached_frame_ptr(NULL); -} - -void video_driver_monitor_reset(void) -{ - video_driver_frame_time_count = 0; -} - -void video_driver_set_aspect_ratio(void) -{ - settings_t *settings = config_get_ptr(); - - switch (settings->uints.video_aspect_ratio_idx) - { - case ASPECT_RATIO_SQUARE: - video_driver_set_viewport_square_pixel(); - break; - - case ASPECT_RATIO_CORE: - video_driver_set_viewport_core(); - break; - - case ASPECT_RATIO_CONFIG: - video_driver_set_viewport_config(); - break; - - default: - break; - } - - video_driver_set_aspect_ratio_value( - aspectratio_lut[settings->uints.video_aspect_ratio_idx].value); - - if (!video_driver_poke || !video_driver_poke->set_aspect_ratio) - return; - video_driver_poke->set_aspect_ratio( - video_driver_data, settings->uints.video_aspect_ratio_idx); -} - -void video_driver_update_viewport(struct video_viewport* vp, bool force_full, bool keep_aspect) -{ - gfx_ctx_aspect_t aspect_data; - float device_aspect = (float)vp->full_width / vp->full_height; - settings_t* settings = config_get_ptr(); - - aspect_data.aspect = &device_aspect; - aspect_data.width = vp->full_width; - aspect_data.height = vp->full_height; - - video_context_driver_translate_aspect(&aspect_data); - - vp->x = 0; - vp->y = 0; - vp->width = vp->full_width; - vp->height = vp->full_height; - - if (settings->bools.video_scale_integer && !force_full) - { - video_viewport_get_scaled_integer( - vp, vp->full_width, vp->full_height, video_driver_get_aspect_ratio(), keep_aspect); - } - else if (keep_aspect && !force_full) - { - float desired_aspect = video_driver_get_aspect_ratio(); - -#if defined(HAVE_MENU) - if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM) - { - const struct video_viewport* custom = video_viewport_get_custom(); - - vp->x = custom->x; - vp->y = custom->y; - vp->width = custom->width; - vp->height = custom->height; - } - else -#endif - { - float delta; - - if (fabsf(device_aspect - desired_aspect) < 0.0001f) - { - /* If the aspect ratios of screen and desired aspect - * ratio are sufficiently equal (floating point stuff), - * assume they are actually equal. - */ - } - else if (device_aspect > desired_aspect) - { - delta = (desired_aspect / device_aspect - 1.0f) - / 2.0f + 0.5f; - vp->x = (int)roundf(vp->full_width * (0.5f - delta)); - vp->width = (unsigned)roundf(2.0f * vp->full_width * delta); - vp->y = 0; - vp->height = vp->full_height; - } - else - { - vp->x = 0; - vp->width = vp->full_width; - delta = (device_aspect / desired_aspect - 1.0f) - / 2.0f + 0.5f; - vp->y = (int)roundf(vp->full_height * (0.5f - delta)); - vp->height = (unsigned)roundf(2.0f * vp->full_height * delta); - } - } - } - -#if defined(RARCH_MOBILE) - /* In portrait mode, we want viewport to gravitate to top of screen. */ - if (device_aspect < 1.0f) - vp->y = 0; -#endif -} - -void video_driver_show_mouse(void) -{ - if (video_driver_poke && video_driver_poke->show_mouse) - video_driver_poke->show_mouse(video_driver_data, true); -} - -void video_driver_hide_mouse(void) -{ - if (video_driver_poke && video_driver_poke->show_mouse) - video_driver_poke->show_mouse(video_driver_data, false); -} - -void video_driver_set_nonblock_state(bool toggle) -{ - if (current_video->set_nonblock_state) - current_video->set_nonblock_state(video_driver_data, toggle); -} - -bool video_driver_find_driver(void) -{ - int i; - driver_ctx_info_t drv; - settings_t *settings = config_get_ptr(); - - if (video_driver_is_hw_context()) - { - struct retro_hw_render_callback *hwr = video_driver_get_hw_context(); - - current_video = NULL; - - (void)hwr; - -#if defined(HAVE_VULKAN) - if (hwr && hw_render_context_is_vulkan(hwr->context_type)) - { - RARCH_LOG("[Video]: Using HW render, Vulkan driver forced.\n"); - current_video = &video_vulkan; - } -#endif - -#if defined(HAVE_OPENGL) || defined(HAVE_OPENGL_CORE) - if (hwr && hw_render_context_is_gl(hwr->context_type)) - { - RARCH_LOG("[Video]: Using HW render, OpenGL driver forced.\n"); - - /* If we have configured one of the HW render capable GL drivers, go with that. */ - if (!string_is_equal(settings->arrays.video_driver, "gl") && - !string_is_equal(settings->arrays.video_driver, "glcore")) - { -#if defined(HAVE_OPENGL_CORE) - current_video = &video_gl_core; - RARCH_LOG("[Video]: Forcing \"glcore\" driver.\n"); -#else - current_video = &video_gl2; - RARCH_LOG("[Video]: Forcing \"gl\" driver.\n"); -#endif - } - else - { - RARCH_LOG("[Video]: Using configured \"%s\" driver for GL HW render.\n", - settings->arrays.video_driver); - } - } -#endif - - if (current_video) - return true; - } - - if (frontend_driver_has_get_video_driver_func()) - { - current_video = (video_driver_t*)frontend_driver_get_video_driver(); - - if (current_video) - return true; - RARCH_WARN("Frontend supports get_video_driver() but did not specify one.\n"); - } - - drv.label = "video_driver"; - drv.s = settings->arrays.video_driver; - - driver_ctl(RARCH_DRIVER_CTL_FIND_INDEX, &drv); - - i = (int)drv.len; - - if (i >= 0) - current_video = (video_driver_t*)video_driver_find_handle(i); - else - { - if (verbosity_is_enabled()) - { - unsigned d; - RARCH_ERR("Couldn't find any video driver named \"%s\"\n", - settings->arrays.video_driver); - RARCH_LOG_OUTPUT("Available video drivers are:\n"); - for (d = 0; video_driver_find_handle(d); d++) - RARCH_LOG_OUTPUT("\t%s\n", video_driver_find_ident(d)); - RARCH_WARN("Going to default to first video driver...\n"); - } - - current_video = (video_driver_t*)video_driver_find_handle(0); - - if (!current_video) - retroarch_fail(1, "find_video_driver()"); - } - return true; -} - -void video_driver_apply_state_changes(void) -{ - if (video_driver_poke && - video_driver_poke->apply_state_changes) - video_driver_poke->apply_state_changes(video_driver_data); -} - -bool video_driver_read_viewport(uint8_t *buffer, bool is_idle) -{ - if ( current_video->read_viewport - && current_video->read_viewport( - video_driver_data, buffer, is_idle)) - return true; - return false; -} - -bool video_driver_frame_filter_alive(void) -{ - return !!video_driver_state_filter; -} - -bool video_driver_frame_filter_is_32bit(void) -{ - return video_driver_state_out_rgb32; -} - -void video_driver_default_settings(void) -{ - global_t *global = global_get_ptr(); - - if (!global) - return; - - global->console.screen.gamma_correction = DEFAULT_GAMMA; - global->console.flickerfilter_enable = false; - global->console.softfilter_enable = false; - - global->console.screen.resolutions.current.id = 0; -} - -void video_driver_load_settings(config_file_t *conf) -{ - bool tmp_bool = false; - global_t *global = global_get_ptr(); - - if (!conf) - return; - -#ifdef _XBOX - CONFIG_GET_BOOL_BASE(conf, global, - console.screen.gamma_correction, "gamma_correction"); -#else - CONFIG_GET_INT_BASE(conf, global, - console.screen.gamma_correction, "gamma_correction"); -#endif - - if (config_get_bool(conf, "flicker_filter_enable", - &tmp_bool)) - global->console.flickerfilter_enable = tmp_bool; - - if (config_get_bool(conf, "soft_filter_enable", - &tmp_bool)) - global->console.softfilter_enable = tmp_bool; - - CONFIG_GET_INT_BASE(conf, global, - console.screen.soft_filter_index, - "soft_filter_index"); - CONFIG_GET_INT_BASE(conf, global, - console.screen.resolutions.current.id, - "current_resolution_id"); - CONFIG_GET_INT_BASE(conf, global, - console.screen.flicker_filter_index, - "flicker_filter_index"); -} - -void video_driver_save_settings(config_file_t *conf) -{ - global_t *global = global_get_ptr(); - if (!conf) - return; - -#ifdef _XBOX - config_set_bool(conf, "gamma_correction", - global->console.screen.gamma_correction); -#else - config_set_int(conf, "gamma_correction", - global->console.screen.gamma_correction); -#endif - config_set_bool(conf, "flicker_filter_enable", - global->console.flickerfilter_enable); - config_set_bool(conf, "soft_filter_enable", - global->console.softfilter_enable); - - config_set_int(conf, "soft_filter_index", - global->console.screen.soft_filter_index); - config_set_int(conf, "current_resolution_id", - global->console.screen.resolutions.current.id); - config_set_int(conf, "flicker_filter_index", - global->console.screen.flicker_filter_index); -} - -void video_driver_reinit(void) -{ - struct retro_hw_render_callback *hwr = - video_driver_get_hw_context(); - - if (hwr->cache_context) - video_driver_cache_context = true; - else - video_driver_cache_context = false; - - video_driver_cache_context_ack = false; - command_event(CMD_EVENT_RESET_CONTEXT, NULL); - video_driver_cache_context = false; -} - -bool video_driver_is_hw_context(void) -{ - bool is_hw_context = false; - - video_driver_context_lock(); - is_hw_context = (hw_render.context_type != RETRO_HW_CONTEXT_NONE); - video_driver_context_unlock(); - - return is_hw_context; -} - -void video_driver_free_hw_context(void) -{ - video_driver_context_lock(); - - if (hw_render.context_destroy) - hw_render.context_destroy(); - - memset(&hw_render, 0, sizeof(hw_render)); - - video_driver_context_unlock(); - - hw_render_context_negotiation = NULL; -} - -struct retro_hw_render_callback *video_driver_get_hw_context(void) -{ - return &hw_render; -} - -const struct retro_hw_render_context_negotiation_interface * - video_driver_get_context_negotiation_interface(void) -{ - return hw_render_context_negotiation; -} - -void video_driver_set_context_negotiation_interface( - const struct retro_hw_render_context_negotiation_interface *iface) -{ - hw_render_context_negotiation = iface; -} - -bool video_driver_is_video_cache_context(void) -{ - return video_driver_cache_context; -} - -void video_driver_set_video_cache_context_ack(void) -{ - video_driver_cache_context_ack = true; -} - -void video_driver_unset_video_cache_context_ack(void) -{ - video_driver_cache_context_ack = false; -} - -bool video_driver_is_video_cache_context_ack(void) -{ - return video_driver_cache_context_ack; -} - -void video_driver_set_active(void) -{ - video_driver_active = true; -} - -void video_driver_unset_active(void) -{ - video_driver_active = false; -} - -bool video_driver_is_active(void) -{ - return video_driver_active; -} - -void video_driver_get_record_status( - bool *has_gpu_record, - uint8_t **gpu_buf) -{ - *gpu_buf = video_driver_record_gpu_buffer; - *has_gpu_record = video_driver_record_gpu_buffer != NULL; -} - -bool video_driver_gpu_record_init(unsigned size) -{ - video_driver_record_gpu_buffer = (uint8_t*)malloc(size); - if (!video_driver_record_gpu_buffer) - return false; - return true; -} - -void video_driver_gpu_record_deinit(void) -{ - free(video_driver_record_gpu_buffer); - video_driver_record_gpu_buffer = NULL; -} - -bool video_driver_get_current_software_framebuffer( - struct retro_framebuffer *fb) -{ - if ( - video_driver_poke - && video_driver_poke->get_current_software_framebuffer - && video_driver_poke->get_current_software_framebuffer( - video_driver_data, fb)) - return true; - - return false; -} - -bool video_driver_get_hw_render_interface( - const struct retro_hw_render_interface **iface) -{ - if ( - video_driver_poke - && video_driver_poke->get_hw_render_interface - && video_driver_poke->get_hw_render_interface( - video_driver_data, iface)) - return true; - - return false; -} - -bool video_driver_get_viewport_info(struct video_viewport *viewport) -{ - if (!current_video || !current_video->viewport_info) - return false; - current_video->viewport_info(video_driver_data, viewport); - return true; -} - -void video_driver_set_title_buf(void) -{ - struct retro_system_info info; - core_get_system_info(&info); - - fill_pathname_join_concat_noext( - video_driver_title_buf, - msg_hash_to_str(MSG_PROGRAM), - " ", - info.library_name, - sizeof(video_driver_title_buf)); - strlcat(video_driver_title_buf, " ", - sizeof(video_driver_title_buf)); - strlcat(video_driver_title_buf, info.library_version, - sizeof(video_driver_title_buf)); -} - -/** - * video_viewport_get_scaled_integer: - * @vp : Viewport handle - * @width : Width. - * @height : Height. - * @aspect_ratio : Aspect ratio (in float). - * @keep_aspect : Preserve aspect ratio? - * - * Gets viewport scaling dimensions based on - * scaled integer aspect ratio. - **/ -void video_viewport_get_scaled_integer(struct video_viewport *vp, - unsigned width, unsigned height, - float aspect_ratio, bool keep_aspect) -{ - int padding_x = 0; - int padding_y = 0; - settings_t *settings = config_get_ptr(); - - if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM) - { - struct video_viewport *custom = video_viewport_get_custom(); - - if (custom) - { - padding_x = width - custom->width; - padding_y = height - custom->height; - width = custom->width; - height = custom->height; - } - } - else - { - unsigned base_width; - /* Use system reported sizes as these define the - * geometry for the "normal" case. */ - unsigned base_height = - video_driver_av_info.geometry.base_height; - - if (base_height == 0) - base_height = 1; - - /* Account for non-square pixels. - * This is sort of contradictory with the goal of integer scale, - * but it is desirable in some cases. - * - * If square pixels are used, base_height will be equal to - * system->av_info.base_height. */ - base_width = (unsigned)roundf(base_height * aspect_ratio); - - /* Make sure that we don't get 0x scale ... */ - if (width >= base_width && height >= base_height) - { - if (keep_aspect) - { - /* X/Y scale must be same. */ - unsigned max_scale = MIN(width / base_width, - height / base_height); - padding_x = width - base_width * max_scale; - padding_y = height - base_height * max_scale; - } - else - { - /* X/Y can be independent, each scaled as much as possible. */ - padding_x = width % base_width; - padding_y = height % base_height; - } - } - - width -= padding_x; - height -= padding_y; - } - - vp->width = width; - vp->height = height; - vp->x = padding_x / 2; - vp->y = padding_y / 2; -} - -struct retro_system_av_info *video_viewport_get_system_av_info(void) -{ - return &video_driver_av_info; -} - -struct video_viewport *video_viewport_get_custom(void) -{ - settings_t *settings = config_get_ptr(); - return &settings->video_viewport_custom; -} - -unsigned video_pixel_get_alignment(unsigned pitch) -{ - if (pitch & 1) - return 1; - if (pitch & 2) - return 2; - if (pitch & 4) - return 4; - return 8; -} - -/** - * video_driver_frame: - * @data : pointer to data of the video frame. - * @width : width of the video frame. - * @height : height of the video frame. - * @pitch : pitch of the video frame. - * - * Video frame render callback function. - **/ -void video_driver_frame(const void *data, unsigned width, - unsigned height, size_t pitch) -{ - static char video_driver_msg[256]; - video_frame_info_t video_info; - static retro_time_t curr_time; - static retro_time_t fps_time; - static float last_fps, frame_time; - const char *msg = NULL; - retro_time_t new_time = - cpu_features_get_time_usec(); - - if (!video_driver_active) - return; - - if (video_driver_scaler_ptr && data && - (video_driver_pix_fmt == RETRO_PIXEL_FORMAT_0RGB1555) && - (data != RETRO_HW_FRAME_BUFFER_VALID)) - { - if (video_pixel_frame_scale( - video_driver_scaler_ptr->scaler, - video_driver_scaler_ptr->scaler_out, - data, width, height, pitch)) - { - data = video_driver_scaler_ptr->scaler_out; - pitch = video_driver_scaler_ptr->scaler->out_stride; - } - } - - if (data) - frame_cache_data = data; - frame_cache_width = width; - frame_cache_height = height; - frame_cache_pitch = pitch; - - video_driver_build_info(&video_info); - - /* Get the amount of frames per seconds. */ - if (video_driver_frame_count) - { - static char title[256]; - unsigned write_index = - video_driver_frame_time_count++ & - (MEASURE_FRAME_TIME_SAMPLES_COUNT - 1); - frame_time = new_time - fps_time; - video_driver_frame_time_samples[write_index] = frame_time; - fps_time = new_time; - - if (video_driver_frame_count == 1) - strlcpy(title, video_driver_window_title, sizeof(title)); - - if (video_info.fps_show) - { - snprintf(video_info.fps_text, sizeof(video_info.fps_text), - "FPS: %6.1f", last_fps); - if (video_info.framecount_show) - strlcat(video_info.fps_text, " || ", sizeof(video_info.fps_text)); - } - - if (video_info.framecount_show) - { - char frames_text[64]; - snprintf(frames_text, - sizeof(frames_text), - "%s: %" PRIu64, msg_hash_to_str(MSG_FRAMES), - (uint64_t)video_driver_frame_count); - strlcat(video_info.fps_text, frames_text, sizeof(video_info.fps_text)); - } - - if ((video_driver_frame_count % FPS_UPDATE_INTERVAL) == 0) - { - last_fps = TIME_TO_FPS(curr_time, new_time, FPS_UPDATE_INTERVAL); - - strlcpy(video_driver_window_title, title, sizeof(video_driver_window_title)); - - if (!string_is_empty(video_info.fps_text)) - { - strlcat(video_driver_window_title, "|| ", sizeof(video_driver_window_title)); - strlcat(video_driver_window_title, - video_info.fps_text, sizeof(video_driver_window_title)); - } - - curr_time = new_time; - video_driver_window_title_update = true; - } - } - else - { - curr_time = fps_time = new_time; - - strlcpy(video_driver_window_title, - video_driver_title_buf, - sizeof(video_driver_window_title)); - - if (video_info.fps_show) - strlcpy(video_info.fps_text, - msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), - sizeof(video_info.fps_text)); - - video_driver_window_title_update = true; - } - - video_info.frame_rate = last_fps; - video_info.frame_time = frame_time / 1000.0f; - video_info.frame_count = (uint64_t) video_driver_frame_count; - - /* Slightly messy code, - * but we really need to do processing before blocking on VSync - * for best possible scheduling. - */ - if ( - ( - !video_driver_state_filter - || !video_info.post_filter_record - || !data - || video_driver_record_gpu_buffer - ) && recording_data - ) - recording_dump_frame(data, width, height, - pitch, video_info.runloop_is_idle); - - if (data && video_driver_state_filter) - { - unsigned output_width = 0; - unsigned output_height = 0; - unsigned output_pitch = 0; - - rarch_softfilter_get_output_size(video_driver_state_filter, - &output_width, &output_height, width, height); - - output_pitch = (output_width) * video_driver_state_out_bpp; - - rarch_softfilter_process(video_driver_state_filter, - video_driver_state_buffer, output_pitch, - data, width, height, pitch); - - if (video_info.post_filter_record && recording_data) - recording_dump_frame(video_driver_state_buffer, - output_width, output_height, output_pitch, - video_info.runloop_is_idle); - - data = video_driver_state_buffer; - width = output_width; - height = output_height; - pitch = output_pitch; - } - - video_driver_msg[0] = '\0'; - - if ( video_info.font_enable - && runloop_msg_queue_pull((const char**)&msg) - && msg) - { -#ifdef HAVE_THREADS - /* the msg pointer may point to data modified by another thread */ - runloop_msg_queue_lock(); -#endif - strlcpy(video_driver_msg, msg, sizeof(video_driver_msg)); -#ifdef HAVE_THREADS - runloop_msg_queue_unlock(); -#endif - } - - if (video_info.statistics_show) - { - audio_statistics_t audio_stats = {0.0f}; - double stddev = 0.0; - struct retro_system_av_info *av_info = &video_driver_av_info; - unsigned red = 255; - unsigned green = 255; - unsigned blue = 255; - unsigned alpha = 255; - - video_monitor_fps_statistics(NULL, &stddev, NULL); - - video_info.osd_stat_params.x = 0.010f; - video_info.osd_stat_params.y = 0.950f; - video_info.osd_stat_params.scale = 1.0f; - video_info.osd_stat_params.full_screen = true; - video_info.osd_stat_params.drop_x = -2; - video_info.osd_stat_params.drop_y = -2; - video_info.osd_stat_params.drop_mod = 0.3f; - video_info.osd_stat_params.drop_alpha = 1.0f; - video_info.osd_stat_params.color = COLOR_ABGR( - red, green, blue, alpha); - - compute_audio_buffer_statistics(&audio_stats); - - snprintf(video_info.stat_text, - sizeof(video_info.stat_text), - "Video Statistics:\n -Frame rate: %6.2f fps\n -Frame time: %6.2f ms\n -Frame time deviation: %.3f %%\n" - " -Frame count: %" PRIu64"\n -Viewport: %d x %d x %3.2f\n" - "Audio Statistics:\n -Average buffer saturation: %.2f %%\n -Standard deviation: %.2f %%\n -Time spent close to underrun: %.2f %%\n -Time spent close to blocking: %.2f %%\n -Sample count: %d\n" - "Core Geometry:\n -Size: %u x %u\n -Max Size: %u x %u\n -Aspect: %3.2f\nCore Timing:\n -FPS: %3.2f\n -Sample Rate: %6.2f\n", - video_info.frame_rate, - video_info.frame_time, - 100.0 * stddev, - video_info.frame_count, - video_info.width, - video_info.height, - video_info.refresh_rate, - audio_stats.average_buffer_saturation, - audio_stats.std_deviation_percentage, - audio_stats.close_to_underrun, - audio_stats.close_to_blocking, - audio_stats.samples, - av_info->geometry.base_width, - av_info->geometry.base_height, - av_info->geometry.max_width, - av_info->geometry.max_height, - av_info->geometry.aspect_ratio, - av_info->timing.fps, - av_info->timing.sample_rate); - - /* TODO/FIXME - add OSD chat text here */ -#if 0 - snprintf(video_info.chat_text, sizeof(video_info.chat_text), - "anon: does retroarch netplay have in-game chat?\nradius: I don't know \u2605"); -#endif - } - - video_driver_active = current_video->frame( - video_driver_data, data, width, height, - video_driver_frame_count, - (unsigned)pitch, video_driver_msg, &video_info); - - video_driver_frame_count++; - - /* Display the FPS, with a higher priority. */ - if (video_info.fps_show || video_info.framecount_show) - { -#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) - if (!menu_widgets_set_fps_text(video_info.fps_text)) -#endif - runloop_msg_queue_push(video_info.fps_text, 2, 1, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); - } - - /* trigger set resolution*/ - if (video_info.crt_switch_resolution) - { - video_driver_crt_switching_active = true; - - if (video_info.crt_switch_resolution_super == 2560) - width = 2560; - if (video_info.crt_switch_resolution_super == 3840) - width = 3840; - if (video_info.crt_switch_resolution_super == 1920) - width = 1920; - - if (video_info.crt_switch_resolution_super == 1) - video_driver_crt_dynamic_super_width = true; - else - video_driver_crt_dynamic_super_width = false; - - crt_switch_res_core(width, height, video_driver_core_hz, video_info.crt_switch_resolution, video_info.crt_switch_center_adjust, video_info.monitor_index, video_driver_crt_dynamic_super_width); - } - else if (!video_info.crt_switch_resolution) - video_driver_crt_switching_active = false; - - /* trigger set resolution*/ -} - -void crt_switch_driver_reinit(void) -{ - video_driver_reinit(); -} - -void video_driver_display_type_set(enum rarch_display_type type) -{ - video_driver_display_type = type; -} - -uintptr_t video_driver_display_get(void) -{ - return video_driver_display; -} - -void video_driver_display_set(uintptr_t idx) -{ - video_driver_display = idx; -} - -enum rarch_display_type video_driver_display_type_get(void) -{ - return video_driver_display_type; -} - -void video_driver_window_set(uintptr_t idx) -{ - video_driver_window = idx; -} - -uintptr_t video_driver_window_get(void) -{ - return video_driver_window; -} - -bool video_driver_texture_load(void *data, - enum texture_filter_type filter_type, - uintptr_t *id) -{ -#ifdef HAVE_THREADS - bool is_threaded = video_driver_is_threaded_internal(); -#endif - if (!id || !video_driver_poke || !video_driver_poke->load_texture) - return false; - -#ifdef HAVE_THREADS - if (is_threaded) - video_context_driver_make_current(false); -#endif - - *id = video_driver_poke->load_texture(video_driver_data, data, - video_driver_is_threaded_internal(), - filter_type); - - return true; -} - -bool video_driver_texture_unload(uintptr_t *id) -{ -#ifdef HAVE_THREADS - bool is_threaded = video_driver_is_threaded_internal(); -#endif - if (!video_driver_poke || !video_driver_poke->unload_texture) - return false; - -#ifdef HAVE_THREADS - if (is_threaded) - video_context_driver_make_current(false); -#endif - - video_driver_poke->unload_texture(video_driver_data, *id); - *id = 0; - return true; -} - -void video_driver_build_info(video_frame_info_t *video_info) -{ - bool is_perfcnt_enable = false; - bool is_paused = false; - bool is_idle = false; - bool is_slowmotion = false; - settings_t *settings = NULL; - video_viewport_t *custom_vp = NULL; - struct retro_hw_render_callback *hwr = - video_driver_get_hw_context(); -#ifdef HAVE_THREADS - bool is_threaded = video_driver_is_threaded_internal(); - video_driver_threaded_lock(is_threaded); -#endif - settings = config_get_ptr(); - custom_vp = &settings->video_viewport_custom; - video_info->refresh_rate = settings->floats.video_refresh_rate; - video_info->crt_switch_resolution = settings->uints.crt_switch_resolution; - video_info->crt_switch_resolution_super = settings->uints.crt_switch_resolution_super; - video_info->crt_switch_center_adjust = settings->ints.crt_switch_center_adjust; - video_info->black_frame_insertion = settings->bools.video_black_frame_insertion; - video_info->hard_sync = settings->bools.video_hard_sync; - video_info->hard_sync_frames = settings->uints.video_hard_sync_frames; - video_info->fps_show = settings->bools.video_fps_show; - video_info->statistics_show = settings->bools.video_statistics_show; - video_info->framecount_show = settings->bools.video_framecount_show; - video_info->scale_integer = settings->bools.video_scale_integer; - video_info->aspect_ratio_idx = settings->uints.video_aspect_ratio_idx; - video_info->post_filter_record = settings->bools.video_post_filter_record; - video_info->input_menu_swap_ok_cancel_buttons = settings->bools.input_menu_swap_ok_cancel_buttons; - video_info->max_swapchain_images = settings->uints.video_max_swapchain_images; - video_info->windowed_fullscreen = settings->bools.video_windowed_fullscreen; - video_info->fullscreen = settings->bools.video_fullscreen || retroarch_is_forced_fullscreen(); - video_info->monitor_index = settings->uints.video_monitor_index; - video_info->shared_context = settings->bools.video_shared_context; - - if (libretro_get_shared_context() && hwr && hwr->context_type != RETRO_HW_CONTEXT_NONE) - video_info->shared_context = true; - - video_info->font_enable = settings->bools.video_font_enable; - video_info->font_msg_pos_x = settings->floats.video_msg_pos_x; - video_info->font_msg_pos_y = settings->floats.video_msg_pos_y; - video_info->font_msg_color_r = settings->floats.video_msg_color_r; - video_info->font_msg_color_g = settings->floats.video_msg_color_g; - video_info->font_msg_color_b = settings->floats.video_msg_color_b; - video_info->custom_vp_x = custom_vp->x; - video_info->custom_vp_y = custom_vp->y; - video_info->custom_vp_width = custom_vp->width; - video_info->custom_vp_height = custom_vp->height; - video_info->custom_vp_full_width = custom_vp->full_width; - video_info->custom_vp_full_height = custom_vp->full_height; - - video_info->fps_text[0] = '\0'; - - video_info->width = video_driver_width; - video_info->height = video_driver_height; - - video_info->use_rgba = video_driver_use_rgba; - - video_info->libretro_running = false; - video_info->msg_bgcolor_enable = settings->bools.video_msg_bgcolor_enable; - -#ifdef HAVE_MENU - video_info->menu_is_alive = menu_driver_is_alive(); - video_info->menu_footer_opacity = settings->floats.menu_footer_opacity; - video_info->menu_header_opacity = settings->floats.menu_header_opacity; - video_info->materialui_color_theme = settings->uints.menu_materialui_color_theme; - video_info->ozone_color_theme = settings->uints.menu_ozone_color_theme; - video_info->menu_shader_pipeline = settings->uints.menu_xmb_shader_pipeline; - video_info->xmb_theme = settings->uints.menu_xmb_theme; - video_info->xmb_color_theme = settings->uints.menu_xmb_color_theme; - video_info->timedate_enable = settings->bools.menu_timedate_enable; - video_info->battery_level_enable = settings->bools.menu_battery_level_enable; - video_info->xmb_shadows_enable = settings->bools.menu_xmb_shadows_enable; - video_info->xmb_alpha_factor = settings->uints.menu_xmb_alpha_factor; - video_info->menu_wallpaper_opacity = settings->floats.menu_wallpaper_opacity; - video_info->menu_framebuffer_opacity = settings->floats.menu_framebuffer_opacity; - - video_info->libretro_running = core_is_game_loaded(); -#else - video_info->menu_is_alive = false; - video_info->menu_footer_opacity = 0.0f; - video_info->menu_header_opacity = 0.0f; - video_info->materialui_color_theme = 0; - video_info->menu_shader_pipeline = 0; - video_info->xmb_color_theme = 0; - video_info->xmb_theme = 0; - video_info->timedate_enable = false; - video_info->battery_level_enable = false; - video_info->xmb_shadows_enable = false; - video_info->xmb_alpha_factor = 0.0f; - video_info->menu_framebuffer_opacity = 0.0f; - video_info->menu_wallpaper_opacity = 0.0f; -#endif - - runloop_get_status(&is_paused, &is_idle, &is_slowmotion, &is_perfcnt_enable); - - video_info->is_perfcnt_enable = is_perfcnt_enable; - video_info->runloop_is_paused = is_paused; - video_info->runloop_is_idle = is_idle; - video_info->runloop_is_slowmotion = is_slowmotion; - - video_info->input_driver_nonblock_state = input_driver_is_nonblock_state(); - - video_info->context_data = video_context_data; - - video_info->cb_update_window_title = current_video_context.update_window_title; - video_info->cb_swap_buffers = current_video_context.swap_buffers; - video_info->cb_get_metrics = current_video_context.get_metrics; - video_info->cb_set_resize = current_video_context.set_resize; - - video_info->userdata = video_driver_get_ptr(false); - -#ifdef HAVE_THREADS - video_driver_threaded_unlock(is_threaded); -#endif -} - -/** - * video_driver_translate_coord_viewport: - * @mouse_x : Pointer X coordinate. - * @mouse_y : Pointer Y coordinate. - * @res_x : Scaled X coordinate. - * @res_y : Scaled Y coordinate. - * @res_screen_x : Scaled screen X coordinate. - * @res_screen_y : Scaled screen Y coordinate. - * - * Translates pointer [X,Y] coordinates into scaled screen - * coordinates based on viewport info. - * - * Returns: true (1) if successful, false if video driver doesn't support - * viewport info. - **/ -bool video_driver_translate_coord_viewport( - struct video_viewport *vp, - int mouse_x, int mouse_y, - int16_t *res_x, int16_t *res_y, - int16_t *res_screen_x, int16_t *res_screen_y) -{ - int scaled_screen_x, scaled_screen_y, scaled_x, scaled_y; - int norm_vp_width = (int)vp->width; - int norm_vp_height = (int)vp->height; - int norm_full_vp_width = (int)vp->full_width; - int norm_full_vp_height = (int)vp->full_height; - - if (norm_full_vp_width <= 0 || norm_full_vp_height <= 0) - return false; - - if (mouse_x >= 0 && mouse_x <= norm_full_vp_width) - scaled_screen_x = ((2 * mouse_x * 0x7fff) - / norm_full_vp_width) - 0x7fff; - else - scaled_screen_x = -0x8000; /* OOB */ - - if (mouse_y >= 0 && mouse_y <= norm_full_vp_height) - scaled_screen_y = ((2 * mouse_y * 0x7fff) - / norm_full_vp_height) - 0x7fff; - else - scaled_screen_y = -0x8000; /* OOB */ - - mouse_x -= vp->x; - mouse_y -= vp->y; - - if (mouse_x >= 0 && mouse_x <= norm_vp_width) - scaled_x = ((2 * mouse_x * 0x7fff) - / norm_vp_width) - 0x7fff; - else - scaled_x = -0x8000; /* OOB */ - - if (mouse_y >= 0 && mouse_y <= norm_vp_height) - scaled_y = ((2 * mouse_y * 0x7fff) - / norm_vp_height) - 0x7fff; - else - scaled_y = -0x8000; /* OOB */ - - *res_x = scaled_x; - *res_y = scaled_y; - *res_screen_x = scaled_screen_x; - *res_screen_y = scaled_screen_y; - - return true; -} - -void video_driver_get_window_title(char *buf, unsigned len) -{ - if (buf && video_driver_window_title_update) - { - strlcpy(buf, video_driver_window_title, len); - video_driver_window_title_update = false; - } -} - -void video_driver_get_status(uint64_t *frame_count, bool * is_alive, - bool *is_focused) -{ - *frame_count = video_driver_frame_count; - *is_alive = current_video ? - current_video->alive(video_driver_data) : true; - *is_focused = video_driver_cb_has_focus(); -} - -/** - * find_video_context_driver_driver_index: - * @ident : Identifier of resampler driver to find. - * - * Finds graphics context driver index by @ident name. - * - * Returns: graphics context driver index if driver was found, otherwise - * -1. - **/ -static int find_video_context_driver_index(const char *ident) -{ - unsigned i; - for (i = 0; gfx_ctx_drivers[i]; i++) - if (string_is_equal_noncase(ident, gfx_ctx_drivers[i]->ident)) - return i; - return -1; -} - -/** - * find_prev_context_driver: - * - * Finds previous driver in graphics context driver array. - **/ -bool video_context_driver_find_prev_driver(void) -{ - settings_t *settings = config_get_ptr(); - int i = find_video_context_driver_index( - settings->arrays.video_context_driver); - - if (i > 0) - { - strlcpy(settings->arrays.video_context_driver, - gfx_ctx_drivers[i - 1]->ident, - sizeof(settings->arrays.video_context_driver)); - return true; - } - - RARCH_WARN("Couldn't find any previous video context driver.\n"); - return false; -} - -/** - * find_next_context_driver: - * - * Finds next driver in graphics context driver array. - **/ -bool video_context_driver_find_next_driver(void) -{ - settings_t *settings = config_get_ptr(); - int i = find_video_context_driver_index( - settings->arrays.video_context_driver); - - if (i >= 0 && gfx_ctx_drivers[i + 1]) - { - strlcpy(settings->arrays.video_context_driver, - gfx_ctx_drivers[i + 1]->ident, - sizeof(settings->arrays.video_context_driver)); - return true; - } - - RARCH_WARN("Couldn't find any next video context driver.\n"); - return false; -} - -/** - * video_context_driver_init: - * @data : Input data. - * @ctx : Graphics context driver to initialize. - * @ident : Identifier of graphics context driver to find. - * @api : API of higher-level graphics API. - * @major : Major version number of higher-level graphics API. - * @minor : Minor version number of higher-level graphics API. - * @hw_render_ctx : Request a graphics context driver capable of - * hardware rendering? - * - * Initialize graphics context driver. - * - * Returns: graphics context driver if successfully initialized, - * otherwise NULL. - **/ -static const gfx_ctx_driver_t *video_context_driver_init( - void *data, - const gfx_ctx_driver_t *ctx, - const char *ident, - enum gfx_ctx_api api, unsigned major, - unsigned minor, bool hw_render_ctx, - void **ctx_data) -{ - video_frame_info_t video_info; - - if (!ctx->bind_api(data, api, major, minor)) - { - RARCH_WARN("Failed to bind API (#%u, version %u.%u)" - " on context driver \"%s\".\n", - (unsigned)api, major, minor, ctx->ident); - - return NULL; - } - - video_driver_build_info(&video_info); - - if (!(*ctx_data = ctx->init(&video_info, data))) - return NULL; - - if (ctx->bind_hw_render) - ctx->bind_hw_render(*ctx_data, - video_info.shared_context && hw_render_ctx); - - return ctx; -} - -/** - * video_context_driver_init_first: - * @data : Input data. - * @ident : Identifier of graphics context driver to find. - * @api : API of higher-level graphics API. - * @major : Major version number of higher-level graphics API. - * @minor : Minor version number of higher-level graphics API. - * @hw_render_ctx : Request a graphics context driver capable of - * hardware rendering? - * - * Finds first suitable graphics context driver and initializes. - * - * Returns: graphics context driver if found, otherwise NULL. - **/ -const gfx_ctx_driver_t *video_context_driver_init_first(void *data, - const char *ident, enum gfx_ctx_api api, unsigned major, - unsigned minor, bool hw_render_ctx, void **ctx_data) -{ - int i = find_video_context_driver_index(ident); - - if (i >= 0) - { - const gfx_ctx_driver_t *ctx = video_context_driver_init(data, gfx_ctx_drivers[i], ident, - api, major, minor, hw_render_ctx, ctx_data); - if (ctx) - { - video_context_data = *ctx_data; - return ctx; - } - } - - for (i = 0; gfx_ctx_drivers[i]; i++) - { - const gfx_ctx_driver_t *ctx = - video_context_driver_init(data, gfx_ctx_drivers[i], ident, - api, major, minor, hw_render_ctx, ctx_data); - - if (ctx) - { - video_context_data = *ctx_data; - return ctx; - } - } - - return NULL; -} - -bool video_context_driver_init_image_buffer(const video_info_t *data) -{ - if ( - current_video_context.image_buffer_init - && current_video_context.image_buffer_init( - video_context_data, data)) - return true; - return false; -} - -bool video_context_driver_write_to_image_buffer(gfx_ctx_image_t *img) -{ - if ( - current_video_context.image_buffer_write - && current_video_context.image_buffer_write(video_context_data, - img->frame, img->width, img->height, img->pitch, - img->rgb32, img->index, img->handle)) - return true; - return false; -} - -bool video_context_driver_get_video_output_prev(void) -{ - if (!current_video_context.get_video_output_prev) - return false; - current_video_context.get_video_output_prev(video_context_data); - return true; -} - -bool video_context_driver_get_video_output_next(void) -{ - if (!current_video_context.get_video_output_next) - return false; - current_video_context.get_video_output_next(video_context_data); - return true; -} - -void video_context_driver_make_current(bool release) -{ - if (current_video_context.make_current) - current_video_context.make_current(release); -} - -bool video_context_driver_translate_aspect(gfx_ctx_aspect_t *aspect) -{ - if (!video_context_data || !aspect) - return false; - if (!current_video_context.translate_aspect) - return false; - *aspect->aspect = current_video_context.translate_aspect( - video_context_data, aspect->width, aspect->height); - return true; -} - -void video_context_driver_free(void) -{ - if (current_video_context.destroy) - current_video_context.destroy(video_context_data); - video_context_driver_destroy(); - video_context_data = NULL; -} - -bool video_context_driver_get_video_output_size(gfx_ctx_size_t *size_data) -{ - if (!size_data) - return false; - if (!current_video_context.get_video_output_size) - return false; - current_video_context.get_video_output_size(video_context_data, - size_data->width, size_data->height); - return true; -} - -bool video_context_driver_swap_interval(int *interval) -{ - gfx_ctx_flags_t flags; - int current_interval = *interval; - settings_t *settings = config_get_ptr(); - bool adaptive_vsync_enabled = video_driver_get_all_flags(&flags, GFX_CTX_FLAGS_ADAPTIVE_VSYNC) && settings->bools.video_adaptive_vsync; - - if (!current_video_context.swap_interval) - return false; - if (adaptive_vsync_enabled && current_interval == 1) - current_interval = -1; - current_video_context.swap_interval(video_context_data, current_interval); - return true; -} - -bool video_context_driver_get_proc_address(gfx_ctx_proc_address_t *proc) -{ - if (!current_video_context.get_proc_address) - return false; - - proc->addr = current_video_context.get_proc_address(proc->sym); - - return true; -} - -bool video_context_driver_get_metrics(gfx_ctx_metrics_t *metrics) -{ - if ( - current_video_context.get_metrics(video_context_data, - metrics->type, - metrics->value)) - return true; - return false; -} - -bool video_context_driver_get_refresh_rate(float *refresh_rate) -{ - float refresh_holder = 0; - - if (!current_video_context.get_refresh_rate || !refresh_rate) - return false; - if (!video_context_data) - return false; - - if (!video_driver_crt_switching_active) - if (refresh_rate) - *refresh_rate = - current_video_context.get_refresh_rate(video_context_data); - - if (video_driver_crt_switching_active) - { - if (refresh_rate) - refresh_holder = - current_video_context.get_refresh_rate(video_context_data); - if (refresh_holder != video_driver_core_hz) /* Fix for incorrect interlace detsction -- HARD SET VSNC TO REQUIRED REFRESH FOR CRT*/ - *refresh_rate = video_driver_core_hz; - } - - return true; -} - -bool video_context_driver_input_driver(gfx_ctx_input_t *inp) -{ - settings_t *settings = config_get_ptr(); - const char *joypad_name = settings ? - settings->arrays.input_joypad_driver : NULL; - - if (!current_video_context.input_driver) - return false; - current_video_context.input_driver( - video_context_data, joypad_name, - inp->input, inp->input_data); - return true; -} - -bool video_context_driver_suppress_screensaver(bool *bool_data) -{ - if ( video_context_data - && current_video_context.suppress_screensaver( - video_context_data, *bool_data)) - return true; - return false; -} - -bool video_context_driver_get_ident(gfx_ctx_ident_t *ident) -{ - if (!ident) - return false; - ident->ident = current_video_context.ident; - return true; -} - -bool video_context_driver_set_video_mode(gfx_ctx_mode_t *mode_info) -{ - video_frame_info_t video_info; - - if (!current_video_context.set_video_mode) - return false; - - video_driver_build_info(&video_info); - - if (!current_video_context.set_video_mode( - video_context_data, &video_info, mode_info->width, - mode_info->height, mode_info->fullscreen)) - return false; - return true; -} - -bool video_context_driver_get_video_size(gfx_ctx_mode_t *mode_info) -{ - if (!current_video_context.get_video_size) - return false; - current_video_context.get_video_size(video_context_data, - &mode_info->width, &mode_info->height); - return true; -} - -bool video_context_driver_show_mouse(bool *bool_data) -{ - if (!current_video_context.show_mouse) - return false; - current_video_context.show_mouse(video_context_data, *bool_data); - return true; -} - -bool video_context_driver_get_flags(gfx_ctx_flags_t *flags) -{ - if (!current_video_context.get_flags) - return false; - - if (deferred_video_context_driver_set_flags) - { - flags->flags = deferred_flag_data.flags; - deferred_video_context_driver_set_flags = false; - return true; - } - - flags->flags = current_video_context.get_flags(video_context_data); - return true; -} - -static bool video_driver_get_flags(gfx_ctx_flags_t *flags) -{ - if (!video_driver_poke || !video_driver_poke->get_flags) - return false; - flags->flags = video_driver_poke->get_flags(video_driver_data); - return true; -} - -bool video_driver_get_all_flags(gfx_ctx_flags_t *flags, enum display_flags flag) -{ - if (!flags) - return false; - - if (video_driver_get_flags(flags)) - if (BIT32_GET(flags->flags, flag)) - return true; - - flags->flags = 0; - - if (video_context_driver_get_flags(flags)) - if (BIT32_GET(flags->flags, flag)) - return true; - - return false; -} - -bool video_context_driver_set_flags(gfx_ctx_flags_t *flags) -{ - if (!flags) - return false; - if (!current_video_context.set_flags) - { - deferred_flag_data.flags = flags->flags; - deferred_video_context_driver_set_flags = true; - return false; - } - - current_video_context.set_flags(video_context_data, flags->flags); - return true; -} - -enum gfx_ctx_api video_context_driver_get_api(void) -{ - enum gfx_ctx_api ctx_api = video_context_data ? - current_video_context.get_api(video_context_data) : GFX_CTX_NONE; - - if (ctx_api == GFX_CTX_NONE) - { - const char *video_driver = video_driver_get_ident(); - if (string_is_equal(video_driver, "d3d9")) - return GFX_CTX_DIRECT3D9_API; - else if (string_is_equal(video_driver, "d3d10")) - return GFX_CTX_DIRECT3D10_API; - else if (string_is_equal(video_driver, "d3d11")) - return GFX_CTX_DIRECT3D11_API; - else if (string_is_equal(video_driver, "d3d12")) - return GFX_CTX_DIRECT3D12_API; - else if (string_is_equal(video_driver, "gx2")) - return GFX_CTX_GX2_API; - else if (string_is_equal(video_driver, "gx")) - return GFX_CTX_GX_API; - else if (string_is_equal(video_driver, "gl")) - return GFX_CTX_OPENGL_API; - else if (string_is_equal(video_driver, "gl1")) - return GFX_CTX_OPENGL_API; - else if (string_is_equal(video_driver, "glcore")) - return GFX_CTX_OPENGL_API; - else if (string_is_equal(video_driver, "vulkan")) - return GFX_CTX_VULKAN_API; - else if (string_is_equal(video_driver, "metal")) - return GFX_CTX_METAL_API; - - return GFX_CTX_NONE; - } - - return ctx_api; -} - -bool video_driver_has_windowed(void) -{ -#if !(defined(RARCH_CONSOLE) || defined(RARCH_MOBILE)) - if (video_driver_data && current_video->has_windowed) - return current_video->has_windowed(video_driver_data); - else if (video_context_data && current_video_context.has_windowed) - return current_video_context.has_windowed(video_context_data); -#endif - return false; -} - -bool video_driver_cached_frame_has_valid_framebuffer(void) -{ - if (frame_cache_data) - return (frame_cache_data == RETRO_HW_FRAME_BUFFER_VALID); - return false; -} - - -bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader) -{ - void *video_driver = video_driver_get_ptr(true); - const video_poke_interface_t *video_poke = video_driver_get_poke(); - - shader->data = NULL; - if (!video_poke || !video_driver || !video_poke->get_current_shader) - return false; - shader->data = video_poke->get_current_shader(video_driver); - return true; -} - -float video_driver_get_refresh_rate(void) -{ - if (video_driver_poke && video_driver_poke->get_refresh_rate) - return video_driver_poke->get_refresh_rate(video_driver_data); - - return 0.0f; -} - -#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) -bool video_driver_has_widgets(void) -{ - return current_video && current_video->menu_widgets_enabled - && current_video->menu_widgets_enabled(video_driver_data); -} -#endif - -void video_driver_set_gpu_device_string(const char *str) -{ - strlcpy(video_driver_gpu_device_string, str, sizeof(video_driver_gpu_device_string)); -} - -const char* video_driver_get_gpu_device_string(void) -{ - return video_driver_gpu_device_string; -} - -void video_driver_set_gpu_api_version_string(const char *str) -{ - strlcpy(video_driver_gpu_api_version_string, str, sizeof(video_driver_gpu_api_version_string)); -} - -const char* video_driver_get_gpu_api_version_string(void) -{ - return video_driver_gpu_api_version_string; -} - -/* string list stays owned by the caller and must be available at all times after the video driver is inited */ -void video_driver_set_gpu_api_devices(enum gfx_ctx_api api, struct string_list *list) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(gpu_map); i++) - { - if (api == gpu_map[i].api) - { - gpu_map[i].list = list; - break; - } - } -} - -struct string_list* video_driver_get_gpu_api_devices(enum gfx_ctx_api api) -{ - int i; - - for (i = 0; i < ARRAY_SIZE(gpu_map); i++) - { - if (api == gpu_map[i].api) - return gpu_map[i].list; - } - - return NULL; -} - diff --git a/gfx/video_driver.h b/gfx/video_driver.h deleted file mode 100644 index d53bcceebc..0000000000 --- a/gfx/video_driver.h +++ /dev/null @@ -1,1300 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * - * 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 __VIDEO_DRIVER__H -#define __VIDEO_DRIVER__H - -#include -#include -#include - -#include -#include -#include -#include -#include - -#ifdef HAVE_CONFIG_H -#include "../config.h" -#endif - -#ifdef HAVE_OVERLAY -#include "../input/input_overlay.h" -#endif - -#ifdef HAVE_VIDEO_LAYOUT -#include "video_layout.h" -#endif - -#include "video_defines.h" -#include "video_coord_array.h" -#include "video_filter.h" -#include "video_shader_parse.h" - -#include "../input/input_types.h" - -#define RARCH_SCALE_BASE 256 - -#include "video_shader_parse.h" - -#define VIDEO_SHADER_STOCK_BLEND (GFX_MAX_SHADERS - 1) -#define VIDEO_SHADER_MENU (GFX_MAX_SHADERS - 2) -#define VIDEO_SHADER_MENU_2 (GFX_MAX_SHADERS - 3) -#define VIDEO_SHADER_MENU_3 (GFX_MAX_SHADERS - 4) -#define VIDEO_SHADER_MENU_4 (GFX_MAX_SHADERS - 5) -#define VIDEO_SHADER_MENU_5 (GFX_MAX_SHADERS - 6) -#define VIDEO_SHADER_MENU_6 (GFX_MAX_SHADERS - 7) - -#if defined(_XBOX360) -#define DEFAULT_SHADER_TYPE RARCH_SHADER_HLSL -#elif defined(__PSL1GHT__) || defined(HAVE_OPENGLES2) || defined(HAVE_GLSL) -#define DEFAULT_SHADER_TYPE RARCH_SHADER_GLSL -#elif defined(__CELLOS_LV2__) || defined(HAVE_CG) -#define DEFAULT_SHADER_TYPE RARCH_SHADER_CG -#else -#define DEFAULT_SHADER_TYPE RARCH_SHADER_NONE -#endif - -RETRO_BEGIN_DECLS - -#ifndef MAX_EGLIMAGE_TEXTURES -#define MAX_EGLIMAGE_TEXTURES 32 -#endif - -#define MAX_VARIABLES 64 - -enum -{ - TEXTURES = 8, - TEXTURESMASK = TEXTURES - 1 -}; - -struct LinkInfo -{ - unsigned tex_w, tex_h; - struct video_shader_pass *pass; -}; - -enum gfx_ctx_api -{ - GFX_CTX_NONE = 0, - GFX_CTX_OPENGL_API, - GFX_CTX_OPENGL_ES_API, - GFX_CTX_DIRECT3D8_API, - GFX_CTX_DIRECT3D9_API, - GFX_CTX_DIRECT3D10_API, - GFX_CTX_DIRECT3D11_API, - GFX_CTX_DIRECT3D12_API, - GFX_CTX_OPENVG_API, - GFX_CTX_VULKAN_API, - GFX_CTX_SIXEL_API, - GFX_CTX_METAL_API, - GFX_CTX_GDI_API, - GFX_CTX_GX_API, - GFX_CTX_GX2_API -}; - -enum display_metric_types -{ - DISPLAY_METRIC_NONE = 0, - DISPLAY_METRIC_MM_WIDTH, - DISPLAY_METRIC_MM_HEIGHT, - DISPLAY_METRIC_DPI, - DISPLAY_METRIC_PIXEL_WIDTH, - DISPLAY_METRIC_PIXEL_HEIGHT -}; - -enum display_flags -{ - GFX_CTX_FLAGS_NONE = 0, - GFX_CTX_FLAGS_GL_CORE_CONTEXT, - GFX_CTX_FLAGS_MULTISAMPLING, - GFX_CTX_FLAGS_CUSTOMIZABLE_SWAPCHAIN_IMAGES, - GFX_CTX_FLAGS_HARD_SYNC, - GFX_CTX_FLAGS_BLACK_FRAME_INSERTION, - GFX_CTX_FLAGS_MENU_FRAME_FILTERING, - GFX_CTX_FLAGS_ADAPTIVE_VSYNC, - GFX_CTX_FLAGS_SHADERS_GLSL, - GFX_CTX_FLAGS_SHADERS_CG, - GFX_CTX_FLAGS_SHADERS_HLSL, - GFX_CTX_FLAGS_SHADERS_SLANG, - GFX_CTX_FLAGS_SCREENSHOTS_SUPPORTED -}; - -enum shader_uniform_type -{ - UNIFORM_1F = 0, - UNIFORM_2F, - UNIFORM_3F, - UNIFORM_4F, - UNIFORM_1FV, - UNIFORM_2FV, - UNIFORM_3FV, - UNIFORM_4FV, - UNIFORM_1I -}; - -enum shader_program_type -{ - SHADER_PROGRAM_VERTEX = 0, - SHADER_PROGRAM_FRAGMENT, - SHADER_PROGRAM_COMBINED -}; - -struct shader_program_info -{ - bool is_file; - const char *vertex; - const char *fragment; - const char *combined; - unsigned idx; - void *data; -}; - -struct uniform_info -{ - bool enabled; - - int32_t location; - int32_t count; - unsigned type; /* shader uniform type */ - - struct - { - enum shader_program_type type; - const char *ident; - uint32_t idx; - bool add_prefix; - bool enable; - } lookup; - - struct - { - struct - { - intptr_t v0; - intptr_t v1; - intptr_t v2; - intptr_t v3; - } integer; - - intptr_t *integerv; - - struct - { - uintptr_t v0; - uintptr_t v1; - uintptr_t v2; - uintptr_t v3; - } unsigned_integer; - - uintptr_t *unsigned_integerv; - - struct - { - float v0; - float v1; - float v2; - float v3; - } f; - - float *floatv; - } result; -}; - -typedef struct shader_backend -{ - void *(*init)(void *data, const char *path); - void (*init_menu_shaders)(void *data); - void (*deinit)(void *data); - - /* Set shader parameters. */ - void (*set_params)(void *data, void *shader_data); - - void (*set_uniform_parameter)(void *data, struct uniform_info *param, - void *uniform_data); - - /* Compile a shader program. */ - bool (*compile_program)(void *data, unsigned idx, - void *program_data, struct shader_program_info *program_info); - - /* Use a shader program specified by variable 'index'. */ - void (*use)(void *data, void *shader_data, unsigned index, bool set_active); - - /* Returns the number of currently loaded shaders. */ - unsigned (*num_shaders)(void *data); - - bool (*filter_type)(void *data, unsigned index, bool *smooth); - enum gfx_wrap_type (*wrap_type)(void *data, unsigned index); - void (*shader_scale)(void *data, - unsigned index, struct gfx_fbo_scale *scale); - bool (*set_coords)(void *shader_data, const struct video_coords *coords); - bool (*set_mvp)(void *shader_data, const void *mat_data); - unsigned (*get_prev_textures)(void *data); - bool (*get_feedback_pass)(void *data, unsigned *pass); - bool (*mipmap_input)(void *data, unsigned index); - - struct video_shader *(*get_current_shader)(void *data); - - void (*get_flags)(uint32_t*); - - enum rarch_shader_type type; - - /* Human readable string. */ - const char *ident; -} shader_backend_t; - -typedef struct video_shader_ctx_init -{ - enum rarch_shader_type shader_type; - const char *path; - const shader_backend_t *shader; - void *data; - void *shader_data; - struct - { - bool core_context_enabled; - } gl; -} video_shader_ctx_init_t; - -typedef struct video_shader_ctx_params -{ - unsigned width; - unsigned height; - unsigned tex_width; - unsigned tex_height; - unsigned out_width; - unsigned out_height; - unsigned frame_counter; - unsigned fbo_info_cnt; - void *data; - const void *info; - const void *prev_info; - const void *feedback_info; - const void *fbo_info; -} video_shader_ctx_params_t; - -typedef struct video_shader_ctx_coords -{ - void *handle_data; - const void *data; -} video_shader_ctx_coords_t; - -typedef struct video_shader_ctx_scale -{ - unsigned idx; - struct gfx_fbo_scale *scale; -} video_shader_ctx_scale_t; - -typedef struct video_shader_ctx_info -{ - bool set_active; - unsigned num; - unsigned idx; - void *data; -} video_shader_ctx_info_t; - -typedef struct video_shader_ctx_mvp -{ - void *data; - const void *matrix; -} video_shader_ctx_mvp_t; - -typedef struct video_shader_ctx_filter -{ - unsigned index; - bool *smooth; -} video_shader_ctx_filter_t; - -typedef struct video_shader_ctx -{ - struct video_shader *data; -} video_shader_ctx_t; - -typedef struct video_shader_ctx_texture -{ - unsigned id; -} video_shader_ctx_texture_t; - -typedef void (*gfx_ctx_proc_t)(void); - -typedef struct video_info -{ - /* Launch in fullscreen mode instead of windowed mode. */ - bool fullscreen; - - /* Start with V-Sync enabled. */ - bool vsync; - - /* If true, the output image should have the aspect ratio - * as set in aspect_ratio. */ - bool force_aspect; - - bool font_enable; - - /* Width of window. - * If fullscreen mode is requested, - * a width of 0 means the resolution of the - * desktop should be used. */ - unsigned width; - - /* Height of window. - * If fullscreen mode is requested, - * a height of 0 means the resolutiof the desktop should be used. - */ - unsigned height; - - int swap_interval; - -#ifdef GEKKO - bool vfilter; -#endif - - /* If true, applies bilinear filtering to the image, - * otherwise nearest filtering. */ - bool smooth; - - bool is_threaded; - - /* Use 32bit RGBA rather than native RGB565/XBGR1555. - * - * XRGB1555 format is 16-bit and has byte ordering: 0RRRRRGGGGGBBBBB, - * in native endian. - * - * ARGB8888 is AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB, native endian. - * Alpha channel should be disregarded. - * */ - bool rgb32; - -#ifdef GEKKO - /* TODO - we can't really have driver system-specific - * variables in here. There should be some - * kind of publicly accessible driver implementation - * video struct for specific things like this. - */ - - /* Wii-specific settings. Ignored for everything else. */ - unsigned viwidth; -#endif - - /* - * input_scale defines the maximum size of the picture that will - * ever be used with the frame callback. - * - * The maximum resolution is a multiple of 256x256 size (RARCH_SCALE_BASE), - * so an input scale of 2 means you should allocate a texture or of 512x512. - * - * Maximum input size: RARCH_SCALE_BASE * input_scale - */ - unsigned input_scale; - - uintptr_t parent; -} video_info_t; - -typedef struct video_frame_info -{ - bool input_menu_swap_ok_cancel_buttons; - bool input_driver_nonblock_state; - bool shared_context; - bool black_frame_insertion; - bool hard_sync; - bool fps_show; - bool statistics_show; - bool framecount_show; - bool scale_integer; - bool post_filter_record; - bool windowed_fullscreen; - bool fullscreen; - bool font_enable; - bool use_rgba; - bool libretro_running; - bool xmb_shadows_enable; - bool battery_level_enable; - bool timedate_enable; - bool runloop_is_slowmotion; - bool runloop_is_idle; - bool runloop_is_paused; - bool is_perfcnt_enable; - bool menu_is_alive; - bool msg_bgcolor_enable; - - int custom_vp_x; - int custom_vp_y; - int crt_switch_center_adjust; - - unsigned hard_sync_frames; - unsigned aspect_ratio_idx; - unsigned max_swapchain_images; - unsigned monitor_index; - unsigned crt_switch_resolution; - unsigned crt_switch_resolution_super; - unsigned width; - unsigned height; - unsigned xmb_theme; - unsigned xmb_color_theme; - unsigned menu_shader_pipeline; - unsigned materialui_color_theme; - unsigned ozone_color_theme; - unsigned custom_vp_width; - unsigned custom_vp_height; - unsigned custom_vp_full_width; - unsigned custom_vp_full_height; - - float menu_wallpaper_opacity; - float menu_framebuffer_opacity; - float menu_header_opacity; - float menu_footer_opacity; - float refresh_rate; - float font_msg_pos_x; - float font_msg_pos_y; - float font_msg_color_r; - float font_msg_color_g; - float font_msg_color_b; - float xmb_alpha_factor; - - char fps_text[128]; - char stat_text[512]; - char chat_text[256]; - - uint64_t frame_count; - float frame_time; - float frame_rate; - - struct - { - float x; - float y; - float scale; - /* Drop shadow color multiplier. */ - float drop_mod; - /* Drop shadow offset. - * If both are 0, no drop shadow will be rendered. */ - int drop_x, drop_y; - /* Drop shadow alpha */ - float drop_alpha; - /* ABGR. Use the macros. */ - uint32_t color; - bool full_screen; - enum text_alignment text_align; - } osd_stat_params; - - void (*cb_update_window_title)(void*, void *); - void (*cb_swap_buffers)(void*, void *); - bool (*cb_get_metrics)(void *data, enum display_metric_types type, - float *value); - bool (*cb_set_resize)(void*, unsigned, unsigned); - - void *context_data; - void *userdata; -} video_frame_info_t; - -typedef void (*update_window_title_cb)(void*, void*); -typedef bool (*get_metrics_cb)(void *data, enum display_metric_types type, - float *value); -typedef bool (*set_resize_cb)(void*, unsigned, unsigned); - -typedef struct gfx_ctx_driver -{ - /* The opaque pointer is the underlying video driver data (e.g. gl_t for - * OpenGL contexts). Although not advised, the context driver is allowed - * to hold a pointer to it as the context never outlives the video driver. - * - * The context driver is responsible for it's own data.*/ - void* (*init)(video_frame_info_t *video_info, void *video_driver); - void (*destroy)(void *data); - - enum gfx_ctx_api (*get_api)(void *data); - - /* Which API to bind to. */ - bool (*bind_api)(void *video_driver, enum gfx_ctx_api, - unsigned major, unsigned minor); - - /* Sets the swap interval. */ - void (*swap_interval)(void *data, int); - - /* Sets video mode. Creates a window, etc. */ - bool (*set_video_mode)(void*, video_frame_info_t *video_info, unsigned, unsigned, bool); - - /* Gets current window size. - * If not initialized yet, it returns current screen size. */ - void (*get_video_size)(void*, unsigned*, unsigned*); - - float (*get_refresh_rate)(void*); - - void (*get_video_output_size)(void*, unsigned*, unsigned*); - - void (*get_video_output_prev)(void*); - - void (*get_video_output_next)(void*); - - get_metrics_cb get_metrics; - - /* Translates a window size to an aspect ratio. - * In most cases this will be just width / height, but - * some contexts will better know which actual aspect ratio is used. - * This can be NULL to assume the default behavior. - */ - float (*translate_aspect)(void*, unsigned, unsigned); - - /* Asks driver to update window title (FPS, etc). */ - update_window_title_cb update_window_title; - - /* Queries for resize and quit events. - * Also processes events. */ - void (*check_window)(void*, bool*, bool*, - unsigned*, unsigned*, bool); - - /* Acknowledge a resize event. This is needed for some APIs. - * Most backends will ignore this. */ - set_resize_cb set_resize; - - /* Checks if window has input focus. */ - bool (*has_focus)(void*); - - /* Should the screensaver be suppressed? */ - bool (*suppress_screensaver)(void *data, bool enable); - - /* Checks if context driver has windowed support. */ - bool (*has_windowed)(void*); - - /* Swaps buffers. VBlank sync depends on - * earlier calls to swap_interval. */ - void (*swap_buffers)(void*, void *); - - /* Most video backends will want to use a certain input driver. - * Checks for it here. */ - void (*input_driver)(void*, const char *, const input_driver_t**, void**); - - /* Wraps whatever gl_proc_address() there is. - * Does not take opaque, to avoid lots of ugly wrapper code. */ - gfx_ctx_proc_t (*get_proc_address)(const char*); - - /* Returns true if this context supports EGLImage buffers for - * screen drawing and was initalized correctly. */ - bool (*image_buffer_init)(void*, const video_info_t*); - - /* Writes the frame to the EGLImage and sets image_handle to it. - * Returns true if a new image handle is created. - * Always returns true the first time it's called for a new index. - * The graphics core must handle a change in the handle correctly. */ - bool (*image_buffer_write)(void*, const void *frame, unsigned width, - unsigned height, unsigned pitch, bool rgb32, - unsigned index, void **image_handle); - - /* Shows or hides mouse. Can be NULL if context doesn't - * have a concept of mouse pointer. */ - void (*show_mouse)(void *data, bool state); - - /* Human readable string. */ - const char *ident; - - uint32_t (*get_flags)(void *data); - - void (*set_flags)(void *data, uint32_t flags); - - /* Optional. Binds HW-render offscreen context. */ - void (*bind_hw_render)(void *data, bool enable); - - /* Optional. Gets base data for the context which is used by the driver. - * This is mostly relevant for graphics APIs such as Vulkan - * which do not have global context state. */ - void *(*get_context_data)(void *data); - - /* Optional. Makes driver context (only GLX right now) - * active for this thread. */ - void (*make_current)(bool release); -} gfx_ctx_driver_t; - -typedef struct gfx_ctx_size -{ - bool *quit; - bool *resize; - unsigned *width; - unsigned *height; -} gfx_ctx_size_t; - -typedef struct gfx_ctx_mode -{ - unsigned width; - unsigned height; - bool fullscreen; -} gfx_ctx_mode_t; - -typedef struct gfx_ctx_metrics -{ - enum display_metric_types type; - float *value; -} gfx_ctx_metrics_t; - -typedef struct gfx_ctx_aspect -{ - float *aspect; - unsigned width; - unsigned height; -} gfx_ctx_aspect_t; - -typedef struct gfx_ctx_image -{ - const void *frame; - unsigned width; - unsigned height; - unsigned pitch; - unsigned index; - bool rgb32; - void **handle; -} gfx_ctx_image_t; - -typedef struct gfx_ctx_input -{ - const input_driver_t **input; - void **input_data; -} gfx_ctx_input_t; - -typedef struct gfx_ctx_proc_address -{ - const char *sym; - retro_proc_address_t addr; -} gfx_ctx_proc_address_t; - -typedef struct gfx_ctx_ident -{ - const char *ident; -} gfx_ctx_ident_t; - -struct aspect_ratio_elem -{ - char name[64]; - float value; -}; - -/* Optionally implemented interface to poke more - * deeply into video driver. */ - -typedef struct video_poke_interface -{ - uint32_t (*get_flags)(void *data); - uintptr_t (*load_texture)(void *video_data, void *data, - bool threaded, enum texture_filter_type filter_type); - void (*unload_texture)(void *data, uintptr_t id); - void (*set_video_mode)(void *data, unsigned width, - unsigned height, bool fullscreen); - float (*get_refresh_rate)(void *data); - void (*set_filtering)(void *data, unsigned index, bool smooth); - void (*get_video_output_size)(void *data, - unsigned *width, unsigned *height); - - /* Move index to previous resolution */ - void (*get_video_output_prev)(void *data); - - /* Move index to next resolution */ - void (*get_video_output_next)(void *data); - - uintptr_t (*get_current_framebuffer)(void *data); - retro_proc_address_t (*get_proc_address)(void *data, const char *sym); - void (*set_aspect_ratio)(void *data, unsigned aspectratio_index); - void (*apply_state_changes)(void *data); - - /* Update texture. */ - void (*set_texture_frame)(void *data, const void *frame, bool rgb32, - unsigned width, unsigned height, float alpha); - /* Enable or disable rendering. */ - void (*set_texture_enable)(void *data, bool enable, bool full_screen); - void (*set_osd_msg)(void *data, video_frame_info_t *video_info, - const char *msg, - const void *params, void *font); - - void (*show_mouse)(void *data, bool state); - void (*grab_mouse_toggle)(void *data); - - struct video_shader *(*get_current_shader)(void *data); - bool (*get_current_software_framebuffer)(void *data, - struct retro_framebuffer *framebuffer); - bool (*get_hw_render_interface)(void *data, - const struct retro_hw_render_interface **iface); -} video_poke_interface_t; - -/* msg is for showing a message on the screen - * along with the video frame. */ -typedef bool (*video_driver_frame_t)(void *data, - const void *frame, unsigned width, - unsigned height, uint64_t frame_count, - unsigned pitch, const char *msg, video_frame_info_t *video_info); - -typedef struct video_driver -{ - /* Should the video driver act as an input driver as well? - * The video initialization might preinitialize an input driver - * to override the settings in case the video driver relies on - * input driver for event handling. */ - void *(*init)(const video_info_t *video, - const input_driver_t **input, - void **input_data); - - /* Updates frame on the screen. - * Frame can be either XRGB1555, RGB565 or ARGB32 format - * depending on rgb32 setting in video_info_t. - * Pitch is the distance in bytes between two scanlines in memory. - * - * When msg is non-NULL, - * it's a message that should be displayed to the user. */ - video_driver_frame_t frame; - - /* Should we care about syncing to vblank? Fast forwarding. - * - * Requests nonblocking operation. - * - * True = VSync is turned off. - * False = VSync is turned on. - * */ - void (*set_nonblock_state)(void *data, bool toggle); - - /* Is the window still active? */ - bool (*alive)(void *data); - - /* Does the window have focus? */ - bool (*focus)(void *data); - - /* Should the screensaver be suppressed? */ - bool (*suppress_screensaver)(void *data, bool enable); - - /* Does the graphics context support windowed mode? */ - bool (*has_windowed)(void *data); - - /* Sets shader. Might not be implemented. Will be moved to - * poke_interface later. */ - bool (*set_shader)(void *data, enum rarch_shader_type type, - const char *path); - - /* Frees driver. */ - void (*free)(void *data); - - /* Human-readable identifier. */ - const char *ident; - - void (*set_viewport)(void *data, unsigned width, unsigned height, - bool force_full, bool allow_rotate); - - void (*set_rotation)(void *data, unsigned rotation); - void (*viewport_info)(void *data, struct video_viewport *vp); - - /* Reads out in BGR byte order (24bpp). */ - bool (*read_viewport)(void *data, uint8_t *buffer, bool is_idle); - - /* Returns a pointer to a newly allocated buffer that can - * (and must) be passed to free() by the caller, containing a - * copy of the current raw frame in the active pixel format - * and sets width, height and pitch to the correct values. */ - void* (*read_frame_raw)(void *data, unsigned *width, - unsigned *height, size_t *pitch); - -#ifdef HAVE_OVERLAY - void (*overlay_interface)(void *data, - const video_overlay_interface_t **iface); -#endif -#ifdef HAVE_VIDEO_LAYOUT - const video_layout_render_interface_t *(*video_layout_render_interface)(void *data); -#endif - void (*poke_interface)(void *data, const video_poke_interface_t **iface); - unsigned (*wrap_type_to_enum)(enum gfx_wrap_type type); - -#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) - /* if set to true, will use menu widgets when applicable - * if set to false, will use OSD as a fallback */ - bool (*menu_widgets_enabled)(void *data); -#endif -} video_driver_t; - -extern struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END]; - -bool video_driver_has_windowed(void); - -bool video_driver_cached_frame_has_valid_framebuffer(void); - -void video_driver_destroy(void); -void video_driver_set_cached_frame_ptr(const void *data); -void video_driver_set_stub_frame(void); -void video_driver_unset_stub_frame(void); -bool video_driver_is_stub_frame(void); -bool video_driver_supports_recording(void); -bool video_driver_supports_viewport_read(void); -bool video_driver_prefer_viewport_read(void); -bool video_driver_supports_read_frame_raw(void); -void video_driver_set_viewport_config(void); -void video_driver_set_viewport_square_pixel(void); -void video_driver_set_viewport_core(void); -void video_driver_reset_custom_viewport(void); -void video_driver_set_rgba(void); -void video_driver_unset_rgba(void); -bool video_driver_supports_rgba(void); -bool video_driver_get_next_video_out(void); -bool video_driver_get_prev_video_out(void); -bool video_driver_init(bool *video_is_threaded); -void video_driver_destroy_data(void); -void video_driver_free(void); -void video_driver_free_hw_context(void); -void video_driver_monitor_reset(void); -void video_driver_set_aspect_ratio(void); -void video_driver_update_viewport(struct video_viewport* vp, bool force_full, bool keep_aspect); -void video_driver_show_mouse(void); -void video_driver_hide_mouse(void); -void video_driver_set_nonblock_state(bool toggle); -bool video_driver_find_driver(void); -void video_driver_apply_state_changes(void); -bool video_driver_read_viewport(uint8_t *buffer, bool is_idle); -bool video_driver_cached_frame(void); -bool video_driver_frame_filter_alive(void); -bool video_driver_frame_filter_is_32bit(void); -void video_driver_default_settings(void); -void video_driver_load_settings(config_file_t *conf); -void video_driver_save_settings(config_file_t *conf); -bool video_driver_is_hw_context(void); -struct retro_hw_render_callback *video_driver_get_hw_context(void); -const struct retro_hw_render_context_negotiation_interface -*video_driver_get_context_negotiation_interface(void); -void video_driver_set_context_negotiation_interface(const struct - retro_hw_render_context_negotiation_interface *iface); -bool video_driver_is_video_cache_context(void); -void video_driver_set_video_cache_context_ack(void); -bool video_driver_is_video_cache_context_ack(void); -void video_driver_set_active(void); -void video_driver_unset_active(void); -bool video_driver_is_active(void); -bool video_driver_gpu_record_init(unsigned size); -void video_driver_gpu_record_deinit(void); -bool video_driver_get_current_software_framebuffer(struct - retro_framebuffer *fb); -bool video_driver_get_hw_render_interface(const struct - retro_hw_render_interface **iface); -bool video_driver_get_viewport_info(struct video_viewport *viewport); -void video_driver_set_title_buf(void); -void video_driver_monitor_adjust_system_rates(void); - -#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) -bool video_driver_has_widgets(void); -#endif - -/** - * video_driver_find_handle: - * @index : index of driver to get handle to. - * - * Returns: handle to video driver at index. Can be NULL - * if nothing found. - **/ -const void *video_driver_find_handle(int index); - -/** - * video_driver_find_ident: - * @index : index of driver to get handle to. - * - * Returns: Human-readable identifier of video driver at index. - * Can be NULL if nothing found. - **/ -const char *video_driver_find_ident(int index); - -/** - * config_get_video_driver_options: - * - * Get an enumerated list of all video driver names, separated by '|'. - * - * Returns: string listing of all video driver names, separated by '|'. - **/ -const char* config_get_video_driver_options(void); - -/** - * video_driver_get_ptr: - * - * Use this if you need the real video driver - * and driver data pointers. - * - * Returns: video driver's userdata. - **/ -void *video_driver_get_ptr(bool force_nonthreaded_data); - -/** - * video_driver_get_current_framebuffer: - * - * Gets pointer to current hardware renderer framebuffer object. - * Used by RETRO_ENVIRONMENT_SET_HW_RENDER. - * - * Returns: pointer to hardware framebuffer object, otherwise 0. - **/ -uintptr_t video_driver_get_current_framebuffer(void); - -retro_proc_address_t video_driver_get_proc_address(const char *sym); - -bool video_driver_set_shader(enum rarch_shader_type type, - const char *shader); - -bool video_driver_set_rotation(unsigned rotation); - -bool video_driver_set_video_mode(unsigned width, - unsigned height, bool fullscreen); - -bool video_driver_get_video_output_size( - unsigned *width, unsigned *height); - -void video_driver_set_osd_msg(const char *msg, - const void *params, void *font); - -void video_driver_set_texture_enable(bool enable, bool full_screen); - -void video_driver_set_texture_frame(const void *frame, bool rgb32, - unsigned width, unsigned height, float alpha); - -#ifdef HAVE_OVERLAY -bool video_driver_overlay_interface( - const video_overlay_interface_t **iface); -#endif - -#ifdef HAVE_VIDEO_LAYOUT -const video_layout_render_interface_t *video_driver_layout_render_interface(void); -#endif - -void * video_driver_read_frame_raw(unsigned *width, - unsigned *height, size_t *pitch); - -void video_driver_set_filtering(unsigned index, bool smooth); - -const char *video_driver_get_ident(void); - -bool video_driver_set_viewport(unsigned width, unsigned height, - bool force_fullscreen, bool allow_rotate); - -void video_driver_get_size(unsigned *width, unsigned *height); - -void video_driver_set_size(unsigned *width, unsigned *height); - -void video_driver_unset_video_cache_context_ack(void); - -float video_driver_get_aspect_ratio(void); - -void video_driver_set_aspect_ratio_value(float value); - -rarch_softfilter_t *video_driver_frame_filter_get_ptr(void); - -enum retro_pixel_format video_driver_get_pixel_format(void); - -void video_driver_set_pixel_format(enum retro_pixel_format fmt); - -void video_driver_cached_frame_set(const void *data, unsigned width, - unsigned height, size_t pitch); - -void video_driver_cached_frame_get(const void **data, unsigned *width, - unsigned *height, size_t *pitch); - -void video_driver_menu_settings(void **list_data, void *list_info_data, - void *group_data, void *subgroup_data, const char *parent_group); - -/** - * video_viewport_get_scaled_integer: - * @vp : Viewport handle - * @width : Width. - * @height : Height. - * @aspect_ratio : Aspect ratio (in float). - * @keep_aspect : Preserve aspect ratio? - * - * Gets viewport scaling dimensions based on - * scaled integer aspect ratio. - **/ -void video_viewport_get_scaled_integer(struct video_viewport *vp, - unsigned width, unsigned height, - float aspect_ratio, bool keep_aspect); - -struct retro_system_av_info *video_viewport_get_system_av_info(void); - -struct video_viewport *video_viewport_get_custom(void); - -/** - * video_monitor_set_refresh_rate: - * @hz : New refresh rate for monitor. - * - * Sets monitor refresh rate to new value. - **/ -void video_monitor_set_refresh_rate(float hz); - -/** - * video_monitor_fps_statistics - * @refresh_rate : Monitor refresh rate. - * @deviation : Deviation from measured refresh rate. - * @sample_points : Amount of sampled points. - * - * Gets the monitor FPS statistics based on the current - * runtime. - * - * Returns: true (1) on success. - * false (0) if: - * a) threaded video mode is enabled - * b) less than 2 frame time samples. - * c) FPS monitor enable is off. - **/ -bool video_monitor_fps_statistics(double *refresh_rate, - double *deviation, unsigned *sample_points); - -unsigned video_pixel_get_alignment(unsigned pitch); - -const video_poke_interface_t *video_driver_get_poke(void); - -/** - * video_driver_frame: - * @data : pointer to data of the video frame. - * @width : width of the video frame. - * @height : height of the video frame. - * @pitch : pitch of the video frame. - * - * Video frame render callback function. - **/ -void video_driver_frame(const void *data, unsigned width, - unsigned height, size_t pitch); - -void crt_switch_driver_reinit(void); - -#define video_driver_translate_coord_viewport_wrap(vp, mouse_x, mouse_y, res_x, res_y, res_screen_x, res_screen_y) \ - (video_driver_get_viewport_info(vp) ? video_driver_translate_coord_viewport(vp, mouse_x, mouse_y, res_x, res_y, res_screen_x, res_screen_y) : false) - -/** - * video_driver_translate_coord_viewport: - * @mouse_x : Pointer X coordinate. - * @mouse_y : Pointer Y coordinate. - * @res_x : Scaled X coordinate. - * @res_y : Scaled Y coordinate. - * @res_screen_x : Scaled screen X coordinate. - * @res_screen_y : Scaled screen Y coordinate. - * - * Translates pointer [X,Y] coordinates into scaled screen - * coordinates based on viewport info. - * - * Returns: true (1) if successful, false if video driver doesn't support - * viewport info. - **/ -bool video_driver_translate_coord_viewport( - struct video_viewport *vp, - int mouse_x, int mouse_y, - int16_t *res_x, int16_t *res_y, int16_t *res_screen_x, - int16_t *res_screen_y); - -uintptr_t video_driver_display_get(void); - -enum rarch_display_type video_driver_display_type_get(void); - -uintptr_t video_driver_window_get(void); - -void video_driver_display_type_set(enum rarch_display_type type); - -void video_driver_display_set(uintptr_t idx); - -void video_driver_window_set(uintptr_t idx); - -bool video_driver_texture_load(void *data, - enum texture_filter_type filter_type, - uintptr_t *id); - -bool video_driver_texture_unload(uintptr_t *id); - -void video_driver_build_info(video_frame_info_t *video_info); - -void video_driver_reinit(void); - -void video_driver_get_window_title(char *buf, unsigned len); - -void video_driver_get_record_status( - bool *has_gpu_record, - uint8_t **gpu_buf); - -bool *video_driver_get_threaded(void); - -void video_driver_set_threaded(bool val); - -void video_driver_get_status(uint64_t *frame_count, bool * is_alive, - bool *is_focused); - -/** - * video_context_driver_init_first: - * @data : Input data. - * @ident : Identifier of graphics context driver to find. - * @api : API of higher-level graphics API. - * @major : Major version number of higher-level graphics API. - * @minor : Minor version number of higher-level graphics API. - * @hw_render_ctx : Request a graphics context driver capable of - * hardware rendering? - * - * Finds first suitable graphics context driver and initializes. - * - * Returns: graphics context driver if found, otherwise NULL. - **/ -const gfx_ctx_driver_t *video_context_driver_init_first( - void *data, const char *ident, - enum gfx_ctx_api api, unsigned major, unsigned minor, - bool hw_render_ctx, void **ctx_data); - -bool video_context_driver_find_prev_driver(void); - -bool video_context_driver_find_next_driver(void); - -bool video_context_driver_init_image_buffer(const video_info_t *data); - -bool video_context_driver_write_to_image_buffer(gfx_ctx_image_t *img); - -bool video_context_driver_get_video_output_prev(void); - -bool video_context_driver_get_video_output_next(void); - -bool video_context_driver_bind_hw_render(bool *enable); - -void video_context_driver_make_current(bool restore); - -bool video_context_driver_set(const gfx_ctx_driver_t *data); - -void video_context_driver_destroy(void); - -bool video_context_driver_get_video_output_size(gfx_ctx_size_t *size_data); - -bool video_context_driver_swap_interval(int *interval); - -bool video_context_driver_get_proc_address(gfx_ctx_proc_address_t *proc); - -bool video_context_driver_suppress_screensaver(bool *bool_data); - -bool video_context_driver_get_ident(gfx_ctx_ident_t *ident); - -bool video_context_driver_set_video_mode(gfx_ctx_mode_t *mode_info); - -bool video_context_driver_get_video_size(gfx_ctx_mode_t *mode_info); - -bool video_context_driver_get_refresh_rate(float *refresh_rate); - -bool video_context_driver_show_mouse(bool *bool_data); - -bool video_context_driver_set_flags(gfx_ctx_flags_t *flags); - -bool video_context_driver_get_metrics(gfx_ctx_metrics_t *metrics); - -bool video_context_driver_translate_aspect(gfx_ctx_aspect_t *aspect); - -bool video_context_driver_input_driver(gfx_ctx_input_t *inp); - -enum gfx_ctx_api video_context_driver_get_api(void); - -void video_context_driver_free(void); - -bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader); - -float video_driver_get_refresh_rate(void); - -extern bool (*video_driver_cb_has_focus)(void); - -bool video_driver_started_fullscreen(void); - -bool video_driver_is_threaded(void); - -bool video_context_driver_get_flags(gfx_ctx_flags_t *flags); - -bool video_driver_get_all_flags(gfx_ctx_flags_t *flags, - enum display_flags flag); - -void video_driver_set_gpu_device_string(const char *str); - -const char* video_driver_get_gpu_device_string(void); - -void video_driver_set_gpu_api_version_string(const char *str); - -const char* video_driver_get_gpu_api_version_string(void); - -/* string list stays owned by the caller and must be available at all times after the video driver is inited */ -void video_driver_set_gpu_api_devices(enum gfx_ctx_api api, struct string_list *list); - -struct string_list* video_driver_get_gpu_api_devices(enum gfx_ctx_api api); - -static INLINE bool gl_set_core_context(enum retro_hw_context_type ctx_type) -{ - gfx_ctx_flags_t flags; - if (ctx_type != RETRO_HW_CONTEXT_OPENGL_CORE) - return false; - - /** - * Ensure that the rest of the frontend knows we have a core context - */ - flags.flags = 0; - BIT32_SET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT); - - video_context_driver_set_flags(&flags); - - return true; -} - -extern video_driver_t video_gl_core; -extern video_driver_t video_gl2; -extern video_driver_t video_gl1; -extern video_driver_t video_vulkan; -extern video_driver_t video_metal; -extern video_driver_t video_psp1; -extern video_driver_t video_vita2d; -extern video_driver_t video_ps2; -extern video_driver_t video_ctr; -extern video_driver_t video_switch; -extern video_driver_t video_d3d8; -extern video_driver_t video_d3d9; -extern video_driver_t video_d3d10; -extern video_driver_t video_d3d11; -extern video_driver_t video_d3d12; -extern video_driver_t video_gx; -extern video_driver_t video_wiiu; -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_vg; -extern video_driver_t video_omap; -extern video_driver_t video_exynos; -extern video_driver_t video_dispmanx; -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_vga; -extern video_driver_t video_sixel; -extern video_driver_t video_null; - -extern const gfx_ctx_driver_t gfx_ctx_osmesa; -extern const gfx_ctx_driver_t gfx_ctx_sdl_gl; -extern const gfx_ctx_driver_t gfx_ctx_x_egl; -extern const gfx_ctx_driver_t gfx_ctx_wayland; -extern const gfx_ctx_driver_t gfx_ctx_x; -extern const gfx_ctx_driver_t gfx_ctx_drm; -extern const gfx_ctx_driver_t gfx_ctx_mali_fbdev; -extern const gfx_ctx_driver_t gfx_ctx_vivante_fbdev; -extern const gfx_ctx_driver_t gfx_ctx_android; -extern const gfx_ctx_driver_t gfx_ctx_ps3; -extern const gfx_ctx_driver_t gfx_ctx_wgl; -extern const gfx_ctx_driver_t gfx_ctx_videocore; -extern const gfx_ctx_driver_t gfx_ctx_qnx; -extern const gfx_ctx_driver_t gfx_ctx_cgl; -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_sixel; -extern const gfx_ctx_driver_t switch_ctx; -extern const gfx_ctx_driver_t orbis_ctx; -extern const gfx_ctx_driver_t gfx_ctx_null; - -extern const shader_backend_t gl_glsl_backend; -extern const shader_backend_t gl_cg_backend; - -RETRO_END_DECLS - -#endif diff --git a/gfx/video_layout.c b/gfx/video_layout.c index da55da3671..3f44aa00c8 100644 --- a/gfx/video_layout.c +++ b/gfx/video_layout.c @@ -1,14 +1,14 @@ -#include "video_layout.h" -#include "video_layout/view.h" -#include "video_driver.h" -#include -#include #include #include #include #include #include +#include "video_layout.h" +#include "video_layout/view.h" + +#include "../retroarch.h" + bool load(view_array_t *view_array, rxml_document_t *doc); typedef struct io diff --git a/gfx/video_shader_parse.c b/gfx/video_shader_parse.c index 1a5000aba4..e17e211480 100644 --- a/gfx/video_shader_parse.c +++ b/gfx/video_shader_parse.c @@ -31,11 +31,11 @@ #include #include -#include "../verbosity.h" #include "../configuration.h" +#include "../retroarch.h" +#include "../verbosity.h" #include "../frontend/frontend_driver.h" #include "../command.h" -#include "video_driver.h" #include "video_shader_parse.h" #if defined(HAVE_SLANG) && defined(HAVE_SPIRV_CROSS) diff --git a/gfx/video_thread_wrapper.c b/gfx/video_thread_wrapper.c index b84dd1bc72..cebf332ac3 100644 --- a/gfx/video_thread_wrapper.c +++ b/gfx/video_thread_wrapper.c @@ -17,6 +17,7 @@ #include #include #include +#include #include #include diff --git a/gfx/video_thread_wrapper.h b/gfx/video_thread_wrapper.h index 3fd306590a..5a60e68e4a 100644 --- a/gfx/video_thread_wrapper.h +++ b/gfx/video_thread_wrapper.h @@ -22,7 +22,6 @@ #include #include -#include "video_driver.h" #include "font_driver.h" RETRO_BEGIN_DECLS diff --git a/griffin/griffin.c b/griffin/griffin.c index 32b46a330c..37ce0dcdbd 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -885,7 +885,6 @@ MIDI /*============================================================ DRIVERS ============================================================ */ -#include "../gfx/video_driver.c" #include "../gfx/video_crt_switch.c" #include "../gfx/video_display_server.c" #include "../gfx/video_coord_array.c" diff --git a/input/drivers/android_input.c b/input/drivers/android_input.c index 91fbf32b83..db1a8104d7 100644 --- a/input/drivers/android_input.c +++ b/input/drivers/android_input.c @@ -37,12 +37,12 @@ #include "../../command.h" #include "../../frontend/drivers/platform_unix.h" -#include "../../gfx/video_driver.h" #include "../drivers_keyboard/keyboard_event_android.h" #include "../../tasks/tasks_internal.h" #include "../../performance_counters.h" #include "../../configuration.h" +#include "../../retroarch.h" #define MAX_TOUCH 16 #define MAX_NUM_KEYBOARDS 3 diff --git a/input/drivers/cocoa_input.c b/input/drivers/cocoa_input.c index c7259e7ebb..ac6528ece0 100644 --- a/input/drivers/cocoa_input.c +++ b/input/drivers/cocoa_input.c @@ -28,7 +28,7 @@ #include "cocoa_input.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../../driver.h" #include "../drivers_keyboard/keyboard_event_apple.h" diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index aa80219e8e..6e8778c207 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -48,9 +48,8 @@ #include "../input_driver.h" #include "../input_keymaps.h" -#include "../../gfx/video_driver.h" - #include "../../configuration.h" +#include "../../retroarch.h" #include "../../verbosity.h" /* Keep track of which pad indexes are 360 controllers. diff --git a/input/drivers/qnx_input.c b/input/drivers/qnx_input.c index 19d21e78a6..38fa88cced 100644 --- a/input/drivers/qnx_input.c +++ b/input/drivers/qnx_input.c @@ -29,7 +29,7 @@ #include "../input_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../../tasks/tasks_internal.h" #include "../../command.h" diff --git a/input/drivers/rwebinput_input.c b/input/drivers/rwebinput_input.c index fc2ad16bd9..76c625b566 100644 --- a/input/drivers/rwebinput_input.c +++ b/input/drivers/rwebinput_input.c @@ -29,9 +29,9 @@ #include "../input_driver.h" #include "../input_keymaps.h" -#include "../../gfx/video_driver.h" #include "../../tasks/tasks_internal.h" #include "../../configuration.h" +#include "../../retroarch.h" #include "../../verbosity.h" /* https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button */ diff --git a/input/drivers/sdl_input.c b/input/drivers/sdl_input.c index e58391dbd2..85d6c7d41c 100644 --- a/input/drivers/sdl_input.c +++ b/input/drivers/sdl_input.c @@ -27,7 +27,7 @@ #include "../input_driver.h" #include "../input_keymaps.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../../tasks/tasks_internal.h" diff --git a/input/drivers/udev_input.c b/input/drivers/udev_input.c index ca947d9243..a72471930d 100644 --- a/input/drivers/udev_input.c +++ b/input/drivers/udev_input.c @@ -69,10 +69,10 @@ #include "../input_driver.h" #include "../input_keymaps.h" -#include "../../gfx/video_driver.h" #include "../common/linux_common.h" -#include "../../configuration.h" +#include "../../configuration.h" +#include "../../retroarch.h" #include "../../verbosity.h" #if defined(HAVE_XKBCOMMON) && defined(HAVE_KMS) diff --git a/input/drivers/wayland_input.c b/input/drivers/wayland_input.c index ca051459f1..4ee19dc1c9 100644 --- a/input/drivers/wayland_input.c +++ b/input/drivers/wayland_input.c @@ -40,11 +40,11 @@ #include "../input_driver.h" #include "../input_keymaps.h" -#include "../../gfx/video_driver.h" #include "../common/linux_common.h" #include "../../gfx/common/wayland_common.h" +#include "../../retroarch.h" #include "../../verbosity.h" /* TODO/FIXME - diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index cd7521c879..9e85918213 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -19,7 +19,7 @@ #include "../input_keymaps.h" #include "../../configuration.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" typedef struct diff --git a/input/drivers/x11_input.c b/input/drivers/x11_input.c index 4672333e6f..846c96fbfa 100644 --- a/input/drivers/x11_input.c +++ b/input/drivers/x11_input.c @@ -27,10 +27,10 @@ #include "../input_driver.h" #include "../input_keymaps.h" -#include "../../gfx/video_driver.h" #include "../common/input_x11_common.h" #include "../../configuration.h" +#include "../../retroarch.h" #include "../../verbosity.h" typedef struct x11_input diff --git a/input/drivers_joypad/dinput_joypad.c b/input/drivers_joypad/dinput_joypad.c index 16ef15b214..466c465a87 100644 --- a/input/drivers_joypad/dinput_joypad.c +++ b/input/drivers_joypad/dinput_joypad.c @@ -30,9 +30,9 @@ #endif #include "../../tasks/tasks_internal.h" -#include "../../gfx/video_driver.h" #include "../input_driver.h" #include "../input_keymaps.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "dinput_joypad.h" diff --git a/input/include/wiiu/input.h b/input/include/wiiu/input.h index 5aee72ef30..ac8064c470 100644 --- a/input/include/wiiu/input.h +++ b/input/include/wiiu/input.h @@ -42,7 +42,6 @@ #include "../../../config.h" #endif /* HAVE_CONFIG_H */ -#include "../../../gfx/video_driver.h" #include "../../../tasks/tasks_internal.h" #define WIIMOTE_TYPE_WIIPLUS 0x00 diff --git a/input/input_overlay.c b/input/input_overlay.c index aa0f26e282..b520e0b0e2 100644 --- a/input/input_overlay.c +++ b/input/input_overlay.c @@ -30,8 +30,8 @@ #include "../menu/menu_driver.h" #endif +#include "../retroarch.h" #include "../verbosity.h" -#include "../gfx/video_driver.h" #include "input_overlay.h" #define OVERLAY_GET_KEY(state, key) (((state)->keys[(key) / 32] >> ((key) % 32)) & 1) diff --git a/led/drivers/led_overlay.c b/led/drivers/led_overlay.c index 2023e43142..4c22e3b177 100644 --- a/led/drivers/led_overlay.c +++ b/led/drivers/led_overlay.c @@ -2,11 +2,12 @@ #include "../led_driver.h" #include "../led_defines.h" +#include "../../input/input_overlay.h" + #include "../../configuration.h" +#include "../../retroarch.h" #include "../../verbosity.h" -#include "../../gfx/video_driver.h" -#include "../../input/input_overlay.h" typedef struct { diff --git a/list_special.c b/list_special.c index 345aeb6b3e..7966dc1973 100644 --- a/list_special.c +++ b/list_special.c @@ -38,7 +38,6 @@ #include "list_special.h" #include "frontend/frontend_driver.h" #include "core_info.h" -#include "gfx/video_driver.h" #include "input/input_driver.h" #include "record/record_driver.h" #include "midi/midi_driver.h" diff --git a/managers/core_option_manager.h b/managers/core_option_manager.h index 60dbe0fa4b..6d8ce55090 100644 --- a/managers/core_option_manager.h +++ b/managers/core_option_manager.h @@ -23,7 +23,7 @@ #include #include -#include "../gfx/video_driver.h" +#include "../../retroarch.h" RETRO_BEGIN_DECLS diff --git a/menu/cbs/menu_cbs_left.c b/menu/cbs/menu_cbs_left.c index 04abaac5d3..3ab6a1fcf3 100644 --- a/menu/cbs/menu_cbs_left.c +++ b/menu/cbs/menu_cbs_left.c @@ -36,7 +36,6 @@ #include "../../managers/cheat_manager.h" #include "../../file_path_special.h" #include "../../driver.h" -#include "../../gfx/video_driver.h" #include "../../retroarch.h" #include "../../network/netplay/netplay.h" diff --git a/menu/cbs/menu_cbs_start.c b/menu/cbs/menu_cbs_start.c index d9f8e49689..71dd5ef813 100644 --- a/menu/cbs/menu_cbs_start.c +++ b/menu/cbs/menu_cbs_start.c @@ -36,8 +36,6 @@ #include "../../retroarch.h" #include "../../performance_counters.h" -#include "../../gfx/video_driver.h" - #include "../../input/input_driver.h" #include "../../input/input_remapping.h" diff --git a/menu/drivers/xui.cpp b/menu/drivers/xui.cpp index af5f5d5b09..966f72df4d 100644 --- a/menu/drivers/xui.cpp +++ b/menu/drivers/xui.cpp @@ -40,8 +40,6 @@ #include "../menu_setting.h" #include "../widgets/menu_input_dialog.h" -#include "../../gfx/video_driver.h" - #include "../../configuration.h" #include "../../retroarch.h" #include "../../verbosity.h" diff --git a/menu/drivers_display/menu_display_caca.c b/menu/drivers_display/menu_display_caca.c index 2ccb702dd2..218fd387cb 100644 --- a/menu/drivers_display/menu_display_caca.c +++ b/menu/drivers_display/menu_display_caca.c @@ -21,7 +21,7 @@ #include "../../config.def.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../menu_driver.h" diff --git a/menu/drivers_display/menu_display_ctr.c b/menu/drivers_display/menu_display_ctr.c index a29cc7f531..c366e2b7fa 100644 --- a/menu/drivers_display/menu_display_ctr.c +++ b/menu/drivers_display/menu_display_ctr.c @@ -23,7 +23,6 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" #include "../../gfx/common/ctr_common.h" #include "../../gfx/drivers/ctr_gu.h" #include "../../ctr/gpu_old.h" diff --git a/menu/drivers_display/menu_display_d3d10.c b/menu/drivers_display/menu_display_d3d10.c index 712dfec833..7927647d26 100644 --- a/menu/drivers_display/menu_display_d3d10.c +++ b/menu/drivers_display/menu_display_d3d10.c @@ -26,7 +26,6 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" #include "../../gfx/common/d3d10_common.h" static const float* menu_display_d3d10_get_default_vertices(void) diff --git a/menu/drivers_display/menu_display_d3d11.c b/menu/drivers_display/menu_display_d3d11.c index 0a83fd64c4..091d47306d 100644 --- a/menu/drivers_display/menu_display_d3d11.c +++ b/menu/drivers_display/menu_display_d3d11.c @@ -25,7 +25,6 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" #include "../../gfx/common/d3d11_common.h" static const float* menu_display_d3d11_get_default_vertices(void) diff --git a/menu/drivers_display/menu_display_d3d12.c b/menu/drivers_display/menu_display_d3d12.c index 9d3d14fb8f..818b02f61c 100644 --- a/menu/drivers_display/menu_display_d3d12.c +++ b/menu/drivers_display/menu_display_d3d12.c @@ -25,7 +25,6 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" #include "../../gfx/common/d3d12_common.h" static const float* menu_display_d3d12_get_default_vertices(void) diff --git a/menu/drivers_display/menu_display_d3d8.c b/menu/drivers_display/menu_display_d3d8.c index 4e10a5c8a6..294e7d8a3b 100644 --- a/menu/drivers_display/menu_display_d3d8.c +++ b/menu/drivers_display/menu_display_d3d8.c @@ -25,7 +25,7 @@ #include "../menu_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../../gfx/common/d3d_common.h" #include "../../gfx/common/d3d8_common.h" diff --git a/menu/drivers_display/menu_display_d3d9.c b/menu/drivers_display/menu_display_d3d9.c index f4316aa9d9..5e1d43613c 100644 --- a/menu/drivers_display/menu_display_d3d9.c +++ b/menu/drivers_display/menu_display_d3d9.c @@ -25,7 +25,7 @@ #include "../menu_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../../gfx/common/d3d_common.h" #include "../../gfx/common/d3d9_common.h" diff --git a/menu/drivers_display/menu_display_gdi.c b/menu/drivers_display/menu_display_gdi.c index 02777dbddd..05fa555d88 100644 --- a/menu/drivers_display/menu_display_gdi.c +++ b/menu/drivers_display/menu_display_gdi.c @@ -22,7 +22,7 @@ #include "../../config.def.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" #include "../menu_driver.h" diff --git a/menu/drivers_display/menu_display_gl.c b/menu/drivers_display/menu_display_gl.c index 416d47703a..eff96eb268 100644 --- a/menu/drivers_display/menu_display_gl.c +++ b/menu/drivers_display/menu_display_gl.c @@ -21,7 +21,6 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" #include "../../gfx/common/gl_common.h" #include "../menu_driver.h" diff --git a/menu/drivers_display/menu_display_gl1.c b/menu/drivers_display/menu_display_gl1.c index 931a3cae22..f27e5b7ba7 100644 --- a/menu/drivers_display/menu_display_gl1.c +++ b/menu/drivers_display/menu_display_gl1.c @@ -22,7 +22,6 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" #include "../../gfx/common/gl1_common.h" #include "../menu_driver.h" diff --git a/menu/drivers_display/menu_display_gl_core.c b/menu/drivers_display/menu_display_gl_core.c index 898735e9bd..c292f84110 100644 --- a/menu/drivers_display/menu_display_gl_core.c +++ b/menu/drivers_display/menu_display_gl_core.c @@ -16,7 +16,6 @@ #include #include -#include #ifdef HAVE_CONFIG_H #include "../../config.h" @@ -25,7 +24,7 @@ #include "../menu_driver.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../../gfx/common/gl_core_common.h" static const float gl_core_vertexes[] = { diff --git a/menu/drivers_display/menu_display_metal.m b/menu/drivers_display/menu_display_metal.m index ac9a9f76d8..6b780588ef 100644 --- a/menu/drivers_display/menu_display_metal.m +++ b/menu/drivers_display/menu_display_metal.m @@ -22,7 +22,7 @@ #include "../menu_driver.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #import "../../gfx/common/metal_common.h" static const float *menu_display_metal_get_default_vertices(void) diff --git a/menu/drivers_display/menu_display_null.c b/menu/drivers_display/menu_display_null.c index 1ae4665c8d..f027b349cb 100644 --- a/menu/drivers_display/menu_display_null.c +++ b/menu/drivers_display/menu_display_null.c @@ -19,7 +19,7 @@ #include #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../menu_driver.h" diff --git a/menu/drivers_display/menu_display_sixel.c b/menu/drivers_display/menu_display_sixel.c index 46dc42a21a..24f60f86f8 100644 --- a/menu/drivers_display/menu_display_sixel.c +++ b/menu/drivers_display/menu_display_sixel.c @@ -21,7 +21,7 @@ #include "../../config.def.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../menu_driver.h" diff --git a/menu/drivers_display/menu_display_switch.c b/menu/drivers_display/menu_display_switch.c index 8c21577eac..a2d76b6e97 100644 --- a/menu/drivers_display/menu_display_switch.c +++ b/menu/drivers_display/menu_display_switch.c @@ -18,7 +18,7 @@ #include #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../menu_driver.h" diff --git a/menu/drivers_display/menu_display_vga.c b/menu/drivers_display/menu_display_vga.c index 6b4b10c964..8c323107c8 100644 --- a/menu/drivers_display/menu_display_vga.c +++ b/menu/drivers_display/menu_display_vga.c @@ -21,7 +21,7 @@ #include "../../config.def.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../menu_driver.h" diff --git a/menu/drivers_display/menu_display_vita2d.c b/menu/drivers_display/menu_display_vita2d.c index 8a9b620db4..291a573cbf 100644 --- a/menu/drivers_display/menu_display_vita2d.c +++ b/menu/drivers_display/menu_display_vita2d.c @@ -25,7 +25,6 @@ #include "../../retroarch.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" #include "../../gfx/common/vita2d_common.h" #include "../../defines/psp_defines.h" diff --git a/menu/drivers_display/menu_display_vulkan.c b/menu/drivers_display/menu_display_vulkan.c index 0beef42eaf..45891cc6a9 100644 --- a/menu/drivers_display/menu_display_vulkan.c +++ b/menu/drivers_display/menu_display_vulkan.c @@ -23,7 +23,7 @@ #include "../menu_driver.h" #include "../../gfx/font_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../../gfx/common/vulkan_common.h" /* Will do Y-flip later, but try to make it similar to GL. */ diff --git a/menu/drivers_display/menu_display_wiiu.c b/menu/drivers_display/menu_display_wiiu.c index fdc6729fd1..829e08876f 100644 --- a/menu/drivers_display/menu_display_wiiu.c +++ b/menu/drivers_display/menu_display_wiiu.c @@ -20,14 +20,13 @@ #include "config.h" #endif -#include "menu/menu_driver.h" +#include "../menu_driver.h" -#include "retroarch.h" -#include "gfx/font_driver.h" -#include "gfx/video_driver.h" -#include "gfx/common/gx2_common.h" -#include "wiiu/system/memory.h" -#include "wiiu/wiiu_dbg.h" +#include "../../retroarch.h" +#include "../../gfx/font_driver.h" +#include "../../gfx/common/gx2_common.h" +#include "../../wiiu/system/memory.h" +#include "../../wiiu/wiiu_dbg.h" static const float *menu_display_wiiu_get_default_vertices(void) { diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index c2eb68ef9a..aad8bc90e6 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -81,7 +81,6 @@ #include "../core.h" #include "../frontend/frontend_driver.h" #include "../ui/ui_companion_driver.h" -#include "../gfx/video_driver.h" #include "../gfx/video_display_server.h" #include "../config.features.h" #include "../version_git.h" diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 8d0b24ffb9..123c4c74bb 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -43,8 +43,6 @@ #include "../gfx/video_thread_wrapper.h" #endif -#include "../gfx/video_driver.h" - #include "menu_animation.h" #include "menu_driver.h" #include "menu_cbs.h" diff --git a/menu/menu_shader.h b/menu/menu_shader.h index a3da011651..ca6bfdcef0 100644 --- a/menu/menu_shader.h +++ b/menu/menu_shader.h @@ -19,7 +19,7 @@ #include -#include "../gfx/video_driver.h" +#include "../retroarch.h" RETRO_BEGIN_DECLS diff --git a/menu/widgets/menu_widgets.h b/menu/widgets/menu_widgets.h index 37c1cd1468..f5a53ff52d 100644 --- a/menu/widgets/menu_widgets.h +++ b/menu/widgets/menu_widgets.h @@ -16,11 +16,11 @@ #ifndef _MENU_WIDGETS_H #define _MENU_WIDGETS_H -#include "../../gfx/video_driver.h" - #include #include +#include "../../retroarch.h" + #define DEFAULT_BACKDROP 0.75f #define MSG_QUEUE_PENDING_MAX 32 diff --git a/network/httpserver/httpserver.c b/network/httpserver/httpserver.c index d1c270524a..39ff860ed1 100644 --- a/network/httpserver/httpserver.c +++ b/network/httpserver/httpserver.c @@ -27,7 +27,6 @@ #include "../../core.h" #include "../../retroarch.h" #include "../../core.h" -#include "../../gfx/video_driver.h" #include "../../managers/core_option_manager.h" #include "../../cheevos-new/cheevos.h" #include "../../content.h" diff --git a/record/drivers/record_ffmpeg.c b/record/drivers/record_ffmpeg.c index 8016f448f5..1592ea3adb 100644 --- a/record/drivers/record_ffmpeg.c +++ b/record/drivers/record_ffmpeg.c @@ -67,7 +67,7 @@ extern "C" { #include "../record_driver.h" #include "../../configuration.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #include "../../verbosity.h" #ifndef AV_CODEC_FLAG_QSCALE diff --git a/record/record_driver.c b/record/record_driver.c index ebaf519642..c54f614920 100644 --- a/record/record_driver.c +++ b/record/record_driver.c @@ -30,7 +30,6 @@ #include "../command.h" #include "../configuration.h" #include "../driver.h" -#include "../gfx/video_driver.h" #include "../retroarch.h" #include "../verbosity.h" #include "../msg_hash.h" diff --git a/retroarch.c b/retroarch.c index 388fd74d40..a0a072c70b 100644 --- a/retroarch.c +++ b/retroarch.c @@ -41,8 +41,13 @@ #include #include #include +#include #include +#include +#include +#include + #include #include #include @@ -62,6 +67,8 @@ #include #include +#include "config.def.h" + #include "runtime_file.h" #ifdef HAVE_CONFIG_H @@ -121,7 +128,8 @@ #ifdef HAVE_THREADS #include "../gfx/video_thread_wrapper.h" #endif -#include "gfx/video_driver.h" +#include "../gfx/video_display_server.h" +#include "../gfx/video_crt_switch.h" #include "record/record_driver.h" #include "wifi/wifi_driver.h" #include "led/led_driver.h" @@ -276,9 +284,6 @@ static struct retro_frame_time_callback runloop_frame_time; static retro_keyboard_event_t runloop_key_event = NULL; static retro_keyboard_event_t runloop_frontend_key_event = NULL; static core_option_manager_t *runloop_core_options = NULL; -#ifdef HAVE_THREADS -static slock_t *_runloop_msg_queue_lock = NULL; -#endif static msg_queue_t *runloop_msg_queue = NULL; static unsigned runloop_pending_windowed_scale = 0; @@ -306,6 +311,54 @@ extern bool input_driver_flushing_input; static char launch_arguments[4096]; +/* Message queue */ + +#ifdef HAVE_THREADS +static slock_t *_runloop_msg_queue_lock = NULL; + +#define runloop_msg_queue_lock_internal() slock_lock(_runloop_msg_queue_lock) +#define runloop_msg_queue_unlock_internal() slock_unlock(_runloop_msg_queue_lock) +void runloop_msg_queue_lock(void) +{ + runloop_msg_queue_lock_internal(); +} + +void runloop_msg_queue_unlock(void) +{ + runloop_msg_queue_unlock_internal(); +} +#endif + +static void retroarch_msg_queue_deinit(void) +{ +#ifdef HAVE_THREADS + runloop_msg_queue_lock_internal(); +#endif + + if (!runloop_msg_queue) + return; + + msg_queue_free(runloop_msg_queue); + +#ifdef HAVE_THREADS + runloop_msg_queue_unlock_internal(); + slock_free(_runloop_msg_queue_lock); + _runloop_msg_queue_lock = NULL; +#endif + + runloop_msg_queue = NULL; +} + +static void retroarch_msg_queue_init(void) +{ + retroarch_msg_queue_deinit(); + runloop_msg_queue = msg_queue_new(8); + +#ifdef HAVE_THREADS + _runloop_msg_queue_lock = slock_new(); +#endif +} + /* Audio */ #define AUDIO_BUFFER_FREE_SAMPLES_COUNT (8 * 1024) @@ -2065,6 +2118,3325 @@ static const char* audio_driver_get_ident(void) return current_audio->ident; } +/* Video */ + +#define MEASURE_FRAME_TIME_SAMPLES_COUNT (2 * 1024) + +#define TIME_TO_FPS(last_time, new_time, frames) ((1000000.0f * (frames)) / ((new_time) - (last_time))) + +#define FPS_UPDATE_INTERVAL 256 + +#ifdef HAVE_THREADS +#define video_driver_is_threaded_internal() ((!video_driver_is_hw_context() && video_driver_threaded) ? true : false) +#else +#define video_driver_is_threaded_internal() (false) +#endif + +#ifdef HAVE_THREADS +#define video_driver_lock() \ + if (display_lock) \ + slock_lock(display_lock) + +#define video_driver_unlock() \ + if (display_lock) \ + slock_unlock(display_lock) + +#define video_driver_context_lock() \ + if (context_lock) \ + slock_lock(context_lock) + +#define video_driver_context_unlock() \ + if (context_lock) \ + slock_unlock(context_lock) + +#define video_driver_lock_free() \ + slock_free(display_lock); \ + slock_free(context_lock); \ + display_lock = NULL; \ + context_lock = NULL + +#define video_driver_threaded_lock(is_threaded) \ + if (is_threaded) \ + video_driver_lock() + +#define video_driver_threaded_unlock(is_threaded) \ + if (is_threaded) \ + video_driver_unlock() +#else +#define video_driver_lock() ((void)0) +#define video_driver_unlock() ((void)0) +#define video_driver_lock_free() ((void)0) +#define video_driver_threaded_lock(is_threaded) ((void)0) +#define video_driver_threaded_unlock(is_threaded) ((void)0) +#define video_driver_context_lock() ((void)0) +#define video_driver_context_unlock() ((void)0) +#endif + +typedef struct video_pixel_scaler +{ + struct scaler_ctx *scaler; + void *scaler_out; +} video_pixel_scaler_t; + +bool (*video_driver_cb_has_focus)(void); + +/* Opaque handles to currently running window. + * Used by e.g. input drivers which bind to a window. + * Drivers are responsible for setting these if an input driver + * could potentially make use of this. */ +static uintptr_t video_driver_display = 0; +static uintptr_t video_driver_window = 0; + +static rarch_softfilter_t *video_driver_state_filter = NULL; +static void *video_driver_state_buffer = NULL; +static unsigned video_driver_state_scale = 0; +static unsigned video_driver_state_out_bpp = 0; +static bool video_driver_state_out_rgb32 = false; +static bool video_driver_crt_switching_active = false; +static bool video_driver_crt_dynamic_super_width = false; + +static struct retro_system_av_info video_driver_av_info; + +static enum retro_pixel_format video_driver_pix_fmt = RETRO_PIXEL_FORMAT_0RGB1555; + +static const void *frame_cache_data = NULL; +static unsigned frame_cache_width = 0; +static unsigned frame_cache_height = 0; +static size_t frame_cache_pitch = 0; +static bool video_driver_threaded = false; + +static float video_driver_core_hz = 0.0f; +static float video_driver_aspect_ratio = 0.0f; +static unsigned video_driver_width = 0; +static unsigned video_driver_height = 0; + +static enum rarch_display_type video_driver_display_type = RARCH_DISPLAY_NONE; +static char video_driver_title_buf[64] = {0}; +static char video_driver_window_title[512] = {0}; +static bool video_driver_window_title_update = true; + +static retro_time_t video_driver_frame_time_samples[MEASURE_FRAME_TIME_SAMPLES_COUNT]; +static uint64_t video_driver_frame_time_count = 0; +static uint64_t video_driver_frame_count = 0; + +static void *video_driver_data = NULL; +static video_driver_t *current_video = NULL; + +/* Interface for "poking". */ +static const video_poke_interface_t *video_driver_poke = NULL; + +/* Used for 15-bit -> 16-bit conversions that take place before + * being passed to video driver. */ +static video_pixel_scaler_t *video_driver_scaler_ptr = NULL; + +static struct retro_hw_render_callback hw_render; + +static const struct +retro_hw_render_context_negotiation_interface * +hw_render_context_negotiation = NULL; + +/* Graphics driver requires RGBA byte order data (ABGR on little-endian) + * for 32-bit. + * This takes effect for overlay and shader cores that wants to load + * data into graphics driver. Kinda hackish to place it here, it is only + * used for GLES. + * TODO: Refactor this better. */ +static bool video_driver_use_rgba = false; +static bool video_driver_active = false; + +static video_driver_frame_t frame_bak = NULL; + +/* If set during context deinit, the driver should keep + * graphics context alive to avoid having to reset all + * context state. */ +static bool video_driver_cache_context = false; + +/* Set to true by driver if context caching succeeded. */ +static bool video_driver_cache_context_ack = false; +static uint8_t *video_driver_record_gpu_buffer = NULL; + +#ifdef HAVE_THREADS +static slock_t *display_lock = NULL; +static slock_t *context_lock = NULL; +#endif + +static gfx_ctx_driver_t current_video_context; + +static void *video_context_data = NULL; + +/** + * dynamic.c:dynamic_request_hw_context will try to set flag data when the context + * is in the middle of being rebuilt; in these cases we will save flag + * data and set this to true. + * When the context is reinit, it checks this, reads from + * deferred_flag_data and cleans it. + * + * TODO - Dirty hack, fix it better + */ +static bool deferred_video_context_driver_set_flags = false; +static gfx_ctx_flags_t deferred_flag_data = {0}; + +static bool video_started_fullscreen = false; + +static char video_driver_gpu_device_string[128] = {0}; +static char video_driver_gpu_api_version_string[128] = {0}; + +struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END] = { + { "4:3", 1.3333f }, + { "16:9", 1.7778f }, + { "16:10", 1.6f }, + { "16:15", 16.0f / 15.0f }, + { "21:9", 21.0f / 9.0f }, + { "1:1", 1.0f }, + { "2:1", 2.0f }, + { "3:2", 1.5f }, + { "3:4", 0.75f }, + { "4:1", 4.0f }, + { "9:16", 0.5625f }, + { "5:4", 1.25f }, + { "6:5", 1.2f }, + { "7:9", 0.7777f }, + { "8:3", 2.6666f }, + { "8:7", 1.1428f }, + { "19:12", 1.5833f }, + { "19:14", 1.3571f }, + { "30:17", 1.7647f }, + { "32:9", 3.5555f }, + { "Config", 0.0f }, + { "Square pixel", 1.0f }, + { "Core provided", 1.0f }, + { "Custom", 0.0f } +}; + +static const video_driver_t *video_drivers[] = { +#ifdef HAVE_OPENGL + &video_gl2, +#endif +#if defined(HAVE_OPENGL_CORE) + &video_gl_core, +#endif +#ifdef HAVE_OPENGL1 + &video_gl1, +#endif +#ifdef HAVE_VULKAN + &video_vulkan, +#endif +#ifdef HAVE_METAL + &video_metal, +#endif +#ifdef XENON + &video_xenon360, +#endif +#if defined(HAVE_D3D12) + &video_d3d12, +#endif +#if defined(HAVE_D3D11) + &video_d3d11, +#endif +#if defined(HAVE_D3D10) + &video_d3d10, +#endif +#if defined(HAVE_D3D9) + &video_d3d9, +#endif +#if defined(HAVE_D3D8) + &video_d3d8, +#endif +#ifdef HAVE_VITA2D + &video_vita2d, +#endif +#ifdef PSP + &video_psp1, +#endif +#ifdef PS2 + &video_ps2, +#endif +#ifdef _3DS + &video_ctr, +#endif +#ifdef SWITCH + &video_switch, +#endif +#ifdef HAVE_SDL + &video_sdl, +#endif +#ifdef HAVE_SDL2 + &video_sdl2, +#endif +#ifdef HAVE_XVIDEO + &video_xvideo, +#endif +#ifdef GEKKO + &video_gx, +#endif +#ifdef WIIU + &video_wiiu, +#endif +#ifdef HAVE_VG + &video_vg, +#endif +#ifdef HAVE_OMAP + &video_omap, +#endif +#ifdef HAVE_EXYNOS + &video_exynos, +#endif +#ifdef HAVE_DISPMANX + &video_dispmanx, +#endif +#ifdef HAVE_SUNXI + &video_sunxi, +#endif +#ifdef HAVE_PLAIN_DRM + &video_drm, +#endif +#ifdef HAVE_XSHM + &video_xshm, +#endif +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) + &video_gdi, +#endif +#ifdef DJGPP + &video_vga, +#endif +#ifdef HAVE_SIXEL + &video_sixel, +#endif +#ifdef HAVE_CACA + &video_caca, +#endif + &video_null, + NULL, +}; + +static const gfx_ctx_driver_t *gfx_ctx_drivers[] = { +#if defined(ORBIS) + &orbis_ctx, +#endif +#if defined(HAVE_LIBNX) && defined(HAVE_OPENGL) + &switch_ctx, +#endif +#if defined(__CELLOS_LV2__) + &gfx_ctx_ps3, +#endif +#if defined(HAVE_VIDEOCORE) + &gfx_ctx_videocore, +#endif +#if defined(HAVE_MALI_FBDEV) + &gfx_ctx_mali_fbdev, +#endif +#if defined(HAVE_VIVANTE_FBDEV) + &gfx_ctx_vivante_fbdev, +#endif +#if defined(HAVE_OPENDINGUX_FBDEV) + &gfx_ctx_opendingux_fbdev, +#endif +#if defined(_WIN32) && (defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE) || defined(HAVE_VULKAN)) + &gfx_ctx_wgl, +#endif +#if defined(HAVE_WAYLAND) + &gfx_ctx_wayland, +#endif +#if defined(HAVE_X11) && !defined(HAVE_OPENGLES) +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE) || defined(HAVE_VULKAN) + &gfx_ctx_x, +#endif +#endif +#if defined(HAVE_X11) && defined(HAVE_OPENGL) && defined(HAVE_EGL) + &gfx_ctx_x_egl, +#endif +#if defined(HAVE_KMS) + &gfx_ctx_drm, +#endif +#if defined(ANDROID) + &gfx_ctx_android, +#endif +#if defined(__QNX__) + &gfx_ctx_qnx, +#endif +#if defined(HAVE_COCOA) || defined(HAVE_COCOATOUCH) || defined(HAVE_COCOA_METAL) + &gfx_ctx_cocoagl, +#endif +#if defined(__APPLE__) && !defined(TARGET_IPHONE_SIMULATOR) && !defined(TARGET_OS_IPHONE) + &gfx_ctx_cgl, +#endif +#if (defined(HAVE_SDL) || defined(HAVE_SDL2)) && (defined(HAVE_OPENGL) || defined(HAVE_OPENGL1) || defined(HAVE_OPENGL_CORE)) + &gfx_ctx_sdl_gl, +#endif +#ifdef HAVE_OSMESA + &gfx_ctx_osmesa, +#endif +#ifdef EMSCRIPTEN + &gfx_ctx_emscripten, +#endif +#if defined(HAVE_VULKAN) && defined(HAVE_VULKAN_DISPLAY) + &gfx_ctx_khr_display, +#endif +#if defined(_WIN32) && !defined(_XBOX) && !defined(__WINRT__) + &gfx_ctx_gdi, +#endif +#ifdef HAVE_SIXEL + &gfx_ctx_sixel, +#endif + &gfx_ctx_null, + NULL +}; + +typedef struct { + enum gfx_ctx_api api; + struct string_list *list; +} gfx_api_gpu_map; + +static gfx_api_gpu_map gpu_map[] = { + { GFX_CTX_VULKAN_API, NULL } +}; + +bool video_driver_started_fullscreen(void) +{ + return video_started_fullscreen; +} + +/* Stub functions */ + +static void update_window_title_null(void *data, void *data2) +{ +} + +static void swap_buffers_null(void *data, void *data2) +{ +} + +static bool get_metrics_null(void *data, enum display_metric_types type, + float *value) +{ + return false; +} + +static bool set_resize_null(void *a, unsigned b, unsigned c) +{ + return false; +} + +/** + * video_driver_find_handle: + * @idx : index of driver to get handle to. + * + * Returns: handle to video driver at index. Can be NULL + * if nothing found. + **/ +const void *video_driver_find_handle(int idx) +{ + const void *drv = video_drivers[idx]; + if (!drv) + return NULL; + return drv; +} + +/** + * video_driver_find_ident: + * @idx : index of driver to get handle to. + * + * Returns: Human-readable identifier of video driver at index. Can be NULL + * if nothing found. + **/ +const char *video_driver_find_ident(int idx) +{ + const video_driver_t *drv = video_drivers[idx]; + if (!drv) + return NULL; + return drv->ident; +} + +/** + * config_get_video_driver_options: + * + * Get an enumerated list of all video driver names, separated by '|'. + * + * Returns: string listing of all video driver names, separated by '|'. + **/ +const char* config_get_video_driver_options(void) +{ + return char_list_new_special(STRING_LIST_VIDEO_DRIVERS, NULL); +} + +bool video_driver_is_threaded(void) +{ + return video_driver_is_threaded_internal(); +} + +#ifdef HAVE_VULKAN +static bool hw_render_context_is_vulkan(enum retro_hw_context_type type) +{ + return type == RETRO_HW_CONTEXT_VULKAN; +} +#endif + +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGL_CORE) +static bool hw_render_context_is_gl(enum retro_hw_context_type type) +{ + switch (type) + { + case RETRO_HW_CONTEXT_OPENGL: + case RETRO_HW_CONTEXT_OPENGLES2: + case RETRO_HW_CONTEXT_OPENGL_CORE: + case RETRO_HW_CONTEXT_OPENGLES3: + case RETRO_HW_CONTEXT_OPENGLES_VERSION: + return true; + default: + break; + } + + return false; +} +#endif + +bool *video_driver_get_threaded(void) +{ + return &video_driver_threaded; +} + +void video_driver_set_threaded(bool val) +{ + video_driver_threaded = val; +} + +/** + * video_driver_get_ptr: + * + * Use this if you need the real video driver + * and driver data pointers. + * + * Returns: video driver's userdata. + **/ +void *video_driver_get_ptr(bool force_nonthreaded_data) +{ +#ifdef HAVE_THREADS + if (video_driver_is_threaded_internal() && !force_nonthreaded_data) + return video_thread_get_ptr(NULL); +#endif + + return video_driver_data; +} + +const char *video_driver_get_ident(void) +{ + return (current_video) ? current_video->ident : NULL; +} + +const video_poke_interface_t *video_driver_get_poke(void) +{ + return video_driver_poke; +} + +static bool video_context_has_focus(void) +{ + return current_video_context.has_focus && current_video_context.has_focus(video_context_data); +} + +static bool video_driver_has_focus(void) +{ + return current_video && current_video->focus && current_video->focus(video_driver_data); +} + +static bool null_driver_has_focus(void) +{ + return true; +} + +static void video_context_driver_reset(void) +{ + if (!current_video_context.get_metrics) + current_video_context.get_metrics = get_metrics_null; + + if (!current_video_context.update_window_title) + current_video_context.update_window_title = update_window_title_null; + + if (!current_video_context.set_resize) + current_video_context.set_resize = set_resize_null; + + if (!current_video_context.swap_buffers) + current_video_context.swap_buffers = swap_buffers_null; + + if (current_video_context.has_focus) + video_driver_cb_has_focus = video_context_has_focus; + +} + +bool video_context_driver_set(const gfx_ctx_driver_t *data) +{ + if (!data) + return false; + current_video_context = *data; + video_context_driver_reset(); + return true; +} + +void video_context_driver_destroy(void) +{ + current_video_context.init = NULL; + current_video_context.bind_api = NULL; + current_video_context.swap_interval = NULL; + current_video_context.set_video_mode = NULL; + current_video_context.get_video_size = NULL; + current_video_context.get_video_output_size = NULL; + current_video_context.get_video_output_prev = NULL; + current_video_context.get_video_output_next = NULL; + current_video_context.get_metrics = get_metrics_null; + current_video_context.translate_aspect = NULL; + current_video_context.update_window_title = update_window_title_null; + current_video_context.check_window = NULL; + current_video_context.set_resize = set_resize_null; + current_video_context.has_focus = NULL; + current_video_context.suppress_screensaver = NULL; + current_video_context.has_windowed = NULL; + current_video_context.swap_buffers = swap_buffers_null; + current_video_context.input_driver = NULL; + current_video_context.get_proc_address = NULL; + current_video_context.image_buffer_init = NULL; + current_video_context.image_buffer_write = NULL; + current_video_context.show_mouse = NULL; + current_video_context.ident = NULL; + current_video_context.get_flags = NULL; + current_video_context.set_flags = NULL; + current_video_context.bind_hw_render = NULL; + current_video_context.get_context_data = NULL; + current_video_context.make_current = NULL; +} + +/** + * video_driver_get_current_framebuffer: + * + * Gets pointer to current hardware renderer framebuffer object. + * Used by RETRO_ENVIRONMENT_SET_HW_RENDER. + * + * Returns: pointer to hardware framebuffer object, otherwise 0. + **/ +uintptr_t video_driver_get_current_framebuffer(void) +{ + if (video_driver_poke && video_driver_poke->get_current_framebuffer) + return video_driver_poke->get_current_framebuffer(video_driver_data); + return 0; +} + +retro_proc_address_t video_driver_get_proc_address(const char *sym) +{ + if (video_driver_poke && video_driver_poke->get_proc_address) + return video_driver_poke->get_proc_address(video_driver_data, sym); + return NULL; +} + +bool video_driver_set_shader(enum rarch_shader_type type, + const char *path) +{ + if (current_video->set_shader) + return current_video->set_shader(video_driver_data, type, path); + return false; +} + +static void video_driver_filter_free(void) +{ + if (video_driver_state_filter) + rarch_softfilter_free(video_driver_state_filter); + video_driver_state_filter = NULL; + + if (video_driver_state_buffer) + { +#ifdef _3DS + linearFree(video_driver_state_buffer); +#else + free(video_driver_state_buffer); +#endif + } + video_driver_state_buffer = NULL; + + video_driver_state_scale = 0; + video_driver_state_out_bpp = 0; + video_driver_state_out_rgb32 = false; +} + +static void video_driver_init_filter(enum retro_pixel_format colfmt_int) +{ + unsigned pow2_x, pow2_y, maxsize; + void *buf = NULL; + settings_t *settings = config_get_ptr(); + struct retro_game_geometry *geom = &video_driver_av_info.geometry; + unsigned width = geom->max_width; + unsigned height = geom->max_height; + /* Deprecated format. Gets pre-converted. */ + enum retro_pixel_format colfmt = + (colfmt_int == RETRO_PIXEL_FORMAT_0RGB1555) ? + RETRO_PIXEL_FORMAT_RGB565 : colfmt_int; + + if (video_driver_is_hw_context()) + { + RARCH_WARN("Cannot use CPU filters when hardware rendering is used.\n"); + return; + } + + video_driver_state_filter = rarch_softfilter_new( + settings->paths.path_softfilter_plugin, + RARCH_SOFTFILTER_THREADS_AUTO, colfmt, width, height); + + if (!video_driver_state_filter) + { + RARCH_ERR("[Video]: Failed to load filter.\n"); + return; + } + + rarch_softfilter_get_max_output_size(video_driver_state_filter, + &width, &height); + + pow2_x = next_pow2(width); + pow2_y = next_pow2(height); + maxsize = MAX(pow2_x, pow2_y); + video_driver_state_scale = maxsize / RARCH_SCALE_BASE; + video_driver_state_out_rgb32 = rarch_softfilter_get_output_format( + video_driver_state_filter) == + RETRO_PIXEL_FORMAT_XRGB8888; + + video_driver_state_out_bpp = video_driver_state_out_rgb32 ? + sizeof(uint32_t) : + sizeof(uint16_t); + + /* TODO: Aligned output. */ +#ifdef _3DS + buf = linearMemAlign( + width * height * video_driver_state_out_bpp, 0x80); +#else + buf = malloc( + width * height * video_driver_state_out_bpp); +#endif + if (!buf) + { + RARCH_ERR("[Video]: Softfilter initialization failed.\n"); + video_driver_filter_free(); + return; + } + + video_driver_state_buffer = buf; +} + +static void video_driver_init_input(const input_driver_t *tmp) +{ + const input_driver_t **input = input_get_double_ptr(); + if (*input) + return; + + /* Video driver didn't provide an input driver, + * so we use configured one. */ + RARCH_LOG("[Video]: Graphics driver did not initialize an input driver." + " Attempting to pick a suitable driver.\n"); + + if (tmp) + *input = tmp; + else + input_driver_find_driver(); + + /* This should never really happen as tmp (driver.input) is always + * found before this in find_driver_input(), or we have aborted + * in a similar fashion anyways. */ + if (!input_get_ptr()) + goto error; + + if (input_driver_init()) + return; + +error: + RARCH_ERR("[Video]: Cannot initialize input driver. Exiting ...\n"); + retroarch_fail(1, "video_driver_init_input()"); +} + +/** + * video_driver_monitor_compute_fps_statistics: + * + * Computes monitor FPS statistics. + **/ +static void video_driver_monitor_compute_fps_statistics(void) +{ + double avg_fps = 0.0; + double stddev = 0.0; + unsigned samples = 0; + + if (video_driver_frame_time_count < + (2 * MEASURE_FRAME_TIME_SAMPLES_COUNT)) + { + RARCH_LOG( + "[Video]: Does not have enough samples for monitor refresh rate" + " estimation. Requires to run for at least %u frames.\n", + 2 * MEASURE_FRAME_TIME_SAMPLES_COUNT); + return; + } + + if (video_monitor_fps_statistics(&avg_fps, &stddev, &samples)) + { + RARCH_LOG("[Video]: Average monitor Hz: %.6f Hz. (%.3f %% frame time" + " deviation, based on %u last samples).\n", + avg_fps, 100.0 * stddev, samples); + } +} + +static void video_driver_pixel_converter_free(void) +{ + if (!video_driver_scaler_ptr) + return; + + scaler_ctx_gen_reset(video_driver_scaler_ptr->scaler); + + if (video_driver_scaler_ptr->scaler) + free(video_driver_scaler_ptr->scaler); + video_driver_scaler_ptr->scaler = NULL; + + if (video_driver_scaler_ptr->scaler_out) + free(video_driver_scaler_ptr->scaler_out); + video_driver_scaler_ptr->scaler_out = NULL; + + if (video_driver_scaler_ptr) + free(video_driver_scaler_ptr); + video_driver_scaler_ptr = NULL; +} + +static void video_driver_free_internal(void) +{ +#ifdef HAVE_THREADS + bool is_threaded = video_driver_is_threaded_internal(); +#endif + +#ifdef HAVE_VIDEO_LAYOUT + video_layout_deinit(); +#endif + + command_event(CMD_EVENT_OVERLAY_DEINIT, NULL); + + if (!video_driver_is_video_cache_context()) + video_driver_free_hw_context(); + + if (!input_driver_is_data_ptr_same(video_driver_data)) + input_driver_deinit(); + + if (video_driver_data + && current_video && current_video->free + ) + current_video->free(video_driver_data); + + video_driver_pixel_converter_free(); + video_driver_filter_free(); + + command_event(CMD_EVENT_SHADER_DIR_DEINIT, NULL); + +#ifdef HAVE_THREADS + if (is_threaded) + return; +#endif + + video_driver_monitor_compute_fps_statistics(); +} + +static bool video_driver_pixel_converter_init(unsigned size) +{ + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); + void *scalr_out = NULL; + video_pixel_scaler_t *scalr = NULL; + struct scaler_ctx *scalr_ctx = NULL; + + /* If pixel format is not 0RGB1555, we don't need to do + * any internal pixel conversion. */ + if (video_driver_pix_fmt != RETRO_PIXEL_FORMAT_0RGB1555) + return true; + + /* No need to perform pixel conversion for HW rendering contexts. */ + if (hwr && hwr->context_type != RETRO_HW_CONTEXT_NONE) + return true; + + RARCH_WARN("0RGB1555 pixel format is deprecated," + " and will be slower. For 15/16-bit, RGB565" + " format is preferred.\n"); + + scalr = (video_pixel_scaler_t*)calloc(1, sizeof(*scalr)); + + if (!scalr) + goto error; + + video_driver_scaler_ptr = scalr; + + scalr_ctx = (struct scaler_ctx*)calloc(1, sizeof(*scalr_ctx)); + + if (!scalr_ctx) + goto error; + + video_driver_scaler_ptr->scaler = scalr_ctx; + video_driver_scaler_ptr->scaler->scaler_type = SCALER_TYPE_POINT; + video_driver_scaler_ptr->scaler->in_fmt = SCALER_FMT_0RGB1555; + + /* TODO: Pick either ARGB8888 or RGB565 depending on driver. */ + video_driver_scaler_ptr->scaler->out_fmt = SCALER_FMT_RGB565; + + if (!scaler_ctx_gen_filter(scalr_ctx)) + goto error; + + scalr_out = calloc(sizeof(uint16_t), size * size); + + if (!scalr_out) + goto error; + + video_driver_scaler_ptr->scaler_out = scalr_out; + + return true; + +error: + video_driver_pixel_converter_free(); + video_driver_filter_free(); + + return false; +} + +static bool video_driver_init_internal(bool *video_is_threaded) +{ + video_info_t video; + unsigned max_dim, scale, width, height; + video_viewport_t *custom_vp = NULL; + const input_driver_t *tmp = NULL; + rarch_system_info_t *system = NULL; + static uint16_t dummy_pixels[32] = {0}; + settings_t *settings = config_get_ptr(); + struct retro_game_geometry *geom = &video_driver_av_info.geometry; + + if (!string_is_empty(settings->paths.path_softfilter_plugin)) + video_driver_init_filter(video_driver_pix_fmt); + + max_dim = MAX(geom->max_width, geom->max_height); + scale = next_pow2(max_dim) / RARCH_SCALE_BASE; + scale = MAX(scale, 1); + + if (video_driver_state_filter) + scale = video_driver_state_scale; + + /* Update core-dependent aspect ratio values. */ + video_driver_set_viewport_square_pixel(); + video_driver_set_viewport_core(); + video_driver_set_viewport_config(); + + /* Update CUSTOM viewport. */ + custom_vp = video_viewport_get_custom(); + + if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM) + { + float default_aspect = aspectratio_lut[ASPECT_RATIO_CORE].value; + aspectratio_lut[ASPECT_RATIO_CUSTOM].value = + (custom_vp->width && custom_vp->height) ? + (float)custom_vp->width / custom_vp->height : default_aspect; + } + + video_driver_set_aspect_ratio_value( + aspectratio_lut[settings->uints.video_aspect_ratio_idx].value); + + if (settings->bools.video_fullscreen|| retroarch_is_forced_fullscreen()) + { + width = settings->uints.video_fullscreen_x; + height = settings->uints.video_fullscreen_y; + } + else + { + /* To-Do: remove when the new window resizing core is hooked */ + if (settings->bools.video_window_save_positions && + (settings->uints.window_position_width || settings->uints.window_position_height)) + { + width = settings->uints.window_position_width; + height = settings->uints.window_position_height; + } + else + { + if (settings->bools.video_force_aspect) + { + /* Do rounding here to simplify integer scale correctness. */ + unsigned base_width = + roundf(geom->base_height * video_driver_get_aspect_ratio()); + width = roundf(base_width * settings->floats.video_scale); + } + else + width = roundf(geom->base_width * settings->floats.video_scale); + height = roundf(geom->base_height * settings->floats.video_scale); + } + } + + if (width && height) + RARCH_LOG("[Video]: Video @ %ux%u\n", width, height); + else + RARCH_LOG("[Video]: Video @ fullscreen\n"); + + video_driver_display_type_set(RARCH_DISPLAY_NONE); + video_driver_display_set(0); + video_driver_window_set(0); + + if (!video_driver_pixel_converter_init(RARCH_SCALE_BASE * scale)) + { + RARCH_ERR("[Video]: Failed to initialize pixel converter.\n"); + goto error; + } + + video.width = width; + video.height = height; + video.fullscreen = settings->bools.video_fullscreen || retroarch_is_forced_fullscreen(); + video.vsync = settings->bools.video_vsync && !rarch_ctl(RARCH_CTL_IS_NONBLOCK_FORCED, NULL); + video.force_aspect = settings->bools.video_force_aspect; + video.font_enable = settings->bools.video_font_enable; + video.swap_interval = settings->uints.video_swap_interval; +#ifdef GEKKO + video.viwidth = settings->uints.video_viwidth; + video.vfilter = settings->bools.video_vfilter; +#endif + video.smooth = settings->bools.video_smooth; + video.input_scale = scale; + video.rgb32 = video_driver_state_filter ? + video_driver_state_out_rgb32 : + (video_driver_pix_fmt == RETRO_PIXEL_FORMAT_XRGB8888); + video.parent = 0; + + video_started_fullscreen = video.fullscreen; + + /* Reset video frame count */ + video_driver_frame_count = 0; + + tmp = input_get_ptr(); + /* Need to grab the "real" video driver interface on a reinit. */ + video_driver_find_driver(); + +#ifdef HAVE_THREADS + video.is_threaded = video_driver_is_threaded_internal(); + *video_is_threaded = video.is_threaded; + + if (video.is_threaded) + { + /* Can't do hardware rendering with threaded driver currently. */ + RARCH_LOG("[Video]: Starting threaded video driver ...\n"); + + 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)) + { + RARCH_ERR("[Video]: Cannot open threaded video driver ... Exiting ...\n"); + goto error; + } + } + else +#endif + video_driver_data = current_video->init( + &video, input_get_double_ptr(), + input_driver_get_data_ptr()); + + if (!video_driver_data) + { + RARCH_ERR("[Video]: Cannot open video driver ... Exiting ...\n"); + goto error; + } + + if (current_video->focus) + video_driver_cb_has_focus = video_driver_has_focus; + + video_driver_poke = NULL; + if (current_video->poke_interface) + current_video->poke_interface(video_driver_data, &video_driver_poke); + + if (current_video->viewport_info && + (!custom_vp->width || + !custom_vp->height)) + { + /* Force custom viewport to have sane parameters. */ + custom_vp->width = width; + custom_vp->height = height; + + video_driver_get_viewport_info(custom_vp); + } + + system = runloop_get_system_info(); + + video_driver_set_rotation( + (settings->uints.video_rotation + system->rotation) % 4); + + current_video->suppress_screensaver(video_driver_data, + settings->bools.ui_suspend_screensaver_enable); + + video_driver_init_input(tmp); + + command_event(CMD_EVENT_OVERLAY_DEINIT, NULL); + command_event(CMD_EVENT_OVERLAY_INIT, NULL); + +#ifdef HAVE_VIDEO_LAYOUT + if(settings->bools.video_layout_enable) + { + video_layout_init(video_driver_data, video_driver_layout_render_interface()); + video_layout_load(settings->paths.path_video_layout); + video_layout_view_select(settings->uints.video_layout_selected_view); + } +#endif + + if (!core_is_game_loaded()) + video_driver_cached_frame_set(&dummy_pixels, 4, 4, 8); + +#if defined(PSP) + video_driver_set_texture_frame(&dummy_pixels, false, 1, 1, 1.0f); +#endif + + video_context_driver_reset(); + + video_display_server_init(); + + if ((enum rotation)settings->uints.screen_orientation != ORIENTATION_NORMAL) + video_display_server_set_screen_orientation((enum rotation)settings->uints.screen_orientation); + + command_event(CMD_EVENT_SHADER_DIR_INIT, NULL); + + return true; + +error: + retroarch_fail(1, "init_video()"); + return false; +} + +bool video_driver_set_viewport(unsigned width, unsigned height, + bool force_fullscreen, bool allow_rotate) +{ + if (!current_video || !current_video->set_viewport) + return false; + current_video->set_viewport(video_driver_data, width, height, + force_fullscreen, allow_rotate); + return true; +} + +bool video_driver_set_rotation(unsigned rotation) +{ + if (!current_video || !current_video->set_rotation) + return false; + current_video->set_rotation(video_driver_data, rotation); + return true; +} + +bool video_driver_set_video_mode(unsigned width, + unsigned height, bool fullscreen) +{ + gfx_ctx_mode_t mode; + + if (video_driver_poke && video_driver_poke->set_video_mode) + { + video_driver_poke->set_video_mode(video_driver_data, + width, height, fullscreen); + return true; + } + + mode.width = width; + mode.height = height; + mode.fullscreen = fullscreen; + + return video_context_driver_set_video_mode(&mode); +} + +bool video_driver_get_video_output_size(unsigned *width, unsigned *height) +{ + if (!video_driver_poke || !video_driver_poke->get_video_output_size) + return false; + video_driver_poke->get_video_output_size(video_driver_data, + width, height); + return true; +} + +void video_driver_set_osd_msg(const char *msg, const void *data, void *font) +{ + video_frame_info_t video_info; + video_driver_build_info(&video_info); + if (video_driver_poke && video_driver_poke->set_osd_msg) + video_driver_poke->set_osd_msg(video_driver_data, &video_info, msg, data, font); +} + +void video_driver_set_texture_enable(bool enable, bool fullscreen) +{ + if (video_driver_poke && video_driver_poke->set_texture_enable) + video_driver_poke->set_texture_enable(video_driver_data, + enable, fullscreen); +} + +void video_driver_set_texture_frame(const void *frame, bool rgb32, + unsigned width, unsigned height, float alpha) +{ + if (video_driver_poke && video_driver_poke->set_texture_frame) + video_driver_poke->set_texture_frame(video_driver_data, + frame, rgb32, width, height, alpha); +} + +#ifdef HAVE_OVERLAY +bool video_driver_overlay_interface(const video_overlay_interface_t **iface) +{ + if (!current_video || !current_video->overlay_interface) + return false; + current_video->overlay_interface(video_driver_data, iface); + return true; +} +#endif + +#ifdef HAVE_VIDEO_LAYOUT +const video_layout_render_interface_t *video_driver_layout_render_interface(void) +{ + if (!current_video || !current_video->video_layout_render_interface) + return NULL; + + return current_video->video_layout_render_interface(video_driver_data); +} +#endif + +void *video_driver_read_frame_raw(unsigned *width, + unsigned *height, size_t *pitch) +{ + if (!current_video || !current_video->read_frame_raw) + return NULL; + return current_video->read_frame_raw(video_driver_data, width, + height, pitch); +} + +void video_driver_set_filtering(unsigned index, bool smooth) +{ + if (video_driver_poke && video_driver_poke->set_filtering) + video_driver_poke->set_filtering(video_driver_data, index, smooth); +} + +void video_driver_cached_frame_set(const void *data, unsigned width, + unsigned height, size_t pitch) +{ + if (data) + frame_cache_data = data; + frame_cache_width = width; + frame_cache_height = height; + frame_cache_pitch = pitch; +} + +void video_driver_cached_frame_get(const void **data, unsigned *width, + unsigned *height, size_t *pitch) +{ + if (data) + *data = frame_cache_data; + if (width) + *width = frame_cache_width; + if (height) + *height = frame_cache_height; + if (pitch) + *pitch = frame_cache_pitch; +} + +void video_driver_get_size(unsigned *width, unsigned *height) +{ +#ifdef HAVE_THREADS + bool is_threaded = video_driver_is_threaded_internal(); + video_driver_threaded_lock(is_threaded); +#endif + if (width) + *width = video_driver_width; + if (height) + *height = video_driver_height; +#ifdef HAVE_THREADS + video_driver_threaded_unlock(is_threaded); +#endif +} + +void video_driver_set_size(unsigned *width, unsigned *height) +{ +#ifdef HAVE_THREADS + bool is_threaded = video_driver_is_threaded_internal(); + video_driver_threaded_lock(is_threaded); +#endif + if (width) + video_driver_width = *width; + if (height) + video_driver_height = *height; +#ifdef HAVE_THREADS + video_driver_threaded_unlock(is_threaded); +#endif +} + +/** + * video_monitor_set_refresh_rate: + * @hz : New refresh rate for monitor. + * + * Sets monitor refresh rate to new value. + **/ +void video_monitor_set_refresh_rate(float hz) +{ + char msg[128]; + settings_t *settings = config_get_ptr(); + + snprintf(msg, sizeof(msg), + "Setting refresh rate to: %.3f Hz.", hz); + runloop_msg_queue_push(msg, 1, 180, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + RARCH_LOG("%s\n", msg); + + configuration_set_float(settings, + settings->floats.video_refresh_rate, + hz); +} + +/** + * video_monitor_fps_statistics + * @refresh_rate : Monitor refresh rate. + * @deviation : Deviation from measured refresh rate. + * @sample_points : Amount of sampled points. + * + * Gets the monitor FPS statistics based on the current + * runtime. + * + * Returns: true (1) on success. + * false (0) if: + * a) threaded video mode is enabled + * b) less than 2 frame time samples. + * c) FPS monitor enable is off. + **/ +bool video_monitor_fps_statistics(double *refresh_rate, + double *deviation, unsigned *sample_points) +{ + unsigned i; + retro_time_t accum = 0; + retro_time_t avg = 0; + retro_time_t accum_var = 0; + unsigned samples = 0; + +#ifdef HAVE_THREADS + if (video_driver_is_threaded_internal()) + return false; +#endif + + samples = MIN(MEASURE_FRAME_TIME_SAMPLES_COUNT, + (unsigned)video_driver_frame_time_count); + + if (samples < 2) + return false; + + /* Measure statistics on frame time (microsecs), *not* FPS. */ + for (i = 0; i < samples; i++) + { + accum += video_driver_frame_time_samples[i]; +#if 0 + RARCH_LOG("[Video]: Interval #%u: %d usec / frame.\n", + i, (int)frame_time_samples[i]); +#endif + } + + avg = accum / samples; + + /* Drop first measurement. It is likely to be bad. */ + for (i = 0; i < samples; i++) + { + retro_time_t diff = video_driver_frame_time_samples[i] - avg; + accum_var += diff * diff; + } + + *deviation = sqrt((double)accum_var / (samples - 1)) / avg; + + if (refresh_rate) + *refresh_rate = 1000000.0 / avg; + + if (sample_points) + *sample_points = samples; + + return true; +} + +float video_driver_get_aspect_ratio(void) +{ + return video_driver_aspect_ratio; +} + +void video_driver_set_aspect_ratio_value(float value) +{ + video_driver_aspect_ratio = value; +} + +rarch_softfilter_t *video_driver_frame_filter_get_ptr(void) +{ + return video_driver_state_filter; +} + +enum retro_pixel_format video_driver_get_pixel_format(void) +{ + return video_driver_pix_fmt; +} + +void video_driver_set_pixel_format(enum retro_pixel_format fmt) +{ + video_driver_pix_fmt = fmt; +} + +/** + * video_driver_cached_frame: + * + * Renders the current video frame. + **/ +bool video_driver_cached_frame(void) +{ + void *recording = recording_driver_get_data_ptr(); + + /* Cannot allow recording when pushing duped frames. */ + recording_data = NULL; + + retro_ctx.frame_cb( + (frame_cache_data != RETRO_HW_FRAME_BUFFER_VALID) + ? frame_cache_data : NULL, + frame_cache_width, + frame_cache_height, frame_cache_pitch); + + recording_data = recording; + + return true; +} + +void video_driver_monitor_adjust_system_rates(void) +{ + float timing_skew = 0.0f; + settings_t *settings = config_get_ptr(); + float video_refresh_rate = settings->floats.video_refresh_rate; + float timing_skew_hz = video_refresh_rate; + const struct retro_system_timing *info = (const struct retro_system_timing*)&video_driver_av_info.timing; + + rarch_ctl(RARCH_CTL_UNSET_NONBLOCK_FORCED, NULL); + + if (!info || info->fps <= 0.0) + return; + + video_driver_core_hz = info->fps; + + if (video_driver_crt_switching_active) + timing_skew_hz = video_driver_core_hz; + timing_skew = fabs( + 1.0f - info->fps / timing_skew_hz); + + if (!settings->bools.vrr_runloop_enable) + { + /* We don't want to adjust pitch too much. If we have extreme cases, + * just don't readjust at all. */ + if (timing_skew <= settings->floats.audio_max_timing_skew) + return; + + RARCH_LOG("[Video]: Timings deviate too much. Will not adjust." + " (Display = %.2f Hz, Game = %.2f Hz)\n", + video_refresh_rate, + (float)info->fps); + } + + if (info->fps <= timing_skew_hz) + return; + + /* We won't be able to do VSync reliably when game FPS > monitor FPS. */ + rarch_ctl(RARCH_CTL_SET_NONBLOCK_FORCED, NULL); + RARCH_LOG("[Video]: Game FPS > Monitor FPS. Cannot rely on VSync.\n"); +} + +static void video_driver_lock_new(void) +{ + video_driver_lock_free(); +#ifdef HAVE_THREADS + if (!display_lock) + display_lock = slock_new(); + retro_assert(display_lock); + + if (!context_lock) + context_lock = slock_new(); + retro_assert(context_lock); +#endif +} + +void video_driver_destroy(void) +{ + video_display_server_destroy(); + crt_video_restore(); + + video_driver_cb_has_focus = null_driver_has_focus; + video_driver_use_rgba = false; + video_driver_active = false; + video_driver_cache_context = false; + video_driver_cache_context_ack = false; + video_driver_record_gpu_buffer = NULL; + current_video = NULL; + video_driver_set_cached_frame_ptr(NULL); +} + +void video_driver_set_cached_frame_ptr(const void *data) +{ + if (data) + frame_cache_data = data; +} + +void video_driver_set_stub_frame(void) +{ + frame_bak = current_video->frame; + current_video->frame = video_null.frame; +} + +void video_driver_unset_stub_frame(void) +{ + if (frame_bak != NULL) + current_video->frame = frame_bak; + + frame_bak = NULL; +} + +bool video_driver_is_stub_frame(void) +{ + return current_video->frame == video_null.frame; +} + +bool video_driver_supports_recording(void) +{ + settings_t *settings = config_get_ptr(); + return settings->bools.video_gpu_record + && current_video->read_viewport; +} + +bool video_driver_supports_viewport_read(void) +{ + return current_video->read_viewport && current_video->viewport_info; +} + +bool video_driver_prefer_viewport_read(void) +{ + settings_t *settings = config_get_ptr(); + return settings->bools.video_gpu_screenshot || + (video_driver_is_hw_context() && !current_video->read_frame_raw); +} + +bool video_driver_supports_read_frame_raw(void) +{ + if (current_video->read_frame_raw) + return true; + return false; +} + +void video_driver_set_viewport_config(void) +{ + settings_t *settings = config_get_ptr(); + + if (settings->floats.video_aspect_ratio < 0.0f) + { + struct retro_game_geometry *geom = &video_driver_av_info.geometry; + + if (geom->aspect_ratio > 0.0f && + settings->bools.video_aspect_ratio_auto) + aspectratio_lut[ASPECT_RATIO_CONFIG].value = geom->aspect_ratio; + else + { + unsigned base_width = geom->base_width; + unsigned base_height = geom->base_height; + + /* Get around division by zero errors */ + if (base_width == 0) + base_width = 1; + if (base_height == 0) + base_height = 1; + aspectratio_lut[ASPECT_RATIO_CONFIG].value = + (float)base_width / base_height; /* 1:1 PAR. */ + } + } + else + { + aspectratio_lut[ASPECT_RATIO_CONFIG].value = + settings->floats.video_aspect_ratio; + } +} + +void video_driver_set_viewport_square_pixel(void) +{ + unsigned len, highest, i, aspect_x, aspect_y; + struct retro_game_geometry *geom = &video_driver_av_info.geometry; + unsigned width = geom->base_width; + unsigned height = geom->base_height; + + if (width == 0 || height == 0) + return; + + len = MIN(width, height); + highest = 1; + + for (i = 1; i < len; i++) + { + if ((width % i) == 0 && (height % i) == 0) + highest = i; + } + + aspect_x = width / highest; + aspect_y = height / highest; + + snprintf(aspectratio_lut[ASPECT_RATIO_SQUARE].name, + sizeof(aspectratio_lut[ASPECT_RATIO_SQUARE].name), + "1:1 PAR (%u:%u DAR)", aspect_x, aspect_y); + + aspectratio_lut[ASPECT_RATIO_SQUARE].value = (float)aspect_x / aspect_y; +} + +void video_driver_set_viewport_core(void) +{ + struct retro_game_geometry *geom = &video_driver_av_info.geometry; + + if (!geom || geom->base_width <= 0.0f || geom->base_height <= 0.0f) + return; + + /* Fallback to 1:1 pixel ratio if none provided */ + if (geom->aspect_ratio > 0.0f) + aspectratio_lut[ASPECT_RATIO_CORE].value = geom->aspect_ratio; + else + aspectratio_lut[ASPECT_RATIO_CORE].value = + (float)geom->base_width / geom->base_height; +} + +void video_driver_reset_custom_viewport(void) +{ + struct video_viewport *custom_vp = video_viewport_get_custom(); + + custom_vp->width = 0; + custom_vp->height = 0; + custom_vp->x = 0; + custom_vp->y = 0; +} + +void video_driver_set_rgba(void) +{ + video_driver_lock(); + video_driver_use_rgba = true; + video_driver_unlock(); +} + +void video_driver_unset_rgba(void) +{ + video_driver_lock(); + video_driver_use_rgba = false; + video_driver_unlock(); +} + +bool video_driver_supports_rgba(void) +{ + bool tmp; + video_driver_lock(); + tmp = video_driver_use_rgba; + video_driver_unlock(); + return tmp; +} + +bool video_driver_get_next_video_out(void) +{ + if (!video_driver_poke) + return false; + + if (!video_driver_poke->get_video_output_next) + return video_context_driver_get_video_output_next(); + video_driver_poke->get_video_output_next(video_driver_data); + return true; +} + +bool video_driver_get_prev_video_out(void) +{ + if (!video_driver_poke) + return false; + + if (!video_driver_poke->get_video_output_prev) + return video_context_driver_get_video_output_prev(); + video_driver_poke->get_video_output_prev(video_driver_data); + return true; +} + +bool video_driver_init(bool *video_is_threaded) +{ + video_driver_lock_new(); + video_driver_filter_free(); + video_driver_set_cached_frame_ptr(NULL); + return video_driver_init_internal(video_is_threaded); +} + +void video_driver_destroy_data(void) +{ + video_driver_data = NULL; +} + +void video_driver_free(void) +{ + video_driver_free_internal(); + video_driver_lock_free(); + video_driver_data = NULL; + video_driver_set_cached_frame_ptr(NULL); +} + +void video_driver_monitor_reset(void) +{ + video_driver_frame_time_count = 0; +} + +void video_driver_set_aspect_ratio(void) +{ + settings_t *settings = config_get_ptr(); + + switch (settings->uints.video_aspect_ratio_idx) + { + case ASPECT_RATIO_SQUARE: + video_driver_set_viewport_square_pixel(); + break; + + case ASPECT_RATIO_CORE: + video_driver_set_viewport_core(); + break; + + case ASPECT_RATIO_CONFIG: + video_driver_set_viewport_config(); + break; + + default: + break; + } + + video_driver_set_aspect_ratio_value( + aspectratio_lut[settings->uints.video_aspect_ratio_idx].value); + + if (!video_driver_poke || !video_driver_poke->set_aspect_ratio) + return; + video_driver_poke->set_aspect_ratio( + video_driver_data, settings->uints.video_aspect_ratio_idx); +} + +void video_driver_update_viewport(struct video_viewport* vp, bool force_full, bool keep_aspect) +{ + gfx_ctx_aspect_t aspect_data; + float device_aspect = (float)vp->full_width / vp->full_height; + settings_t* settings = config_get_ptr(); + + aspect_data.aspect = &device_aspect; + aspect_data.width = vp->full_width; + aspect_data.height = vp->full_height; + + video_context_driver_translate_aspect(&aspect_data); + + vp->x = 0; + vp->y = 0; + vp->width = vp->full_width; + vp->height = vp->full_height; + + if (settings->bools.video_scale_integer && !force_full) + { + video_viewport_get_scaled_integer( + vp, vp->full_width, vp->full_height, video_driver_get_aspect_ratio(), keep_aspect); + } + else if (keep_aspect && !force_full) + { + float desired_aspect = video_driver_get_aspect_ratio(); + +#if defined(HAVE_MENU) + if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM) + { + const struct video_viewport* custom = video_viewport_get_custom(); + + vp->x = custom->x; + vp->y = custom->y; + vp->width = custom->width; + vp->height = custom->height; + } + else +#endif + { + float delta; + + if (fabsf(device_aspect - desired_aspect) < 0.0001f) + { + /* If the aspect ratios of screen and desired aspect + * ratio are sufficiently equal (floating point stuff), + * assume they are actually equal. + */ + } + else if (device_aspect > desired_aspect) + { + delta = (desired_aspect / device_aspect - 1.0f) + / 2.0f + 0.5f; + vp->x = (int)roundf(vp->full_width * (0.5f - delta)); + vp->width = (unsigned)roundf(2.0f * vp->full_width * delta); + vp->y = 0; + vp->height = vp->full_height; + } + else + { + vp->x = 0; + vp->width = vp->full_width; + delta = (device_aspect / desired_aspect - 1.0f) + / 2.0f + 0.5f; + vp->y = (int)roundf(vp->full_height * (0.5f - delta)); + vp->height = (unsigned)roundf(2.0f * vp->full_height * delta); + } + } + } + +#if defined(RARCH_MOBILE) + /* In portrait mode, we want viewport to gravitate to top of screen. */ + if (device_aspect < 1.0f) + vp->y = 0; +#endif +} + +void video_driver_show_mouse(void) +{ + if (video_driver_poke && video_driver_poke->show_mouse) + video_driver_poke->show_mouse(video_driver_data, true); +} + +void video_driver_hide_mouse(void) +{ + if (video_driver_poke && video_driver_poke->show_mouse) + video_driver_poke->show_mouse(video_driver_data, false); +} + +void video_driver_set_nonblock_state(bool toggle) +{ + if (current_video->set_nonblock_state) + current_video->set_nonblock_state(video_driver_data, toggle); +} + +bool video_driver_find_driver(void) +{ + int i; + driver_ctx_info_t drv; + settings_t *settings = config_get_ptr(); + + if (video_driver_is_hw_context()) + { + struct retro_hw_render_callback *hwr = video_driver_get_hw_context(); + + current_video = NULL; + + (void)hwr; + +#if defined(HAVE_VULKAN) + if (hwr && hw_render_context_is_vulkan(hwr->context_type)) + { + RARCH_LOG("[Video]: Using HW render, Vulkan driver forced.\n"); + current_video = &video_vulkan; + } +#endif + +#if defined(HAVE_OPENGL) || defined(HAVE_OPENGL_CORE) + if (hwr && hw_render_context_is_gl(hwr->context_type)) + { + RARCH_LOG("[Video]: Using HW render, OpenGL driver forced.\n"); + + /* If we have configured one of the HW render capable GL drivers, go with that. */ + if (!string_is_equal(settings->arrays.video_driver, "gl") && + !string_is_equal(settings->arrays.video_driver, "glcore")) + { +#if defined(HAVE_OPENGL_CORE) + current_video = &video_gl_core; + RARCH_LOG("[Video]: Forcing \"glcore\" driver.\n"); +#else + current_video = &video_gl2; + RARCH_LOG("[Video]: Forcing \"gl\" driver.\n"); +#endif + } + else + { + RARCH_LOG("[Video]: Using configured \"%s\" driver for GL HW render.\n", + settings->arrays.video_driver); + } + } +#endif + + if (current_video) + return true; + } + + if (frontend_driver_has_get_video_driver_func()) + { + current_video = (video_driver_t*)frontend_driver_get_video_driver(); + + if (current_video) + return true; + RARCH_WARN("Frontend supports get_video_driver() but did not specify one.\n"); + } + + drv.label = "video_driver"; + drv.s = settings->arrays.video_driver; + + driver_ctl(RARCH_DRIVER_CTL_FIND_INDEX, &drv); + + i = (int)drv.len; + + if (i >= 0) + current_video = (video_driver_t*)video_driver_find_handle(i); + else + { + if (verbosity_is_enabled()) + { + unsigned d; + RARCH_ERR("Couldn't find any video driver named \"%s\"\n", + settings->arrays.video_driver); + RARCH_LOG_OUTPUT("Available video drivers are:\n"); + for (d = 0; video_driver_find_handle(d); d++) + RARCH_LOG_OUTPUT("\t%s\n", video_driver_find_ident(d)); + RARCH_WARN("Going to default to first video driver...\n"); + } + + current_video = (video_driver_t*)video_driver_find_handle(0); + + if (!current_video) + retroarch_fail(1, "find_video_driver()"); + } + return true; +} + +void video_driver_apply_state_changes(void) +{ + if (video_driver_poke && + video_driver_poke->apply_state_changes) + video_driver_poke->apply_state_changes(video_driver_data); +} + +bool video_driver_read_viewport(uint8_t *buffer, bool is_idle) +{ + if ( current_video->read_viewport + && current_video->read_viewport( + video_driver_data, buffer, is_idle)) + return true; + return false; +} + +bool video_driver_frame_filter_alive(void) +{ + return !!video_driver_state_filter; +} + +bool video_driver_frame_filter_is_32bit(void) +{ + return video_driver_state_out_rgb32; +} + +void video_driver_default_settings(void) +{ + global_t *global = global_get_ptr(); + + if (!global) + return; + + global->console.screen.gamma_correction = DEFAULT_GAMMA; + global->console.flickerfilter_enable = false; + global->console.softfilter_enable = false; + + global->console.screen.resolutions.current.id = 0; +} + +void video_driver_load_settings(config_file_t *conf) +{ + bool tmp_bool = false; + global_t *global = global_get_ptr(); + + if (!conf) + return; + +#ifdef _XBOX + CONFIG_GET_BOOL_BASE(conf, global, + console.screen.gamma_correction, "gamma_correction"); +#else + CONFIG_GET_INT_BASE(conf, global, + console.screen.gamma_correction, "gamma_correction"); +#endif + + if (config_get_bool(conf, "flicker_filter_enable", + &tmp_bool)) + global->console.flickerfilter_enable = tmp_bool; + + if (config_get_bool(conf, "soft_filter_enable", + &tmp_bool)) + global->console.softfilter_enable = tmp_bool; + + CONFIG_GET_INT_BASE(conf, global, + console.screen.soft_filter_index, + "soft_filter_index"); + CONFIG_GET_INT_BASE(conf, global, + console.screen.resolutions.current.id, + "current_resolution_id"); + CONFIG_GET_INT_BASE(conf, global, + console.screen.flicker_filter_index, + "flicker_filter_index"); +} + +void video_driver_save_settings(config_file_t *conf) +{ + global_t *global = global_get_ptr(); + if (!conf) + return; + +#ifdef _XBOX + config_set_bool(conf, "gamma_correction", + global->console.screen.gamma_correction); +#else + config_set_int(conf, "gamma_correction", + global->console.screen.gamma_correction); +#endif + config_set_bool(conf, "flicker_filter_enable", + global->console.flickerfilter_enable); + config_set_bool(conf, "soft_filter_enable", + global->console.softfilter_enable); + + config_set_int(conf, "soft_filter_index", + global->console.screen.soft_filter_index); + config_set_int(conf, "current_resolution_id", + global->console.screen.resolutions.current.id); + config_set_int(conf, "flicker_filter_index", + global->console.screen.flicker_filter_index); +} + +void video_driver_reinit(void) +{ + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); + + if (hwr->cache_context) + video_driver_cache_context = true; + else + video_driver_cache_context = false; + + video_driver_cache_context_ack = false; + command_event(CMD_EVENT_RESET_CONTEXT, NULL); + video_driver_cache_context = false; +} + +bool video_driver_is_hw_context(void) +{ + bool is_hw_context = false; + + video_driver_context_lock(); + is_hw_context = (hw_render.context_type != RETRO_HW_CONTEXT_NONE); + video_driver_context_unlock(); + + return is_hw_context; +} + +void video_driver_free_hw_context(void) +{ + video_driver_context_lock(); + + if (hw_render.context_destroy) + hw_render.context_destroy(); + + memset(&hw_render, 0, sizeof(hw_render)); + + video_driver_context_unlock(); + + hw_render_context_negotiation = NULL; +} + +struct retro_hw_render_callback *video_driver_get_hw_context(void) +{ + return &hw_render; +} + +const struct retro_hw_render_context_negotiation_interface * + video_driver_get_context_negotiation_interface(void) +{ + return hw_render_context_negotiation; +} + +void video_driver_set_context_negotiation_interface( + const struct retro_hw_render_context_negotiation_interface *iface) +{ + hw_render_context_negotiation = iface; +} + +bool video_driver_is_video_cache_context(void) +{ + return video_driver_cache_context; +} + +void video_driver_set_video_cache_context_ack(void) +{ + video_driver_cache_context_ack = true; +} + +void video_driver_unset_video_cache_context_ack(void) +{ + video_driver_cache_context_ack = false; +} + +bool video_driver_is_video_cache_context_ack(void) +{ + return video_driver_cache_context_ack; +} + +void video_driver_set_active(void) +{ + video_driver_active = true; +} + +void video_driver_unset_active(void) +{ + video_driver_active = false; +} + +bool video_driver_is_active(void) +{ + return video_driver_active; +} + +void video_driver_get_record_status( + bool *has_gpu_record, + uint8_t **gpu_buf) +{ + *gpu_buf = video_driver_record_gpu_buffer; + *has_gpu_record = video_driver_record_gpu_buffer != NULL; +} + +bool video_driver_gpu_record_init(unsigned size) +{ + video_driver_record_gpu_buffer = (uint8_t*)malloc(size); + if (!video_driver_record_gpu_buffer) + return false; + return true; +} + +void video_driver_gpu_record_deinit(void) +{ + free(video_driver_record_gpu_buffer); + video_driver_record_gpu_buffer = NULL; +} + +bool video_driver_get_current_software_framebuffer( + struct retro_framebuffer *fb) +{ + if ( + video_driver_poke + && video_driver_poke->get_current_software_framebuffer + && video_driver_poke->get_current_software_framebuffer( + video_driver_data, fb)) + return true; + + return false; +} + +bool video_driver_get_hw_render_interface( + const struct retro_hw_render_interface **iface) +{ + if ( + video_driver_poke + && video_driver_poke->get_hw_render_interface + && video_driver_poke->get_hw_render_interface( + video_driver_data, iface)) + return true; + + return false; +} + +bool video_driver_get_viewport_info(struct video_viewport *viewport) +{ + if (!current_video || !current_video->viewport_info) + return false; + current_video->viewport_info(video_driver_data, viewport); + return true; +} + +void video_driver_set_title_buf(void) +{ + struct retro_system_info info; + core_get_system_info(&info); + + fill_pathname_join_concat_noext( + video_driver_title_buf, + msg_hash_to_str(MSG_PROGRAM), + " ", + info.library_name, + sizeof(video_driver_title_buf)); + strlcat(video_driver_title_buf, " ", + sizeof(video_driver_title_buf)); + strlcat(video_driver_title_buf, info.library_version, + sizeof(video_driver_title_buf)); +} + +/** + * video_viewport_get_scaled_integer: + * @vp : Viewport handle + * @width : Width. + * @height : Height. + * @aspect_ratio : Aspect ratio (in float). + * @keep_aspect : Preserve aspect ratio? + * + * Gets viewport scaling dimensions based on + * scaled integer aspect ratio. + **/ +void video_viewport_get_scaled_integer(struct video_viewport *vp, + unsigned width, unsigned height, + float aspect_ratio, bool keep_aspect) +{ + int padding_x = 0; + int padding_y = 0; + settings_t *settings = config_get_ptr(); + + if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM) + { + struct video_viewport *custom = video_viewport_get_custom(); + + if (custom) + { + padding_x = width - custom->width; + padding_y = height - custom->height; + width = custom->width; + height = custom->height; + } + } + else + { + unsigned base_width; + /* Use system reported sizes as these define the + * geometry for the "normal" case. */ + unsigned base_height = + video_driver_av_info.geometry.base_height; + + if (base_height == 0) + base_height = 1; + + /* Account for non-square pixels. + * This is sort of contradictory with the goal of integer scale, + * but it is desirable in some cases. + * + * If square pixels are used, base_height will be equal to + * system->av_info.base_height. */ + base_width = (unsigned)roundf(base_height * aspect_ratio); + + /* Make sure that we don't get 0x scale ... */ + if (width >= base_width && height >= base_height) + { + if (keep_aspect) + { + /* X/Y scale must be same. */ + unsigned max_scale = MIN(width / base_width, + height / base_height); + padding_x = width - base_width * max_scale; + padding_y = height - base_height * max_scale; + } + else + { + /* X/Y can be independent, each scaled as much as possible. */ + padding_x = width % base_width; + padding_y = height % base_height; + } + } + + width -= padding_x; + height -= padding_y; + } + + vp->width = width; + vp->height = height; + vp->x = padding_x / 2; + vp->y = padding_y / 2; +} + +struct retro_system_av_info *video_viewport_get_system_av_info(void) +{ + return &video_driver_av_info; +} + +struct video_viewport *video_viewport_get_custom(void) +{ + settings_t *settings = config_get_ptr(); + return &settings->video_viewport_custom; +} + +unsigned video_pixel_get_alignment(unsigned pitch) +{ + if (pitch & 1) + return 1; + if (pitch & 2) + return 2; + if (pitch & 4) + return 4; + return 8; +} + +/** + * video_driver_frame: + * @data : pointer to data of the video frame. + * @width : width of the video frame. + * @height : height of the video frame. + * @pitch : pitch of the video frame. + * + * Video frame render callback function. + **/ +void video_driver_frame(const void *data, unsigned width, + unsigned height, size_t pitch) +{ + static char video_driver_msg[256]; + video_frame_info_t video_info; + static retro_time_t curr_time; + static retro_time_t fps_time; + static float last_fps, frame_time; + retro_time_t new_time = + cpu_features_get_time_usec(); + + if (!video_driver_active) + return; + + if (video_driver_scaler_ptr && data && + (video_driver_pix_fmt == RETRO_PIXEL_FORMAT_0RGB1555) && + (data != RETRO_HW_FRAME_BUFFER_VALID)) + { + if (video_pixel_frame_scale( + video_driver_scaler_ptr->scaler, + video_driver_scaler_ptr->scaler_out, + data, width, height, pitch)) + { + data = video_driver_scaler_ptr->scaler_out; + pitch = video_driver_scaler_ptr->scaler->out_stride; + } + } + + if (data) + frame_cache_data = data; + frame_cache_width = width; + frame_cache_height = height; + frame_cache_pitch = pitch; + + video_driver_build_info(&video_info); + + /* Get the amount of frames per seconds. */ + if (video_driver_frame_count) + { + static char title[256]; + unsigned write_index = + video_driver_frame_time_count++ & + (MEASURE_FRAME_TIME_SAMPLES_COUNT - 1); + frame_time = new_time - fps_time; + video_driver_frame_time_samples[write_index] = frame_time; + fps_time = new_time; + + if (video_driver_frame_count == 1) + strlcpy(title, video_driver_window_title, sizeof(title)); + + if (video_info.fps_show) + { + snprintf(video_info.fps_text, sizeof(video_info.fps_text), + "FPS: %6.1f", last_fps); + if (video_info.framecount_show) + strlcat(video_info.fps_text, " || ", sizeof(video_info.fps_text)); + } + + if (video_info.framecount_show) + { + char frames_text[64]; + snprintf(frames_text, + sizeof(frames_text), + "%s: %" PRIu64, msg_hash_to_str(MSG_FRAMES), + (uint64_t)video_driver_frame_count); + strlcat(video_info.fps_text, frames_text, sizeof(video_info.fps_text)); + } + + if ((video_driver_frame_count % FPS_UPDATE_INTERVAL) == 0) + { + last_fps = TIME_TO_FPS(curr_time, new_time, FPS_UPDATE_INTERVAL); + + strlcpy(video_driver_window_title, title, sizeof(video_driver_window_title)); + + if (!string_is_empty(video_info.fps_text)) + { + strlcat(video_driver_window_title, "|| ", sizeof(video_driver_window_title)); + strlcat(video_driver_window_title, + video_info.fps_text, sizeof(video_driver_window_title)); + } + + curr_time = new_time; + video_driver_window_title_update = true; + } + } + else + { + curr_time = fps_time = new_time; + + strlcpy(video_driver_window_title, + video_driver_title_buf, + sizeof(video_driver_window_title)); + + if (video_info.fps_show) + strlcpy(video_info.fps_text, + msg_hash_to_str(MENU_ENUM_LABEL_VALUE_NOT_AVAILABLE), + sizeof(video_info.fps_text)); + + video_driver_window_title_update = true; + } + + video_info.frame_rate = last_fps; + video_info.frame_time = frame_time / 1000.0f; + video_info.frame_count = (uint64_t) video_driver_frame_count; + + /* Slightly messy code, + * but we really need to do processing before blocking on VSync + * for best possible scheduling. + */ + if ( + ( + !video_driver_state_filter + || !video_info.post_filter_record + || !data + || video_driver_record_gpu_buffer + ) && recording_data + ) + recording_dump_frame(data, width, height, + pitch, video_info.runloop_is_idle); + + if (data && video_driver_state_filter) + { + unsigned output_width = 0; + unsigned output_height = 0; + unsigned output_pitch = 0; + + rarch_softfilter_get_output_size(video_driver_state_filter, + &output_width, &output_height, width, height); + + output_pitch = (output_width) * video_driver_state_out_bpp; + + rarch_softfilter_process(video_driver_state_filter, + video_driver_state_buffer, output_pitch, + data, width, height, pitch); + + if (video_info.post_filter_record && recording_data) + recording_dump_frame(video_driver_state_buffer, + output_width, output_height, output_pitch, + video_info.runloop_is_idle); + + data = video_driver_state_buffer; + width = output_width; + height = output_height; + pitch = output_pitch; + } + + video_driver_msg[0] = '\0'; + + if (video_info.font_enable) + { + const char *msg = NULL; +#ifdef HAVE_THREADS + runloop_msg_queue_lock_internal(); +#endif + msg = msg_queue_pull(runloop_msg_queue); + if (msg) + strlcpy(video_driver_msg, msg, sizeof(video_driver_msg)); +#ifdef HAVE_THREADS + runloop_msg_queue_unlock_internal(); +#endif + } + + if (video_info.statistics_show) + { + audio_statistics_t audio_stats = {0.0f}; + double stddev = 0.0; + struct retro_system_av_info *av_info = &video_driver_av_info; + unsigned red = 255; + unsigned green = 255; + unsigned blue = 255; + unsigned alpha = 255; + + video_monitor_fps_statistics(NULL, &stddev, NULL); + + video_info.osd_stat_params.x = 0.010f; + video_info.osd_stat_params.y = 0.950f; + video_info.osd_stat_params.scale = 1.0f; + video_info.osd_stat_params.full_screen = true; + video_info.osd_stat_params.drop_x = -2; + video_info.osd_stat_params.drop_y = -2; + video_info.osd_stat_params.drop_mod = 0.3f; + video_info.osd_stat_params.drop_alpha = 1.0f; + video_info.osd_stat_params.color = COLOR_ABGR( + red, green, blue, alpha); + + compute_audio_buffer_statistics(&audio_stats); + + snprintf(video_info.stat_text, + sizeof(video_info.stat_text), + "Video Statistics:\n -Frame rate: %6.2f fps\n -Frame time: %6.2f ms\n -Frame time deviation: %.3f %%\n" + " -Frame count: %" PRIu64"\n -Viewport: %d x %d x %3.2f\n" + "Audio Statistics:\n -Average buffer saturation: %.2f %%\n -Standard deviation: %.2f %%\n -Time spent close to underrun: %.2f %%\n -Time spent close to blocking: %.2f %%\n -Sample count: %d\n" + "Core Geometry:\n -Size: %u x %u\n -Max Size: %u x %u\n -Aspect: %3.2f\nCore Timing:\n -FPS: %3.2f\n -Sample Rate: %6.2f\n", + video_info.frame_rate, + video_info.frame_time, + 100.0 * stddev, + video_info.frame_count, + video_info.width, + video_info.height, + video_info.refresh_rate, + audio_stats.average_buffer_saturation, + audio_stats.std_deviation_percentage, + audio_stats.close_to_underrun, + audio_stats.close_to_blocking, + audio_stats.samples, + av_info->geometry.base_width, + av_info->geometry.base_height, + av_info->geometry.max_width, + av_info->geometry.max_height, + av_info->geometry.aspect_ratio, + av_info->timing.fps, + av_info->timing.sample_rate); + + /* TODO/FIXME - add OSD chat text here */ +#if 0 + snprintf(video_info.chat_text, sizeof(video_info.chat_text), + "anon: does retroarch netplay have in-game chat?\nradius: I don't know \u2605"); +#endif + } + + video_driver_active = current_video->frame( + video_driver_data, data, width, height, + video_driver_frame_count, + (unsigned)pitch, video_driver_msg, &video_info); + + video_driver_frame_count++; + + /* Display the FPS, with a higher priority. */ + if (video_info.fps_show || video_info.framecount_show) + { +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) + if (!menu_widgets_set_fps_text(video_info.fps_text)) +#endif + runloop_msg_queue_push(video_info.fps_text, 2, 1, true, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); + } + + /* trigger set resolution*/ + if (video_info.crt_switch_resolution) + { + video_driver_crt_switching_active = true; + + if (video_info.crt_switch_resolution_super == 2560) + width = 2560; + if (video_info.crt_switch_resolution_super == 3840) + width = 3840; + if (video_info.crt_switch_resolution_super == 1920) + width = 1920; + + if (video_info.crt_switch_resolution_super == 1) + video_driver_crt_dynamic_super_width = true; + else + video_driver_crt_dynamic_super_width = false; + + crt_switch_res_core(width, height, video_driver_core_hz, video_info.crt_switch_resolution, video_info.crt_switch_center_adjust, video_info.monitor_index, video_driver_crt_dynamic_super_width); + } + else if (!video_info.crt_switch_resolution) + video_driver_crt_switching_active = false; + + /* trigger set resolution*/ +} + +void crt_switch_driver_reinit(void) +{ + video_driver_reinit(); +} + +void video_driver_display_type_set(enum rarch_display_type type) +{ + video_driver_display_type = type; +} + +uintptr_t video_driver_display_get(void) +{ + return video_driver_display; +} + +void video_driver_display_set(uintptr_t idx) +{ + video_driver_display = idx; +} + +enum rarch_display_type video_driver_display_type_get(void) +{ + return video_driver_display_type; +} + +void video_driver_window_set(uintptr_t idx) +{ + video_driver_window = idx; +} + +uintptr_t video_driver_window_get(void) +{ + return video_driver_window; +} + +bool video_driver_texture_load(void *data, + enum texture_filter_type filter_type, + uintptr_t *id) +{ +#ifdef HAVE_THREADS + bool is_threaded = video_driver_is_threaded_internal(); +#endif + if (!id || !video_driver_poke || !video_driver_poke->load_texture) + return false; + +#ifdef HAVE_THREADS + if (is_threaded) + video_context_driver_make_current(false); +#endif + + *id = video_driver_poke->load_texture(video_driver_data, data, + video_driver_is_threaded_internal(), + filter_type); + + return true; +} + +bool video_driver_texture_unload(uintptr_t *id) +{ +#ifdef HAVE_THREADS + bool is_threaded = video_driver_is_threaded_internal(); +#endif + if (!video_driver_poke || !video_driver_poke->unload_texture) + return false; + +#ifdef HAVE_THREADS + if (is_threaded) + video_context_driver_make_current(false); +#endif + + video_driver_poke->unload_texture(video_driver_data, *id); + *id = 0; + return true; +} + +void video_driver_build_info(video_frame_info_t *video_info) +{ + bool is_perfcnt_enable = false; + bool is_paused = false; + bool is_idle = false; + bool is_slowmotion = false; + settings_t *settings = NULL; + video_viewport_t *custom_vp = NULL; + struct retro_hw_render_callback *hwr = + video_driver_get_hw_context(); +#ifdef HAVE_THREADS + bool is_threaded = video_driver_is_threaded_internal(); + video_driver_threaded_lock(is_threaded); +#endif + settings = config_get_ptr(); + custom_vp = &settings->video_viewport_custom; + video_info->refresh_rate = settings->floats.video_refresh_rate; + video_info->crt_switch_resolution = settings->uints.crt_switch_resolution; + video_info->crt_switch_resolution_super = settings->uints.crt_switch_resolution_super; + video_info->crt_switch_center_adjust = settings->ints.crt_switch_center_adjust; + video_info->black_frame_insertion = settings->bools.video_black_frame_insertion; + video_info->hard_sync = settings->bools.video_hard_sync; + video_info->hard_sync_frames = settings->uints.video_hard_sync_frames; + video_info->fps_show = settings->bools.video_fps_show; + video_info->statistics_show = settings->bools.video_statistics_show; + video_info->framecount_show = settings->bools.video_framecount_show; + video_info->scale_integer = settings->bools.video_scale_integer; + video_info->aspect_ratio_idx = settings->uints.video_aspect_ratio_idx; + video_info->post_filter_record = settings->bools.video_post_filter_record; + video_info->input_menu_swap_ok_cancel_buttons = settings->bools.input_menu_swap_ok_cancel_buttons; + video_info->max_swapchain_images = settings->uints.video_max_swapchain_images; + video_info->windowed_fullscreen = settings->bools.video_windowed_fullscreen; + video_info->fullscreen = settings->bools.video_fullscreen || retroarch_is_forced_fullscreen(); + video_info->monitor_index = settings->uints.video_monitor_index; + video_info->shared_context = settings->bools.video_shared_context; + + if (libretro_get_shared_context() && hwr && hwr->context_type != RETRO_HW_CONTEXT_NONE) + video_info->shared_context = true; + + video_info->font_enable = settings->bools.video_font_enable; + video_info->font_msg_pos_x = settings->floats.video_msg_pos_x; + video_info->font_msg_pos_y = settings->floats.video_msg_pos_y; + video_info->font_msg_color_r = settings->floats.video_msg_color_r; + video_info->font_msg_color_g = settings->floats.video_msg_color_g; + video_info->font_msg_color_b = settings->floats.video_msg_color_b; + video_info->custom_vp_x = custom_vp->x; + video_info->custom_vp_y = custom_vp->y; + video_info->custom_vp_width = custom_vp->width; + video_info->custom_vp_height = custom_vp->height; + video_info->custom_vp_full_width = custom_vp->full_width; + video_info->custom_vp_full_height = custom_vp->full_height; + + video_info->fps_text[0] = '\0'; + + video_info->width = video_driver_width; + video_info->height = video_driver_height; + + video_info->use_rgba = video_driver_use_rgba; + + video_info->libretro_running = false; + video_info->msg_bgcolor_enable = settings->bools.video_msg_bgcolor_enable; + +#ifdef HAVE_MENU + video_info->menu_is_alive = menu_driver_is_alive(); + video_info->menu_footer_opacity = settings->floats.menu_footer_opacity; + video_info->menu_header_opacity = settings->floats.menu_header_opacity; + video_info->materialui_color_theme = settings->uints.menu_materialui_color_theme; + video_info->ozone_color_theme = settings->uints.menu_ozone_color_theme; + video_info->menu_shader_pipeline = settings->uints.menu_xmb_shader_pipeline; + video_info->xmb_theme = settings->uints.menu_xmb_theme; + video_info->xmb_color_theme = settings->uints.menu_xmb_color_theme; + video_info->timedate_enable = settings->bools.menu_timedate_enable; + video_info->battery_level_enable = settings->bools.menu_battery_level_enable; + video_info->xmb_shadows_enable = settings->bools.menu_xmb_shadows_enable; + video_info->xmb_alpha_factor = settings->uints.menu_xmb_alpha_factor; + video_info->menu_wallpaper_opacity = settings->floats.menu_wallpaper_opacity; + video_info->menu_framebuffer_opacity = settings->floats.menu_framebuffer_opacity; + + video_info->libretro_running = core_is_game_loaded(); +#else + video_info->menu_is_alive = false; + video_info->menu_footer_opacity = 0.0f; + video_info->menu_header_opacity = 0.0f; + video_info->materialui_color_theme = 0; + video_info->menu_shader_pipeline = 0; + video_info->xmb_color_theme = 0; + video_info->xmb_theme = 0; + video_info->timedate_enable = false; + video_info->battery_level_enable = false; + video_info->xmb_shadows_enable = false; + video_info->xmb_alpha_factor = 0.0f; + video_info->menu_framebuffer_opacity = 0.0f; + video_info->menu_wallpaper_opacity = 0.0f; +#endif + + runloop_get_status(&is_paused, &is_idle, &is_slowmotion, &is_perfcnt_enable); + + video_info->is_perfcnt_enable = is_perfcnt_enable; + video_info->runloop_is_paused = is_paused; + video_info->runloop_is_idle = is_idle; + video_info->runloop_is_slowmotion = is_slowmotion; + + video_info->input_driver_nonblock_state = input_driver_is_nonblock_state(); + + video_info->context_data = video_context_data; + + video_info->cb_update_window_title = current_video_context.update_window_title; + video_info->cb_swap_buffers = current_video_context.swap_buffers; + video_info->cb_get_metrics = current_video_context.get_metrics; + video_info->cb_set_resize = current_video_context.set_resize; + + video_info->userdata = video_driver_get_ptr(false); + +#ifdef HAVE_THREADS + video_driver_threaded_unlock(is_threaded); +#endif +} + +/** + * video_driver_translate_coord_viewport: + * @mouse_x : Pointer X coordinate. + * @mouse_y : Pointer Y coordinate. + * @res_x : Scaled X coordinate. + * @res_y : Scaled Y coordinate. + * @res_screen_x : Scaled screen X coordinate. + * @res_screen_y : Scaled screen Y coordinate. + * + * Translates pointer [X,Y] coordinates into scaled screen + * coordinates based on viewport info. + * + * Returns: true (1) if successful, false if video driver doesn't support + * viewport info. + **/ +bool video_driver_translate_coord_viewport( + struct video_viewport *vp, + int mouse_x, int mouse_y, + int16_t *res_x, int16_t *res_y, + int16_t *res_screen_x, int16_t *res_screen_y) +{ + int scaled_screen_x, scaled_screen_y, scaled_x, scaled_y; + int norm_vp_width = (int)vp->width; + int norm_vp_height = (int)vp->height; + int norm_full_vp_width = (int)vp->full_width; + int norm_full_vp_height = (int)vp->full_height; + + if (norm_full_vp_width <= 0 || norm_full_vp_height <= 0) + return false; + + if (mouse_x >= 0 && mouse_x <= norm_full_vp_width) + scaled_screen_x = ((2 * mouse_x * 0x7fff) + / norm_full_vp_width) - 0x7fff; + else + scaled_screen_x = -0x8000; /* OOB */ + + if (mouse_y >= 0 && mouse_y <= norm_full_vp_height) + scaled_screen_y = ((2 * mouse_y * 0x7fff) + / norm_full_vp_height) - 0x7fff; + else + scaled_screen_y = -0x8000; /* OOB */ + + mouse_x -= vp->x; + mouse_y -= vp->y; + + if (mouse_x >= 0 && mouse_x <= norm_vp_width) + scaled_x = ((2 * mouse_x * 0x7fff) + / norm_vp_width) - 0x7fff; + else + scaled_x = -0x8000; /* OOB */ + + if (mouse_y >= 0 && mouse_y <= norm_vp_height) + scaled_y = ((2 * mouse_y * 0x7fff) + / norm_vp_height) - 0x7fff; + else + scaled_y = -0x8000; /* OOB */ + + *res_x = scaled_x; + *res_y = scaled_y; + *res_screen_x = scaled_screen_x; + *res_screen_y = scaled_screen_y; + + return true; +} + +void video_driver_get_window_title(char *buf, unsigned len) +{ + if (buf && video_driver_window_title_update) + { + strlcpy(buf, video_driver_window_title, len); + video_driver_window_title_update = false; + } +} + +void video_driver_get_status(uint64_t *frame_count, bool * is_alive, + bool *is_focused) +{ + *frame_count = video_driver_frame_count; + *is_alive = current_video ? + current_video->alive(video_driver_data) : true; + *is_focused = video_driver_cb_has_focus(); +} + +/** + * find_video_context_driver_driver_index: + * @ident : Identifier of resampler driver to find. + * + * Finds graphics context driver index by @ident name. + * + * Returns: graphics context driver index if driver was found, otherwise + * -1. + **/ +static int find_video_context_driver_index(const char *ident) +{ + unsigned i; + for (i = 0; gfx_ctx_drivers[i]; i++) + if (string_is_equal_noncase(ident, gfx_ctx_drivers[i]->ident)) + return i; + return -1; +} + +/** + * find_prev_context_driver: + * + * Finds previous driver in graphics context driver array. + **/ +bool video_context_driver_find_prev_driver(void) +{ + settings_t *settings = config_get_ptr(); + int i = find_video_context_driver_index( + settings->arrays.video_context_driver); + + if (i > 0) + { + strlcpy(settings->arrays.video_context_driver, + gfx_ctx_drivers[i - 1]->ident, + sizeof(settings->arrays.video_context_driver)); + return true; + } + + RARCH_WARN("Couldn't find any previous video context driver.\n"); + return false; +} + +/** + * find_next_context_driver: + * + * Finds next driver in graphics context driver array. + **/ +bool video_context_driver_find_next_driver(void) +{ + settings_t *settings = config_get_ptr(); + int i = find_video_context_driver_index( + settings->arrays.video_context_driver); + + if (i >= 0 && gfx_ctx_drivers[i + 1]) + { + strlcpy(settings->arrays.video_context_driver, + gfx_ctx_drivers[i + 1]->ident, + sizeof(settings->arrays.video_context_driver)); + return true; + } + + RARCH_WARN("Couldn't find any next video context driver.\n"); + return false; +} + +/** + * video_context_driver_init: + * @data : Input data. + * @ctx : Graphics context driver to initialize. + * @ident : Identifier of graphics context driver to find. + * @api : API of higher-level graphics API. + * @major : Major version number of higher-level graphics API. + * @minor : Minor version number of higher-level graphics API. + * @hw_render_ctx : Request a graphics context driver capable of + * hardware rendering? + * + * Initialize graphics context driver. + * + * Returns: graphics context driver if successfully initialized, + * otherwise NULL. + **/ +static const gfx_ctx_driver_t *video_context_driver_init( + void *data, + const gfx_ctx_driver_t *ctx, + const char *ident, + enum gfx_ctx_api api, unsigned major, + unsigned minor, bool hw_render_ctx, + void **ctx_data) +{ + video_frame_info_t video_info; + + if (!ctx->bind_api(data, api, major, minor)) + { + RARCH_WARN("Failed to bind API (#%u, version %u.%u)" + " on context driver \"%s\".\n", + (unsigned)api, major, minor, ctx->ident); + + return NULL; + } + + video_driver_build_info(&video_info); + + if (!(*ctx_data = ctx->init(&video_info, data))) + return NULL; + + if (ctx->bind_hw_render) + ctx->bind_hw_render(*ctx_data, + video_info.shared_context && hw_render_ctx); + + return ctx; +} + +/** + * video_context_driver_init_first: + * @data : Input data. + * @ident : Identifier of graphics context driver to find. + * @api : API of higher-level graphics API. + * @major : Major version number of higher-level graphics API. + * @minor : Minor version number of higher-level graphics API. + * @hw_render_ctx : Request a graphics context driver capable of + * hardware rendering? + * + * Finds first suitable graphics context driver and initializes. + * + * Returns: graphics context driver if found, otherwise NULL. + **/ +const gfx_ctx_driver_t *video_context_driver_init_first(void *data, + const char *ident, enum gfx_ctx_api api, unsigned major, + unsigned minor, bool hw_render_ctx, void **ctx_data) +{ + int i = find_video_context_driver_index(ident); + + if (i >= 0) + { + const gfx_ctx_driver_t *ctx = video_context_driver_init(data, gfx_ctx_drivers[i], ident, + api, major, minor, hw_render_ctx, ctx_data); + if (ctx) + { + video_context_data = *ctx_data; + return ctx; + } + } + + for (i = 0; gfx_ctx_drivers[i]; i++) + { + const gfx_ctx_driver_t *ctx = + video_context_driver_init(data, gfx_ctx_drivers[i], ident, + api, major, minor, hw_render_ctx, ctx_data); + + if (ctx) + { + video_context_data = *ctx_data; + return ctx; + } + } + + return NULL; +} + +bool video_context_driver_init_image_buffer(const video_info_t *data) +{ + if ( + current_video_context.image_buffer_init + && current_video_context.image_buffer_init( + video_context_data, data)) + return true; + return false; +} + +bool video_context_driver_write_to_image_buffer(gfx_ctx_image_t *img) +{ + if ( + current_video_context.image_buffer_write + && current_video_context.image_buffer_write(video_context_data, + img->frame, img->width, img->height, img->pitch, + img->rgb32, img->index, img->handle)) + return true; + return false; +} + +bool video_context_driver_get_video_output_prev(void) +{ + if (!current_video_context.get_video_output_prev) + return false; + current_video_context.get_video_output_prev(video_context_data); + return true; +} + +bool video_context_driver_get_video_output_next(void) +{ + if (!current_video_context.get_video_output_next) + return false; + current_video_context.get_video_output_next(video_context_data); + return true; +} + +void video_context_driver_make_current(bool release) +{ + if (current_video_context.make_current) + current_video_context.make_current(release); +} + +bool video_context_driver_translate_aspect(gfx_ctx_aspect_t *aspect) +{ + if (!video_context_data || !aspect) + return false; + if (!current_video_context.translate_aspect) + return false; + *aspect->aspect = current_video_context.translate_aspect( + video_context_data, aspect->width, aspect->height); + return true; +} + +void video_context_driver_free(void) +{ + if (current_video_context.destroy) + current_video_context.destroy(video_context_data); + video_context_driver_destroy(); + video_context_data = NULL; +} + +bool video_context_driver_get_video_output_size(gfx_ctx_size_t *size_data) +{ + if (!size_data) + return false; + if (!current_video_context.get_video_output_size) + return false; + current_video_context.get_video_output_size(video_context_data, + size_data->width, size_data->height); + return true; +} + +bool video_context_driver_swap_interval(int *interval) +{ + gfx_ctx_flags_t flags; + int current_interval = *interval; + settings_t *settings = config_get_ptr(); + bool adaptive_vsync_enabled = video_driver_get_all_flags(&flags, GFX_CTX_FLAGS_ADAPTIVE_VSYNC) && settings->bools.video_adaptive_vsync; + + if (!current_video_context.swap_interval) + return false; + if (adaptive_vsync_enabled && current_interval == 1) + current_interval = -1; + current_video_context.swap_interval(video_context_data, current_interval); + return true; +} + +bool video_context_driver_get_proc_address(gfx_ctx_proc_address_t *proc) +{ + if (!current_video_context.get_proc_address) + return false; + + proc->addr = current_video_context.get_proc_address(proc->sym); + + return true; +} + +bool video_context_driver_get_metrics(gfx_ctx_metrics_t *metrics) +{ + if ( + current_video_context.get_metrics(video_context_data, + metrics->type, + metrics->value)) + return true; + return false; +} + +bool video_context_driver_get_refresh_rate(float *refresh_rate) +{ + float refresh_holder = 0; + + if (!current_video_context.get_refresh_rate || !refresh_rate) + return false; + if (!video_context_data) + return false; + + if (!video_driver_crt_switching_active) + if (refresh_rate) + *refresh_rate = + current_video_context.get_refresh_rate(video_context_data); + + if (video_driver_crt_switching_active) + { + if (refresh_rate) + refresh_holder = + current_video_context.get_refresh_rate(video_context_data); + if (refresh_holder != video_driver_core_hz) /* Fix for incorrect interlace detsction -- HARD SET VSNC TO REQUIRED REFRESH FOR CRT*/ + *refresh_rate = video_driver_core_hz; + } + + return true; +} + +bool video_context_driver_input_driver(gfx_ctx_input_t *inp) +{ + settings_t *settings = config_get_ptr(); + const char *joypad_name = settings ? + settings->arrays.input_joypad_driver : NULL; + + if (!current_video_context.input_driver) + return false; + current_video_context.input_driver( + video_context_data, joypad_name, + inp->input, inp->input_data); + return true; +} + +bool video_context_driver_suppress_screensaver(bool *bool_data) +{ + if ( video_context_data + && current_video_context.suppress_screensaver( + video_context_data, *bool_data)) + return true; + return false; +} + +bool video_context_driver_get_ident(gfx_ctx_ident_t *ident) +{ + if (!ident) + return false; + ident->ident = current_video_context.ident; + return true; +} + +bool video_context_driver_set_video_mode(gfx_ctx_mode_t *mode_info) +{ + video_frame_info_t video_info; + + if (!current_video_context.set_video_mode) + return false; + + video_driver_build_info(&video_info); + + if (!current_video_context.set_video_mode( + video_context_data, &video_info, mode_info->width, + mode_info->height, mode_info->fullscreen)) + return false; + return true; +} + +bool video_context_driver_get_video_size(gfx_ctx_mode_t *mode_info) +{ + if (!current_video_context.get_video_size) + return false; + current_video_context.get_video_size(video_context_data, + &mode_info->width, &mode_info->height); + return true; +} + +bool video_context_driver_show_mouse(bool *bool_data) +{ + if (!current_video_context.show_mouse) + return false; + current_video_context.show_mouse(video_context_data, *bool_data); + return true; +} + +bool video_context_driver_get_flags(gfx_ctx_flags_t *flags) +{ + if (!current_video_context.get_flags) + return false; + + if (deferred_video_context_driver_set_flags) + { + flags->flags = deferred_flag_data.flags; + deferred_video_context_driver_set_flags = false; + return true; + } + + flags->flags = current_video_context.get_flags(video_context_data); + return true; +} + +static bool video_driver_get_flags(gfx_ctx_flags_t *flags) +{ + if (!video_driver_poke || !video_driver_poke->get_flags) + return false; + flags->flags = video_driver_poke->get_flags(video_driver_data); + return true; +} + +bool video_driver_get_all_flags(gfx_ctx_flags_t *flags, enum display_flags flag) +{ + if (!flags) + return false; + + if (video_driver_get_flags(flags)) + if (BIT32_GET(flags->flags, flag)) + return true; + + flags->flags = 0; + + if (video_context_driver_get_flags(flags)) + if (BIT32_GET(flags->flags, flag)) + return true; + + return false; +} + +bool video_context_driver_set_flags(gfx_ctx_flags_t *flags) +{ + if (!flags) + return false; + if (!current_video_context.set_flags) + { + deferred_flag_data.flags = flags->flags; + deferred_video_context_driver_set_flags = true; + return false; + } + + current_video_context.set_flags(video_context_data, flags->flags); + return true; +} + +enum gfx_ctx_api video_context_driver_get_api(void) +{ + enum gfx_ctx_api ctx_api = video_context_data ? + current_video_context.get_api(video_context_data) : GFX_CTX_NONE; + + if (ctx_api == GFX_CTX_NONE) + { + const char *video_driver = video_driver_get_ident(); + if (string_is_equal(video_driver, "d3d9")) + return GFX_CTX_DIRECT3D9_API; + else if (string_is_equal(video_driver, "d3d10")) + return GFX_CTX_DIRECT3D10_API; + else if (string_is_equal(video_driver, "d3d11")) + return GFX_CTX_DIRECT3D11_API; + else if (string_is_equal(video_driver, "d3d12")) + return GFX_CTX_DIRECT3D12_API; + else if (string_is_equal(video_driver, "gx2")) + return GFX_CTX_GX2_API; + else if (string_is_equal(video_driver, "gx")) + return GFX_CTX_GX_API; + else if (string_is_equal(video_driver, "gl")) + return GFX_CTX_OPENGL_API; + else if (string_is_equal(video_driver, "gl1")) + return GFX_CTX_OPENGL_API; + else if (string_is_equal(video_driver, "glcore")) + return GFX_CTX_OPENGL_API; + else if (string_is_equal(video_driver, "vulkan")) + return GFX_CTX_VULKAN_API; + else if (string_is_equal(video_driver, "metal")) + return GFX_CTX_METAL_API; + + return GFX_CTX_NONE; + } + + return ctx_api; +} + +bool video_driver_has_windowed(void) +{ +#if !(defined(RARCH_CONSOLE) || defined(RARCH_MOBILE)) + if (video_driver_data && current_video->has_windowed) + return current_video->has_windowed(video_driver_data); + else if (video_context_data && current_video_context.has_windowed) + return current_video_context.has_windowed(video_context_data); +#endif + return false; +} + +bool video_driver_cached_frame_has_valid_framebuffer(void) +{ + if (frame_cache_data) + return (frame_cache_data == RETRO_HW_FRAME_BUFFER_VALID); + return false; +} + + +bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader) +{ + void *video_driver = video_driver_get_ptr(true); + const video_poke_interface_t *video_poke = video_driver_get_poke(); + + shader->data = NULL; + if (!video_poke || !video_driver || !video_poke->get_current_shader) + return false; + shader->data = video_poke->get_current_shader(video_driver); + return true; +} + +float video_driver_get_refresh_rate(void) +{ + if (video_driver_poke && video_driver_poke->get_refresh_rate) + return video_driver_poke->get_refresh_rate(video_driver_data); + + return 0.0f; +} + +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) +bool video_driver_has_widgets(void) +{ + return current_video && current_video->menu_widgets_enabled + && current_video->menu_widgets_enabled(video_driver_data); +} +#endif + +void video_driver_set_gpu_device_string(const char *str) +{ + strlcpy(video_driver_gpu_device_string, str, sizeof(video_driver_gpu_device_string)); +} + +const char* video_driver_get_gpu_device_string(void) +{ + return video_driver_gpu_device_string; +} + +void video_driver_set_gpu_api_version_string(const char *str) +{ + strlcpy(video_driver_gpu_api_version_string, str, sizeof(video_driver_gpu_api_version_string)); +} + +const char* video_driver_get_gpu_api_version_string(void) +{ + return video_driver_gpu_api_version_string; +} + +/* string list stays owned by the caller and must be available at all times after the video driver is inited */ +void video_driver_set_gpu_api_devices(enum gfx_ctx_api api, struct string_list *list) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(gpu_map); i++) + { + if (api == gpu_map[i].api) + { + gpu_map[i].list = list; + break; + } + } +} + +struct string_list* video_driver_get_gpu_api_devices(enum gfx_ctx_api api) +{ + int i; + + for (i = 0; i < ARRAY_SIZE(gpu_map); i++) + { + if (api == gpu_map[i].api) + return gpu_map[i].list; + } + + return NULL; +} + + /* BSV Movie */ struct bsv_state @@ -3541,47 +6913,6 @@ static void update_runtime_log(bool log_per_core) free(runtime_log); } -#ifdef HAVE_THREADS -void runloop_msg_queue_lock(void) -{ - slock_lock(_runloop_msg_queue_lock); -} - -void runloop_msg_queue_unlock(void) -{ - slock_unlock(_runloop_msg_queue_lock); -} -#endif - -static void retroarch_msg_queue_deinit(void) -{ -#ifdef HAVE_THREADS - runloop_msg_queue_lock(); -#endif - - if (!runloop_msg_queue) - return; - - msg_queue_free(runloop_msg_queue); - -#ifdef HAVE_THREADS - runloop_msg_queue_unlock(); - slock_free(_runloop_msg_queue_lock); - _runloop_msg_queue_lock = NULL; -#endif - - runloop_msg_queue = NULL; -} - -static void retroarch_msg_queue_init(void) -{ - retroarch_msg_queue_deinit(); - runloop_msg_queue = msg_queue_new(8); - -#ifdef HAVE_THREADS - _runloop_msg_queue_lock = slock_new(); -#endif -} static void retroarch_override_setting_free_state(void) { @@ -5883,7 +9214,7 @@ void runloop_msg_queue_push(const char *msg, #endif #ifdef HAVE_THREADS - runloop_msg_queue_lock(); + runloop_msg_queue_lock_internal(); #endif if (flush) @@ -5905,7 +9236,7 @@ void runloop_msg_queue_push(const char *msg, } #ifdef HAVE_THREADS - runloop_msg_queue_unlock(); + runloop_msg_queue_unlock_internal(); #endif } @@ -5918,20 +9249,6 @@ void runloop_get_status(bool *is_paused, bool *is_idle, *is_perfcnt_enable = runloop_perfcnt_enable; } -bool runloop_msg_queue_pull(const char **ret) -{ -#ifdef HAVE_THREADS - runloop_msg_queue_lock(); -#endif - if (!ret) - return false; - *ret = msg_queue_pull(runloop_msg_queue); -#ifdef HAVE_THREADS - runloop_msg_queue_unlock(); -#endif - return true; -} - #define bsv_movie_is_end_of_file() (bsv_movie_state.movie_end && bsv_movie_state.eof_exit) /* Time to exit out of the main loop? @@ -6085,9 +9402,10 @@ static enum runloop_state runloop_check_state( static input_bits_t last_input = {{0}}; #endif static bool old_focus = true; - bool is_focused = false; - bool is_alive = false; - uint64_t frame_count = 0; + bool is_focused = video_driver_cb_has_focus(); + bool is_alive = current_video ? + current_video->alive(video_driver_data) : true; + uint64_t frame_count = video_driver_frame_count; bool focused = true; bool pause_nonactive = settings->bools.pause_nonactive; bool rarch_is_initialized = rarch_is_inited; @@ -6136,7 +9454,7 @@ static enum runloop_state runloop_check_state( } } - if (!video_driver_is_threaded()) + if (!video_driver_is_threaded_internal()) { const ui_application_t *application = ui_companion_driver_get_application_ptr(); @@ -6144,8 +9462,6 @@ static enum runloop_state runloop_check_state( application->process_events(); } - video_driver_get_status(&frame_count, &is_alive, &is_focused); - #ifdef HAVE_MENU if (menu_driver_binding_state) BIT256_CLEAR_ALL(current_input); @@ -7464,7 +10780,7 @@ bool rarch_write_debug_info(void) #endif driver = #ifdef HAVE_THREADS - (video_driver_is_threaded()) ? + (video_driver_is_threaded_internal()) ? video_thread_get_ident() : #endif video_driver_get_ident(); diff --git a/retroarch.h b/retroarch.h index 108f4a6ad9..1cafc49207 100644 --- a/retroarch.h +++ b/retroarch.h @@ -19,10 +19,16 @@ #include #include +#include #include -#include #include +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include #include @@ -405,8 +411,6 @@ void runloop_msg_queue_push(const char *msg, char *title, enum message_queue_icon icon, enum message_queue_category category); -bool runloop_msg_queue_pull(const char **ret); - void runloop_get_status(bool *is_paused, bool *is_idle, bool *is_slowmotion, bool *is_perfcnt_enable); @@ -707,6 +711,1268 @@ extern audio_driver_t audio_switch_thread; extern audio_driver_t audio_rwebaudio; extern audio_driver_t audio_null; +/* Video */ + +#ifdef HAVE_OVERLAY +#include "input/input_overlay.h" +#endif + +#ifdef HAVE_VIDEO_LAYOUT +#include "gfx/video_layout.h" +#endif + +#include "gfx/video_defines.h" +#include "gfx/video_coord_array.h" +#include "gfx/video_filter.h" +#include "gfx/video_shader_parse.h" + +#include "input/input_types.h" + +#define RARCH_SCALE_BASE 256 + +#define VIDEO_SHADER_STOCK_BLEND (GFX_MAX_SHADERS - 1) +#define VIDEO_SHADER_MENU (GFX_MAX_SHADERS - 2) +#define VIDEO_SHADER_MENU_2 (GFX_MAX_SHADERS - 3) +#define VIDEO_SHADER_MENU_3 (GFX_MAX_SHADERS - 4) +#define VIDEO_SHADER_MENU_4 (GFX_MAX_SHADERS - 5) +#define VIDEO_SHADER_MENU_5 (GFX_MAX_SHADERS - 6) +#define VIDEO_SHADER_MENU_6 (GFX_MAX_SHADERS - 7) + +#if defined(_XBOX360) +#define DEFAULT_SHADER_TYPE RARCH_SHADER_HLSL +#elif defined(__PSL1GHT__) || defined(HAVE_OPENGLES2) || defined(HAVE_GLSL) +#define DEFAULT_SHADER_TYPE RARCH_SHADER_GLSL +#elif defined(__CELLOS_LV2__) || defined(HAVE_CG) +#define DEFAULT_SHADER_TYPE RARCH_SHADER_CG +#else +#define DEFAULT_SHADER_TYPE RARCH_SHADER_NONE +#endif + +#ifndef MAX_EGLIMAGE_TEXTURES +#define MAX_EGLIMAGE_TEXTURES 32 +#endif + +#define MAX_VARIABLES 64 + +enum +{ + TEXTURES = 8, + TEXTURESMASK = TEXTURES - 1 +}; + +struct LinkInfo +{ + unsigned tex_w, tex_h; + struct video_shader_pass *pass; +}; + +enum gfx_ctx_api +{ + GFX_CTX_NONE = 0, + GFX_CTX_OPENGL_API, + GFX_CTX_OPENGL_ES_API, + GFX_CTX_DIRECT3D8_API, + GFX_CTX_DIRECT3D9_API, + GFX_CTX_DIRECT3D10_API, + GFX_CTX_DIRECT3D11_API, + GFX_CTX_DIRECT3D12_API, + GFX_CTX_OPENVG_API, + GFX_CTX_VULKAN_API, + GFX_CTX_SIXEL_API, + GFX_CTX_METAL_API, + GFX_CTX_GDI_API, + GFX_CTX_GX_API, + GFX_CTX_GX2_API +}; + +enum display_metric_types +{ + DISPLAY_METRIC_NONE = 0, + DISPLAY_METRIC_MM_WIDTH, + DISPLAY_METRIC_MM_HEIGHT, + DISPLAY_METRIC_DPI, + DISPLAY_METRIC_PIXEL_WIDTH, + DISPLAY_METRIC_PIXEL_HEIGHT +}; + +enum display_flags +{ + GFX_CTX_FLAGS_NONE = 0, + GFX_CTX_FLAGS_GL_CORE_CONTEXT, + GFX_CTX_FLAGS_MULTISAMPLING, + GFX_CTX_FLAGS_CUSTOMIZABLE_SWAPCHAIN_IMAGES, + GFX_CTX_FLAGS_HARD_SYNC, + GFX_CTX_FLAGS_BLACK_FRAME_INSERTION, + GFX_CTX_FLAGS_MENU_FRAME_FILTERING, + GFX_CTX_FLAGS_ADAPTIVE_VSYNC, + GFX_CTX_FLAGS_SHADERS_GLSL, + GFX_CTX_FLAGS_SHADERS_CG, + GFX_CTX_FLAGS_SHADERS_HLSL, + GFX_CTX_FLAGS_SHADERS_SLANG, + GFX_CTX_FLAGS_SCREENSHOTS_SUPPORTED +}; + +enum shader_uniform_type +{ + UNIFORM_1F = 0, + UNIFORM_2F, + UNIFORM_3F, + UNIFORM_4F, + UNIFORM_1FV, + UNIFORM_2FV, + UNIFORM_3FV, + UNIFORM_4FV, + UNIFORM_1I +}; + +enum shader_program_type +{ + SHADER_PROGRAM_VERTEX = 0, + SHADER_PROGRAM_FRAGMENT, + SHADER_PROGRAM_COMBINED +}; + +struct shader_program_info +{ + bool is_file; + const char *vertex; + const char *fragment; + const char *combined; + unsigned idx; + void *data; +}; + +struct uniform_info +{ + bool enabled; + + int32_t location; + int32_t count; + unsigned type; /* shader uniform type */ + + struct + { + enum shader_program_type type; + const char *ident; + uint32_t idx; + bool add_prefix; + bool enable; + } lookup; + + struct + { + struct + { + intptr_t v0; + intptr_t v1; + intptr_t v2; + intptr_t v3; + } integer; + + intptr_t *integerv; + + struct + { + uintptr_t v0; + uintptr_t v1; + uintptr_t v2; + uintptr_t v3; + } unsigned_integer; + + uintptr_t *unsigned_integerv; + + struct + { + float v0; + float v1; + float v2; + float v3; + } f; + + float *floatv; + } result; +}; + +typedef struct shader_backend +{ + void *(*init)(void *data, const char *path); + void (*init_menu_shaders)(void *data); + void (*deinit)(void *data); + + /* Set shader parameters. */ + void (*set_params)(void *data, void *shader_data); + + void (*set_uniform_parameter)(void *data, struct uniform_info *param, + void *uniform_data); + + /* Compile a shader program. */ + bool (*compile_program)(void *data, unsigned idx, + void *program_data, struct shader_program_info *program_info); + + /* Use a shader program specified by variable 'index'. */ + void (*use)(void *data, void *shader_data, unsigned index, bool set_active); + + /* Returns the number of currently loaded shaders. */ + unsigned (*num_shaders)(void *data); + + bool (*filter_type)(void *data, unsigned index, bool *smooth); + enum gfx_wrap_type (*wrap_type)(void *data, unsigned index); + void (*shader_scale)(void *data, + unsigned index, struct gfx_fbo_scale *scale); + bool (*set_coords)(void *shader_data, const struct video_coords *coords); + bool (*set_mvp)(void *shader_data, const void *mat_data); + unsigned (*get_prev_textures)(void *data); + bool (*get_feedback_pass)(void *data, unsigned *pass); + bool (*mipmap_input)(void *data, unsigned index); + + struct video_shader *(*get_current_shader)(void *data); + + void (*get_flags)(uint32_t*); + + enum rarch_shader_type type; + + /* Human readable string. */ + const char *ident; +} shader_backend_t; + +typedef struct video_shader_ctx_init +{ + enum rarch_shader_type shader_type; + const char *path; + const shader_backend_t *shader; + void *data; + void *shader_data; + struct + { + bool core_context_enabled; + } gl; +} video_shader_ctx_init_t; + +typedef struct video_shader_ctx_params +{ + unsigned width; + unsigned height; + unsigned tex_width; + unsigned tex_height; + unsigned out_width; + unsigned out_height; + unsigned frame_counter; + unsigned fbo_info_cnt; + void *data; + const void *info; + const void *prev_info; + const void *feedback_info; + const void *fbo_info; +} video_shader_ctx_params_t; + +typedef struct video_shader_ctx_coords +{ + void *handle_data; + const void *data; +} video_shader_ctx_coords_t; + +typedef struct video_shader_ctx_scale +{ + unsigned idx; + struct gfx_fbo_scale *scale; +} video_shader_ctx_scale_t; + +typedef struct video_shader_ctx_info +{ + bool set_active; + unsigned num; + unsigned idx; + void *data; +} video_shader_ctx_info_t; + +typedef struct video_shader_ctx_mvp +{ + void *data; + const void *matrix; +} video_shader_ctx_mvp_t; + +typedef struct video_shader_ctx_filter +{ + unsigned index; + bool *smooth; +} video_shader_ctx_filter_t; + +typedef struct video_shader_ctx +{ + struct video_shader *data; +} video_shader_ctx_t; + +typedef struct video_shader_ctx_texture +{ + unsigned id; +} video_shader_ctx_texture_t; + +typedef void (*gfx_ctx_proc_t)(void); + +typedef struct video_info +{ + /* Launch in fullscreen mode instead of windowed mode. */ + bool fullscreen; + + /* Start with V-Sync enabled. */ + bool vsync; + + /* If true, the output image should have the aspect ratio + * as set in aspect_ratio. */ + bool force_aspect; + + bool font_enable; + + /* Width of window. + * If fullscreen mode is requested, + * a width of 0 means the resolution of the + * desktop should be used. */ + unsigned width; + + /* Height of window. + * If fullscreen mode is requested, + * a height of 0 means the resolutiof the desktop should be used. + */ + unsigned height; + + int swap_interval; + +#ifdef GEKKO + bool vfilter; +#endif + + /* If true, applies bilinear filtering to the image, + * otherwise nearest filtering. */ + bool smooth; + + bool is_threaded; + + /* Use 32bit RGBA rather than native RGB565/XBGR1555. + * + * XRGB1555 format is 16-bit and has byte ordering: 0RRRRRGGGGGBBBBB, + * in native endian. + * + * ARGB8888 is AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB, native endian. + * Alpha channel should be disregarded. + * */ + bool rgb32; + +#ifdef GEKKO + /* TODO - we can't really have driver system-specific + * variables in here. There should be some + * kind of publicly accessible driver implementation + * video struct for specific things like this. + */ + + /* Wii-specific settings. Ignored for everything else. */ + unsigned viwidth; +#endif + + /* + * input_scale defines the maximum size of the picture that will + * ever be used with the frame callback. + * + * The maximum resolution is a multiple of 256x256 size (RARCH_SCALE_BASE), + * so an input scale of 2 means you should allocate a texture or of 512x512. + * + * Maximum input size: RARCH_SCALE_BASE * input_scale + */ + unsigned input_scale; + + uintptr_t parent; +} video_info_t; + +typedef struct video_frame_info +{ + bool input_menu_swap_ok_cancel_buttons; + bool input_driver_nonblock_state; + bool shared_context; + bool black_frame_insertion; + bool hard_sync; + bool fps_show; + bool statistics_show; + bool framecount_show; + bool scale_integer; + bool post_filter_record; + bool windowed_fullscreen; + bool fullscreen; + bool font_enable; + bool use_rgba; + bool libretro_running; + bool xmb_shadows_enable; + bool battery_level_enable; + bool timedate_enable; + bool runloop_is_slowmotion; + bool runloop_is_idle; + bool runloop_is_paused; + bool is_perfcnt_enable; + bool menu_is_alive; + bool msg_bgcolor_enable; + + int custom_vp_x; + int custom_vp_y; + int crt_switch_center_adjust; + + unsigned hard_sync_frames; + unsigned aspect_ratio_idx; + unsigned max_swapchain_images; + unsigned monitor_index; + unsigned crt_switch_resolution; + unsigned crt_switch_resolution_super; + unsigned width; + unsigned height; + unsigned xmb_theme; + unsigned xmb_color_theme; + unsigned menu_shader_pipeline; + unsigned materialui_color_theme; + unsigned ozone_color_theme; + unsigned custom_vp_width; + unsigned custom_vp_height; + unsigned custom_vp_full_width; + unsigned custom_vp_full_height; + + float menu_wallpaper_opacity; + float menu_framebuffer_opacity; + float menu_header_opacity; + float menu_footer_opacity; + float refresh_rate; + float font_msg_pos_x; + float font_msg_pos_y; + float font_msg_color_r; + float font_msg_color_g; + float font_msg_color_b; + float xmb_alpha_factor; + + char fps_text[128]; + char stat_text[512]; + char chat_text[256]; + + uint64_t frame_count; + float frame_time; + float frame_rate; + + struct + { + float x; + float y; + float scale; + /* Drop shadow color multiplier. */ + float drop_mod; + /* Drop shadow offset. + * If both are 0, no drop shadow will be rendered. */ + int drop_x, drop_y; + /* Drop shadow alpha */ + float drop_alpha; + /* ABGR. Use the macros. */ + uint32_t color; + bool full_screen; + enum text_alignment text_align; + } osd_stat_params; + + void (*cb_update_window_title)(void*, void *); + void (*cb_swap_buffers)(void*, void *); + bool (*cb_get_metrics)(void *data, enum display_metric_types type, + float *value); + bool (*cb_set_resize)(void*, unsigned, unsigned); + + void *context_data; + void *userdata; +} video_frame_info_t; + +typedef void (*update_window_title_cb)(void*, void*); +typedef bool (*get_metrics_cb)(void *data, enum display_metric_types type, + float *value); +typedef bool (*set_resize_cb)(void*, unsigned, unsigned); + +typedef struct gfx_ctx_driver +{ + /* The opaque pointer is the underlying video driver data (e.g. gl_t for + * OpenGL contexts). Although not advised, the context driver is allowed + * to hold a pointer to it as the context never outlives the video driver. + * + * The context driver is responsible for it's own data.*/ + void* (*init)(video_frame_info_t *video_info, void *video_driver); + void (*destroy)(void *data); + + enum gfx_ctx_api (*get_api)(void *data); + + /* Which API to bind to. */ + bool (*bind_api)(void *video_driver, enum gfx_ctx_api, + unsigned major, unsigned minor); + + /* Sets the swap interval. */ + void (*swap_interval)(void *data, int); + + /* Sets video mode. Creates a window, etc. */ + bool (*set_video_mode)(void*, video_frame_info_t *video_info, unsigned, unsigned, bool); + + /* Gets current window size. + * If not initialized yet, it returns current screen size. */ + void (*get_video_size)(void*, unsigned*, unsigned*); + + float (*get_refresh_rate)(void*); + + void (*get_video_output_size)(void*, unsigned*, unsigned*); + + void (*get_video_output_prev)(void*); + + void (*get_video_output_next)(void*); + + get_metrics_cb get_metrics; + + /* Translates a window size to an aspect ratio. + * In most cases this will be just width / height, but + * some contexts will better know which actual aspect ratio is used. + * This can be NULL to assume the default behavior. + */ + float (*translate_aspect)(void*, unsigned, unsigned); + + /* Asks driver to update window title (FPS, etc). */ + update_window_title_cb update_window_title; + + /* Queries for resize and quit events. + * Also processes events. */ + void (*check_window)(void*, bool*, bool*, + unsigned*, unsigned*, bool); + + /* Acknowledge a resize event. This is needed for some APIs. + * Most backends will ignore this. */ + set_resize_cb set_resize; + + /* Checks if window has input focus. */ + bool (*has_focus)(void*); + + /* Should the screensaver be suppressed? */ + bool (*suppress_screensaver)(void *data, bool enable); + + /* Checks if context driver has windowed support. */ + bool (*has_windowed)(void*); + + /* Swaps buffers. VBlank sync depends on + * earlier calls to swap_interval. */ + void (*swap_buffers)(void*, void *); + + /* Most video backends will want to use a certain input driver. + * Checks for it here. */ + void (*input_driver)(void*, const char *, const input_driver_t**, void**); + + /* Wraps whatever gl_proc_address() there is. + * Does not take opaque, to avoid lots of ugly wrapper code. */ + gfx_ctx_proc_t (*get_proc_address)(const char*); + + /* Returns true if this context supports EGLImage buffers for + * screen drawing and was initalized correctly. */ + bool (*image_buffer_init)(void*, const video_info_t*); + + /* Writes the frame to the EGLImage and sets image_handle to it. + * Returns true if a new image handle is created. + * Always returns true the first time it's called for a new index. + * The graphics core must handle a change in the handle correctly. */ + bool (*image_buffer_write)(void*, const void *frame, unsigned width, + unsigned height, unsigned pitch, bool rgb32, + unsigned index, void **image_handle); + + /* Shows or hides mouse. Can be NULL if context doesn't + * have a concept of mouse pointer. */ + void (*show_mouse)(void *data, bool state); + + /* Human readable string. */ + const char *ident; + + uint32_t (*get_flags)(void *data); + + void (*set_flags)(void *data, uint32_t flags); + + /* Optional. Binds HW-render offscreen context. */ + void (*bind_hw_render)(void *data, bool enable); + + /* Optional. Gets base data for the context which is used by the driver. + * This is mostly relevant for graphics APIs such as Vulkan + * which do not have global context state. */ + void *(*get_context_data)(void *data); + + /* Optional. Makes driver context (only GLX right now) + * active for this thread. */ + void (*make_current)(bool release); +} gfx_ctx_driver_t; + +typedef struct gfx_ctx_size +{ + bool *quit; + bool *resize; + unsigned *width; + unsigned *height; +} gfx_ctx_size_t; + +typedef struct gfx_ctx_mode +{ + unsigned width; + unsigned height; + bool fullscreen; +} gfx_ctx_mode_t; + +typedef struct gfx_ctx_metrics +{ + enum display_metric_types type; + float *value; +} gfx_ctx_metrics_t; + +typedef struct gfx_ctx_aspect +{ + float *aspect; + unsigned width; + unsigned height; +} gfx_ctx_aspect_t; + +typedef struct gfx_ctx_image +{ + const void *frame; + unsigned width; + unsigned height; + unsigned pitch; + unsigned index; + bool rgb32; + void **handle; +} gfx_ctx_image_t; + +typedef struct gfx_ctx_input +{ + const input_driver_t **input; + void **input_data; +} gfx_ctx_input_t; + +typedef struct gfx_ctx_proc_address +{ + const char *sym; + retro_proc_address_t addr; +} gfx_ctx_proc_address_t; + +typedef struct gfx_ctx_ident +{ + const char *ident; +} gfx_ctx_ident_t; + +struct aspect_ratio_elem +{ + char name[64]; + float value; +}; + +/* Optionally implemented interface to poke more + * deeply into video driver. */ + +typedef struct video_poke_interface +{ + uint32_t (*get_flags)(void *data); + uintptr_t (*load_texture)(void *video_data, void *data, + bool threaded, enum texture_filter_type filter_type); + void (*unload_texture)(void *data, uintptr_t id); + void (*set_video_mode)(void *data, unsigned width, + unsigned height, bool fullscreen); + float (*get_refresh_rate)(void *data); + void (*set_filtering)(void *data, unsigned index, bool smooth); + void (*get_video_output_size)(void *data, + unsigned *width, unsigned *height); + + /* Move index to previous resolution */ + void (*get_video_output_prev)(void *data); + + /* Move index to next resolution */ + void (*get_video_output_next)(void *data); + + uintptr_t (*get_current_framebuffer)(void *data); + retro_proc_address_t (*get_proc_address)(void *data, const char *sym); + void (*set_aspect_ratio)(void *data, unsigned aspectratio_index); + void (*apply_state_changes)(void *data); + + /* Update texture. */ + void (*set_texture_frame)(void *data, const void *frame, bool rgb32, + unsigned width, unsigned height, float alpha); + /* Enable or disable rendering. */ + void (*set_texture_enable)(void *data, bool enable, bool full_screen); + void (*set_osd_msg)(void *data, video_frame_info_t *video_info, + const char *msg, + const void *params, void *font); + + void (*show_mouse)(void *data, bool state); + void (*grab_mouse_toggle)(void *data); + + struct video_shader *(*get_current_shader)(void *data); + bool (*get_current_software_framebuffer)(void *data, + struct retro_framebuffer *framebuffer); + bool (*get_hw_render_interface)(void *data, + const struct retro_hw_render_interface **iface); +} video_poke_interface_t; + +/* msg is for showing a message on the screen + * along with the video frame. */ +typedef bool (*video_driver_frame_t)(void *data, + const void *frame, unsigned width, + unsigned height, uint64_t frame_count, + unsigned pitch, const char *msg, video_frame_info_t *video_info); + +typedef struct video_driver +{ + /* Should the video driver act as an input driver as well? + * The video initialization might preinitialize an input driver + * to override the settings in case the video driver relies on + * input driver for event handling. */ + void *(*init)(const video_info_t *video, + const input_driver_t **input, + void **input_data); + + /* Updates frame on the screen. + * Frame can be either XRGB1555, RGB565 or ARGB32 format + * depending on rgb32 setting in video_info_t. + * Pitch is the distance in bytes between two scanlines in memory. + * + * When msg is non-NULL, + * it's a message that should be displayed to the user. */ + video_driver_frame_t frame; + + /* Should we care about syncing to vblank? Fast forwarding. + * + * Requests nonblocking operation. + * + * True = VSync is turned off. + * False = VSync is turned on. + * */ + void (*set_nonblock_state)(void *data, bool toggle); + + /* Is the window still active? */ + bool (*alive)(void *data); + + /* Does the window have focus? */ + bool (*focus)(void *data); + + /* Should the screensaver be suppressed? */ + bool (*suppress_screensaver)(void *data, bool enable); + + /* Does the graphics context support windowed mode? */ + bool (*has_windowed)(void *data); + + /* Sets shader. Might not be implemented. Will be moved to + * poke_interface later. */ + bool (*set_shader)(void *data, enum rarch_shader_type type, + const char *path); + + /* Frees driver. */ + void (*free)(void *data); + + /* Human-readable identifier. */ + const char *ident; + + void (*set_viewport)(void *data, unsigned width, unsigned height, + bool force_full, bool allow_rotate); + + void (*set_rotation)(void *data, unsigned rotation); + void (*viewport_info)(void *data, struct video_viewport *vp); + + /* Reads out in BGR byte order (24bpp). */ + bool (*read_viewport)(void *data, uint8_t *buffer, bool is_idle); + + /* Returns a pointer to a newly allocated buffer that can + * (and must) be passed to free() by the caller, containing a + * copy of the current raw frame in the active pixel format + * and sets width, height and pitch to the correct values. */ + void* (*read_frame_raw)(void *data, unsigned *width, + unsigned *height, size_t *pitch); + +#ifdef HAVE_OVERLAY + void (*overlay_interface)(void *data, + const video_overlay_interface_t **iface); +#endif +#ifdef HAVE_VIDEO_LAYOUT + const video_layout_render_interface_t *(*video_layout_render_interface)(void *data); +#endif + void (*poke_interface)(void *data, const video_poke_interface_t **iface); + unsigned (*wrap_type_to_enum)(enum gfx_wrap_type type); + +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) + /* if set to true, will use menu widgets when applicable + * if set to false, will use OSD as a fallback */ + bool (*menu_widgets_enabled)(void *data); +#endif +} video_driver_t; + +extern struct aspect_ratio_elem aspectratio_lut[ASPECT_RATIO_END]; + +bool video_driver_has_windowed(void); + +bool video_driver_cached_frame_has_valid_framebuffer(void); + +void video_driver_destroy(void); +void video_driver_set_cached_frame_ptr(const void *data); +void video_driver_set_stub_frame(void); +void video_driver_unset_stub_frame(void); +bool video_driver_is_stub_frame(void); +bool video_driver_supports_recording(void); +bool video_driver_supports_viewport_read(void); +bool video_driver_prefer_viewport_read(void); +bool video_driver_supports_read_frame_raw(void); +void video_driver_set_viewport_config(void); +void video_driver_set_viewport_square_pixel(void); +void video_driver_set_viewport_core(void); +void video_driver_reset_custom_viewport(void); +void video_driver_set_rgba(void); +void video_driver_unset_rgba(void); +bool video_driver_supports_rgba(void); +bool video_driver_get_next_video_out(void); +bool video_driver_get_prev_video_out(void); +bool video_driver_init(bool *video_is_threaded); +void video_driver_destroy_data(void); +void video_driver_free(void); +void video_driver_free_hw_context(void); +void video_driver_monitor_reset(void); +void video_driver_set_aspect_ratio(void); +void video_driver_update_viewport(struct video_viewport* vp, bool force_full, bool keep_aspect); +void video_driver_show_mouse(void); +void video_driver_hide_mouse(void); +void video_driver_set_nonblock_state(bool toggle); +bool video_driver_find_driver(void); +void video_driver_apply_state_changes(void); +bool video_driver_read_viewport(uint8_t *buffer, bool is_idle); +bool video_driver_cached_frame(void); +bool video_driver_frame_filter_alive(void); +bool video_driver_frame_filter_is_32bit(void); +void video_driver_default_settings(void); +void video_driver_load_settings(config_file_t *conf); +void video_driver_save_settings(config_file_t *conf); +bool video_driver_is_hw_context(void); +struct retro_hw_render_callback *video_driver_get_hw_context(void); +const struct retro_hw_render_context_negotiation_interface +*video_driver_get_context_negotiation_interface(void); +void video_driver_set_context_negotiation_interface(const struct + retro_hw_render_context_negotiation_interface *iface); +bool video_driver_is_video_cache_context(void); +void video_driver_set_video_cache_context_ack(void); +bool video_driver_is_video_cache_context_ack(void); +void video_driver_set_active(void); +void video_driver_unset_active(void); +bool video_driver_is_active(void); +bool video_driver_gpu_record_init(unsigned size); +void video_driver_gpu_record_deinit(void); +bool video_driver_get_current_software_framebuffer(struct + retro_framebuffer *fb); +bool video_driver_get_hw_render_interface(const struct + retro_hw_render_interface **iface); +bool video_driver_get_viewport_info(struct video_viewport *viewport); +void video_driver_set_title_buf(void); +void video_driver_monitor_adjust_system_rates(void); + +#if defined(HAVE_MENU) && defined(HAVE_MENU_WIDGETS) +bool video_driver_has_widgets(void); +#endif + +/** + * video_driver_find_handle: + * @index : index of driver to get handle to. + * + * Returns: handle to video driver at index. Can be NULL + * if nothing found. + **/ +const void *video_driver_find_handle(int index); + +/** + * video_driver_find_ident: + * @index : index of driver to get handle to. + * + * Returns: Human-readable identifier of video driver at index. + * Can be NULL if nothing found. + **/ +const char *video_driver_find_ident(int index); + +/** + * config_get_video_driver_options: + * + * Get an enumerated list of all video driver names, separated by '|'. + * + * Returns: string listing of all video driver names, separated by '|'. + **/ +const char* config_get_video_driver_options(void); + +/** + * video_driver_get_ptr: + * + * Use this if you need the real video driver + * and driver data pointers. + * + * Returns: video driver's userdata. + **/ +void *video_driver_get_ptr(bool force_nonthreaded_data); + +/** + * video_driver_get_current_framebuffer: + * + * Gets pointer to current hardware renderer framebuffer object. + * Used by RETRO_ENVIRONMENT_SET_HW_RENDER. + * + * Returns: pointer to hardware framebuffer object, otherwise 0. + **/ +uintptr_t video_driver_get_current_framebuffer(void); + +retro_proc_address_t video_driver_get_proc_address(const char *sym); + +bool video_driver_set_shader(enum rarch_shader_type type, + const char *shader); + +bool video_driver_set_rotation(unsigned rotation); + +bool video_driver_set_video_mode(unsigned width, + unsigned height, bool fullscreen); + +bool video_driver_get_video_output_size( + unsigned *width, unsigned *height); + +void video_driver_set_osd_msg(const char *msg, + const void *params, void *font); + +void video_driver_set_texture_enable(bool enable, bool full_screen); + +void video_driver_set_texture_frame(const void *frame, bool rgb32, + unsigned width, unsigned height, float alpha); + +#ifdef HAVE_OVERLAY +bool video_driver_overlay_interface( + const video_overlay_interface_t **iface); +#endif + +#ifdef HAVE_VIDEO_LAYOUT +const video_layout_render_interface_t *video_driver_layout_render_interface(void); +#endif + +void * video_driver_read_frame_raw(unsigned *width, + unsigned *height, size_t *pitch); + +void video_driver_set_filtering(unsigned index, bool smooth); + +const char *video_driver_get_ident(void); + +bool video_driver_set_viewport(unsigned width, unsigned height, + bool force_fullscreen, bool allow_rotate); + +void video_driver_get_size(unsigned *width, unsigned *height); + +void video_driver_set_size(unsigned *width, unsigned *height); + +void video_driver_unset_video_cache_context_ack(void); + +float video_driver_get_aspect_ratio(void); + +void video_driver_set_aspect_ratio_value(float value); + +rarch_softfilter_t *video_driver_frame_filter_get_ptr(void); + +enum retro_pixel_format video_driver_get_pixel_format(void); + +void video_driver_set_pixel_format(enum retro_pixel_format fmt); + +void video_driver_cached_frame_set(const void *data, unsigned width, + unsigned height, size_t pitch); + +void video_driver_cached_frame_get(const void **data, unsigned *width, + unsigned *height, size_t *pitch); + +void video_driver_menu_settings(void **list_data, void *list_info_data, + void *group_data, void *subgroup_data, const char *parent_group); + +/** + * video_viewport_get_scaled_integer: + * @vp : Viewport handle + * @width : Width. + * @height : Height. + * @aspect_ratio : Aspect ratio (in float). + * @keep_aspect : Preserve aspect ratio? + * + * Gets viewport scaling dimensions based on + * scaled integer aspect ratio. + **/ +void video_viewport_get_scaled_integer(struct video_viewport *vp, + unsigned width, unsigned height, + float aspect_ratio, bool keep_aspect); + +struct retro_system_av_info *video_viewport_get_system_av_info(void); + +struct video_viewport *video_viewport_get_custom(void); + +/** + * video_monitor_set_refresh_rate: + * @hz : New refresh rate for monitor. + * + * Sets monitor refresh rate to new value. + **/ +void video_monitor_set_refresh_rate(float hz); + +/** + * video_monitor_fps_statistics + * @refresh_rate : Monitor refresh rate. + * @deviation : Deviation from measured refresh rate. + * @sample_points : Amount of sampled points. + * + * Gets the monitor FPS statistics based on the current + * runtime. + * + * Returns: true (1) on success. + * false (0) if: + * a) threaded video mode is enabled + * b) less than 2 frame time samples. + * c) FPS monitor enable is off. + **/ +bool video_monitor_fps_statistics(double *refresh_rate, + double *deviation, unsigned *sample_points); + +unsigned video_pixel_get_alignment(unsigned pitch); + +const video_poke_interface_t *video_driver_get_poke(void); + +/** + * video_driver_frame: + * @data : pointer to data of the video frame. + * @width : width of the video frame. + * @height : height of the video frame. + * @pitch : pitch of the video frame. + * + * Video frame render callback function. + **/ +void video_driver_frame(const void *data, unsigned width, + unsigned height, size_t pitch); + +void crt_switch_driver_reinit(void); + +#define video_driver_translate_coord_viewport_wrap(vp, mouse_x, mouse_y, res_x, res_y, res_screen_x, res_screen_y) \ + (video_driver_get_viewport_info(vp) ? video_driver_translate_coord_viewport(vp, mouse_x, mouse_y, res_x, res_y, res_screen_x, res_screen_y) : false) + +/** + * video_driver_translate_coord_viewport: + * @mouse_x : Pointer X coordinate. + * @mouse_y : Pointer Y coordinate. + * @res_x : Scaled X coordinate. + * @res_y : Scaled Y coordinate. + * @res_screen_x : Scaled screen X coordinate. + * @res_screen_y : Scaled screen Y coordinate. + * + * Translates pointer [X,Y] coordinates into scaled screen + * coordinates based on viewport info. + * + * Returns: true (1) if successful, false if video driver doesn't support + * viewport info. + **/ +bool video_driver_translate_coord_viewport( + struct video_viewport *vp, + int mouse_x, int mouse_y, + int16_t *res_x, int16_t *res_y, int16_t *res_screen_x, + int16_t *res_screen_y); + +uintptr_t video_driver_display_get(void); + +enum rarch_display_type video_driver_display_type_get(void); + +uintptr_t video_driver_window_get(void); + +void video_driver_display_type_set(enum rarch_display_type type); + +void video_driver_display_set(uintptr_t idx); + +void video_driver_window_set(uintptr_t idx); + +bool video_driver_texture_load(void *data, + enum texture_filter_type filter_type, + uintptr_t *id); + +bool video_driver_texture_unload(uintptr_t *id); + +void video_driver_build_info(video_frame_info_t *video_info); + +void video_driver_reinit(void); + +void video_driver_get_window_title(char *buf, unsigned len); + +void video_driver_get_record_status( + bool *has_gpu_record, + uint8_t **gpu_buf); + +bool *video_driver_get_threaded(void); + +void video_driver_set_threaded(bool val); + +void video_driver_get_status(uint64_t *frame_count, bool * is_alive, + bool *is_focused); + +/** + * video_context_driver_init_first: + * @data : Input data. + * @ident : Identifier of graphics context driver to find. + * @api : API of higher-level graphics API. + * @major : Major version number of higher-level graphics API. + * @minor : Minor version number of higher-level graphics API. + * @hw_render_ctx : Request a graphics context driver capable of + * hardware rendering? + * + * Finds first suitable graphics context driver and initializes. + * + * Returns: graphics context driver if found, otherwise NULL. + **/ +const gfx_ctx_driver_t *video_context_driver_init_first( + void *data, const char *ident, + enum gfx_ctx_api api, unsigned major, unsigned minor, + bool hw_render_ctx, void **ctx_data); + +bool video_context_driver_find_prev_driver(void); + +bool video_context_driver_find_next_driver(void); + +bool video_context_driver_init_image_buffer(const video_info_t *data); + +bool video_context_driver_write_to_image_buffer(gfx_ctx_image_t *img); + +bool video_context_driver_get_video_output_prev(void); + +bool video_context_driver_get_video_output_next(void); + +bool video_context_driver_bind_hw_render(bool *enable); + +void video_context_driver_make_current(bool restore); + +bool video_context_driver_set(const gfx_ctx_driver_t *data); + +void video_context_driver_destroy(void); + +bool video_context_driver_get_video_output_size(gfx_ctx_size_t *size_data); + +bool video_context_driver_swap_interval(int *interval); + +bool video_context_driver_get_proc_address(gfx_ctx_proc_address_t *proc); + +bool video_context_driver_suppress_screensaver(bool *bool_data); + +bool video_context_driver_get_ident(gfx_ctx_ident_t *ident); + +bool video_context_driver_set_video_mode(gfx_ctx_mode_t *mode_info); + +bool video_context_driver_get_video_size(gfx_ctx_mode_t *mode_info); + +bool video_context_driver_get_refresh_rate(float *refresh_rate); + +bool video_context_driver_show_mouse(bool *bool_data); + +bool video_context_driver_set_flags(gfx_ctx_flags_t *flags); + +bool video_context_driver_get_metrics(gfx_ctx_metrics_t *metrics); + +bool video_context_driver_translate_aspect(gfx_ctx_aspect_t *aspect); + +bool video_context_driver_input_driver(gfx_ctx_input_t *inp); + +enum gfx_ctx_api video_context_driver_get_api(void); + +void video_context_driver_free(void); + +bool video_shader_driver_get_current_shader(video_shader_ctx_t *shader); + +float video_driver_get_refresh_rate(void); + +extern bool (*video_driver_cb_has_focus)(void); + +bool video_driver_started_fullscreen(void); + +bool video_driver_is_threaded(void); + +bool video_context_driver_get_flags(gfx_ctx_flags_t *flags); + +bool video_driver_get_all_flags(gfx_ctx_flags_t *flags, + enum display_flags flag); + +void video_driver_set_gpu_device_string(const char *str); + +const char* video_driver_get_gpu_device_string(void); + +void video_driver_set_gpu_api_version_string(const char *str); + +const char* video_driver_get_gpu_api_version_string(void); + +/* string list stays owned by the caller and must be available at all times after the video driver is inited */ +void video_driver_set_gpu_api_devices(enum gfx_ctx_api api, struct string_list *list); + +struct string_list* video_driver_get_gpu_api_devices(enum gfx_ctx_api api); + +static INLINE bool gl_set_core_context(enum retro_hw_context_type ctx_type) +{ + gfx_ctx_flags_t flags; + if (ctx_type != RETRO_HW_CONTEXT_OPENGL_CORE) + return false; + + /** + * Ensure that the rest of the frontend knows we have a core context + */ + flags.flags = 0; + BIT32_SET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT); + + video_context_driver_set_flags(&flags); + + return true; +} + +extern video_driver_t video_gl_core; +extern video_driver_t video_gl2; +extern video_driver_t video_gl1; +extern video_driver_t video_vulkan; +extern video_driver_t video_metal; +extern video_driver_t video_psp1; +extern video_driver_t video_vita2d; +extern video_driver_t video_ps2; +extern video_driver_t video_ctr; +extern video_driver_t video_switch; +extern video_driver_t video_d3d8; +extern video_driver_t video_d3d9; +extern video_driver_t video_d3d10; +extern video_driver_t video_d3d11; +extern video_driver_t video_d3d12; +extern video_driver_t video_gx; +extern video_driver_t video_wiiu; +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_vg; +extern video_driver_t video_omap; +extern video_driver_t video_exynos; +extern video_driver_t video_dispmanx; +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_vga; +extern video_driver_t video_sixel; +extern video_driver_t video_null; + +extern const gfx_ctx_driver_t gfx_ctx_osmesa; +extern const gfx_ctx_driver_t gfx_ctx_sdl_gl; +extern const gfx_ctx_driver_t gfx_ctx_x_egl; +extern const gfx_ctx_driver_t gfx_ctx_wayland; +extern const gfx_ctx_driver_t gfx_ctx_x; +extern const gfx_ctx_driver_t gfx_ctx_drm; +extern const gfx_ctx_driver_t gfx_ctx_mali_fbdev; +extern const gfx_ctx_driver_t gfx_ctx_vivante_fbdev; +extern const gfx_ctx_driver_t gfx_ctx_android; +extern const gfx_ctx_driver_t gfx_ctx_ps3; +extern const gfx_ctx_driver_t gfx_ctx_wgl; +extern const gfx_ctx_driver_t gfx_ctx_videocore; +extern const gfx_ctx_driver_t gfx_ctx_qnx; +extern const gfx_ctx_driver_t gfx_ctx_cgl; +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_sixel; +extern const gfx_ctx_driver_t switch_ctx; +extern const gfx_ctx_driver_t orbis_ctx; +extern const gfx_ctx_driver_t gfx_ctx_null; + +extern const shader_backend_t gl_glsl_backend; +extern const shader_backend_t gl_cg_backend; + /* BSV Movie */ enum rarch_movie_type diff --git a/runahead/run_ahead.c b/runahead/run_ahead.c index 1881935710..0501a48664 100644 --- a/runahead/run_ahead.c +++ b/runahead/run_ahead.c @@ -11,7 +11,6 @@ #include "../core.h" #include "../dynamic.h" -#include "../gfx/video_driver.h" #include "../configuration.h" #include "../retroarch.h" diff --git a/tasks/task_overlay.c b/tasks/task_overlay.c index 327f9842e7..860cbf0de9 100644 --- a/tasks/task_overlay.c +++ b/tasks/task_overlay.c @@ -26,8 +26,8 @@ #include "tasks_internal.h" -#include "../gfx/video_driver.h" #include "../input/input_overlay.h" +#include "../retroarch.h" #include "../verbosity.h" typedef struct overlay_loader overlay_loader_t; diff --git a/tasks/task_save.c b/tasks/task_save.c index e3d533ecae..7dcb6c6cff 100644 --- a/tasks/task_save.c +++ b/tasks/task_save.c @@ -48,7 +48,6 @@ #include "../core.h" #include "../file_path_special.h" #include "../configuration.h" -#include "../gfx/video_driver.h" #include "../msg_hash.h" #include "../retroarch.h" #include "../verbosity.h" diff --git a/tasks/task_screenshot.c b/tasks/task_screenshot.c index dbfed75a02..c037d7202f 100644 --- a/tasks/task_screenshot.c +++ b/tasks/task_screenshot.c @@ -55,8 +55,6 @@ #include "../msg_hash.h" #include "../verbosity.h" -#include "../gfx/video_driver.h" - #include "tasks_internal.h" typedef struct screenshot_task_state screenshot_task_state_t; diff --git a/translation/translation_service.c b/translation/translation_service.c index 9ad6489058..0575f793f4 100644 --- a/translation/translation_service.c +++ b/translation/translation_service.c @@ -4,7 +4,6 @@ #include #include #include "translation_service.h" -#include "gfx/video_driver.h" #include "gfx/video_frame.h" #include "gfx/scaler/scaler.h" #include "tasks/tasks_internal.h" diff --git a/translation/translation_service.h b/translation/translation_service.h index ec9135bde3..dea80b6cea 100644 --- a/translation/translation_service.h +++ b/translation/translation_service.h @@ -2,6 +2,7 @@ #define __TRANSLATION_SERVICE__H #include "tasks/tasks_internal.h" + void call_translation_server(const char* body); bool g_translation_service_status; @@ -9,4 +10,5 @@ bool g_translation_service_status; bool run_translation_service(void); void handle_translation_cb(retro_task_t *task, void *task_data, void *user_data, const char *error); + #endif diff --git a/ui/drivers/qt/options/video.cpp b/ui/drivers/qt/options/video.cpp index a948277118..a23436cff0 100644 --- a/ui/drivers/qt/options/video.cpp +++ b/ui/drivers/qt/options/video.cpp @@ -5,7 +5,7 @@ extern "C" { #endif #include "../../../../gfx/video_display_server.h" -#include "../../../../gfx/video_driver.h" +#include "../../../../retroarch.h" #ifndef CXX_BUILD } diff --git a/ui/drivers/qt/shaderparamsdialog.cpp b/ui/drivers/qt/shaderparamsdialog.cpp index 23b2ef8ab1..d6fdedf8e7 100644 --- a/ui/drivers/qt/shaderparamsdialog.cpp +++ b/ui/drivers/qt/shaderparamsdialog.cpp @@ -23,6 +23,7 @@ extern "C" { #endif +#include #include #include #include diff --git a/ui/drivers/ui_qt.h b/ui/drivers/ui_qt.h index d0f1e8e919..05a84b5db1 100644 --- a/ui/drivers/ui_qt.h +++ b/ui/drivers/ui_qt.h @@ -53,7 +53,7 @@ extern "C" { #include #include #include "../ui_companion_driver.h" -#include "../../gfx/video_driver.h" +#include "../../retroarch.h" #ifndef CXX_BUILD } diff --git a/ui/drivers/ui_win32.c b/ui/drivers/ui_win32.c index a19009c520..1d75ab029b 100644 --- a/ui/drivers/ui_win32.c +++ b/ui/drivers/ui_win32.c @@ -47,7 +47,6 @@ #include "../../driver.h" #include "../../paths.h" #include "../../retroarch.h" -#include "../../gfx/video_driver.h" #include "../../tasks/tasks_internal.h" #include "ui_win32.h"