diff --git a/Makefile.common b/Makefile.common
index 9ba1c61c80..9f5f1f0dfd 100644
--- a/Makefile.common
+++ b/Makefile.common
@@ -309,11 +309,12 @@ OBJ += \
input/input_driver.o \
input/common/input_hid_common.o \
led/led_driver.o \
- gfx/video_coord_array.o \
- gfx/gfx_display.o \
+ gfx/video_driver.o \
+ gfx/gfx_display.o \
gfx/gfx_animation.o \
- gfx/gfx_thumbnail_path.o \
- gfx/gfx_thumbnail.o \
+ gfx/gfx_thumbnail_path.o \
+ gfx/gfx_thumbnail.o \
+ gfx/video_coord_array.o \
configuration.o \
$(LIBRETRO_COMM_DIR)/dynamic/dylib.o \
cores/dynamic_dummy.o \
diff --git a/gfx/common/d3d9_common.c b/gfx/common/d3d9_common.c
index 3314cfa731..0dfd47b66c 100644
--- a/gfx/common/d3d9_common.c
+++ b/gfx/common/d3d9_common.c
@@ -15,6 +15,10 @@
#define CINTERFACE
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
/* For Xbox we will just link statically
* to Direct3D libraries instead. */
diff --git a/gfx/video_driver.c b/gfx/video_driver.c
new file mode 100644
index 0000000000..77c3bbc7b9
--- /dev/null
+++ b/gfx/video_driver.c
@@ -0,0 +1,185 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2021 - 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 .
+ */
+
+#include
+
+#include "video_driver.h"
+
+video_driver_t *hw_render_context_driver(
+ enum retro_hw_context_type type, int major, int minor)
+{
+ switch (type)
+ {
+ case RETRO_HW_CONTEXT_OPENGL_CORE:
+#ifdef HAVE_OPENGL_CORE
+ return &video_gl_core;
+#else
+ break;
+#endif
+ case RETRO_HW_CONTEXT_OPENGL:
+#ifdef HAVE_OPENGL
+ return &video_gl2;
+#else
+ break;
+#endif
+ case RETRO_HW_CONTEXT_DIRECT3D:
+#if defined(HAVE_D3D9)
+ if (major == 9)
+ return &video_d3d9;
+#endif
+#if defined(HAVE_D3D11)
+ if (major == 11)
+ return &video_d3d11;
+#endif
+ break;
+ case RETRO_HW_CONTEXT_VULKAN:
+#if defined(HAVE_VULKAN)
+ return &video_vulkan;
+#else
+ break;
+#endif
+ default:
+ case RETRO_HW_CONTEXT_NONE:
+ break;
+ }
+
+ return NULL;
+}
+
+const char *hw_render_context_name(
+ enum retro_hw_context_type type, int major, int minor)
+{
+#ifdef HAVE_OPENGL_CORE
+ if (type == RETRO_HW_CONTEXT_OPENGL_CORE)
+ return "glcore";
+#endif
+#ifdef HAVE_OPENGL
+ switch (type)
+ {
+ case RETRO_HW_CONTEXT_OPENGLES2:
+ case RETRO_HW_CONTEXT_OPENGLES3:
+ case RETRO_HW_CONTEXT_OPENGLES_VERSION:
+ case RETRO_HW_CONTEXT_OPENGL:
+#ifndef HAVE_OPENGL_CORE
+ case RETRO_HW_CONTEXT_OPENGL_CORE:
+#endif
+ return "gl";
+ default:
+ break;
+ }
+#endif
+#ifdef HAVE_VULKAN
+ if (type == RETRO_HW_CONTEXT_VULKAN)
+ return "vulkan";
+#endif
+#ifdef HAVE_D3D11
+ if (type == RETRO_HW_CONTEXT_DIRECT3D && major == 11)
+ return "d3d11";
+#endif
+#ifdef HAVE_D3D9
+ if (type == RETRO_HW_CONTEXT_DIRECT3D && major == 9)
+ return "d3d9";
+#endif
+ return "N/A";
+}
+
+enum retro_hw_context_type hw_render_context_type(const char *s)
+{
+#ifdef HAVE_OPENGL_CORE
+ if (string_is_equal(s, "glcore"))
+ return RETRO_HW_CONTEXT_OPENGL_CORE;
+#endif
+#ifdef HAVE_OPENGL
+ if (string_is_equal(s, "gl"))
+ return RETRO_HW_CONTEXT_OPENGL;
+#endif
+#ifdef HAVE_VULKAN
+ if (string_is_equal(s, "vulkan"))
+ return RETRO_HW_CONTEXT_VULKAN;
+#endif
+#ifdef HAVE_D3D11
+ if (string_is_equal(s, "d3d11"))
+ return RETRO_HW_CONTEXT_DIRECT3D;
+#endif
+#ifdef HAVE_D3D11
+ if (string_is_equal(s, "d3d9"))
+ return RETRO_HW_CONTEXT_DIRECT3D;
+#endif
+ return RETRO_HW_CONTEXT_NONE;
+}
+
+/**
+ * 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 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;
+ int scaled_screen_x = -0x8000; /* OOB */
+ int scaled_screen_y = -0x8000; /* OOB */
+ int scaled_x = -0x8000; /* OOB */
+ int scaled_y = -0x8000; /* OOB */
+ if (norm_vp_width <= 0 ||
+ norm_vp_height <= 0 ||
+ 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;
+
+ if (mouse_y >= 0 && mouse_y <= norm_full_vp_height)
+ scaled_screen_y = ((2 * mouse_y * 0x7fff)
+ / norm_full_vp_height) - 0x7fff;
+
+ 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;
+
+ *res_x = scaled_x;
+ *res_y = scaled_y;
+ *res_screen_x = scaled_screen_x;
+ *res_screen_y = scaled_screen_y;
+ return true;
+}
diff --git a/gfx/video_driver.h b/gfx/video_driver.h
new file mode 100644
index 0000000000..8da3db1152
--- /dev/null
+++ b/gfx/video_driver.h
@@ -0,0 +1,1219 @@
+/* RetroArch - A frontend for libretro.
+ * Copyright (C) 2010-2014 - Hans-Kristian Arntzen
+ * Copyright (C) 2011-2021 - 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 RARCH_VIDEO_DRIVER_H__
+#define RARCH_VIDEO_DRIVER_H__
+
+#include
+
+#include
+#include
+
+#ifdef HAVE_CONFIG_H
+#include "../config.h"
+#endif
+
+#include "../input/input_driver.h"
+#include "../input/input_types.h"
+
+#ifdef HAVE_VIDEO_LAYOUT
+#include "video_layout.h"
+#endif
+
+#include "video_defines.h"
+#include "video_coord_array.h"
+#include "video_shader_parse.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)
+#define VIDEO_SHADER_STOCK_HDR (GFX_MAX_SHADERS - 8)
+
+#define VIDEO_HDR_MAX_CONTRAST 10.0f
+
+#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(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
+
+RETRO_BEGIN_DECLS
+
+enum
+{
+ TEXTURES = 8,
+ TEXTURESMASK = TEXTURES - 1
+};
+
+struct LinkInfo
+{
+ struct video_shader_pass *pass;
+ unsigned tex_w, tex_h;
+};
+
+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_METAL_API,
+ GFX_CTX_RSX_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
+{
+ void *data;
+ const char *vertex;
+ const char *fragment;
+ const char *combined;
+ unsigned idx;
+ bool is_file;
+};
+
+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
+ {
+ float *floatv;
+ intptr_t *integerv;
+ uintptr_t *unsigned_integerv;
+
+ struct
+ {
+ intptr_t v0;
+ intptr_t v1;
+ intptr_t v2;
+ intptr_t v3;
+ } integer;
+
+ struct
+ {
+ uintptr_t v0;
+ uintptr_t v1;
+ uintptr_t v2;
+ uintptr_t v3;
+ } unsigned_integer;
+
+ struct
+ {
+ float v0;
+ float v1;
+ float v2;
+ float v3;
+ } f;
+
+ } 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
+{
+ const char *path;
+ const shader_backend_t *shader;
+ void *data;
+ void *shader_data;
+ enum rarch_shader_type shader_type;
+ struct
+ {
+ bool core_context_enabled;
+ } gl;
+} video_shader_ctx_init_t;
+
+typedef struct video_shader_ctx_params
+{
+ void *data;
+ const void *info;
+ const void *prev_info;
+ const void *feedback_info;
+ const void *fbo_info;
+ unsigned width;
+ unsigned height;
+ unsigned tex_width;
+ unsigned tex_height;
+ unsigned out_width;
+ unsigned out_height;
+ unsigned frame_counter;
+ unsigned fbo_info_cnt;
+} 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
+{
+ struct gfx_fbo_scale *scale;
+ unsigned idx;
+} video_shader_ctx_scale_t;
+
+typedef struct video_shader_ctx_info
+{
+ void *data;
+ unsigned num;
+ unsigned idx;
+ bool set_active;
+} 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
+{
+ bool *smooth;
+ unsigned index;
+} 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
+{
+ const char *path_font;
+
+ uintptr_t parent;
+
+ int swap_interval;
+
+
+ /* 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;
+
+#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;
+
+ float font_size;
+
+ bool adaptive_vsync;
+
+#ifdef GEKKO
+ bool vfilter;
+#endif
+
+ /* If true, applies bilinear filtering to the image,
+ * otherwise nearest filtering. */
+ bool smooth;
+
+ bool ctx_scaling;
+
+ 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;
+
+ /* 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;
+} video_info_t;
+
+typedef struct video_frame_info
+{
+ void *userdata;
+ void *widgets_userdata;
+ void *disp_userdata;
+
+ int custom_vp_x;
+ int custom_vp_y;
+ int crt_switch_center_adjust;
+ int crt_switch_porch_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;
+ unsigned black_frame_insertion;
+ unsigned fps_update_interval;
+ unsigned memory_update_interval;
+
+ 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;
+
+
+ struct
+ {
+ /* Drop shadow offset.
+ * If both are 0, no drop shadow will be rendered. */
+ int drop_x, drop_y;
+ /* ABGR. Use the macros. */
+ uint32_t color;
+ float x;
+ float y;
+ float scale;
+ /* Drop shadow color multiplier. */
+ float drop_mod;
+ /* Drop shadow alpha */
+ float drop_alpha;
+ enum text_alignment text_align;
+ bool full_screen;
+ } osd_stat_params;
+
+ char stat_text[512];
+
+ bool widgets_active;
+ bool menu_mouse_enable;
+ bool widgets_is_paused;
+ bool widgets_is_fast_forwarding;
+ bool widgets_is_rewinding;
+ bool input_menu_swap_ok_cancel_buttons;
+ bool input_driver_nonblock_state;
+ bool input_driver_grab_mouse_state;
+ bool hard_sync;
+ bool fps_show;
+ bool memory_show;
+ bool statistics_show;
+ bool framecount_show;
+ bool core_status_msg_show;
+ bool post_filter_record;
+ bool windowed_fullscreen;
+ bool fullscreen;
+ bool font_enable;
+ bool use_rgba;
+ bool hdr_support;
+ bool libretro_running;
+ bool xmb_shadows_enable;
+ bool battery_level_enable;
+ bool timedate_enable;
+ bool runloop_is_slowmotion;
+ bool runloop_is_paused;
+ bool menu_is_alive;
+ bool menu_screensaver_active;
+ bool msg_bgcolor_enable;
+ bool crt_switch_hires_menu;
+ bool hdr_enable;
+} video_frame_info_t;
+
+typedef void (*update_window_title_cb)(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)(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*, 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*);
+
+ /* 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;
+
+ /* Swaps buffers. VBlank sync depends on
+ * earlier calls to swap_interval. */
+ void (*swap_buffers)(void*);
+
+ /* Most video backends will want to use a certain input driver.
+ * Checks for it here. */
+ void (*input_driver)(void*, const char *, 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 GL 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
+{
+ float *value;
+ enum display_metric_types type;
+} gfx_ctx_metrics_t;
+
+typedef struct gfx_ctx_aspect
+{
+ float *aspect;
+ unsigned width;
+ unsigned height;
+} gfx_ctx_aspect_t;
+
+typedef struct gfx_ctx_input
+{
+ input_driver_t **input;
+ void **input_data;
+} gfx_ctx_input_t;
+
+typedef struct gfx_ctx_ident
+{
+ const char *ident;
+} gfx_ctx_ident_t;
+
+struct aspect_ratio_elem
+{
+ float value;
+ char name[64];
+};
+
+/* 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, bool threaded, 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, bool ctx_scaling);
+ 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,
+ 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);
+
+ /* hdr settings */
+ void (*set_hdr_max_nits)(void *data, float max_nits);
+ void (*set_hdr_paper_white_nits)(void *data, float paper_white_nits);
+ void (*set_hdr_contrast)(void *data, float contrast);
+ void (*set_hdr_expand_gamut)(void *data, bool expand_gamut);
+} 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,
+ 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,
+ bool adaptive_vsync_enabled,
+ unsigned swap_interval);
+
+ /* 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_GFX_WIDGETS)
+ /* if set to true, will use display widgets when applicable
+ * if set to false, will use OSD as a fallback */
+ bool (*gfx_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_has_focus(void);
+
+bool video_driver_cached_frame_has_valid_framebuffer(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_supports_viewport_read(void);
+
+bool video_driver_prefer_viewport_read(void);
+
+bool video_driver_supports_read_frame_raw(void);
+
+void video_driver_set_viewport_core(void);
+
+void video_driver_set_viewport_full(void);
+
+void video_driver_reset_custom_viewport(void *settings_data);
+
+void video_driver_set_rgba(void);
+
+void video_driver_unset_rgba(void);
+
+bool video_driver_supports_rgba(void);
+
+void video_driver_set_hdr_support(void);
+
+void video_driver_unset_hdr_support(void);
+
+bool video_driver_supports_hdr(void);
+
+unsigned video_driver_get_hdr_color(unsigned color);
+
+float video_driver_get_hdr_luminance(float nits);
+
+unsigned video_driver_get_hdr_paper_white(void);
+
+float* video_driver_get_hdr_paper_white_float(void);
+
+bool video_driver_get_next_video_out(void);
+
+bool video_driver_get_prev_video_out(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_apply_state_changes(void);
+
+bool video_driver_read_viewport(uint8_t *buffer, bool is_idle);
+
+void video_driver_cached_frame(void);
+
+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);
+
+bool video_driver_is_video_cache_context(void);
+
+void video_driver_set_video_cache_context_ack(void);
+
+bool video_driver_get_viewport_info(struct video_viewport *viewport);
+
+/**
+ * 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(void);
+
+void *video_driver_get_data(void);
+
+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_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_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, bool ctx_scaling);
+
+void video_driver_set_hdr_max_nits(float max_nits);
+void video_driver_set_hdr_paper_white_nits(float paper_white_nits);
+void video_driver_set_hdr_contrast(float contrast);
+void video_driver_set_hdr_expand_gamut(bool expand_gamut);
+
+const char *video_driver_get_ident(void);
+
+void 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);
+
+float video_driver_get_aspect_ratio(void);
+
+void video_driver_set_aspect_ratio_value(float value);
+
+enum retro_pixel_format video_driver_get_pixel_format(void);
+
+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);
+
+void crt_switch_driver_refresh(void);
+
+char* crt_switch_core_name(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_userdata_get(void);
+
+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_display_userdata_set(uintptr_t idx);
+
+void video_driver_window_set(uintptr_t idx);
+
+uintptr_t video_driver_window_get(void);
+
+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(int flags);
+
+void video_driver_get_window_title(char *buf, unsigned len);
+
+bool *video_driver_get_threaded(void);
+
+void video_driver_set_threaded(bool val);
+
+/**
+ * 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_set(const gfx_ctx_driver_t *data);
+
+void video_context_driver_destroy(void);
+
+bool video_context_driver_get_ident(gfx_ctx_ident_t *ident);
+
+bool video_context_driver_get_refresh_rate(float *refresh_rate);
+
+bool video_context_driver_set_flags(gfx_ctx_flags_t *flags);
+
+bool video_context_driver_get_metrics(gfx_ctx_metrics_t *metrics);
+
+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);
+
+#if defined(HAVE_GFX_WIDGETS)
+bool video_driver_has_widgets(void);
+#endif
+
+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_test_all_flags(enum display_flags testflag);
+
+gfx_ctx_flags_t video_driver_get_flags_wrapper(void);
+
+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);
+
+enum retro_hw_context_type hw_render_context_type(const char *s);
+
+const char *hw_render_context_name(
+ enum retro_hw_context_type type, int major, int minor);
+
+video_driver_t *hw_render_context_driver(
+ enum retro_hw_context_type type, int major, int minor);
+
+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_gcm;
+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_sdl_dingux;
+extern video_driver_t video_sdl_rs90;
+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_fpga;
+extern video_driver_t video_sixel;
+extern video_driver_t video_network;
+extern video_driver_t video_oga;
+
+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_uwp;
+extern const gfx_ctx_driver_t gfx_ctx_vk_wayland;
+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_vk_x;
+extern const gfx_ctx_driver_t gfx_ctx_drm;
+extern const gfx_ctx_driver_t gfx_ctx_go2_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_vk_android;
+extern const gfx_ctx_driver_t gfx_ctx_ps3;
+extern const gfx_ctx_driver_t gfx_ctx_w_vk;
+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_cocoavk;
+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_fpga;
+extern const gfx_ctx_driver_t gfx_ctx_sixel;
+extern const gfx_ctx_driver_t gfx_ctx_network;
+extern const gfx_ctx_driver_t switch_ctx;
+extern const gfx_ctx_driver_t orbis_ctx;
+extern const gfx_ctx_driver_t vita_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/griffin/griffin.c b/griffin/griffin.c
index 004902364d..69511d3506 100644
--- a/griffin/griffin.c
+++ b/griffin/griffin.c
@@ -231,6 +231,7 @@ CHEATS
#endif
#include "../libretro-common/hash/lrc_hash.c"
+#include "../gfx/video_driver.c"
/*============================================================
UI COMMON CONTEXT
============================================================ */
diff --git a/menu/menu_driver.c b/menu/menu_driver.c
index fad809f655..bc7151e944 100644
--- a/menu/menu_driver.c
+++ b/menu/menu_driver.c
@@ -3348,6 +3348,39 @@ bool generic_menu_init_list(struct menu_state *menu_st,
return true;
}
+/* This function gets called at first startup on Android/iOS
+ * when we need to extract the APK contents/zip file. This
+ * file contains assets which then get extracted to the
+ * user's asset directories. */
+static void bundle_decompressed(retro_task_t *task,
+ void *task_data,
+ void *user_data, const char *err)
+{
+ settings_t *settings = config_get_ptr();
+ decompress_task_data_t *dec = (decompress_task_data_t*)task_data;
+
+ if (err)
+ RARCH_ERR("%s", err);
+
+ if (dec)
+ {
+ if (!err)
+ command_event(CMD_EVENT_REINIT, NULL);
+
+ /* delete bundle? */
+ free(dec->source_file);
+ free(dec);
+ }
+
+ configuration_set_uint(settings,
+ settings->uints.bundle_assets_extract_last_version,
+ settings->uints.bundle_assets_extract_version_current);
+
+ configuration_set_bool(settings, settings->bools.bundle_finished, true);
+
+ command_event(CMD_EVENT_MENU_SAVE_CURRENT_CONFIG, NULL);
+}
+
bool rarch_menu_init(
struct menu_state *menu_st,
menu_dialog_t *p_dialog,
diff --git a/menu/menu_driver.h b/menu/menu_driver.h
index 304f944d46..a136ef5574 100644
--- a/menu/menu_driver.h
+++ b/menu/menu_driver.h
@@ -776,10 +776,6 @@ bool menu_driver_displaylist_push(
file_list_t *entry_list,
file_list_t *entry_stack);
-void bundle_decompressed(retro_task_t *task,
- void *task_data,
- void *user_data, const char *err);
-
int generic_menu_entry_action(void *userdata, menu_entry_t *entry, size_t i, enum menu_action action);
#if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL)
diff --git a/retroarch.c b/retroarch.c
index 5c61573afa..fceb1b1fd2 100644
--- a/retroarch.c
+++ b/retroarch.c
@@ -1482,41 +1482,6 @@ int generic_menu_entry_action(
return ret;
}
-#ifdef HAVE_COMPRESSION
-/* This function gets called at first startup on Android/iOS
- * when we need to extract the APK contents/zip file. This
- * file contains assets which then get extracted to the
- * user's asset directories. */
-void bundle_decompressed(retro_task_t *task,
- void *task_data,
- void *user_data, const char *err)
-{
- settings_t *settings = config_get_ptr();
- decompress_task_data_t *dec = (decompress_task_data_t*)task_data;
-
- if (err)
- RARCH_ERR("%s", err);
-
- if (dec)
- {
- if (!err)
- command_event(CMD_EVENT_REINIT, NULL);
-
- /* delete bundle? */
- free(dec->source_file);
- free(dec);
- }
-
- configuration_set_uint(settings,
- settings->uints.bundle_assets_extract_last_version,
- settings->uints.bundle_assets_extract_version_current);
-
- configuration_set_bool(settings, settings->bools.bundle_finished, true);
-
- command_event(CMD_EVENT_MENU_SAVE_CURRENT_CONFIG, NULL);
-}
-#endif
-
const char *menu_driver_ident(void)
{
struct rarch_state *p_rarch = &rarch_st;
@@ -10365,109 +10330,6 @@ static void runloop_core_msg_queue_push(
category);
}
-#if defined(HAVE_VULKAN) || defined(HAVE_D3D11) || defined(HAVE_D3D9) || defined(HAVE_OPENGL_CORE)
-static video_driver_t *hw_render_context_driver(enum retro_hw_context_type type, int major, int minor)
-{
- switch (type)
- {
- case RETRO_HW_CONTEXT_OPENGL_CORE:
-#ifdef HAVE_OPENGL_CORE
- return &video_gl_core;
-#else
- break;
-#endif
- case RETRO_HW_CONTEXT_OPENGL:
-#ifdef HAVE_OPENGL
- return &video_gl2;
-#else
- break;
-#endif
- case RETRO_HW_CONTEXT_DIRECT3D:
-#if defined(HAVE_D3D9)
- if (major == 9)
- return &video_d3d9;
-#endif
-#if defined(HAVE_D3D11)
- if (major == 11)
- return &video_d3d11;
-#endif
- break;
- case RETRO_HW_CONTEXT_VULKAN:
-#if defined(HAVE_VULKAN)
- return &video_vulkan;
-#else
- break;
-#endif
- default:
- case RETRO_HW_CONTEXT_NONE:
- break;
- }
-
- return NULL;
-}
-#endif
-
-static enum retro_hw_context_type hw_render_context_type(const char *s)
-{
-#ifdef HAVE_OPENGL_CORE
- if (string_is_equal(s, "glcore"))
- return RETRO_HW_CONTEXT_OPENGL_CORE;
-#endif
-#ifdef HAVE_OPENGL
- if (string_is_equal(s, "gl"))
- return RETRO_HW_CONTEXT_OPENGL;
-#endif
-#ifdef HAVE_VULKAN
- if (string_is_equal(s, "vulkan"))
- return RETRO_HW_CONTEXT_VULKAN;
-#endif
-#ifdef HAVE_D3D11
- if (string_is_equal(s, "d3d11"))
- return RETRO_HW_CONTEXT_DIRECT3D;
-#endif
-#ifdef HAVE_D3D11
- if (string_is_equal(s, "d3d9"))
- return RETRO_HW_CONTEXT_DIRECT3D;
-#endif
- return RETRO_HW_CONTEXT_NONE;
-}
-
-static const char *hw_render_context_name(enum retro_hw_context_type type, int major, int minor)
-{
-#ifdef HAVE_OPENGL_CORE
- if (type == RETRO_HW_CONTEXT_OPENGL_CORE)
- return "glcore";
-#endif
-#ifdef HAVE_OPENGL
- switch (type)
- {
- case RETRO_HW_CONTEXT_OPENGLES2:
- case RETRO_HW_CONTEXT_OPENGLES3:
- case RETRO_HW_CONTEXT_OPENGLES_VERSION:
- case RETRO_HW_CONTEXT_OPENGL:
-#ifndef HAVE_OPENGL_CORE
- case RETRO_HW_CONTEXT_OPENGL_CORE:
-#endif
- return "gl";
- default:
- break;
- }
-#endif
-#ifdef HAVE_VULKAN
- if (type == RETRO_HW_CONTEXT_VULKAN)
- return "vulkan";
-#endif
-#ifdef HAVE_D3D11
- if (type == RETRO_HW_CONTEXT_DIRECT3D && major == 11)
- return "d3d11";
-#endif
-#ifdef HAVE_D3D9
- if (type == RETRO_HW_CONTEXT_DIRECT3D && major == 9)
- return "d3d9";
-#endif
- return "N/A";
-}
-
/**
* rarch_environment_cb:
* @cmd : Identifier of command.
@@ -23087,69 +22949,6 @@ void video_driver_build_info(video_frame_info_t *video_info)
#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 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;
- int scaled_screen_x = -0x8000; /* OOB */
- int scaled_screen_y = -0x8000; /* OOB */
- int scaled_x = -0x8000; /* OOB */
- int scaled_y = -0x8000; /* OOB */
- if (norm_vp_width <= 0 ||
- norm_vp_height <= 0 ||
- 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;
-
- if (mouse_y >= 0 && mouse_y <= norm_full_vp_height)
- scaled_screen_y = ((2 * mouse_y * 0x7fff)
- / norm_full_vp_height) - 0x7fff;
-
- 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;
-
- *res_x = scaled_x;
- *res_y = scaled_y;
- *res_screen_x = scaled_screen_x;
- *res_screen_y = scaled_screen_y;
- return true;
-}
-
bool video_driver_has_focus(void)
{
struct rarch_state *p_rarch = &rarch_st;
diff --git a/retroarch.h b/retroarch.h
index b5e850fd32..46817912c5 100644
--- a/retroarch.h
+++ b/retroarch.h
@@ -39,14 +39,11 @@
#endif
#include "audio/audio_defines.h"
-#include "gfx/video_shader_parse.h"
+#include "gfx/video_driver.h"
#include "core_type.h"
#include "core.h"
-#include "input/input_driver.h"
-#include "input/input_types.h"
-
#ifdef HAVE_MENU
#include "menu/menu_defines.h"
#endif
@@ -783,1180 +780,6 @@ void recording_driver_update_streaming_url(void);
#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"
-
-#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)
-#define VIDEO_SHADER_STOCK_HDR (GFX_MAX_SHADERS - 8)
-
-#define VIDEO_HDR_MAX_CONTRAST 10.0f
-
-#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(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
-{
- struct video_shader_pass *pass;
- unsigned tex_w, tex_h;
-};
-
-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_METAL_API,
- GFX_CTX_RSX_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
-{
- void *data;
- const char *vertex;
- const char *fragment;
- const char *combined;
- unsigned idx;
- bool is_file;
-};
-
-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
- {
- float *floatv;
- intptr_t *integerv;
- uintptr_t *unsigned_integerv;
-
- struct
- {
- intptr_t v0;
- intptr_t v1;
- intptr_t v2;
- intptr_t v3;
- } integer;
-
- struct
- {
- uintptr_t v0;
- uintptr_t v1;
- uintptr_t v2;
- uintptr_t v3;
- } unsigned_integer;
-
- struct
- {
- float v0;
- float v1;
- float v2;
- float v3;
- } f;
-
- } 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
-{
- const char *path;
- const shader_backend_t *shader;
- void *data;
- void *shader_data;
- enum rarch_shader_type shader_type;
- struct
- {
- bool core_context_enabled;
- } gl;
-} video_shader_ctx_init_t;
-
-typedef struct video_shader_ctx_params
-{
- void *data;
- const void *info;
- const void *prev_info;
- const void *feedback_info;
- const void *fbo_info;
- unsigned width;
- unsigned height;
- unsigned tex_width;
- unsigned tex_height;
- unsigned out_width;
- unsigned out_height;
- unsigned frame_counter;
- unsigned fbo_info_cnt;
-} 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
-{
- struct gfx_fbo_scale *scale;
- unsigned idx;
-} video_shader_ctx_scale_t;
-
-typedef struct video_shader_ctx_info
-{
- void *data;
- unsigned num;
- unsigned idx;
- bool set_active;
-} 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
-{
- bool *smooth;
- unsigned index;
-} 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
-{
- const char *path_font;
-
- uintptr_t parent;
-
- int swap_interval;
-
-
- /* 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;
-
-#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;
-
- float font_size;
-
- bool adaptive_vsync;
-
-#ifdef GEKKO
- bool vfilter;
-#endif
-
- /* If true, applies bilinear filtering to the image,
- * otherwise nearest filtering. */
- bool smooth;
-
- bool ctx_scaling;
-
- 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;
-
- /* 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;
-} video_info_t;
-
-typedef struct video_frame_info
-{
- void *userdata;
- void *widgets_userdata;
- void *disp_userdata;
-
- int custom_vp_x;
- int custom_vp_y;
- int crt_switch_center_adjust;
- int crt_switch_porch_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;
- unsigned black_frame_insertion;
- unsigned fps_update_interval;
- unsigned memory_update_interval;
-
- 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;
-
-
- struct
- {
- /* Drop shadow offset.
- * If both are 0, no drop shadow will be rendered. */
- int drop_x, drop_y;
- /* ABGR. Use the macros. */
- uint32_t color;
- float x;
- float y;
- float scale;
- /* Drop shadow color multiplier. */
- float drop_mod;
- /* Drop shadow alpha */
- float drop_alpha;
- enum text_alignment text_align;
- bool full_screen;
- } osd_stat_params;
-
- char stat_text[512];
-
- bool widgets_active;
- bool menu_mouse_enable;
- bool widgets_is_paused;
- bool widgets_is_fast_forwarding;
- bool widgets_is_rewinding;
- bool input_menu_swap_ok_cancel_buttons;
- bool input_driver_nonblock_state;
- bool input_driver_grab_mouse_state;
- bool hard_sync;
- bool fps_show;
- bool memory_show;
- bool statistics_show;
- bool framecount_show;
- bool core_status_msg_show;
- bool post_filter_record;
- bool windowed_fullscreen;
- bool fullscreen;
- bool font_enable;
- bool use_rgba;
- bool hdr_support;
- bool libretro_running;
- bool xmb_shadows_enable;
- bool battery_level_enable;
- bool timedate_enable;
- bool runloop_is_slowmotion;
- bool runloop_is_paused;
- bool menu_is_alive;
- bool menu_screensaver_active;
- bool msg_bgcolor_enable;
- bool crt_switch_hires_menu;
- bool hdr_enable;
-} video_frame_info_t;
-
-typedef void (*update_window_title_cb)(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)(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*, 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*);
-
- /* 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;
-
- /* Swaps buffers. VBlank sync depends on
- * earlier calls to swap_interval. */
- void (*swap_buffers)(void*);
-
- /* Most video backends will want to use a certain input driver.
- * Checks for it here. */
- void (*input_driver)(void*, const char *, 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 GL 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
-{
- float *value;
- enum display_metric_types type;
-} gfx_ctx_metrics_t;
-
-typedef struct gfx_ctx_aspect
-{
- float *aspect;
- unsigned width;
- unsigned height;
-} gfx_ctx_aspect_t;
-
-typedef struct gfx_ctx_input
-{
- input_driver_t **input;
- void **input_data;
-} gfx_ctx_input_t;
-
-typedef struct gfx_ctx_ident
-{
- const char *ident;
-} gfx_ctx_ident_t;
-
-struct aspect_ratio_elem
-{
- float value;
- char name[64];
-};
-
-/* 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, bool threaded, 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, bool ctx_scaling);
- 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,
- 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);
-
- /* hdr settings */
- void (*set_hdr_max_nits)(void *data, float max_nits);
- void (*set_hdr_paper_white_nits)(void *data, float paper_white_nits);
- void (*set_hdr_contrast)(void *data, float contrast);
- void (*set_hdr_expand_gamut)(void *data, bool expand_gamut);
-} 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,
- 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,
- bool adaptive_vsync_enabled,
- unsigned swap_interval);
-
- /* 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_GFX_WIDGETS)
- /* if set to true, will use display widgets when applicable
- * if set to false, will use OSD as a fallback */
- bool (*gfx_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_has_focus(void);
-
-bool video_driver_cached_frame_has_valid_framebuffer(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_supports_viewport_read(void);
-
-bool video_driver_prefer_viewport_read(void);
-
-bool video_driver_supports_read_frame_raw(void);
-
-void video_driver_set_viewport_core(void);
-
-void video_driver_set_viewport_full(void);
-
-void video_driver_reset_custom_viewport(void *settings_data);
-
-void video_driver_set_rgba(void);
-
-void video_driver_unset_rgba(void);
-
-bool video_driver_supports_rgba(void);
-
-void video_driver_set_hdr_support(void);
-
-void video_driver_unset_hdr_support(void);
-
-bool video_driver_supports_hdr(void);
-
-unsigned video_driver_get_hdr_color(unsigned color);
-
-float video_driver_get_hdr_luminance(float nits);
-
-unsigned video_driver_get_hdr_paper_white(void);
-
-float* video_driver_get_hdr_paper_white_float(void);
-
-bool video_driver_get_next_video_out(void);
-
-bool video_driver_get_prev_video_out(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_apply_state_changes(void);
-
-bool video_driver_read_viewport(uint8_t *buffer, bool is_idle);
-
-void video_driver_cached_frame(void);
-
-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);
-
-bool video_driver_is_video_cache_context(void);
-
-void video_driver_set_video_cache_context_ack(void);
-
-bool video_driver_get_viewport_info(struct video_viewport *viewport);
-
-/**
- * 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(void);
-
-void *video_driver_get_data(void);
-
-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_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_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, bool ctx_scaling);
-
-void video_driver_set_hdr_max_nits(float max_nits);
-void video_driver_set_hdr_paper_white_nits(float paper_white_nits);
-void video_driver_set_hdr_contrast(float contrast);
-void video_driver_set_hdr_expand_gamut(bool expand_gamut);
-
-const char *video_driver_get_ident(void);
-
-void 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);
-
-float video_driver_get_aspect_ratio(void);
-
-void video_driver_set_aspect_ratio_value(float value);
-
-enum retro_pixel_format video_driver_get_pixel_format(void);
-
-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);
-
-void crt_switch_driver_refresh(void);
-
-char* crt_switch_core_name(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_userdata_get(void);
-
-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_display_userdata_set(uintptr_t idx);
-
-void video_driver_window_set(uintptr_t idx);
-
-uintptr_t video_driver_window_get(void);
-
-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(int flags);
-
-void video_driver_get_window_title(char *buf, unsigned len);
-
-bool *video_driver_get_threaded(void);
-
-void video_driver_set_threaded(bool val);
-
-/**
- * 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_set(const gfx_ctx_driver_t *data);
-
-void video_context_driver_destroy(void);
-
-bool video_context_driver_get_ident(gfx_ctx_ident_t *ident);
-
-bool video_context_driver_get_refresh_rate(float *refresh_rate);
-
-bool video_context_driver_set_flags(gfx_ctx_flags_t *flags);
-
-bool video_context_driver_get_metrics(gfx_ctx_metrics_t *metrics);
-
-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);
-
-#if defined(HAVE_GFX_WIDGETS)
-bool video_driver_has_widgets(void);
-#endif
-
-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_test_all_flags(enum display_flags testflag);
-
-gfx_ctx_flags_t video_driver_get_flags_wrapper(void);
-
-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);
-
-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_gcm;
-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_sdl_dingux;
-extern video_driver_t video_sdl_rs90;
-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_fpga;
-extern video_driver_t video_sixel;
-extern video_driver_t video_network;
-extern video_driver_t video_oga;
-
-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_uwp;
-extern const gfx_ctx_driver_t gfx_ctx_vk_wayland;
-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_vk_x;
-extern const gfx_ctx_driver_t gfx_ctx_drm;
-extern const gfx_ctx_driver_t gfx_ctx_go2_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_vk_android;
-extern const gfx_ctx_driver_t gfx_ctx_ps3;
-extern const gfx_ctx_driver_t gfx_ctx_w_vk;
-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_cocoavk;
-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_fpga;
-extern const gfx_ctx_driver_t gfx_ctx_sixel;
-extern const gfx_ctx_driver_t gfx_ctx_network;
-extern const gfx_ctx_driver_t switch_ctx;
-extern const gfx_ctx_driver_t orbis_ctx;
-extern const gfx_ctx_driver_t vita_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 */
void bsv_movie_frame_rewind(void);