Reimplement 'Take Screenshot' - if GPU-accelerated viewport screenshots

are not available, resort to raw screenshots instead
This commit is contained in:
twinaphex 2019-05-22 07:07:33 +02:00
parent f4346401e2
commit 6aed230930
27 changed files with 53 additions and 373 deletions

View File

@ -255,21 +255,6 @@ static void caca_gfx_set_rotation(void *data,
(void)rotation;
}
static void caca_gfx_viewport_info(void *data,
struct video_viewport *vp)
{
(void)data;
(void)vp;
}
static bool caca_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void caca_set_texture_frame(void *data,
const void *frame, bool rgb32, unsigned width, unsigned height,
float alpha)
@ -353,8 +338,8 @@ video_driver_t video_caca = {
"caca",
caca_gfx_set_viewport,
caca_gfx_set_rotation,
caca_gfx_viewport_info,
caca_gfx_read_viewport,
NULL, /* viewport_info */
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -1253,13 +1253,6 @@ static void ctr_get_poke_interface(void* data,
*iface = &ctr_poke_interface;
}
static bool ctr_read_viewport(void* data, uint8_t* buffer, bool is_idle)
{
(void)data;
(void)buffer;
return false;
}
static bool ctr_set_shader(void* data,
enum rarch_shader_type type, const char* path)
{
@ -1285,7 +1278,7 @@ video_driver_t video_ctr =
NULL, /* set_viewport */
ctr_set_rotation,
ctr_viewport_info,
ctr_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
NULL,

View File

@ -1530,14 +1530,6 @@ static void d3d10_gfx_viewport_info(void* data, struct video_viewport* vp)
*vp = d3d10->vp;
}
static bool d3d10_gfx_read_viewport(void* data, uint8_t* buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void d3d10_set_menu_texture_frame(
void* data, const void* frame, bool rgb32, unsigned width, unsigned height, float alpha)
{
@ -1748,7 +1740,7 @@ video_driver_t video_d3d10 = {
NULL, /* set_viewport */
d3d10_gfx_set_rotation,
d3d10_gfx_viewport_info,
d3d10_gfx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -1598,14 +1598,6 @@ static void d3d11_gfx_viewport_info(void* data, struct video_viewport* vp)
*vp = d3d11->vp;
}
static bool d3d11_gfx_read_viewport(void* data, uint8_t* buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void d3d11_set_menu_texture_frame(
void* data, const void* frame, bool rgb32, unsigned width, unsigned height, float alpha)
{
@ -1810,7 +1802,7 @@ video_driver_t video_d3d11 = {
NULL, /* set_viewport */
d3d11_gfx_set_rotation,
d3d11_gfx_viewport_info,
d3d11_gfx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -1632,14 +1632,6 @@ static void d3d12_gfx_viewport_info(void* data, struct video_viewport* vp)
*vp = d3d12->vp;
}
static bool d3d12_gfx_read_viewport(void* data, uint8_t* buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void d3d12_set_menu_texture_frame(
void* data, const void* frame, bool rgb32,
unsigned width, unsigned height, float alpha)
@ -1858,7 +1850,7 @@ video_driver_t video_d3d12 = {
NULL, /* set_viewport */
d3d12_gfx_set_rotation,
d3d12_gfx_viewport_info,
d3d12_gfx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -1631,11 +1631,6 @@ static bool d3d8_frame(void *data, const void *frame,
return true;
}
static bool d3d8_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
return false;
}
static bool d3d8_set_shader(void *data,
enum rarch_shader_type type, const char *path)
{
@ -1900,7 +1895,7 @@ video_driver_t video_d3d8 = {
d3d8_set_viewport,
d3d8_set_rotation,
d3d8_viewport_info,
d3d8_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
d3d8_get_overlay_interface,

View File

@ -586,20 +586,6 @@ static bool dispmanx_gfx_set_shader(void *data,
return false;
}
static void dispmanx_gfx_set_rotation(void *data, unsigned rotation)
{
(void)data;
(void)rotation;
}
static bool dispmanx_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void dispmanx_set_aspect_ratio (void *data, unsigned aspect_ratio_idx)
{
/* Due to RetroArch setting the data pointer to NULL internally
@ -704,9 +690,9 @@ video_driver_t video_dispmanx = {
dispmanx_gfx_free,
"dispmanx",
NULL, /* set_viewport */
dispmanx_gfx_set_rotation,
NULL, /* set_rotation */
dispmanx_gfx_viewport_info,
dispmanx_gfx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -932,20 +932,6 @@ static bool drm_gfx_set_shader(void *data,
return false;
}
static void drm_gfx_set_rotation(void *data, unsigned rotation)
{
(void)data;
(void)rotation;
}
static bool drm_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void drm_set_aspect_ratio (void *data, unsigned aspect_ratio_idx)
{
struct drm_video *_drmvars = data;
@ -1029,9 +1015,9 @@ video_driver_t video_drm = {
drm_gfx_free,
"drm",
NULL, /* set_viewport */
drm_gfx_set_rotation,
NULL, /* set_rotation */
drm_gfx_viewport_info,
drm_gfx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -1528,14 +1528,6 @@ static bool exynos_gfx_set_shader(void *data,
return false;
}
static bool exynos_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
video_driver_t video_exynos = {
exynos_gfx_init,
exynos_gfx_frame,
@ -1550,7 +1542,7 @@ video_driver_t video_exynos = {
NULL, /* set_viewport */
exynos_gfx_set_rotation,
exynos_gfx_viewport_info,
exynos_gfx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -472,28 +472,6 @@ static bool gdi_gfx_set_shader(void *data,
return false;
}
static void gdi_gfx_set_rotation(void *data,
unsigned rotation)
{
(void)data;
(void)rotation;
}
static void gdi_gfx_viewport_info(void *data,
struct video_viewport *vp)
{
(void)data;
(void)vp;
}
static bool gdi_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void gdi_set_texture_frame(void *data,
const void *frame, bool rgb32, unsigned width, unsigned height,
float alpha)
@ -689,9 +667,9 @@ video_driver_t video_gdi = {
gdi_gfx_free,
"gdi",
gdi_gfx_set_viewport,
gdi_gfx_set_rotation,
gdi_gfx_viewport_info,
gdi_gfx_read_viewport,
NULL, /* set_rotation */
NULL, /* viewport_info */
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -1566,14 +1566,6 @@ static void wiiu_gfx_viewport_info(void *data,
*vp = wiiu->vp;
}
static bool wiiu_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static uintptr_t wiiu_gfx_load_texture(void *video_data, void *data,
bool threaded, enum texture_filter_type filter_type)
{
@ -1773,7 +1765,7 @@ video_driver_t video_wiiu =
NULL, /* set_viewport */
wiiu_gfx_set_rotation,
wiiu_gfx_viewport_info,
wiiu_gfx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
gx2_get_overlay_interface, /* overlay_interface */

View File

@ -1230,13 +1230,6 @@ static void gx_viewport_info(void *data, struct video_viewport *vp)
*vp = gx->vp;
}
static bool gx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void gx_get_video_output_prev(void *data)
{
global_t *global = global_get_ptr();
@ -1679,7 +1672,7 @@ video_driver_t video_gx = {
NULL, /* set_viewport */
gx_set_rotation,
gx_viewport_info,
gx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
gx_get_overlay_interface,

View File

@ -1085,20 +1085,6 @@ static bool omap_gfx_set_shader(void *data,
return false;
}
static void omap_gfx_set_rotation(void *data, unsigned rotation)
{
(void)data;
(void)rotation;
}
static bool omap_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void omap_gfx_set_texture_frame(void *data, const void *frame, bool rgb32,
unsigned width, unsigned height, float alpha)
{
@ -1179,9 +1165,9 @@ video_driver_t video_omap = {
omap_gfx_free,
"omap",
NULL, /* set_viewport */
omap_gfx_set_rotation,
NULL, /* set_rotation */
omap_gfx_viewport_info,
omap_gfx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -384,28 +384,6 @@ static bool ps2_gfx_set_shader(void *data,
return false;
}
static void ps2_gfx_set_rotation(void *data,
unsigned rotation)
{
(void)data;
(void)rotation;
}
static void ps2_gfx_viewport_info(void *data,
struct video_viewport *vp)
{
(void)data;
(void)vp;
}
static bool ps2_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void ps2_set_filtering(void *data, unsigned index, bool smooth)
{
ps2_video_t *ps2 = (ps2_video_t*)data;
@ -511,9 +489,9 @@ video_driver_t video_ps2 = {
ps2_gfx_free,
"ps2",
NULL, /* set_viewport */
ps2_gfx_set_rotation,
ps2_gfx_viewport_info,
ps2_gfx_read_viewport,
NULL, /* set_rotation */
NULL, /* viewport_info */
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -429,7 +429,8 @@ static bool sdl_gfx_has_windowed(void *data)
static void sdl_gfx_viewport_info(void *data, struct video_viewport *vp)
{
sdl_video_t *vid = (sdl_video_t*)data;
vp->x = vp->y = 0;
vp->x = 0;
vp->y = 0;
vp->width = vp->full_width = vid->screen->w;
vp->height = vp->full_height = vid->screen->h;
}
@ -566,20 +567,6 @@ static bool sdl_gfx_set_shader(void *data,
return false;
}
static void sdl_gfx_set_rotation(void *data, unsigned rotation)
{
(void)data;
(void)rotation;
}
static bool sdl_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
video_driver_t video_sdl = {
sdl_gfx_init,
sdl_gfx_frame,
@ -592,9 +579,9 @@ video_driver_t video_sdl = {
sdl_gfx_free,
"sdl",
NULL,
sdl_gfx_set_rotation,
NULL, /* set_rotation */
sdl_gfx_viewport_info,
sdl_gfx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
NULL,

View File

@ -515,21 +515,6 @@ static void sixel_gfx_set_rotation(void *data,
(void)rotation;
}
static void sixel_gfx_viewport_info(void *data,
struct video_viewport *vp)
{
(void)data;
(void)vp;
}
static bool sixel_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void sixel_set_texture_frame(void *data,
const void *frame, bool rgb32, unsigned width, unsigned height,
float alpha)
@ -659,8 +644,8 @@ video_driver_t video_sixel = {
"sixel",
sixel_gfx_set_viewport,
sixel_gfx_set_rotation,
sixel_gfx_viewport_info,
sixel_gfx_read_viewport,
NULL, /* viewport_info */
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
NULL, /* overlay_interface */

View File

@ -824,12 +824,6 @@ static bool sunxi_gfx_focus(void *data)
return true; /* fb device always has focus */
}
static void sunxi_gfx_set_rotation(void *data, unsigned rotation)
{
(void)data;
(void)rotation;
}
static bool sunxi_gfx_suppress_screensaver(void *data, bool enable)
{
(void)data;
@ -985,7 +979,7 @@ video_driver_t video_sunxi = {
sunxi_gfx_free,
"sunxi",
NULL, /* set_viewport */
sunxi_gfx_set_rotation,
NULL, /* set_rotation */
sunxi_gfx_viewport_info,
NULL, /* read_viewport */
NULL, /* read_frame_raw */

View File

@ -327,14 +327,6 @@ static void switch_viewport_info(void *data, struct video_viewport *vp)
*vp = sw->vp;
}
static bool switch_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void) data;
(void) buffer;
return true;
}
static void switch_set_texture_frame(
void *data, const void *frame, bool rgb32,
unsigned width, unsigned height, float alpha)
@ -449,7 +441,7 @@ video_driver_t video_switch = {
NULL, /* set_viewport */
switch_set_rotation,
switch_viewport_info,
switch_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
NULL, /* overlay_interface */

View File

@ -576,14 +576,6 @@ static void switch_viewport_info(void *data, struct video_viewport *vp)
*vp = sw->vp;
}
static bool switch_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void switch_set_texture_frame(
void *data, const void *frame, bool rgb32,
unsigned width, unsigned height, float alpha)
@ -798,7 +790,7 @@ video_driver_t video_switch = {
NULL, /* set_viewport */
switch_set_rotation,
switch_viewport_info,
switch_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
switch_overlay_interface, /* switch_overlay_interface */

View File

@ -473,27 +473,6 @@ static bool vg_set_shader(void *data,
return false;
}
static void vg_set_rotation(void *data, unsigned rotation)
{
(void)data;
(void)rotation;
}
static void vg_viewport_info(void *data,
struct video_viewport *vp)
{
(void)data;
(void)vp;
}
static bool vg_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void vg_get_poke_interface(void *data,
const video_poke_interface_t **iface)
{
@ -513,9 +492,9 @@ video_driver_t video_vg = {
vg_free,
"vg",
NULL, /* set_viewport */
vg_set_rotation,
vg_viewport_info,
vg_read_viewport,
NULL, /* set_rotation */
NULL, /* viewport_info */
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
NULL, /* overlay_interface */

View File

@ -303,28 +303,6 @@ static bool vga_gfx_set_shader(void *data,
return false;
}
static void vga_gfx_set_rotation(void *data,
unsigned rotation)
{
(void)data;
(void)rotation;
}
static void vga_gfx_viewport_info(void *data,
struct video_viewport *vp)
{
(void)data;
(void)vp;
}
static bool vga_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void vga_set_texture_frame(void *data,
const void *frame, bool rgb32, unsigned width, unsigned height,
float alpha)
@ -444,9 +422,9 @@ video_driver_t video_vga = {
vga_gfx_free,
"vga",
vga_gfx_set_viewport,
vga_gfx_set_rotation,
vga_gfx_viewport_info,
vga_gfx_read_viewport,
NULL, /* set_rotation */
NULL, /* viewport_info */
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -565,14 +565,6 @@ static void vita2d_gfx_viewport_info(void *data,
*vp = vita->vp;
}
static bool vita2d_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void vita_set_filtering(void *data, unsigned index, bool smooth)
{
vita_video_t *vita = (vita_video_t *)data;
@ -979,7 +971,7 @@ video_driver_t video_vita2d = {
vita2d_gfx_set_viewport,
vita2d_gfx_set_rotation,
vita2d_gfx_viewport_info,
vita2d_gfx_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
vita2d_get_overlay_interface,

View File

@ -270,12 +270,6 @@ static bool xenon360_gfx_suppress_screensaver(void *data, bool enable)
return false;
}
static void xenon360_gfx_set_rotation(void *data, unsigned rotation)
{
(void)data;
(void)rotation;
}
static bool xenon360_gfx_set_shader(void *data,
enum rarch_shader_type type, const char *path)
{
@ -286,20 +280,6 @@ static bool xenon360_gfx_set_shader(void *data,
return false;
}
static void xenon360_gfx_viewport_info(void *data, struct video_viewport *vp)
{
(void)data;
(void)vp;
}
static bool xenon360_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static void xenon360_gfx_get_poke_interface(void *data,
const video_poke_interface_t **iface)
{
@ -319,9 +299,9 @@ video_driver_t video_xenon360 = {
xenon360_gfx_free,
"xenon360",
NULL, /* set_viewport */
xenon360_gfx_set_rotation,
xenon360_gfx_viewport_info,
xenon360_gfx_read_viewport,
NULL, /* set_rotation */
NULL, /* viewport_info */
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY

View File

@ -143,21 +143,6 @@ static void xshm_gfx_free(void *data)
}
static void xshm_gfx_set_rotation(void *data, unsigned rotation)
{
}
static void xshm_gfx_viewport_info(void *data, struct video_viewport *vp)
{
}
static bool xshm_gfx_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
return false;
}
static void xshm_poke_set_filtering(void *data, unsigned index, bool smooth)
{
@ -256,9 +241,9 @@ video_driver_t video_xshm = {
"xshm",
NULL,
xshm_gfx_set_rotation,
xshm_gfx_viewport_info,
xshm_gfx_read_viewport,
NULL, /* set_rotation */
NULL, /* viewport_info */
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
NULL,

View File

@ -920,20 +920,6 @@ static void xv_viewport_info(void *data, struct video_viewport *vp)
*vp = xv->vp;
}
static void xv_set_rotation(void *data, unsigned rotation)
{
(void)data;
(void)rotation;
}
static bool xv_read_viewport(void *data, uint8_t *buffer, bool is_idle)
{
(void)data;
(void)buffer;
return true;
}
static uint32_t xv_get_flags(void *data)
{
uint32_t flags = 0;
@ -994,9 +980,9 @@ video_driver_t video_xvideo = {
xv_free,
"xvideo",
NULL, /* set_viewport */
xv_set_rotation,
NULL, /* set_rotation */
xv_viewport_info,
xv_read_viewport,
NULL, /* read_viewport */
NULL, /* read_frame_raw */
#ifdef HAVE_OVERLAY
NULL, /* overlay_interface */

View File

@ -1750,14 +1750,11 @@ static int menu_displaylist_parse_load_content_settings(
if (settings->bools.quick_menu_show_take_screenshot)
{
gfx_ctx_flags_t flags;
if (video_driver_get_all_flags(&flags, GFX_CTX_FLAGS_SCREENSHOTS_SUPPORTED))
menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT),
msg_hash_to_str(MENU_ENUM_LABEL_TAKE_SCREENSHOT),
MENU_ENUM_LABEL_TAKE_SCREENSHOT,
MENU_SETTING_ACTION_SCREENSHOT, 0, 0);
menu_entries_append_enum(info->list,
msg_hash_to_str(MENU_ENUM_LABEL_VALUE_TAKE_SCREENSHOT),
msg_hash_to_str(MENU_ENUM_LABEL_TAKE_SCREENSHOT),
MENU_ENUM_LABEL_TAKE_SCREENSHOT,
MENU_SETTING_ACTION_SCREENSHOT, 0, 0);
}
if (settings->bools.quick_menu_show_save_load_state)

View File

@ -350,7 +350,6 @@ static bool screenshot_dump(
return screenshot_dump_direct(state);
}
#if !defined(VITA)
static bool take_screenshot_viewport(
const char *screenshot_dir,
const char *name_base,
@ -400,7 +399,6 @@ static bool take_screenshot_viewport(
return true;
}
#endif
static bool take_screenshot_raw(const char *screenshot_dir,
const char *name_base, void *userbuf,
@ -446,7 +444,8 @@ static bool take_screenshot_choice(
bool use_thread,
bool supports_viewport_read,
bool supports_read_frame_raw,
unsigned pixel_format_type)
unsigned pixel_format_type
)
{
size_t old_pitch;
unsigned old_width, old_height;
@ -459,15 +458,9 @@ static bool take_screenshot_choice(
video_driver_set_texture_enable(false, false);
if (!is_idle)
video_driver_cached_frame();
#if defined(VITA)
return take_screenshot_raw(screenshot_dir,
name_base, NULL, savestate, is_idle, is_paused, fullpath, use_thread,
pixel_format_type);
#else
return take_screenshot_viewport(screenshot_dir,
name_base, savestate, is_idle, is_paused, fullpath, use_thread,
pixel_format_type);
#endif
}
if (!has_valid_framebuffer)