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);