diff --git a/CHANGES.md b/CHANGES.md index 17bb6ec41b..9a962e0dcf 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,22 @@ # 1.7.0 (future) -- CHEEVOS: Add badges +- CHEEVOS: Add badges for achievements, shows thumbnail images of achievements. +- COMMON: Add 'Automatically Load Content To Playlist' feature, enabled by default. +- COMMON: Fix slowmotion ratio always being reset back to 1. +- COMMON: Optimized NBIO implementations now for Apple, Windows, and Linux. Uses mmap for Linux/Windows/BSD if/when available. File I/O should now be much faster for loading images inside the menu. +- COMMON: Native Blissbox support now for latest firmware as of writing (2.0). Implementation through libusb and/or native Windows HID. +- COMMON: New lightgun API. +- COMMON: Fixed some playlist bugs. +- FREEBSD: Support libusb HID input driver. +- HAIKU: Buildfix. +- LINUX/X11: Add RetroArch logo to window title bar. +- LINUX/X11: Input driver now supports new lightgun code. +- LOCALIZATION: Update Italian translation. +- LOCALIZATION: Update Portuguese-Brazilian translation. +- LOCALIZATION: Update Russian translation. +- OSX/PPC: Fix the GL2 renderchain, had to use EXT versions of framebuffer/renderbuffer functions. +- SCANNER: Fix crash from Windows-incompatible format string. +- WIIU: Disabled the controller patcher for now since it was the source of many stability issues. +- WINDOWS: Raw input driver now supports new lightgun code. # 1.6.9 - COMMON: Small memory leak. diff --git a/Makefile.common b/Makefile.common index 58158f33aa..14caf2e201 100644 --- a/Makefile.common +++ b/Makefile.common @@ -170,6 +170,7 @@ OBJ += frontend/frontend.o \ tasks/task_audio_mixer.o \ $(LIBRETRO_COMM_DIR)/encodings/encoding_utf.o \ $(LIBRETRO_COMM_DIR)/encodings/encoding_crc32.o \ + $(LIBRETRO_COMM_DIR)/compat/fopen_utf8.o \ $(LIBRETRO_COMM_DIR)/lists/file_list.o \ $(LIBRETRO_COMM_DIR)/lists/dir_list.o \ $(LIBRETRO_COMM_DIR)/file/retro_dirent.o \ diff --git a/audio/drivers/xaudio.h b/audio/drivers/xaudio.h index 41e21be09d..266f89a59c 100644 --- a/audio/drivers/xaudio.h +++ b/audio/drivers/xaudio.h @@ -324,16 +324,11 @@ STDAPI XAudio2Create(__deref_out IXAudio2** ppXAudio2, UINT32 Flags X2DEFAULT(0) #else static INLINE HRESULT XAudio2Create(IXAudio2 **ppXAudio2, UINT32 flags, XAUDIO2_PROCESSOR proc) { - HRESULT hr; IXAudio2 *pXAudio2 = NULL; - - (void)flags; - (void)proc; - #ifdef __cplusplus - hr = CoCreateInstance(CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, IID_IXAudio2, (void**)&pXAudio2); + HRESULT hr = CoCreateInstance(CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, IID_IXAudio2, (void**)&pXAudio2); #else - hr = CoCreateInstance(&CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, &IID_IXAudio2, (void**)&pXAudio2); + HRESULT hr = CoCreateInstance(&CLSID_XAudio2, NULL, CLSCTX_INPROC_SERVER, &IID_IXAudio2, (void**)&pXAudio2); #endif if (SUCCEEDED(hr)) @@ -342,9 +337,7 @@ static INLINE HRESULT XAudio2Create(IXAudio2 **ppXAudio2, UINT32 flags, XAUDIO2_ if (SUCCEEDED(hr)) *ppXAudio2 = pXAudio2; else - { IXAudio2_Release(pXAudio2); - } } return hr; } diff --git a/cheevos/badges.c b/cheevos/badges.c index 961fbc600e..5ac1112222 100644 --- a/cheevos/badges.c +++ b/cheevos/badges.c @@ -21,15 +21,16 @@ bool badge_exists(const char* filepath) void set_badge_menu_texture(badges_ctx_t * badges, int i) { + char fullpath[PATH_MAX_LENGTH]; const char * locked_suffix = (badges->badge_locked[i] == true) ? "_lock.png" : ".png"; unsigned int bufferSize = 16; + /* TODO/FIXME - variable length forbidden in C89 - rewrite this! */ char badge_file[bufferSize]; snprintf(badge_file, bufferSize, "%s", badges->badge_id_list[i]); strcat(badge_file, locked_suffix); - char fullpath[PATH_MAX_LENGTH]; fill_pathname_application_special(fullpath, PATH_MAX_LENGTH * sizeof(char), APPLICATION_SPECIAL_DIRECTORY_THUMBNAILS_CHEEVOS_BADGES); diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index b2cf87154b..87517d6164 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -1796,6 +1796,7 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set) } else if (valid) { + char msg[256]; char url[256]; url[0] = '\0'; @@ -1807,7 +1808,6 @@ static void cheevos_test_cheevo_set(const cheevoset_t *set) RARCH_LOG("[CHEEVOS]: awarding cheevo %u: %s (%s).\n", cheevo->id, cheevo->title, cheevo->description); - char msg[256]; snprintf(msg, sizeof(msg), "Achievement Unlocked: %s", cheevo->title); msg[sizeof(msg) - 1] = 0; runloop_msg_queue_push(msg, 0, 2 * 60, false); @@ -1856,10 +1856,11 @@ static int cheevos_expr_value(cheevos_expr_t* expr) { cheevos_term_t* term = expr->terms; unsigned i; - /* Separate possible values with '$' operator, submit the largest */ unsigned current_value = 0; + /* TODO/FIXME - variable length forbidden in C89 - rewrite this! */ int values[expr->compare_count]; + memset(values, 0, sizeof values); for (i = expr->count; i != 0; i--, term++) @@ -1871,8 +1872,10 @@ static int cheevos_expr_value(cheevos_expr_t* expr) if (expr->compare_count > 1) { + unsigned j; int maximum = values[0]; - for (unsigned j = 1; j < expr->compare_count; j++) + + for (j = 1; j < expr->compare_count; j++) maximum = values[j] > maximum ? values[j] : maximum; return maximum; @@ -1974,12 +1977,13 @@ static void cheevos_test_leaderboards(void) else { char url[256]; + char msg[256]; + char formatted_value[16]; + cheevos_make_lboard_url(lboard, url, sizeof(url)); task_push_http_transfer(url, true, NULL, cheevos_lboard_submit, lboard); RARCH_LOG("[CHEEVOS]: submit lboard %s\n", lboard->title); - char msg[256]; - char formatted_value[16]; cheevos_format_value(value, lboard->format, formatted_value, sizeof(formatted_value)); snprintf(msg, sizeof(msg), "Submitted %s for %s", formatted_value, lboard->title); msg[sizeof(msg) - 1] = 0; @@ -1998,11 +2002,12 @@ static void cheevos_test_leaderboards(void) { if (cheevos_test_lboard_condition(&lboard->start)) { + char msg[256]; + RARCH_LOG("[CHEEVOS]: start lboard %s\n", lboard->title); lboard->active = 1; lboard->last_value = -1; - char msg[256]; snprintf(msg, sizeof(msg), "Leaderboard Active: %s", lboard->title); msg[sizeof(msg) - 1] = 0; runloop_msg_queue_push(msg, 0, 2 * 60, false); @@ -2835,10 +2840,10 @@ static int cheevos_iterate(coro_t* coro) { if(cheevos_locals.core.count > 0) { + int mode; const cheevo_t* cheevo = cheevos_locals.core.cheevos; const cheevo_t* end = cheevo + cheevos_locals.core.count; int number_of_unlocked = cheevos_locals.core.count; - int mode; char msg[256]; if(CHEEVOS_VAR_SETTINGS->bools.cheevos_hardcore_mode_enable) @@ -3168,10 +3173,12 @@ static int cheevos_iterate(coro_t* coro) badges_ctx = new_badges_ctx; - settings_t *settings = config_get_ptr(); - if (!string_is_equal(settings->arrays.menu_driver, "xmb") || - !settings->bools.cheevos_badges_enable) - CORO_RET(); + { + settings_t *settings = config_get_ptr(); + if (!string_is_equal(settings->arrays.menu_driver, "xmb") || + !settings->bools.cheevos_badges_enable) + CORO_RET(); + } CHEEVOS_VAR_CHEEVO_CURR = cheevos_locals.core.cheevos; CHEEVOS_VAR_CHEEVO_END = cheevos_locals.core.cheevos + cheevos_locals.core.count; diff --git a/cheevos/var.c b/cheevos/var.c index 36828b46b3..45ae9ac866 100644 --- a/cheevos/var.c +++ b/cheevos/var.c @@ -24,10 +24,15 @@ #include "../core.h" #include "../verbosity.h" +static void STUB_LOG(const char *fmt, ...) +{ + (void)fmt; +} + #ifdef CHEEVOS_VERBOSE #define CHEEVOS_LOG RARCH_LOG #else -#define CHEEVOS_LOG(...) +#define CHEEVOS_LOG STUB_LOG #endif /***************************************************************************** diff --git a/gfx/common/gl_common.c b/gfx/common/gl_common.c index f349938427..10c139bef0 100644 --- a/gfx/common/gl_common.c +++ b/gfx/common/gl_common.c @@ -14,16 +14,13 @@ * If not, see . */ -#include #include #ifdef HAVE_CONFIG_H #include "../../config.h" #endif -#include "../drivers/gl_symlinks.h" -#include "../video_coord_array.h" - +#include "gl_common.h" static void gl_size_format(GLint* internalFormat) { diff --git a/gfx/common/gl_common.h b/gfx/common/gl_common.h index 5d5c1fa284..7fb5527dcf 100644 --- a/gfx/common/gl_common.h +++ b/gfx/common/gl_common.h @@ -17,7 +17,9 @@ #ifndef __GL_COMMON_H #define __GL_COMMON_H +#include #include +#include #ifdef HAVE_CONFIG_H #include "../../config.h" @@ -32,14 +34,124 @@ #include "../font_driver.h" #include "../video_coord_array.h" #include "../video_driver.h" -#include "../drivers/gl_symlinks.h" +#include RETRO_BEGIN_DECLS -#define MAX_FENCES 4 +#if defined(HAVE_PSGL) +#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_OES +#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_OES +#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT +#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT +#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT +#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT +#else +#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER +#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE +#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0 +#endif -#ifndef ARB_sync -typedef struct __GLsync *GLsync; +#if defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES3) || defined(HAVE_OPENGLES_3_1) || defined(HAVE_OPENGLES_3_2) +#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER +#if defined(HAVE_OPENGLES2) +#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES +#else +#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8 +#endif +#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT +#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT +#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER_EXT +#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_EXT +#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT +#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT +#elif defined(HAVE_PSGL) +#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER_OES +#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_SCE +#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_OES +#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_OES +#else +#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER +#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8 +#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT +#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT +#endif + +#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE_EXT +#elif defined(HAVE_PSGL) +#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE_OES +#else +#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE +#endif + +#if defined(HAVE_PSGL) +#define glGenerateMipmap glGenerateMipmapOES +#endif + +#if defined(__APPLE__) || defined(HAVE_PSGL) +#define GL_RGBA32F GL_RGBA32F_ARB +#endif + +#if defined(HAVE_PSGL) +#define RARCH_GL_INTERNAL_FORMAT32 GL_ARGB_SCE +#define RARCH_GL_INTERNAL_FORMAT16 GL_RGB5 /* TODO: Verify if this is really 565 or just 555. */ +#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA +#define RARCH_GL_TEXTURE_TYPE16 GL_BGRA +#define RARCH_GL_FORMAT32 GL_UNSIGNED_INT_8_8_8_8_REV +#define RARCH_GL_FORMAT16 GL_RGB5 +#elif defined(HAVE_OPENGLES) +/* Imgtec/SGX headers have this missing. */ +#ifndef GL_BGRA_EXT +#define GL_BGRA_EXT 0x80E1 +#endif +#ifndef GL_BGRA8_EXT +#define GL_BGRA8_EXT 0x93A1 +#endif +#ifdef IOS +/* Stupid Apple */ +#define RARCH_GL_INTERNAL_FORMAT32 GL_RGBA +#else +#define RARCH_GL_INTERNAL_FORMAT32 GL_BGRA_EXT +#endif +#define RARCH_GL_INTERNAL_FORMAT16 GL_RGB +#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA_EXT +#define RARCH_GL_TEXTURE_TYPE16 GL_RGB +#define RARCH_GL_FORMAT32 GL_UNSIGNED_BYTE +#define RARCH_GL_FORMAT16 GL_UNSIGNED_SHORT_5_6_5 +#else +/* On desktop, we always use 32-bit. */ +#define RARCH_GL_INTERNAL_FORMAT32 GL_RGBA8 +#define RARCH_GL_INTERNAL_FORMAT16 GL_RGBA8 +#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA +#define RARCH_GL_TEXTURE_TYPE16 GL_BGRA +#define RARCH_GL_FORMAT32 GL_UNSIGNED_INT_8_8_8_8_REV +#define RARCH_GL_FORMAT16 GL_UNSIGNED_INT_8_8_8_8_REV + +/* GL_RGB565 internal format isn't in desktop GL + * until 4.1 core (ARB_ES2_compatibility). + * Check for this. */ +#ifndef GL_RGB565 +#define GL_RGB565 0x8D62 +#endif +#define RARCH_GL_INTERNAL_FORMAT16_565 GL_RGB565 +#define RARCH_GL_TEXTURE_TYPE16_565 GL_RGB +#define RARCH_GL_FORMAT16_565 GL_UNSIGNED_SHORT_5_6_5 +#endif + +#if defined(HAVE_OPENGLES2) /* TODO: Figure out exactly what. */ +#define NO_GL_CLAMP_TO_BORDER +#endif + +#if defined(HAVE_OPENGLES) +#ifndef GL_UNPACK_ROW_LENGTH +#define GL_UNPACK_ROW_LENGTH 0x0CF2 +#endif + +#ifndef GL_SRGB_ALPHA_EXT +#define GL_SRGB_ALPHA_EXT 0x8C42 +#endif #endif typedef struct gl @@ -54,11 +166,7 @@ typedef struct gl bool fbo_inited; bool fbo_feedback_enable; bool hw_render_fbo_init; - bool hw_render_depth_init; bool has_fbo; - bool has_srgb_fbo_gles3; - bool has_fp_fbo; - bool has_srgb_fbo; bool hw_render_use; bool core_context_in_use; @@ -71,7 +179,6 @@ typedef struct gl bool have_full_npot_support; bool have_mipmap; - bool egl_images; bool overlay_enable; bool overlay_full_screen; bool menu_texture_enable; @@ -82,7 +189,6 @@ typedef struct gl int version_major; int version_minor; - int fbo_pass; GLuint tex_mag_filter; GLuint tex_min_filter; @@ -91,13 +197,9 @@ typedef struct gl GLuint pbo; GLuint *overlay_tex; GLuint menu_texture; - GLuint vao; GLuint pbo_readback[4]; GLuint texture[GFX_MAX_TEXTURES]; - GLuint fbo[GFX_MAX_SHADERS]; - GLuint fbo_texture[GFX_MAX_SHADERS]; GLuint hw_render_fbo[GFX_MAX_TEXTURES]; - GLuint hw_render_depth[GFX_MAX_TEXTURES]; unsigned tex_index; /* For use with PREV. */ unsigned textures; @@ -110,7 +212,6 @@ typedef struct gl unsigned base_size; /* 2 or 4 */ unsigned overlays; unsigned pbo_readback_index; - unsigned fence_count; unsigned last_width[GFX_MAX_TEXTURES]; unsigned last_height[GFX_MAX_TEXTURES]; @@ -134,9 +235,7 @@ typedef struct gl video_info_t video_info; struct video_tex_info prev_info[GFX_MAX_TEXTURES]; struct video_fbo_rect fbo_rect[GFX_MAX_SHADERS]; - struct gfx_fbo_scale fbo_scale[GFX_MAX_SHADERS]; - GLsync fences[MAX_FENCES]; const gl_renderchain_driver_t *renderchain_driver; void *renderchain_data; } gl_t; diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index 40a807a2c0..a8a696cbb2 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -53,8 +53,8 @@ #include -/* Assume W-functions do not work below VC2005 and Xbox platforms */ -#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) +/* Assume W-functions do not work below Win2K and Xbox platforms */ +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) #ifndef LEGACY_WIN32 #define LEGACY_WIN32 diff --git a/gfx/drivers/gl.c b/gfx/drivers/gl.c index 8c2d230194..c717513f74 100644 --- a/gfx/drivers/gl.c +++ b/gfx/drivers/gl.c @@ -40,6 +40,7 @@ #include #include +#include #include "../../configuration.h" #include "../../dynamic.h" @@ -543,11 +544,9 @@ static void gl_init_textures_data(gl_t *gl) static void gl_init_textures(gl_t *gl, const video_info_t *video) { unsigned i; - GLenum internal_fmt, texture_type = 0, texture_fmt = 0; - - /* Use regular textures if we use HW render. */ - gl->egl_images = !gl->hw_render_use && gl_check_capability(GL_CAPS_EGLIMAGE) && - video_context_driver_init_image_buffer(video); + GLenum internal_fmt = gl->internal_fmt; + GLenum texture_type = gl->texture_type; + GLenum texture_fmt = gl->texture_fmt; #ifdef HAVE_PSGL if (!gl->pbo) @@ -559,10 +558,6 @@ static void gl_init_textures(gl_t *gl, const video_info_t *video) NULL, GL_STREAM_DRAW); #endif - internal_fmt = gl->internal_fmt; - texture_type = gl->texture_type; - texture_fmt = gl->texture_fmt; - #if defined(HAVE_OPENGLES) && !defined(HAVE_PSGL) /* GLES is picky about which format we use here. * Without extensions, we can *only* render to 16-bit FBOs. */ @@ -594,7 +589,7 @@ static void gl_init_textures(gl_t *gl, const video_info_t *video) if (gl->renderchain_driver->init_texture_reference) gl->renderchain_driver->init_texture_reference( - gl, i, internal_fmt, + gl, gl->renderchain_data, i, internal_fmt, texture_fmt, texture_type); } @@ -893,11 +888,11 @@ static void gl_pbo_async_readback(gl_t *gl) gl->pbo_readback_valid[gl->pbo_readback_index] = true; if (gl->renderchain_driver->readback) - gl->renderchain_driver->readback(gl, + gl->renderchain_driver->readback(gl, gl->renderchain_data, video_pixel_get_alignment(gl->vp.width * sizeof(uint32_t)), fmt, type, NULL); if (gl->renderchain_driver->unbind_pbo) - gl->renderchain_driver->unbind_pbo(); + gl->renderchain_driver->unbind_pbo(gl, gl->renderchain_data); } static INLINE void gl_draw_texture(gl_t *gl, video_frame_info_t *video_info) @@ -982,7 +977,7 @@ static bool gl_frame(void *data, const void *frame, context_bind_hw_render(false); if (gl->core_context_in_use && gl->renderchain_driver->bind_vao) - gl->renderchain_driver->bind_vao(gl); + gl->renderchain_driver->bind_vao(gl, gl->renderchain_data); video_info->cb_shader_use(gl, video_info->shader_data, 1, true); @@ -996,11 +991,12 @@ static bool gl_frame(void *data, const void *frame, { if (gl->renderchain_driver->recompute_pass_sizes) gl->renderchain_driver->recompute_pass_sizes( - gl, frame_width, frame_height, + gl, gl->renderchain_data, frame_width, frame_height, gl->vp_out_width, gl->vp_out_height); if (gl->renderchain_driver->start_render) - gl->renderchain_driver->start_render(gl, video_info); + gl->renderchain_driver->start_render(gl, gl->renderchain_data, + video_info); } if (gl->should_resize) @@ -1018,12 +1014,14 @@ static bool gl_frame(void *data, const void *frame, if (gl->fbo_inited) { if (gl->renderchain_driver->check_fbo_dimensions) - gl->renderchain_driver->check_fbo_dimensions(gl); + gl->renderchain_driver->check_fbo_dimensions(gl, + gl->renderchain_data); /* Go back to what we're supposed to do, * render to FBO #0. */ if (gl->renderchain_driver->start_render) - gl->renderchain_driver->start_render(gl, video_info); + gl->renderchain_driver->start_render(gl, gl->renderchain_data, + video_info); } else gl_set_viewport(gl, video_info, width, height, false, true); @@ -1042,7 +1040,7 @@ static bool gl_frame(void *data, const void *frame, gl_update_input_size(gl, frame_width, frame_height, pitch, true); if (gl->renderchain_driver->copy_frame) - gl->renderchain_driver->copy_frame(gl, + gl->renderchain_driver->copy_frame(gl, gl->renderchain_data, video_info, frame, frame_width, frame_height, pitch); } @@ -1060,12 +1058,12 @@ static bool gl_frame(void *data, const void *frame, if (!gl->fbo_inited) { if (gl->renderchain_driver->bind_backbuffer) - gl->renderchain_driver->bind_backbuffer(); + gl->renderchain_driver->bind_backbuffer(gl, gl->renderchain_data); gl_set_viewport(gl, video_info, width, height, false, true); } if (gl->renderchain_driver->restore_default_state) - gl->renderchain_driver->restore_default_state(gl); + gl->renderchain_driver->restore_default_state(gl, gl->renderchain_data); glDisable(GL_STENCIL_TEST); glDisable(GL_BLEND); @@ -1127,12 +1125,14 @@ static bool gl_frame(void *data, const void *frame, glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); if (gl->fbo_inited && gl->renderchain_driver->renderchain_render) - gl->renderchain_driver->renderchain_render(gl, video_info, + gl->renderchain_driver->renderchain_render(gl, gl->renderchain_data, + video_info, frame_count, &gl->tex_info, &feedback_info); /* Set prev textures. */ if (gl->renderchain_driver->bind_prev_texture) - gl->renderchain_driver->bind_prev_texture(gl, &gl->tex_info); + gl->renderchain_driver->bind_prev_texture(gl, gl->renderchain_data, + &gl->tex_info); #if defined(HAVE_MENU) if (gl->menu_texture_enable) @@ -1167,7 +1167,8 @@ static bool gl_frame(void *data, const void *frame, glBindTexture(GL_TEXTURE_2D, 0); if (gl->renderchain_driver->disable_client_arrays) - gl->renderchain_driver->disable_client_arrays(); + gl->renderchain_driver->disable_client_arrays(gl, + gl->renderchain_data); } /* Screenshots. */ @@ -1175,6 +1176,7 @@ static bool gl_frame(void *data, const void *frame, { if (gl->renderchain_driver->readback) gl->renderchain_driver->readback(gl, + gl->renderchain_data, 4, GL_RGBA, GL_UNSIGNED_BYTE, gl->readback_buffer_screenshot); } @@ -1207,12 +1209,14 @@ static bool gl_frame(void *data, const void *frame, if (gl->renderchain_driver->fence_iterate) gl->renderchain_driver->fence_iterate(gl, + gl->renderchain_data, video_info->hard_sync_frames); } if (gl->core_context_in_use && gl->renderchain_driver->unbind_vao) - gl->renderchain_driver->unbind_vao(gl); + gl->renderchain_driver->unbind_vao(gl, + gl->renderchain_data); context_bind_hw_render(true); @@ -1242,7 +1246,7 @@ static void gl_deinit_chain(gl_t *gl) return; if (gl->renderchain_driver->chain_free) - gl->renderchain_driver->chain_free(gl->renderchain_data); + gl->renderchain_driver->chain_free(gl, gl->renderchain_data); gl->renderchain_driver = NULL; gl->renderchain_data = NULL; @@ -1259,14 +1263,14 @@ static void gl_free(void *data) if (gl->have_sync) { if (gl->renderchain_driver->fence_free) - gl->renderchain_driver->fence_free(gl); + gl->renderchain_driver->fence_free(gl, gl->renderchain_data); } font_driver_free_osd(); video_shader_driver_deinit(); if (gl->renderchain_driver->disable_client_arrays) - gl->renderchain_driver->disable_client_arrays(); + gl->renderchain_driver->disable_client_arrays(gl, gl->renderchain_data); glDeleteTextures(gl->textures, gl->texture); @@ -1295,13 +1299,13 @@ static void gl_free(void *data) if (gl->core_context_in_use) { if (gl->renderchain_driver->unbind_vao) - gl->renderchain_driver->unbind_vao(gl); + gl->renderchain_driver->unbind_vao(gl, gl->renderchain_data); if (gl->renderchain_driver->free_vao) - gl->renderchain_driver->free_vao(gl); + gl->renderchain_driver->free_vao(gl, gl->renderchain_data); } if (gl->renderchain_driver->free) - gl->renderchain_driver->free(gl); + gl->renderchain_driver->free(gl, gl->renderchain_data); gl_deinit_chain(gl); video_context_driver_free(); @@ -1329,7 +1333,7 @@ static void gl_set_nonblock_state(void *data, bool state) context_bind_hw_render(true); } -static bool resolve_extensions(gl_t *gl, const char *context_ident) +static bool resolve_extensions(gl_t *gl, const char *context_ident, const video_info_t *video) { settings_t *settings = config_get_ptr(); @@ -1342,25 +1346,21 @@ static bool resolve_extensions(gl_t *gl, const char *context_ident) * * have_sync - Use ARB_sync to reduce latency. */ - gl->has_srgb_fbo = false; gl->has_fbo = gl_check_capability(GL_CAPS_FBO); gl->have_full_npot_support = gl_check_capability(GL_CAPS_FULL_NPOT_SUPPORT); gl->have_mipmap = gl_check_capability(GL_CAPS_MIPMAP); gl->have_es2_compat = gl_check_capability(GL_CAPS_ES2_COMPAT); - gl->has_fp_fbo = gl_check_capability(GL_CAPS_FP_FBO); gl->support_unpack_row_length = gl_check_capability(GL_CAPS_UNPACK_ROW_LENGTH); gl->have_sync = gl_check_capability(GL_CAPS_SYNC); - /* GLES3 has unpack_subimage and sRGB in core. */ - gl->has_srgb_fbo_gles3 = gl_check_capability(GL_CAPS_SRGB_FBO_ES3); - - if (!settings->bools.video_force_srgb_disable) - gl->has_srgb_fbo = gl_check_capability(GL_CAPS_SRGB_FBO); if (gl->have_sync && settings->bools.video_hard_sync) RARCH_LOG("[GL]: Using ARB_sync to reduce latency.\n"); video_driver_unset_rgba(); + if (gl->renderchain_driver->resolve_extensions) + gl->renderchain_driver->resolve_extensions(gl, gl->renderchain_data, context_ident, video); + #if defined(HAVE_OPENGLES) && !defined(HAVE_PSGL) if (!gl_check_capability(GL_CAPS_BGRA8888)) { @@ -1463,7 +1463,7 @@ static bool gl_init_pbo_readback(gl_t *gl) gl->vp.height * sizeof(uint32_t), NULL); } if (gl->renderchain_driver->unbind_pbo) - gl->renderchain_driver->unbind_pbo(); + gl->renderchain_driver->unbind_pbo(gl, gl->renderchain_data); #ifndef HAVE_OPENGLES3 { @@ -1775,16 +1775,16 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo } if (gl->renderchain_driver->restore_default_state) - gl->renderchain_driver->restore_default_state(gl); + gl->renderchain_driver->restore_default_state(gl, gl->renderchain_data); if (hwr->context_type == RETRO_HW_CONTEXT_OPENGL_CORE) if (gl->renderchain_driver->new_vao) - gl->renderchain_driver->new_vao(gl); + gl->renderchain_driver->new_vao(gl, gl->renderchain_data); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBlendEquation(GL_FUNC_ADD); - if (!resolve_extensions(gl, ctx_driver->ident)) + if (!resolve_extensions(gl, ctx_driver->ident, video)) goto error; #ifdef GL_DEBUG @@ -1927,13 +1927,13 @@ static void *gl_init(const video_info_t *video, const input_driver_t **input, vo gl_init_textures_data(gl); if (gl->renderchain_driver->init) - gl->renderchain_driver->init(gl, gl->tex_w, gl->tex_h); + gl->renderchain_driver->init(gl, gl->renderchain_data, gl->tex_w, gl->tex_h); if (gl->has_fbo) { if (gl->hw_render_use && gl->renderchain_driver->init_hw_render && - !gl->renderchain_driver->init_hw_render(gl, gl->tex_w, gl->tex_h)) + !gl->renderchain_driver->init_hw_render(gl, gl->renderchain_data, gl->tex_w, gl->tex_h)) { RARCH_ERR("[GL]: Hardware rendering context initialization failed.\n"); goto error; @@ -2111,7 +2111,7 @@ static bool gl_set_shader(void *data, if (gl->fbo_inited) { if (gl->renderchain_driver->deinit_fbo) - gl->renderchain_driver->deinit_fbo(gl); + gl->renderchain_driver->deinit_fbo(gl, gl->renderchain_data); glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); } @@ -2143,7 +2143,7 @@ static bool gl_set_shader(void *data, { if (gl->hw_render_use && gl->fbo_inited && gl->renderchain_driver->deinit_hw_render) - gl->renderchain_driver->deinit_hw_render(gl); + gl->renderchain_driver->deinit_hw_render(gl, gl->renderchain_data); glDeleteTextures(gl->textures, gl->texture); #if defined(HAVE_PSGL) @@ -2157,11 +2157,13 @@ static bool gl_set_shader(void *data, gl_init_textures_data(gl); if (gl->hw_render_use && gl->renderchain_driver->init_hw_render) - gl->renderchain_driver->init_hw_render(gl, gl->tex_w, gl->tex_h); + gl->renderchain_driver->init_hw_render(gl, gl->renderchain_data, + gl->tex_w, gl->tex_h); } if (gl->renderchain_driver->init) - gl->renderchain_driver->init(gl, gl->tex_w, gl->tex_h); + gl->renderchain_driver->init(gl, gl->renderchain_data, + gl->tex_w, gl->tex_h); /* Apparently need to set viewport for passes when we aren't using FBOs. */ gl_set_shader_viewports(gl); @@ -2185,7 +2187,7 @@ static void gl_viewport_info(void *data, struct video_viewport *vp) gl_t *gl = (gl_t*)data; if (!gl->renderchain_driver || !gl->renderchain_driver->viewport_info) return; - gl->renderchain_driver->viewport_info(data, vp); + gl->renderchain_driver->viewport_info(gl, gl->renderchain_data, vp); } static bool gl_read_viewport(void *data, uint8_t *buffer, bool is_idle) @@ -2193,7 +2195,8 @@ static bool gl_read_viewport(void *data, uint8_t *buffer, bool is_idle) gl_t *gl = (gl_t*)data; if (!gl->renderchain_driver || !gl->renderchain_driver->read_viewport) return false; - return gl->renderchain_driver->read_viewport(data, buffer, is_idle); + return gl->renderchain_driver->read_viewport(gl, gl->renderchain_data, + buffer, is_idle); } #if 0 @@ -2524,7 +2527,7 @@ static void gl_set_coords(void *handle_data, void *shader_data, { gl_t *gl = (gl_t*)handle_data; if (gl && gl->renderchain_driver->set_coords) - gl->renderchain_driver->set_coords(handle_data, + gl->renderchain_driver->set_coords(gl, gl->renderchain_data, shader_data, coords); } @@ -2533,7 +2536,7 @@ static void gl_set_mvp(void *data, void *shader_data, { gl_t *gl = (gl_t*)data; if (gl && gl->renderchain_driver->set_mvp) - gl->renderchain_driver->set_mvp(data, + gl->renderchain_driver->set_mvp(gl, gl->renderchain_data, shader_data, mat_data); } diff --git a/gfx/drivers/gl_symlinks.h b/gfx/drivers/gl_symlinks.h deleted file mode 100644 index 8628698f3e..0000000000 --- a/gfx/drivers/gl_symlinks.h +++ /dev/null @@ -1,159 +0,0 @@ -/* RetroArch - A frontend for libretro. - * Copyright (C) 2010-2014 - Hans-Kristian Arntzen - * Copyright (C) 2011-2017 - Daniel De Matteis - * Copyright (C) 2012-2015 - Michael Lelli - * - * 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 _GL_SYMLINKS_H -#define _GL_SYMLINKS_H - -#include -#include - -#include - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#if defined(HAVE_PSGL) -#define glGenFramebuffers glGenFramebuffersOES -#define glBindFramebuffer glBindFramebufferOES -#define glFramebufferTexture2D glFramebufferTexture2DOES -#define glCheckFramebufferStatus glCheckFramebufferStatusOES -#define glDeleteFramebuffers glDeleteFramebuffersOES -#define glGenRenderbuffers glGenRenderbuffersOES -#define glBindRenderbuffer glBindRenderbufferOES -#define glFramebufferRenderbuffer glFramebufferRenderbufferOES -#define glRenderbufferStorage glRenderbufferStorageOES -#define glDeleteRenderbuffers glDeleteRenderbuffersOES -#endif - -#if defined(HAVE_PSGL) -#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_OES -#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_OES -#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT -#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) -#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER_EXT -#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE_EXT -#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0_EXT -#else -#define RARCH_GL_FRAMEBUFFER GL_FRAMEBUFFER -#define RARCH_GL_FRAMEBUFFER_COMPLETE GL_FRAMEBUFFER_COMPLETE -#define RARCH_GL_COLOR_ATTACHMENT0 GL_COLOR_ATTACHMENT0 -#endif - -#if defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES3) || defined(HAVE_OPENGLES_3_1) || defined(HAVE_OPENGLES_3_2) -#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER -#if defined(HAVE_OPENGLES2) -#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_OES -#else -#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8 -#endif -#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT -#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT -#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) -#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER_EXT -#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_EXT -#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_EXT -#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_EXT -#elif defined(HAVE_PSGL) -#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER_OES -#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8_SCE -#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT_OES -#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT_OES -#else -#define RARCH_GL_RENDERBUFFER GL_RENDERBUFFER -#define RARCH_GL_DEPTH24_STENCIL8 GL_DEPTH24_STENCIL8 -#define RARCH_GL_DEPTH_ATTACHMENT GL_DEPTH_ATTACHMENT -#define RARCH_GL_STENCIL_ATTACHMENT GL_STENCIL_ATTACHMENT -#endif - -#if (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) -#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE_EXT -#elif defined(HAVE_PSGL) -#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE_OES -#else -#define RARCH_GL_MAX_RENDERBUFFER_SIZE GL_MAX_RENDERBUFFER_SIZE -#endif - -#if defined(HAVE_PSGL) -#define glGenerateMipmap glGenerateMipmapOES -#endif - -#if defined(__APPLE__) || defined(HAVE_PSGL) -#define GL_RGBA32F GL_RGBA32F_ARB -#endif - -#if defined(HAVE_PSGL) -#define RARCH_GL_INTERNAL_FORMAT32 GL_ARGB_SCE -#define RARCH_GL_INTERNAL_FORMAT16 GL_RGB5 /* TODO: Verify if this is really 565 or just 555. */ -#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA -#define RARCH_GL_TEXTURE_TYPE16 GL_BGRA -#define RARCH_GL_FORMAT32 GL_UNSIGNED_INT_8_8_8_8_REV -#define RARCH_GL_FORMAT16 GL_RGB5 -#elif defined(HAVE_OPENGLES) -/* Imgtec/SGX headers have this missing. */ -#ifndef GL_BGRA_EXT -#define GL_BGRA_EXT 0x80E1 -#endif -#ifndef GL_BGRA8_EXT -#define GL_BGRA8_EXT 0x93A1 -#endif -#ifdef IOS -/* Stupid Apple */ -#define RARCH_GL_INTERNAL_FORMAT32 GL_RGBA -#else -#define RARCH_GL_INTERNAL_FORMAT32 GL_BGRA_EXT -#endif -#define RARCH_GL_INTERNAL_FORMAT16 GL_RGB -#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA_EXT -#define RARCH_GL_TEXTURE_TYPE16 GL_RGB -#define RARCH_GL_FORMAT32 GL_UNSIGNED_BYTE -#define RARCH_GL_FORMAT16 GL_UNSIGNED_SHORT_5_6_5 -#else -/* On desktop, we always use 32-bit. */ -#define RARCH_GL_INTERNAL_FORMAT32 GL_RGBA8 -#define RARCH_GL_INTERNAL_FORMAT16 GL_RGBA8 -#define RARCH_GL_TEXTURE_TYPE32 GL_BGRA -#define RARCH_GL_TEXTURE_TYPE16 GL_BGRA -#define RARCH_GL_FORMAT32 GL_UNSIGNED_INT_8_8_8_8_REV -#define RARCH_GL_FORMAT16 GL_UNSIGNED_INT_8_8_8_8_REV - -/* GL_RGB565 internal format isn't in desktop GL - * until 4.1 core (ARB_ES2_compatibility). - * Check for this. */ -#ifndef GL_RGB565 -#define GL_RGB565 0x8D62 -#endif -#define RARCH_GL_INTERNAL_FORMAT16_565 GL_RGB565 -#define RARCH_GL_TEXTURE_TYPE16_565 GL_RGB -#define RARCH_GL_FORMAT16_565 GL_UNSIGNED_SHORT_5_6_5 -#endif - -#if defined(HAVE_OPENGLES2) /* TODO: Figure out exactly what. */ -#define NO_GL_CLAMP_TO_BORDER -#endif - -#if defined(HAVE_OPENGLES) -#ifndef GL_UNPACK_ROW_LENGTH -#define GL_UNPACK_ROW_LENGTH 0x0CF2 -#endif - -#ifndef GL_SRGB_ALPHA_EXT -#define GL_SRGB_ALPHA_EXT 0x8C42 -#endif -#endif - -#endif diff --git a/gfx/drivers_renderchain/gl1_renderchain.c b/gfx/drivers_renderchain/gl1_renderchain.c index 04e8fa6199..56a5d27650 100644 --- a/gfx/drivers_renderchain/gl1_renderchain.c +++ b/gfx/drivers_renderchain/gl1_renderchain.c @@ -57,14 +57,15 @@ typedef struct gl1_renderchain GLenum min_filter_to_mag(GLenum type); -void gl1_renderchain_free(void *data) +void gl1_renderchain_free(void *data, void *chain_data) { - gl_t *gl = (gl_t*)data; - (void)gl; + (void)chain_data; + (void)data; } static void gl1_renderchain_bind_prev_texture( void *data, + void *chain_data, const struct video_tex_info *tex_info) { gl_t *gl = (gl_t*)data; @@ -76,7 +77,8 @@ static void gl1_renderchain_bind_prev_texture( } static void gl1_renderchain_viewport_info( - void *data, struct video_viewport *vp) + void *data, void *chain_data, + struct video_viewport *vp) { unsigned width, height; unsigned top_y, top_dist; @@ -95,7 +97,8 @@ static void gl1_renderchain_viewport_info( } static bool gl1_renderchain_read_viewport( - void *data, uint8_t *buffer, bool is_idle) + void *data, void *chain_data, + uint8_t *buffer, bool is_idle) { unsigned num_pixels = 0; gl_t *gl = (gl_t*)data; @@ -108,14 +111,12 @@ static bool gl1_renderchain_read_viewport( /* Use slow synchronous readbacks. Use this with plain screenshots as we don't really care about performance in this case. */ - /* GLES2 only guarantees GL_RGBA/GL_UNSIGNED_BYTE + /* GL1 only guarantees GL_RGBA/GL_UNSIGNED_BYTE * readbacks so do just that. - * GLES2 also doesn't support reading back data + * GL1 also doesn't support reading back data * from front buffer, so render a cached frame * and have gl_frame() do the readback while it's * in the back buffer. - * - * Keep codepath similar for GLES and desktop GL. */ gl->readback_buffer_screenshot = malloc(num_pixels * sizeof(uint32_t)); @@ -136,9 +137,9 @@ static bool gl1_renderchain_read_viewport( return true; } -void gl1_renderchain_free_internal(void *data) +void gl1_renderchain_free_internal(void *data, void *chain_data) { - gl1_renderchain_t *cg_data = (gl1_renderchain_t*)data; + gl1_renderchain_t *cg_data = (gl1_renderchain_t*)chain_data; if (!cg_data) return; @@ -185,7 +186,8 @@ static void gl1_renderchain_ff_matrix(const void *data) glLoadMatrixf(ident.data); } -static void gl1_renderchain_disable_client_arrays(void) +static void gl1_renderchain_disable_client_arrays(void *data, + void *chain_data) { if (gl_query_core_context_in_use()) return; @@ -198,7 +200,8 @@ static void gl1_renderchain_disable_client_arrays(void) glDisableClientState(GL_TEXTURE_COORD_ARRAY); } -static void gl1_renderchain_restore_default_state(void *data) +static void gl1_renderchain_restore_default_state(void *data, + void *chain_data) { gl_t *gl = (gl_t*)data; if (!gl) @@ -211,6 +214,7 @@ static void gl1_renderchain_restore_default_state(void *data) static void gl1_renderchain_copy_frame( void *data, + void *chain_data, video_frame_info_t *video_info, const void *frame, unsigned width, unsigned height, unsigned pitch) @@ -246,6 +250,7 @@ static void gl1_renderchain_copy_frame( } static void gl1_renderchain_readback(void *data, + void *chain_data, unsigned alignment, unsigned fmt, unsigned type, void *src) @@ -262,6 +267,7 @@ static void gl1_renderchain_readback(void *data, } static void gl1_renderchain_set_mvp(void *data, + void *chain_data, void *shader_data, const void *mat_data) { math_matrix_4x4 ident; @@ -276,6 +282,7 @@ static void gl1_renderchain_set_mvp(void *data, } static void gl1_renderchain_set_coords(void *handle_data, + void *chain_data, void *shader_data, const struct video_coords *coords) { /* Fall back to fixed function-style if needed and possible. */ @@ -320,10 +327,11 @@ gl_renderchain_driver_t gl2_renderchain = { NULL, /* renderchain_init */ NULL, /* init_hw_render */ gl1_renderchain_free, - NULL, /* deinit_hw_render */ - NULL, /* start_render */ + NULL, /* deinit_hw_render */ + NULL, /* start_render */ NULL, /* check_fbo_dimensions */ NULL, /* recompute_pass_sizes */ - NULL, /* renderchain_render */ + NULL, /* renderchain_render */ + NULL, /* resolve_extensions */ "gl1", }; diff --git a/gfx/drivers_renderchain/gl2_renderchain.c b/gfx/drivers_renderchain/gl2_renderchain.c index 0c9733e35f..d2a4d2c3a1 100644 --- a/gfx/drivers_renderchain/gl2_renderchain.c +++ b/gfx/drivers_renderchain/gl2_renderchain.c @@ -41,6 +41,7 @@ #include #include +#include #include "../video_driver.h" #include "../video_shader_parse.h" @@ -50,9 +51,28 @@ #include "../../configuration.h" #include "../../verbosity.h" +#define MAX_FENCES 4 + typedef struct gl2_renderchain { - void *empty; + bool egl_images; + bool has_fp_fbo; + bool has_srgb_fbo_gles3; + bool has_srgb_fbo; + bool hw_render_depth_init; + + int fbo_pass; + + GLuint vao; + GLuint fbo[GFX_MAX_SHADERS]; + GLuint fbo_texture[GFX_MAX_SHADERS]; + GLuint hw_render_depth[GFX_MAX_TEXTURES]; + + unsigned fence_count; + + GLsync fences[MAX_FENCES]; + + struct gfx_fbo_scale fbo_scale[GFX_MAX_SHADERS]; } gl2_renderchain_t; #if (!defined(HAVE_OPENGLES) || defined(HAVE_OPENGLES3)) @@ -67,7 +87,45 @@ typedef struct gl2_renderchain coords[5] = yamt; \ coords[7] = yamt -#define gl2_bind_fb(id) glBindFramebuffer(RARCH_GL_FRAMEBUFFER, id) +#if defined(HAVE_PSGL) +#define gl2_fb_texture_2d(a, b, c, d, e) glFramebufferTexture2DOES(a, b, c, d, e) +#define gl2_check_fb_status(target) glCheckFramebufferStatusOES(target) +#define gl2_gen_fb(n, ids) glGenFramebuffersOES(n, ids) +#define gl2_delete_fb(n, fb) glDeleteFramebuffersOES(n, fb) +#define gl2_bind_fb(id) glBindFramebufferOES(RARCH_GL_FRAMEBUFFER, id) +#define gl2_gen_rb glGenRenderbuffersOES +#define gl2_bind_rb glBindRenderbufferOES +#define gl2_fb_rb glFramebufferRenderbufferOES +#define gl2_rb_storage glRenderbufferStorageOES +#define gl2_delete_rb glDeleteRenderbuffersOES + +#elif (defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__))) +#define gl2_fb_texture_2d(a, b, c, d, e) glFramebufferTexture2DEXT(a, b, c, d, e) +#define gl2_check_fb_status(target) glCheckFramebufferStatusEXT(target) +#define gl2_gen_fb(n, ids) glGenFramebuffersEXT(n, ids) +#define gl2_delete_fb(n, fb) glDeleteFramebuffersEXT(n, fb) +#define gl2_bind_fb(id) glBindFramebufferEXT(RARCH_GL_FRAMEBUFFER, id) +#define gl2_gen_rb glGenRenderbuffersEXT +#define gl2_bind_rb glBindRenderbufferEXT +#define gl2_fb_rb glFramebufferRenderbufferEXT +#define gl2_rb_storage glRenderbufferStorageEXT +#define gl2_delete_rb glDeleteRenderbuffersEXT + +#else + +#define gl2_fb_texture_2d(a, b, c, d, e) glFramebufferTexture2D(a, b, c, d, e) +#define gl2_check_fb_status(target) glCheckFramebufferStatus(target) +#define gl2_gen_fb(n, ids) glGenFramebuffers(n, ids) +#define gl2_delete_fb(n, fb) glDeleteFramebuffers(n, fb) +#define gl2_bind_fb(id) glBindFramebuffer(RARCH_GL_FRAMEBUFFER, id) +#define gl2_gen_rb glGenRenderbuffers +#define gl2_bind_rb glBindRenderbuffer +#define gl2_fb_rb glFramebufferRenderbuffer +#define gl2_rb_storage glRenderbufferStorage +#define gl2_delete_rb glDeleteRenderbuffers + +#endif + #ifndef GL_SYNC_GPU_COMMANDS_COMPLETE #define GL_SYNC_GPU_COMMANDS_COMPLETE 0x9117 @@ -78,7 +136,8 @@ typedef struct gl2_renderchain #endif /* Prototypes */ -static void gl2_renderchain_bind_backbuffer(void) +static void gl2_renderchain_bind_backbuffer(void *data, + void *chain_data) { #ifdef IOS /* There is no default frame buffer on iOS. */ @@ -169,11 +228,11 @@ static bool gl_recreate_fbo( 0, RARCH_GL_TEXTURE_TYPE32, RARCH_GL_FORMAT32, NULL); - glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, + gl2_fb_texture_2d(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, *texture, 0); - if (glCheckFramebufferStatus(RARCH_GL_FRAMEBUFFER) + if (gl2_check_fb_status(RARCH_GL_FRAMEBUFFER) == RARCH_GL_FRAMEBUFFER_COMPLETE) return true; @@ -181,12 +240,15 @@ static bool gl_recreate_fbo( return false; } -static void gl_check_fbo_dimension(gl_t *gl, unsigned i, +static void gl_check_fbo_dimension(gl_t *gl, + void *chain_data, + unsigned i, bool update_feedback) { struct video_fbo_rect *fbo_rect = &gl->fbo_rect[i]; /* Check proactively since we might suddently * get sizes of tex_w width or tex_h height. */ + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; unsigned img_width = fbo_rect->max_img_width; unsigned img_height = fbo_rect->max_img_height; unsigned max = img_width > img_height ? img_width : img_height; @@ -195,7 +257,7 @@ static void gl_check_fbo_dimension(gl_t *gl, unsigned i, fbo_rect->width = pow2_size; fbo_rect->height = pow2_size; - gl_recreate_fbo(fbo_rect, gl->fbo[i], &gl->fbo_texture[i]); + gl_recreate_fbo(fbo_rect, chain->fbo[i], &chain->fbo_texture[i]); /* Update feedback texture in-place so we avoid having to * juggle two different fbo_rect structs since they get updated here. */ @@ -218,13 +280,15 @@ static void gl_check_fbo_dimension(gl_t *gl, unsigned i, /* On resize, we might have to recreate our FBOs * due to "Viewport" scale, and set a new viewport. */ -static void gl2_renderchain_check_fbo_dimensions(void *data) +static void gl2_renderchain_check_fbo_dimensions(void *data, + void *chain_data) { int i; - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; /* Check if we have to recreate our FBO textures. */ - for (i = 0; i < gl->fbo_pass; i++) + for (i = 0; i < chain->fbo_pass; i++) { struct video_fbo_rect *fbo_rect = &gl->fbo_rect[i]; if (fbo_rect) @@ -234,13 +298,14 @@ static void gl2_renderchain_check_fbo_dimensions(void *data) if ((fbo_rect->max_img_width > fbo_rect->width) || (fbo_rect->max_img_height > fbo_rect->height)) - gl_check_fbo_dimension(gl, i, update_feedback); + gl_check_fbo_dimension(gl, chain_data, i, update_feedback); } } } static void gl2_renderchain_render( void *data, + void *chain_data, video_frame_info_t *video_info, uint64_t frame_count, const struct video_tex_info *tex_info, @@ -251,6 +316,7 @@ static void gl2_renderchain_render( video_shader_ctx_params_t params; video_shader_ctx_info_t shader_info; gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; static GLfloat fbo_tex_coords[8] = {0.0f}; struct video_tex_info fbo_tex_info[GFX_MAX_SHADERS]; struct video_tex_info *fbo_info = NULL; @@ -267,7 +333,7 @@ static void gl2_renderchain_render( /* Calculate viewports, texture coordinates etc, * and render all passes from FBOs, to another FBO. */ - for (i = 1; i < gl->fbo_pass; i++) + for (i = 1; i < chain->fbo_pass; i++) { video_shader_ctx_coords_t coords; video_shader_ctx_params_t params; @@ -281,7 +347,7 @@ static void gl2_renderchain_render( set_texture_coords(fbo_tex_coords, xamt, yamt); - fbo_info->tex = gl->fbo_texture[i - 1]; + fbo_info->tex = chain->fbo_texture[i - 1]; fbo_info->input_size[0] = prev_rect->img_width; fbo_info->input_size[1] = prev_rect->img_height; fbo_info->tex_size[0] = prev_rect->width; @@ -289,14 +355,14 @@ static void gl2_renderchain_render( memcpy(fbo_info->coord, fbo_tex_coords, sizeof(fbo_tex_coords)); fbo_tex_info_cnt++; - gl2_bind_fb(gl->fbo[i]); + gl2_bind_fb(chain->fbo[i]); shader_info.data = gl; shader_info.idx = i + 1; shader_info.set_active = true; video_shader_driver_use(shader_info); - glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[i - 1]); + glBindTexture(GL_TEXTURE_2D, chain->fbo_texture[i - 1]); mip_level = i + 1; @@ -340,21 +406,21 @@ static void gl2_renderchain_render( } #if defined(GL_FRAMEBUFFER_SRGB) && !defined(HAVE_OPENGLES) - if (gl->has_srgb_fbo) + if (chain->has_srgb_fbo) glDisable(GL_FRAMEBUFFER_SRGB); #endif /* Render our last FBO texture directly to screen. */ - prev_rect = &gl->fbo_rect[gl->fbo_pass - 1]; + prev_rect = &gl->fbo_rect[chain->fbo_pass - 1]; xamt = (GLfloat)prev_rect->img_width / prev_rect->width; yamt = (GLfloat)prev_rect->img_height / prev_rect->height; set_texture_coords(fbo_tex_coords, xamt, yamt); /* Push final FBO to list. */ - fbo_info = &fbo_tex_info[gl->fbo_pass - 1]; + fbo_info = &fbo_tex_info[chain->fbo_pass - 1]; - fbo_info->tex = gl->fbo_texture[gl->fbo_pass - 1]; + fbo_info->tex = chain->fbo_texture[chain->fbo_pass - 1]; fbo_info->input_size[0] = prev_rect->img_width; fbo_info->input_size[1] = prev_rect->img_height; fbo_info->tex_size[0] = prev_rect->width; @@ -363,17 +429,17 @@ static void gl2_renderchain_render( fbo_tex_info_cnt++; /* Render our FBO texture to back buffer. */ - gl2_renderchain_bind_backbuffer(); + gl2_renderchain_bind_backbuffer(gl, chain_data); shader_info.data = gl; - shader_info.idx = gl->fbo_pass + 1; + shader_info.idx = chain->fbo_pass + 1; shader_info.set_active = true; video_shader_driver_use(shader_info); - glBindTexture(GL_TEXTURE_2D, gl->fbo_texture[gl->fbo_pass - 1]); + glBindTexture(GL_TEXTURE_2D, chain->fbo_texture[chain->fbo_pass - 1]); - mip_level = gl->fbo_pass + 1; + mip_level = chain->fbo_pass + 1; if (video_shader_driver_mipmap_input(&mip_level) && gl->have_mipmap) @@ -416,69 +482,80 @@ static void gl2_renderchain_render( gl->coords.tex_coord = gl->tex_info.coord; } -static void gl2_renderchain_deinit_fbo(void *data) +static void gl2_renderchain_deinit_fbo(void *data, + void *chain_data) { - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; - glDeleteTextures(gl->fbo_pass, gl->fbo_texture); - glDeleteFramebuffers(gl->fbo_pass, gl->fbo); - memset(gl->fbo_texture, 0, sizeof(gl->fbo_texture)); - memset(gl->fbo, 0, sizeof(gl->fbo)); - gl->fbo_inited = false; - gl->fbo_pass = 0; + if (!gl) + return; + + glDeleteTextures(chain->fbo_pass, chain->fbo_texture); + gl2_delete_fb(chain->fbo_pass, chain->fbo); + + memset(chain->fbo_texture, 0, sizeof(chain->fbo_texture)); + memset(chain->fbo, 0, sizeof(chain->fbo)); if (gl->fbo_feedback) - glDeleteFramebuffers(1, &gl->fbo_feedback); + gl2_delete_fb(1, &gl->fbo_feedback); if (gl->fbo_feedback_texture) glDeleteTextures(1, &gl->fbo_feedback_texture); + chain->fbo_pass = 0; + + gl->fbo_inited = false; gl->fbo_feedback_enable = false; gl->fbo_feedback_pass = 0; gl->fbo_feedback_texture = 0; gl->fbo_feedback = 0; } -static void gl2_renderchain_deinit_hw_render(void *data) +static void gl2_renderchain_deinit_hw_render( + void *data, + void *chain_data) { - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; if (!gl) return; context_bind_hw_render(true); if (gl->hw_render_fbo_init) - glDeleteFramebuffers(gl->textures, gl->hw_render_fbo); - if (gl->hw_render_depth_init) - glDeleteRenderbuffers(gl->textures, gl->hw_render_depth); + gl2_delete_fb(gl->textures, gl->hw_render_fbo); + if (chain->hw_render_depth_init) + gl2_delete_rb(gl->textures, chain->hw_render_depth); gl->hw_render_fbo_init = false; context_bind_hw_render(false); } -void gl2_renderchain_free(void *data) +static void gl2_renderchain_free(void *data, void *chain_data) { gl_t *gl = (gl_t*)data; - gl2_renderchain_deinit_fbo(gl); - gl2_renderchain_deinit_hw_render(gl); + gl2_renderchain_deinit_fbo(gl, chain_data); + gl2_renderchain_deinit_hw_render(gl, chain_data); } -static bool gl_create_fbo_targets(gl_t *gl) +static bool gl_create_fbo_targets(gl_t *gl, void *chain_data) { int i; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; glBindTexture(GL_TEXTURE_2D, 0); - glGenFramebuffers(gl->fbo_pass, gl->fbo); + gl2_gen_fb(chain->fbo_pass, chain->fbo); - for (i = 0; i < gl->fbo_pass; i++) + for (i = 0; i < chain->fbo_pass; i++) { GLenum status; - gl2_bind_fb(gl->fbo[i]); - glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, - RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->fbo_texture[i], 0); + gl2_bind_fb(chain->fbo[i]); + gl2_fb_texture_2d(RARCH_GL_FRAMEBUFFER, + RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, chain->fbo_texture[i], 0); - status = glCheckFramebufferStatus(RARCH_GL_FRAMEBUFFER); + status = gl2_check_fb_status(RARCH_GL_FRAMEBUFFER); if (status != RARCH_GL_FRAMEBUFFER_COMPLETE) goto error; } @@ -487,13 +564,13 @@ static bool gl_create_fbo_targets(gl_t *gl) { GLenum status; - glGenFramebuffers(1, &gl->fbo_feedback); + gl2_gen_fb(1, &gl->fbo_feedback); gl2_bind_fb(gl->fbo_feedback); - glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, + gl2_fb_texture_2d(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->fbo_feedback_texture, 0); - status = glCheckFramebufferStatus(RARCH_GL_FRAMEBUFFER); + status = gl2_check_fb_status(RARCH_GL_FRAMEBUFFER); if (status != RARCH_GL_FRAMEBUFFER_COMPLETE) goto error; @@ -506,20 +583,22 @@ static bool gl_create_fbo_targets(gl_t *gl) return true; error: - glDeleteFramebuffers(gl->fbo_pass, gl->fbo); + gl2_delete_fb(chain->fbo_pass, chain->fbo); if (gl->fbo_feedback) - glDeleteFramebuffers(1, &gl->fbo_feedback); + gl2_delete_fb(1, &gl->fbo_feedback); RARCH_ERR("[GL]: Failed to set up frame buffer objects. Multi-pass shading will not work.\n"); return false; } -static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) +static void gl_create_fbo_texture(gl_t *gl, + void *chain_data, unsigned i, GLuint texture) { GLenum mag_filter, wrap_enum; video_shader_ctx_filter_t filter_type; video_shader_ctx_wrap_t wrap = {0}; bool fp_fbo = false; bool smooth = false; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; settings_t *settings = config_get_ptr(); GLuint base_filt = settings->bools.video_smooth ? GL_LINEAR : GL_NEAREST; GLuint base_mip_filt = settings->bools.video_smooth ? @@ -547,16 +626,16 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) gl_bind_texture(texture, wrap_enum, mag_filter, min_filter); - fp_fbo = gl->fbo_scale[i].fp_fbo; + fp_fbo = chain->fbo_scale[i].fp_fbo; if (fp_fbo) { - if (!gl->has_fp_fbo) + if (!chain->has_fp_fbo) RARCH_ERR("[GL]: Floating-point FBO was requested, but is not supported. Falling back to UNORM. Result may band/clip/etc.!\n"); } #if !defined(HAVE_OPENGLES2) - if (fp_fbo && gl->has_fp_fbo) + if (fp_fbo && chain->has_fp_fbo) { RARCH_LOG("[GL]: FBO pass #%d is floating-point.\n", i); gl_load_texture_image(GL_TEXTURE_2D, 0, GL_RGBA32F, @@ -567,18 +646,18 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) #endif { #ifndef HAVE_OPENGLES - bool srgb_fbo = gl->fbo_scale[i].srgb_fbo; + bool srgb_fbo = chain->fbo_scale[i].srgb_fbo; if (!fp_fbo && srgb_fbo) { - if (!gl->has_srgb_fbo) + if (!chain->has_srgb_fbo) RARCH_ERR("[GL]: sRGB FBO was requested, but it is not supported. Falling back to UNORM. Result may have banding!\n"); } if (settings->bools.video_force_srgb_disable) srgb_fbo = false; - if (srgb_fbo && gl->has_srgb_fbo) + if (srgb_fbo && chain->has_srgb_fbo) { RARCH_LOG("[GL]: FBO pass #%d is sRGB.\n", i); #ifdef HAVE_OPENGLES2 @@ -587,7 +666,7 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) glTexImage2D(GL_TEXTURE_2D, 0, GL_SRGB_ALPHA_EXT, gl->fbo_rect[i].width, gl->fbo_rect[i].height, 0, - gl->has_srgb_fbo_gles3 ? GL_RGBA : GL_SRGB_ALPHA_EXT, + chain->has_srgb_fbo_gles3 ? GL_RGBA : GL_SRGB_ALPHA_EXT, GL_UNSIGNED_BYTE, NULL); #else gl_load_texture_image(GL_TEXTURE_2D, @@ -616,18 +695,22 @@ static void gl_create_fbo_texture(gl_t *gl, unsigned i, GLuint texture) } } -static void gl_create_fbo_textures(gl_t *gl) +static void gl_create_fbo_textures(gl_t *gl, void *chain_data) { int i; - glGenTextures(gl->fbo_pass, gl->fbo_texture); + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; - for (i = 0; i < gl->fbo_pass; i++) - gl_create_fbo_texture(gl, i, gl->fbo_texture[i]); + glGenTextures(chain->fbo_pass, chain->fbo_texture); + + for (i = 0; i < chain->fbo_pass; i++) + gl_create_fbo_texture(gl, gl->renderchain_data, + i, chain->fbo_texture[i]); if (gl->fbo_feedback_enable) { glGenTextures(1, &gl->fbo_feedback_texture); gl_create_fbo_texture(gl, + gl->renderchain_data, gl->fbo_feedback_pass, gl->fbo_feedback_texture); } @@ -640,11 +723,13 @@ static void gl_create_fbo_textures(gl_t *gl) static void gl2_renderchain_recompute_pass_sizes( void *data, + void *chain_data, unsigned width, unsigned height, unsigned vp_width, unsigned vp_height) { int i; gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; bool size_modified = false; GLint max_size = 0; unsigned last_width = width; @@ -655,10 +740,10 @@ static void gl2_renderchain_recompute_pass_sizes( glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max_size); /* Calculate viewports for FBOs. */ - for (i = 0; i < gl->fbo_pass; i++) + for (i = 0; i < chain->fbo_pass; i++) { struct video_fbo_rect *fbo_rect = &gl->fbo_rect[i]; - struct gfx_fbo_scale *fbo_scale = &gl->fbo_scale[i]; + struct gfx_fbo_scale *fbo_scale = &chain->fbo_scale[i]; gl2_renderchain_convert_geometry( gl, fbo_rect, fbo_scale, @@ -702,6 +787,7 @@ static void gl2_renderchain_recompute_pass_sizes( } static void gl2_renderchain_start_render(void *data, + void *chain_data, video_frame_info_t *video_info) { /* Used when rendering to an FBO. @@ -713,10 +799,11 @@ static void gl2_renderchain_start_render(void *data, 0, 1, 1, 1 }; - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; glBindTexture(GL_TEXTURE_2D, gl->texture[gl->tex_index]); - gl2_bind_fb(gl->fbo[0]); + gl2_bind_fb(chain->fbo[0]); gl_set_viewport(gl, video_info, gl->fbo_rect[0].img_width, @@ -729,21 +816,23 @@ static void gl2_renderchain_start_render(void *data, gl->coords.vertex = fbo_vertexes; #if defined(GL_FRAMEBUFFER_SRGB) && !defined(HAVE_OPENGLES) - if (gl->has_srgb_fbo) + if (chain->has_srgb_fbo) glEnable(GL_FRAMEBUFFER_SRGB); #endif } /* Set up render to texture. */ void gl2_renderchain_init( - void *data, unsigned fbo_width, unsigned fbo_height) + void *data, void *chain_data, + unsigned fbo_width, unsigned fbo_height) { int i; unsigned width, height; video_shader_ctx_scale_t scaler; video_shader_ctx_info_t shader_info; struct gfx_fbo_scale scale, scale_last; - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; if (!video_shader_driver_info(&shader_info)) return; @@ -773,9 +862,9 @@ void gl2_renderchain_init( return; } - gl->fbo_pass = shader_info.num - 1; + chain->fbo_pass = shader_info.num - 1; if (scale_last.valid) - gl->fbo_pass++; + chain->fbo_pass++; if (!scale.valid) { @@ -785,28 +874,29 @@ void gl2_renderchain_init( scale.valid = true; } - gl->fbo_scale[0] = scale; + chain->fbo_scale[0] = scale; - for (i = 1; i < gl->fbo_pass; i++) + for (i = 1; i < chain->fbo_pass; i++) { scaler.idx = i + 1; - scaler.scale = &gl->fbo_scale[i]; + scaler.scale = &chain->fbo_scale[i]; video_shader_driver_scale(&scaler); - if (!gl->fbo_scale[i].valid) + if (!chain->fbo_scale[i].valid) { - gl->fbo_scale[i].scale_x = gl->fbo_scale[i].scale_y = 1.0f; - gl->fbo_scale[i].type_x = gl->fbo_scale[i].type_y = + chain->fbo_scale[i].scale_x = chain->fbo_scale[i].scale_y = 1.0f; + chain->fbo_scale[i].type_x = chain->fbo_scale[i].type_y = RARCH_SCALE_INPUT; - gl->fbo_scale[i].valid = true; + chain->fbo_scale[i].valid = true; } } gl2_renderchain_recompute_pass_sizes(gl, + chain_data, fbo_width, fbo_height, width, height); - for (i = 0; i < gl->fbo_pass; i++) + for (i = 0; i < chain->fbo_pass; i++) { gl->fbo_rect[i].width = next_pow2(gl->fbo_rect[i].img_width); gl->fbo_rect[i].height = next_pow2(gl->fbo_rect[i].img_height); @@ -818,7 +908,7 @@ void gl2_renderchain_init( &gl->fbo_feedback_pass); if (gl->fbo_feedback_enable && gl->fbo_feedback_pass - < (unsigned)gl->fbo_pass) + < (unsigned)chain->fbo_pass) { RARCH_LOG("[GL]: Creating feedback FBO %d @ %ux%u\n", i, gl->fbo_rect[gl->fbo_feedback_pass].width, @@ -827,14 +917,14 @@ void gl2_renderchain_init( else if (gl->fbo_feedback_enable) { RARCH_WARN("[GL]: Tried to create feedback FBO of pass #%u, but there are only %d FBO passes. Will use input texture as feedback texture.\n", - gl->fbo_feedback_pass, gl->fbo_pass); + gl->fbo_feedback_pass, chain->fbo_pass); gl->fbo_feedback_enable = false; } - gl_create_fbo_textures(gl); - if (!gl || !gl_create_fbo_targets(gl)) + gl_create_fbo_textures(gl, chain); + if (!gl || !gl_create_fbo_targets(gl, chain)) { - glDeleteTextures(gl->fbo_pass, gl->fbo_texture); + glDeleteTextures(chain->fbo_pass, chain->fbo_texture); RARCH_ERR("[GL]: Failed to create FBO targets. Will continue without FBO.\n"); return; } @@ -844,6 +934,7 @@ void gl2_renderchain_init( static bool gl2_renderchain_init_hw_render( void *data, + void *chain_data, unsigned width, unsigned height) { GLenum status; @@ -855,6 +946,7 @@ static bool gl2_renderchain_init_hw_render( struct retro_hw_render_callback *hwr = video_driver_get_hw_context(); gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; /* We can only share texture objects through contexts. * FBOs are "abstract" objects and are not shared. */ @@ -872,58 +964,62 @@ static bool gl2_renderchain_init_hw_render( RARCH_LOG("[GL]: Supports FBO (render-to-texture).\n"); glBindTexture(GL_TEXTURE_2D, 0); - glGenFramebuffers(gl->textures, gl->hw_render_fbo); + gl2_gen_fb(gl->textures, gl->hw_render_fbo); depth = hwr->depth; stencil = hwr->stencil; if (depth) { - glGenRenderbuffers(gl->textures, gl->hw_render_depth); - gl->hw_render_depth_init = true; + gl2_gen_rb(gl->textures, chain->hw_render_depth); + chain->hw_render_depth_init = true; } for (i = 0; i < gl->textures; i++) { gl2_bind_fb(gl->hw_render_fbo[i]); - glFramebufferTexture2D(RARCH_GL_FRAMEBUFFER, + gl2_fb_texture_2d(RARCH_GL_FRAMEBUFFER, RARCH_GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, gl->texture[i], 0); if (depth) { - glBindRenderbuffer(RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); - glRenderbufferStorage(RARCH_GL_RENDERBUFFER, + gl2_bind_rb(RARCH_GL_RENDERBUFFER, chain->hw_render_depth[i]); + gl2_rb_storage(RARCH_GL_RENDERBUFFER, stencil ? RARCH_GL_DEPTH24_STENCIL8 : GL_DEPTH_COMPONENT16, width, height); - glBindRenderbuffer(RARCH_GL_RENDERBUFFER, 0); + gl2_bind_rb(RARCH_GL_RENDERBUFFER, 0); if (stencil) { #if defined(HAVE_OPENGLES2) || defined(HAVE_OPENGLES1) || ((defined(__MACH__) && (defined(__ppc__) || defined(__ppc64__)))) /* GLES2 is a bit weird, as always. * There's no GL_DEPTH_STENCIL_ATTACHMENT like in desktop GL. */ - glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER, + gl2_fb_rb(RARCH_GL_FRAMEBUFFER, RARCH_GL_DEPTH_ATTACHMENT, - RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); - glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER, + RARCH_GL_RENDERBUFFER, + chain->hw_render_depth[i]); + gl2_fb_rb(RARCH_GL_FRAMEBUFFER, RARCH_GL_STENCIL_ATTACHMENT, - RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); + RARCH_GL_RENDERBUFFER, + chain->hw_render_depth[i]); #else /* We use ARB FBO extensions, no need to check. */ - glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER, + gl2_fb_rb(RARCH_GL_FRAMEBUFFER, GL_DEPTH_STENCIL_ATTACHMENT, - RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); + RARCH_GL_RENDERBUFFER, + chain->hw_render_depth[i]); #endif } else { - glFramebufferRenderbuffer(RARCH_GL_FRAMEBUFFER, + gl2_fb_rb(RARCH_GL_FRAMEBUFFER, RARCH_GL_DEPTH_ATTACHMENT, - RARCH_GL_RENDERBUFFER, gl->hw_render_depth[i]); + RARCH_GL_RENDERBUFFER, + chain->hw_render_depth[i]); } } - status = glCheckFramebufferStatus(RARCH_GL_FRAMEBUFFER); + status = gl2_check_fb_status(RARCH_GL_FRAMEBUFFER); if (status != RARCH_GL_FRAMEBUFFER_COMPLETE) { RARCH_ERR("[GL]: Failed to create HW render FBO #%u, error: 0x%u.\n", @@ -932,7 +1028,7 @@ static bool gl2_renderchain_init_hw_render( } } - gl2_renderchain_bind_backbuffer(); + gl2_renderchain_bind_backbuffer(gl, chain_data); gl->hw_render_fbo_init = true; context_bind_hw_render(false); @@ -941,9 +1037,11 @@ static bool gl2_renderchain_init_hw_render( static void gl2_renderchain_bind_prev_texture( void *data, + void *chain_data, const struct video_tex_info *tex_info) { - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; memmove(gl->prev_info + 1, gl->prev_info, sizeof(*tex_info) * (gl->textures - 1)); @@ -956,15 +1054,16 @@ static void gl2_renderchain_bind_prev_texture( { GLuint tmp_fbo = gl->fbo_feedback; GLuint tmp_tex = gl->fbo_feedback_texture; - gl->fbo_feedback = gl->fbo[gl->fbo_feedback_pass]; - gl->fbo_feedback_texture = gl->fbo_texture[gl->fbo_feedback_pass]; - gl->fbo[gl->fbo_feedback_pass] = tmp_fbo; - gl->fbo_texture[gl->fbo_feedback_pass] = tmp_tex; + gl->fbo_feedback = chain->fbo[gl->fbo_feedback_pass]; + gl->fbo_feedback_texture = chain->fbo_texture[gl->fbo_feedback_pass]; + chain->fbo[gl->fbo_feedback_pass] = tmp_fbo; + chain->fbo_texture[gl->fbo_feedback_pass] = tmp_tex; } } static void gl2_renderchain_viewport_info( - void *data, struct video_viewport *vp) + void *data, void *chain_data, + struct video_viewport *vp) { unsigned width, height; unsigned top_y, top_dist; @@ -983,7 +1082,9 @@ static void gl2_renderchain_viewport_info( } static bool gl2_renderchain_read_viewport( - void *data, uint8_t *buffer, bool is_idle) + void *data, + void *chain_data, + uint8_t *buffer, bool is_idle) { unsigned num_pixels = 0; gl_t *gl = (gl_t*)data; @@ -1084,14 +1185,14 @@ error: return false; } -void gl2_renderchain_free_internal(void *data) +void gl2_renderchain_free_internal(void *data, void *chain_data) { - gl2_renderchain_t *cg_data = (gl2_renderchain_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; - if (!cg_data) + if (!chain) return; - free(cg_data); + free(chain); } static void *gl2_renderchain_new(void) @@ -1104,40 +1205,43 @@ static void *gl2_renderchain_new(void) } #ifndef HAVE_OPENGLES -static void gl2_renderchain_bind_vao(void *data) +static void gl2_renderchain_bind_vao(void *data, + void *chain_data) { - gl_t *gl = (gl_t*)data; - if (!gl) + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; + if (!chain) return; - glBindVertexArray(gl->vao); + glBindVertexArray(chain->vao); } -static void gl2_renderchain_unbind_vao(void *data) +static void gl2_renderchain_unbind_vao(void *data, + void *chain_data) { - gl_t *gl = (gl_t*)data; - if (!gl) - return; glBindVertexArray(0); } -static void gl2_renderchain_new_vao(void *data) +static void gl2_renderchain_new_vao(void *data, + void *chain_data) { - gl_t *gl = (gl_t*)data; - if (!gl) + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; + if (!chain) return; - glGenVertexArrays(1, &gl->vao); + glGenVertexArrays(1, &chain->vao); } -static void gl2_renderchain_free_vao(void *data) +static void gl2_renderchain_free_vao(void *data, + void *chain_data) { - gl_t *gl = (gl_t*)data; - if (!gl) + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; + if (!chain) return; - glDeleteVertexArrays(1, &gl->vao); + glDeleteVertexArrays(1, &chain->vao); } #endif -static void gl2_renderchain_restore_default_state(void *data) +static void gl2_renderchain_restore_default_state( + void *data, + void *chain_data) { gl_t *gl = (gl_t*)data; if (!gl) @@ -1153,11 +1257,16 @@ static void gl2_renderchain_restore_default_state(void *data) static void gl2_renderchain_copy_frame( void *data, + void *chain_data, video_frame_info_t *video_info, const void *frame, unsigned width, unsigned height, unsigned pitch) { - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; + + (void)chain; + #if defined(HAVE_PSGL) { unsigned h; @@ -1176,7 +1285,7 @@ static void gl2_renderchain_copy_frame( } #elif defined(HAVE_OPENGLES) #if defined(HAVE_EGL) - if (gl->egl_images) + if (chain->egl_images) { gfx_ctx_image_t img_info; bool new_egl = false; @@ -1295,7 +1404,8 @@ static void gl2_renderchain_bind_pbo(unsigned idx) glBindBuffer(GL_PIXEL_PACK_BUFFER, (GLuint)idx); } -static void gl2_renderchain_unbind_pbo(void) +static void gl2_renderchain_unbind_pbo(void *data, + void *chain_data) { glBindBuffer(GL_PIXEL_PACK_BUFFER, 0); } @@ -1309,6 +1419,7 @@ static void gl2_renderchain_init_pbo(unsigned size, #endif static void gl2_renderchain_readback(void *data, + void *chain_data, unsigned alignment, unsigned fmt, unsigned type, void *src) @@ -1327,47 +1438,51 @@ static void gl2_renderchain_readback(void *data, } #ifndef HAVE_OPENGLES -static void gl2_renderchain_fence_iterate(void *data, unsigned - hard_sync_frames) +static void gl2_renderchain_fence_iterate( + void *data, + void *chain_data, + unsigned hard_sync_frames) { - gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; - gl->fences[gl->fence_count++] = + chain->fences[chain->fence_count++] = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); - while (gl->fence_count > hard_sync_frames) + while (chain->fence_count > hard_sync_frames) { - glClientWaitSync(gl->fences[0], + glClientWaitSync(chain->fences[0], GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); - glDeleteSync(gl->fences[0]); + glDeleteSync(chain->fences[0]); - gl->fence_count--; - memmove(gl->fences, gl->fences + 1, - gl->fence_count * sizeof(GLsync)); + chain->fence_count--; + memmove(chain->fences, chain->fences + 1, + chain->fence_count * sizeof(void*)); } } -static void gl2_renderchain_fence_free(void *data) +static void gl2_renderchain_fence_free(void *data, + void *chain_data) { unsigned i; - gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; - for (i = 0; i < gl->fence_count; i++) + for (i = 0; i < chain->fence_count; i++) { - glClientWaitSync(gl->fences[i], + glClientWaitSync(chain->fences[i], GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000); - glDeleteSync(gl->fences[i]); + glDeleteSync(chain->fences[i]); } - gl->fence_count = 0; + chain->fence_count = 0; } #endif static void gl2_renderchain_init_textures_reference( - void *data, unsigned i, + void *data, void *chain_data, unsigned i, unsigned internal_fmt, unsigned texture_fmt, unsigned texture_type) { - gl_t *gl = (gl_t*)data; + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; #ifdef HAVE_PSGL glTextureReferenceSCE(GL_TEXTURE_2D, 1, gl->tex_w, gl->tex_h, 0, @@ -1375,7 +1490,7 @@ static void gl2_renderchain_init_textures_reference( gl->tex_w * gl->base_size, gl->tex_w * gl->tex_h * i * gl->base_size); #else - if (gl->egl_images) + if (chain->egl_images) return; gl_load_texture_image(GL_TEXTURE_2D, @@ -1388,6 +1503,30 @@ static void gl2_renderchain_init_textures_reference( #endif } +static void gl2_renderchain_resolve_extensions(void *data, + void *chain_data, const char *context_ident, + const video_info_t *video) +{ + gl_t *gl = (gl_t*)data; + gl2_renderchain_t *chain = (gl2_renderchain_t*)chain_data; + settings_t *settings = config_get_ptr(); + + if (!chain) + return; + + chain->has_srgb_fbo = false; + chain->has_fp_fbo = gl_check_capability(GL_CAPS_FP_FBO); + /* GLES3 has unpack_subimage and sRGB in core. */ + chain->has_srgb_fbo_gles3 = gl_check_capability(GL_CAPS_SRGB_FBO_ES3); + + if (!settings->bools.video_force_srgb_disable) + chain->has_srgb_fbo = gl_check_capability(GL_CAPS_SRGB_FBO); + + /* Use regular textures if we use HW render. */ + chain->egl_images = !gl->hw_render_use && gl_check_capability(GL_CAPS_EGLIMAGE) && + video_context_driver_init_image_buffer(video); +} + gl_renderchain_driver_t gl2_renderchain = { NULL, /* set_coords */ NULL, /* set_mvp */ @@ -1440,5 +1579,6 @@ gl_renderchain_driver_t gl2_renderchain = { gl2_renderchain_check_fbo_dimensions, gl2_renderchain_recompute_pass_sizes, gl2_renderchain_render, + gl2_renderchain_resolve_extensions, "gl2", }; diff --git a/gfx/include/GL/glext.h b/gfx/include/GL/glext.h index 44ab7c62e1..a1381696b4 100644 --- a/gfx/include/GL/glext.h +++ b/gfx/include/GL/glext.h @@ -6220,8 +6220,8 @@ typedef uint64_t GLuint64EXT; #ifndef GL_ARB_sync typedef int64_t GLint64; typedef uint64_t GLuint64; -typedef struct __GLsync *GLsync; #endif +typedef struct __GLsync *GLsync; #ifndef GL_ARB_cl_event /* These incomplete types let us declare types compatible with OpenCL's cl_context and cl_event */ diff --git a/gfx/include/d3d9/d3dx9shader.h b/gfx/include/d3d9/d3dx9shader.h index 46ddf4c85a..74e40cfc80 100644 --- a/gfx/include/d3d9/d3dx9shader.h +++ b/gfx/include/d3d9/d3dx9shader.h @@ -643,4 +643,4 @@ typedef struct _D3DXSHADER_STRUCTMEMBERINFO -#endif //__D3DX9SHADER_H__ +#endif /* __D3DX9SHADER_H__ */ diff --git a/gfx/include/d3d9caps.h b/gfx/include/d3d9caps.h index 96a9bef9d4..adc3fb1f8d 100644 --- a/gfx/include/d3d9caps.h +++ b/gfx/include/d3d9caps.h @@ -12,9 +12,9 @@ #ifndef DIRECT3D_VERSION #define DIRECT3D_VERSION 0x0900 -#endif //DIRECT3D_VERSION +#endif /* DIRECT3D_VERSION */ -// include this file content only if compiling for DX9 interfaces +/* include this file content only if compiling for DX9 interfaces */ #if(DIRECT3D_VERSION >= 0x0900) @@ -117,7 +117,7 @@ DEFINE_GUID(D3DKEYEXCHANGE_RSAES_OAEP, DEFINE_GUID(D3DKEYEXCHANGE_DXVA, 0x43d3775c, 0x38e5, 0x4924, 0x8d, 0x86, 0xd3, 0xfc, 0xcf, 0x15, 0x3e, 0x9b); -#endif // !D3D_DISABLE_9EX +#endif /* !D3D_DISABLE_9EX */ /* -- D3D9Ex only */ typedef struct _D3DCAPS9 @@ -146,13 +146,13 @@ typedef struct _D3DCAPS9 DWORD AlphaCmpCaps; DWORD ShadeCaps; DWORD TextureCaps; - DWORD TextureFilterCaps; // D3DPTFILTERCAPS for IDirect3DTexture9's - DWORD CubeTextureFilterCaps; // D3DPTFILTERCAPS for IDirect3DCubeTexture9's - DWORD VolumeTextureFilterCaps; // D3DPTFILTERCAPS for IDirect3DVolumeTexture9's - DWORD TextureAddressCaps; // D3DPTADDRESSCAPS for IDirect3DTexture9's - DWORD VolumeTextureAddressCaps; // D3DPTADDRESSCAPS for IDirect3DVolumeTexture9's + DWORD TextureFilterCaps; /* D3DPTFILTERCAPS for IDirect3DTexture9's */ + DWORD CubeTextureFilterCaps; /* D3DPTFILTERCAPS for IDirect3DCubeTexture9's */ + DWORD VolumeTextureFilterCaps; /* D3DPTFILTERCAPS for IDirect3DVolumeTexture9's */ + DWORD TextureAddressCaps; /* D3DPTADDRESSCAPS for IDirect3DTexture9's */ + DWORD VolumeTextureAddressCaps; /* D3DPTADDRESSCAPS for IDirect3DVolumeTexture9's */ - DWORD LineCaps; // D3DLINECAPS + DWORD LineCaps; /* D3DLINECAPS */ DWORD MaxTextureWidth, MaxTextureHeight; DWORD MaxVolumeExtent; @@ -183,51 +183,49 @@ typedef struct _D3DCAPS9 float MaxPointSize; - DWORD MaxPrimitiveCount; // max number of primitives per DrawPrimitive call + DWORD MaxPrimitiveCount; /* max number of primitives per DrawPrimitive call */ DWORD MaxVertexIndex; DWORD MaxStreams; - DWORD MaxStreamStride; // max stride for SetStreamSource + DWORD MaxStreamStride; /* max stride for SetStreamSource */ DWORD VertexShaderVersion; - DWORD MaxVertexShaderConst; // number of vertex shader constant registers + DWORD MaxVertexShaderConst; /* number of vertex shader constant registers */ DWORD PixelShaderVersion; - float PixelShader1xMaxValue; // max value storable in registers of ps.1.x shaders + float PixelShader1xMaxValue; /* max value storable in registers of ps.1.x shaders */ - // Here are the DX9 specific ones + /* Here are the DX9 specific ones */ DWORD DevCaps2; float MaxNpatchTessellationLevel; DWORD Reserved5; - UINT MasterAdapterOrdinal; // ordinal of master adaptor for adapter group - UINT AdapterOrdinalInGroup; // ordinal inside the adapter group - UINT NumberOfAdaptersInGroup; // number of adapters in this adapter group (only if master) - DWORD DeclTypes; // Data types, supported in vertex declarations - DWORD NumSimultaneousRTs; // Will be at least 1 - DWORD StretchRectFilterCaps; // Filter caps supported by StretchRect + UINT MasterAdapterOrdinal; /* ordinal of master adaptor for adapter group */ + UINT AdapterOrdinalInGroup; /* ordinal inside the adapter group */ + UINT NumberOfAdaptersInGroup; /* number of adapters in this adapter group (only if master) */ + DWORD DeclTypes; /* Data types, supported in vertex declarations */ + DWORD NumSimultaneousRTs; /* Will be at least 1 */ + DWORD StretchRectFilterCaps; /* Filter caps supported by StretchRect */ D3DVSHADERCAPS2_0 VS20Caps; D3DPSHADERCAPS2_0 PS20Caps; - DWORD VertexTextureFilterCaps; // D3DPTFILTERCAPS for IDirect3DTexture9's for texture, used in vertex shaders - DWORD MaxVShaderInstructionsExecuted; // maximum number of vertex shader instructions that can be executed - DWORD MaxPShaderInstructionsExecuted; // maximum number of pixel shader instructions that can be executed + DWORD VertexTextureFilterCaps; /* D3DPTFILTERCAPS for IDirect3DTexture9's for texture, used in vertex shaders */ + DWORD MaxVShaderInstructionsExecuted; /* maximum number of vertex shader instructions that can be executed */ + DWORD MaxPShaderInstructionsExecuted; /* maximum number of pixel shader instructions that can be executed */ DWORD MaxVertexShader30InstructionSlots; DWORD MaxPixelShader30InstructionSlots; } D3DCAPS9; -// -// BIT DEFINES FOR D3DCAPS9 DWORD MEMBERS -// +/* + * BIT DEFINES FOR D3DCAPS9 DWORD MEMBERS + */ -// -// Caps -// +/* + * Caps + */ #define D3DCAPS_OVERLAY 0x00000800L #define D3DCAPS_READ_SCANLINE 0x00020000L -// -// Caps2 -// +/* Caps2 */ #define D3DCAPS2_FULLSCREENGAMMA 0x00020000L #define D3DCAPS2_CANCALIBRATEGAMMA 0x00100000L #define D3DCAPS2_RESERVED 0x02000000L @@ -240,21 +238,21 @@ typedef struct _D3DCAPS9 #define D3DCAPS2_CANSHARERESOURCE 0x80000000L -#endif // !D3D_DISABLE_9EX +#endif /* !D3D_DISABLE_9EX */ /* -- D3D9Ex only */ -// -// Caps3 -// +/* Caps3 */ #define D3DCAPS3_RESERVED 0x8000001fL -// Indicates that the device can respect the ALPHABLENDENABLE render state -// when fullscreen while using the FLIP or DISCARD swap effect. -// COPY and COPYVSYNC swap effects work whether or not this flag is set. +/* Indicates that the device can respect the ALPHABLENDENABLE render state + * when fullscreen while using the FLIP or DISCARD swap effect. + * COPY and COPYVSYNC swap effects work whether or not this flag is set. + */ #define D3DCAPS3_ALPHA_FULLSCREEN_FLIP_OR_DISCARD 0x00000020L -// Indicates that the device can perform a gamma correction from -// a windowed back buffer containing linear content to the sRGB desktop. +/* Indicates that the device can perform a gamma correction from + * a windowed back buffer containing linear content to the sRGB desktop. + */ #define D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION 0x00000080L #define D3DCAPS3_COPY_TO_VIDMEM 0x00000100L /* Device can acclerate copies from sysmem to local vidmem */ @@ -262,10 +260,7 @@ typedef struct _D3DCAPS9 #define D3DCAPS3_DXVAHD 0x00000400L #define D3DCAPS3_DXVAHD_LIMITED 0x00000800L - -// -// PresentationIntervals -// +/* PresentationIntervals */ #define D3DPRESENT_INTERVAL_DEFAULT 0x00000000L #define D3DPRESENT_INTERVAL_ONE 0x00000001L #define D3DPRESENT_INTERVAL_TWO 0x00000002L @@ -273,17 +268,13 @@ typedef struct _D3DCAPS9 #define D3DPRESENT_INTERVAL_FOUR 0x00000008L #define D3DPRESENT_INTERVAL_IMMEDIATE 0x80000000L -// -// CursorCaps -// -// Driver supports HW color cursor in at least hi-res modes(height >=400) +/* CursorCaps */ +/* Driver supports HW color cursor in at least hi-res modes(height >=400) */ #define D3DCURSORCAPS_COLOR 0x00000001L -// Driver supports HW cursor also in low-res modes(height < 400) +/* Driver supports HW cursor also in low-res modes(height < 400) */ #define D3DCURSORCAPS_LOWRES 0x00000002L -// -// DevCaps -// +/* DevCaps */ #define D3DDEVCAPS_EXECUTESYSTEMMEMORY 0x00000010L /* Device can use execute buffers from system memory */ #define D3DDEVCAPS_EXECUTEVIDEOMEMORY 0x00000020L /* Device can use execute buffers from video memory */ #define D3DDEVCAPS_TLVERTEXSYSTEMMEMORY 0x00000040L /* Device can use TL buffers from system memory */ @@ -305,9 +296,9 @@ typedef struct _D3DCAPS9 #define D3DDEVCAPS_RTPATCHHANDLEZERO 0x00800000L /* Indicates that RT Patches may be drawn efficiently using handle 0 */ #define D3DDEVCAPS_NPATCHES 0x01000000L /* Device supports N-Patches */ -// -// PrimitiveMiscCaps -// +/* + * PrimitiveMiscCaps + */ #define D3DPMISCCAPS_MASKZ 0x00000002L #define D3DPMISCCAPS_CULLNONE 0x00000010L #define D3DPMISCCAPS_CULLCW 0x00000020L @@ -332,13 +323,13 @@ typedef struct _D3DCAPS9 #define D3DPMISCCAPS_POSTBLENDSRGBCONVERT 0x00200000L /* Indicates device can perform conversion to sRGB after blending. */ -#endif // !D3D_DISABLE_9EX +#endif /* !D3D_DISABLE_9EX */ /* -- D3D9Ex only */ -// -// LineCaps -// +/* + * LineCaps + */ #define D3DLINECAPS_TEXTURE 0x00000001L #define D3DLINECAPS_ZTEST 0x00000002L #define D3DLINECAPS_BLEND 0x00000004L @@ -346,9 +337,9 @@ typedef struct _D3DCAPS9 #define D3DLINECAPS_FOG 0x00000010L #define D3DLINECAPS_ANTIALIAS 0x00000020L -// -// RasterCaps -// +/* + * RasterCaps + */ #define D3DPRASTERCAPS_DITHER 0x00000001L #define D3DPRASTERCAPS_ZTEST 0x00000010L #define D3DPRASTERCAPS_FOGVERTEX 0x00000080L @@ -366,9 +357,9 @@ typedef struct _D3DCAPS9 #define D3DPRASTERCAPS_DEPTHBIAS 0x04000000L #define D3DPRASTERCAPS_MULTISAMPLE_TOGGLE 0x08000000L -// -// ZCmpCaps, AlphaCmpCaps -// +/* + * ZCmpCaps, AlphaCmpCaps + */ #define D3DPCMPCAPS_NEVER 0x00000001L #define D3DPCMPCAPS_LESS 0x00000002L #define D3DPCMPCAPS_EQUAL 0x00000004L @@ -378,9 +369,9 @@ typedef struct _D3DCAPS9 #define D3DPCMPCAPS_GREATEREQUAL 0x00000040L #define D3DPCMPCAPS_ALWAYS 0x00000080L -// -// SourceBlendCaps, DestBlendCaps -// +/* + * SourceBlendCaps, DestBlendCaps + */ #define D3DPBLENDCAPS_ZERO 0x00000001L #define D3DPBLENDCAPS_ONE 0x00000002L #define D3DPBLENDCAPS_SRCCOLOR 0x00000004L @@ -402,31 +393,32 @@ typedef struct _D3DCAPS9 #define D3DPBLENDCAPS_SRCCOLOR2 0x00004000L #define D3DPBLENDCAPS_INVSRCCOLOR2 0x00008000L -#endif // !D3D_DISABLE_9EX +#endif /* !D3D_DISABLE_9EX */ /* -- D3D9Ex only */ - -// -// ShadeCaps -// +/* + * ShadeCaps + */ #define D3DPSHADECAPS_COLORGOURAUDRGB 0x00000008L #define D3DPSHADECAPS_SPECULARGOURAUDRGB 0x00000200L #define D3DPSHADECAPS_ALPHAGOURAUDBLEND 0x00004000L #define D3DPSHADECAPS_FOGGOURAUD 0x00080000L -// -// TextureCaps -// +/* + * TextureCaps + */ #define D3DPTEXTURECAPS_PERSPECTIVE 0x00000001L /* Perspective-correct texturing is supported */ #define D3DPTEXTURECAPS_POW2 0x00000002L /* Power-of-2 texture dimensions are required - applies to non-Cube/Volume textures only. */ #define D3DPTEXTURECAPS_ALPHA 0x00000004L /* Alpha in texture pixels is supported */ #define D3DPTEXTURECAPS_SQUAREONLY 0x00000020L /* Only square textures are supported */ #define D3DPTEXTURECAPS_TEXREPEATNOTSCALEDBYSIZE 0x00000040L /* Texture indices are not scaled by the texture size prior to interpolation */ #define D3DPTEXTURECAPS_ALPHAPALETTE 0x00000080L /* Device can draw alpha from texture palettes */ -// Device can use non-POW2 textures if: -// 1) D3DTEXTURE_ADDRESS is set to CLAMP for this texture's stage -// 2) D3DRS_WRAP(N) is zero for this texture's coordinates -// 3) mip mapping is not enabled (use magnification filter only) + +/* Device can use non-POW2 textures if: + * 1) D3DTEXTURE_ADDRESS is set to CLAMP for this texture's stage + * 2) D3DRS_WRAP(N) is zero for this texture's coordinates + * 3) mip mapping is not enabled (use magnification filter only) + */ #define D3DPTEXTURECAPS_NONPOW2CONDITIONAL 0x00000100L #define D3DPTEXTURECAPS_PROJECTED 0x00000400L /* Device can do D3DTTFF_PROJECTED */ #define D3DPTEXTURECAPS_CUBEMAP 0x00000800L /* Device can do cubemap textures */ @@ -439,9 +431,9 @@ typedef struct _D3DCAPS9 #define D3DPTEXTURECAPS_NOPROJECTEDBUMPENV 0x00200000L /* Device does not support projected bump env lookup operation in programmable and fixed function pixel shaders */ -// -// TextureFilterCaps, StretchRectFilterCaps -// +/* + * TextureFilterCaps, StretchRectFilterCaps + */ #define D3DPTFILTERCAPS_MINFPOINT 0x00000100L /* Min Filter */ #define D3DPTFILTERCAPS_MINFLINEAR 0x00000200L #define D3DPTFILTERCAPS_MINFANISOTROPIC 0x00000400L @@ -455,7 +447,7 @@ typedef struct _D3DCAPS9 #define D3DPTFILTERCAPS_CONVOLUTIONMONO 0x00040000L /* Min and Mag for the convolution mono filter */ -#endif // !D3D_DISABLE_9EX +#endif /* !D3D_DISABLE_9EX */ /* -- D3D9Ex only */ #define D3DPTFILTERCAPS_MAGFPOINT 0x01000000L /* Mag Filter */ @@ -464,9 +456,9 @@ typedef struct _D3DCAPS9 #define D3DPTFILTERCAPS_MAGFPYRAMIDALQUAD 0x08000000L #define D3DPTFILTERCAPS_MAGFGAUSSIANQUAD 0x10000000L -// -// TextureAddressCaps -// +/* + * TextureAddressCaps + */ #define D3DPTADDRESSCAPS_WRAP 0x00000001L #define D3DPTADDRESSCAPS_MIRROR 0x00000002L #define D3DPTADDRESSCAPS_CLAMP 0x00000004L @@ -474,9 +466,9 @@ typedef struct _D3DCAPS9 #define D3DPTADDRESSCAPS_INDEPENDENTUV 0x00000010L #define D3DPTADDRESSCAPS_MIRRORONCE 0x00000020L -// -// StencilCaps -// +/* + * StencilCaps + */ #define D3DSTENCILCAPS_KEEP 0x00000001L #define D3DSTENCILCAPS_ZERO 0x00000002L #define D3DSTENCILCAPS_REPLACE 0x00000004L @@ -487,9 +479,9 @@ typedef struct _D3DCAPS9 #define D3DSTENCILCAPS_DECR 0x00000080L #define D3DSTENCILCAPS_TWOSIDED 0x00000100L -// -// TextureOpCaps -// +/* + * TextureOpCaps + */ #define D3DTEXOPCAPS_DISABLE 0x00000001L #define D3DTEXOPCAPS_SELECTARG1 0x00000002L #define D3DTEXOPCAPS_SELECTARG2 0x00000004L @@ -517,16 +509,16 @@ typedef struct _D3DCAPS9 #define D3DTEXOPCAPS_MULTIPLYADD 0x01000000L #define D3DTEXOPCAPS_LERP 0x02000000L -// -// FVFCaps -// +/* + * FVFCaps + */ #define D3DFVFCAPS_TEXCOORDCOUNTMASK 0x0000ffffL /* mask for texture coordinate count field */ #define D3DFVFCAPS_DONOTSTRIPELEMENTS 0x00080000L /* Device prefers that vertex elements not be stripped */ #define D3DFVFCAPS_PSIZE 0x00100000L /* Device can receive point size */ -// -// VertexProcessingCaps -// +/* + * VertexProcessingCaps + */ #define D3DVTXPCAPS_TEXGEN 0x00000001L /* device can do texgen */ #define D3DVTXPCAPS_MATERIALSOURCE7 0x00000002L /* device can do DX7-level colormaterialsource ops */ #define D3DVTXPCAPS_DIRECTIONALLIGHTS 0x00000008L /* device can do directional lights */ @@ -537,9 +529,9 @@ typedef struct _D3DCAPS9 #define D3DVTXPCAPS_NO_TEXGEN_NONLOCALVIEWER 0x00000200L /* device does not support TexGen in non-local viewer mode */ -// -// DevCaps2 -// +/* + * DevCaps2 + */ #define D3DDEVCAPS2_STREAMOFFSET 0x00000001L /* Device supports offsets in streams. Must be set by DX9 drivers */ #define D3DDEVCAPS2_DMAPNPATCH 0x00000002L /* Device supports displacement maps for N-Patches*/ #define D3DDEVCAPS2_ADAPTIVETESSRTPATCH 0x00000004L /* Device supports adaptive tesselation of RT-patches*/ @@ -548,9 +540,9 @@ typedef struct _D3DCAPS9 #define D3DDEVCAPS2_PRESAMPLEDDMAPNPATCH 0x00000020L /* Device supports presampled displacement maps for N-Patches */ #define D3DDEVCAPS2_VERTEXELEMENTSCANSHARESTREAMOFFSET 0x00000040L /* Vertex elements in a vertex declaration can share the same stream offset */ -// -// DeclTypes -// +/* + * DeclTypes + */ #define D3DDTCAPS_UBYTE4 0x00000001L #define D3DDTCAPS_UBYTE4N 0x00000002L #define D3DDTCAPS_SHORT2N 0x00000004L diff --git a/gfx/include/d3d9types.h b/gfx/include/d3d9types.h index 80fabba9e8..b4b9a94ddf 100644 --- a/gfx/include/d3d9types.h +++ b/gfx/include/d3d9types.h @@ -565,25 +565,25 @@ typedef enum _D3DTEXTUREOP D3DTOP_MODULATE4X = 6, /* multiply and 2 bits */ /* Add */ - D3DTOP_ADD = 7, // add arguments together - D3DTOP_ADDSIGNED = 8, // add with -0.5 bias - D3DTOP_ADDSIGNED2X = 9, // as above but left 1 bit - D3DTOP_SUBTRACT = 10, // Arg1 - Arg2, with no saturation - D3DTOP_ADDSMOOTH = 11, // add 2 args, subtract product - // Arg1 + Arg2 - Arg1*Arg2 - // = Arg1 + (1-Arg1)*Arg2 + D3DTOP_ADD = 7, /* add arguments together */ + D3DTOP_ADDSIGNED = 8, /* add with -0.5 bias */ + D3DTOP_ADDSIGNED2X = 9, /* as above but left 1 bit */ + D3DTOP_SUBTRACT = 10, /* Arg1 - Arg2, with no saturation */ + D3DTOP_ADDSMOOTH = 11, /* add 2 args, subtract product */ + /* Arg1 + Arg2 - Arg1*Arg2 */ + /* = Arg1 + (1-Arg1)*Arg2 */ - // Linear alpha blend: Arg1*(Alpha) + Arg2*(1-Alpha) - D3DTOP_BLENDDIFFUSEALPHA = 12, // iterated alpha - D3DTOP_BLENDTEXTUREALPHA = 13, // texture alpha - D3DTOP_BLENDFACTORALPHA = 14, // alpha from D3DRS_TEXTUREFACTOR + /* Linear alpha blend: Arg1*(Alpha) + Arg2*(1-Alpha) */ + D3DTOP_BLENDDIFFUSEALPHA = 12, /* iterated alpha */ + D3DTOP_BLENDTEXTUREALPHA = 13, /* texture alpha */ + D3DTOP_BLENDFACTORALPHA = 14, /* alpha from D3DRS_TEXTUREFACTOR */ - // Linear alpha blend with pre-multiplied arg1 input: Arg1 + Arg2*(1-Alpha) - D3DTOP_BLENDTEXTUREALPHAPM = 15, // texture alpha - D3DTOP_BLENDCURRENTALPHA = 16, // by alpha of current color + /* Linear alpha blend with pre-multiplied arg1 input: Arg1 + Arg2*(1-Alpha) */ + D3DTOP_BLENDTEXTUREALPHAPM = 15, /* texture alpha */ + D3DTOP_BLENDCURRENTALPHA = 16, /* by alpha of current color */ - // Specular mapping - D3DTOP_PREMODULATE = 17, // modulate with next texture before use + /* Specular mapping */ + D3DTOP_PREMODULATE = 17, /* modulate with next texture before use */ D3DTOP_MODULATEALPHA_ADDCOLOR = 18, // Arg1.RGB + Arg1.A*Arg2.RGB // COLOROP only D3DTOP_MODULATECOLOR_ADDALPHA = 19, // Arg1.RGB*Arg2.RGB + Arg1.A @@ -1601,10 +1601,11 @@ typedef enum _D3DRESOURCETYPE { #endif /* !D3D_DISABLE_9EX */ /* -- D3D9Ex only */ -// When passed to CheckDeviceFormat, D3DUSAGE_AUTOGENMIPMAP may return -// D3DOK_NOAUTOGEN if the device doesn't support autogeneration for that format. -// D3DOK_NOAUTOGEN is a success code, not a failure code... the SUCCEEDED and FAILED macros -// will return true and false respectively for this code. +/* When passed to CheckDeviceFormat, D3DUSAGE_AUTOGENMIPMAP may return + * D3DOK_NOAUTOGEN if the device doesn't support autogeneration for that format. + * D3DOK_NOAUTOGEN is a success code, not a failure code... the SUCCEEDED and FAILED macros + * will return true and false respectively for this code. + */ #define D3DUSAGE_AUTOGENMIPMAP (0x00000400L) #define D3DUSAGE_DMAP (0x00004000L) diff --git a/gfx/video_driver.c b/gfx/video_driver.c index d06252fb90..c4174e6726 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -46,10 +46,6 @@ #include "../menu/menu_setting.h" #endif -#ifdef HAVE_OPENGL -#include "common/gl_common.h" -#endif - #include "video_thread_wrapper.h" #include "video_driver.h" diff --git a/gfx/video_driver.h b/gfx/video_driver.h index 6836ede817..43bbef97ca 100644 --- a/gfx/video_driver.h +++ b/gfx/video_driver.h @@ -838,60 +838,77 @@ typedef struct d3d_renderchain_driver typedef struct gl_renderchain_driver { void (*set_coords)(void *handle_data, + void *chain_data, void *shader_data, const struct video_coords *coords); - void (*set_mvp)(void *data, void *shader_data, + void (*set_mvp)(void *data, + void *chain_data, + void *shader_data, const void *mat_data); void (*init_texture_reference)( - void *data, unsigned i, + void *data, void *chain_data, unsigned i, unsigned internal_fmt, unsigned texture_fmt, unsigned texture_type); - void (*fence_iterate)(void *data, unsigned hard_sync_frames); - void (*fence_free)(void *data); + void (*fence_iterate)(void *data, void *chain_data, + unsigned hard_sync_frames); + void (*fence_free)(void *data, void *chain_data); void (*readback)(void *data, + void *chain_data, unsigned alignment, unsigned fmt, unsigned type, void *src); void (*init_pbo)(unsigned size, const void *data); void (*bind_pbo)(unsigned idx); - void (*unbind_pbo)(void); + void (*unbind_pbo)(void *data, void *chain_data); void (*copy_frame)( void *data, + void *chain_data, video_frame_info_t *video_info, const void *frame, unsigned width, unsigned height, unsigned pitch); - void (*restore_default_state)(void *data); - void (*new_vao)(void *data); - void (*free_vao)(void *data); - void (*bind_vao)(void *data); - void (*unbind_vao)(void *data); - void (*disable_client_arrays)(void); + void (*restore_default_state)(void *data, void *chain_data); + void (*new_vao)(void *data, void *chain_data); + void (*free_vao)(void *data, void *chain_data); + void (*bind_vao)(void *data, void *chain_data); + void (*unbind_vao)(void *data, void *chain_data); + void (*disable_client_arrays)(void *data, void *chain_data); void (*ff_vertex)(const void *data); void (*ff_matrix)(const void *data); - void (*bind_backbuffer)(void); - void (*deinit_fbo)(void *data); + void (*bind_backbuffer)(void *data, void *chain_data); + void (*deinit_fbo)(void *data, void *chain_data); void (*viewport_info)( - void *data, struct video_viewport *vp); + void *data, void *chain_data, struct video_viewport *vp); bool (*read_viewport)( - void *data, uint8_t *buffer, bool is_idle); + void *data, void *chain_data, uint8_t *buffer, bool is_idle); void (*bind_prev_texture)( void *data, + void *chain_data, const struct video_tex_info *tex_info); - void (*chain_free)(void *data); + void (*chain_free)(void *data, void *chain_data); void *(*chain_new)(void); - void (*init)(void *data, unsigned fbo_width, unsigned fbo_height); - bool (*init_hw_render)(void *data, unsigned width, unsigned height); - void (*free)(void *data); - void (*deinit_hw_render)(void *data); - void (*start_render)(void *data, video_frame_info_t *video_info); - void (*check_fbo_dimensions)(void *data); + void (*init)(void *data, void *chain_data, + unsigned fbo_width, unsigned fbo_height); + bool (*init_hw_render)(void *data, void *chain_data, + unsigned width, unsigned height); + void (*free)(void *data, void *chain_data); + void (*deinit_hw_render)(void *data, void *chain_data); + void (*start_render)(void *data, void *chain_data, + video_frame_info_t *video_info); + void (*check_fbo_dimensions)(void *data, void *chain_data); void (*recompute_pass_sizes)(void *data, + void *chain_data, unsigned width, unsigned height, unsigned vp_width, unsigned vp_height); void (*renderchain_render)(void *data, + void *chain_data, video_frame_info_t *video_info, uint64_t frame_count, const struct video_tex_info *tex_info, const struct video_tex_info *feedback_info); + void (*resolve_extensions)( + void *data, + void *chain_data, + const char *context_ident, + const video_info_t *video); const char *ident; } gl_renderchain_driver_t; diff --git a/griffin/griffin.c b/griffin/griffin.c index 2bbb31a47b..8ac7762892 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -58,6 +58,7 @@ COMPATIBILITY #endif #include "../libretro-common/compat/compat_fnmatch.c" +#include "../libretro-common/compat/fopen_utf8.c" #include "../libretro-common/memmap/memalign.c" /*============================================================ diff --git a/input/connect/connect_nesusb.c b/input/connect/connect_nesusb.c index 24c5f0532e..bf21fbb901 100644 --- a/input/connect/connect_nesusb.c +++ b/input/connect/connect_nesusb.c @@ -62,11 +62,12 @@ static void hidpad_nesusb_deinit(void *data) static void hidpad_nesusb_get_buttons(void *data, retro_bits_t* state) { struct hidpad_nesusb_data *device = (struct hidpad_nesusb_data*)data; - if (device) { - RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (device) + { + BITS_COPY16_PTR(state, device->buttons); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t hidpad_nesusb_get_axis(void *data, unsigned axis) diff --git a/input/connect/connect_ps2adapter.c b/input/connect/connect_ps2adapter.c index 78c3cf9c92..87b174bd4e 100644 --- a/input/connect/connect_ps2adapter.c +++ b/input/connect/connect_ps2adapter.c @@ -62,11 +62,12 @@ static void hidpad_ps2adapter_deinit(void *data) static void hidpad_ps2adapter_get_buttons(void *data, retro_bits_t *state) { struct hidpad_ps2adapter_data *device = (struct hidpad_ps2adapter_data*)data; - if ( device ) { - RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (device) + { + BITS_COPY16_PTR(state, device->buttons); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t hidpad_ps2adapter_get_axis(void *data, unsigned axis) diff --git a/input/connect/connect_ps3.c b/input/connect/connect_ps3.c index 422a1b02a2..7e96e5a7f4 100644 --- a/input/connect/connect_ps3.c +++ b/input/connect/connect_ps3.c @@ -111,17 +111,14 @@ static void hidpad_ps3_get_buttons(void *data, retro_bits_t *state) if ( device ) { /*copy first 16 bits - standard RetroPad controls*/ - RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); + BITS_COPY16_PTR(state, device->buttons); /*PS button?*/ - if ( device->buttons & 0x10000 ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RARCH_MENU_TOGGLE ); - } + if (device->buttons & 0x10000) + BIT256_SET_PTR(state, RARCH_MENU_TOGGLE); } else - { - RARCH_INPUT_STATE_CLEAR_PTR( state ); - } + BIT256_CLEAR_ALL_PTR(state); } static int16_t hidpad_ps3_get_axis(void *data, unsigned axis) diff --git a/input/connect/connect_ps4.c b/input/connect/connect_ps4.c index 47a9cdabe6..dcdd88a41e 100644 --- a/input/connect/connect_ps4.c +++ b/input/connect/connect_ps4.c @@ -20,6 +20,7 @@ #include #include +#include #include "joypad_connection.h" #include "../input_defines.h" @@ -187,64 +188,48 @@ static bool hidpad_ps4_check_dpad(struct ps4 *rpt, unsigned id) static void hidpad_ps4_get_buttons(void *data, retro_bits_t* state) { struct hidpad_ps4_data *device = (struct hidpad_ps4_data*)data; - struct ps4 *rpt = device ? (struct ps4*)&device->data : NULL; + struct ps4 *rpt = device ? + (struct ps4*)&device->data : NULL; if (!device || !rpt) return; - RARCH_INPUT_STATE_CLEAR_PTR( state ); + BIT256_CLEAR_ALL_PTR( state ); - if ( rpt->btn.r3 ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R3 ); - } - if ( rpt->btn.l3 ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L3 ); - } - if ( rpt->btn.options ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_START ); - } - if ( rpt->btn.share ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_SELECT ); - } - if ( rpt->btn.r2 ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R2 ); - } - if ( rpt->btn.l2 ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L2 ); - } - if ( rpt->btn.r1 ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R ); - } - if ( rpt->btn.l1 ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L ); - } - if ( rpt->btn.triangle ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_X ); - } - if ( rpt->btn.circle ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_A ); - } - if ( rpt->btn.cross ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_B ); - } - if ( rpt->btn.square ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_Y ); - } - if ( (hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_LEFT)) ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_LEFT ); - } - if ( (hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_DOWN)) ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_DOWN ); - } - if ( (hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_RIGHT)) ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_RIGHT ); - } - if ( (hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_UP)) ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_UP ); - } - if ( rpt->btn.ps ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RARCH_MENU_TOGGLE ); - } + if (rpt->btn.r3) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R3 ); + if (rpt->btn.l3) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L3 ); + if (rpt->btn.options) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_START ); + if ( rpt->btn.share) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_SELECT ); + if ( rpt->btn.r2) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R2 ); + if (rpt->btn.l2) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L2 ); + if (rpt->btn.r1) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R ); + if (rpt->btn.l1) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L ); + if (rpt->btn.triangle) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_X ); + if (rpt->btn.circle) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_A ); + if (rpt->btn.cross) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_B ); + if (rpt->btn.square) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_Y ); + if ((hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_LEFT))) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_LEFT ); + if ((hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_DOWN))) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_DOWN ); + if ((hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_RIGHT))) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_RIGHT ); + if ((hidpad_ps4_check_dpad(rpt, RETRO_DEVICE_ID_JOYPAD_UP))) + BIT256_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_UP ); + if (rpt->btn.ps) + BIT256_SET_PTR( state, RARCH_MENU_TOGGLE ); } static int16_t hidpad_ps4_get_axis(void *data, unsigned axis) diff --git a/input/connect/connect_psxadapter.c b/input/connect/connect_psxadapter.c index 6f77e77f72..b9d2e7f9ba 100644 --- a/input/connect/connect_psxadapter.c +++ b/input/connect/connect_psxadapter.c @@ -62,11 +62,12 @@ static void hidpad_psxadapter_deinit(void *data) static void hidpad_psxadapter_get_buttons(void *data, retro_bits_t *state) { struct hidpad_psxadapter_data *device = (struct hidpad_psxadapter_data*)data; - if ( device ) { - RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (device) + { + BITS_COPY16_PTR(state, device->buttons); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t hidpad_psxadapter_get_axis(void *data, unsigned axis) diff --git a/input/connect/connect_snesusb.c b/input/connect/connect_snesusb.c index bbc9fb43a4..62759b51fb 100644 --- a/input/connect/connect_snesusb.c +++ b/input/connect/connect_snesusb.c @@ -63,11 +63,12 @@ static void hidpad_snesusb_deinit(void *data) static void hidpad_snesusb_get_buttons(void *data, retro_bits_t *state) { struct hidpad_snesusb_data *device = (struct hidpad_snesusb_data*)data; - if ( device ) { - RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (device) + { + BITS_COPY16_PTR(state, device->buttons); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t hidpad_snesusb_get_axis(void *data, unsigned axis) diff --git a/input/connect/connect_wii.c b/input/connect/connect_wii.c index ec4ceaaa72..83ac50d736 100644 --- a/input/connect/connect_wii.c +++ b/input/connect/connect_wii.c @@ -677,9 +677,9 @@ static void hidpad_wii_get_buttons(void *data, retro_bits_t *state) struct connect_wii_wiimote_t* device = (struct connect_wii_wiimote_t*)data; if ( device ) { - uint32_t b; - b = device->btns | (device->exp.cc.classic.btns << 16); /*broken? this doesn't match retropad!!*/ - RARCH_INPUT_STATE_COPY32_PTR(state, b); + /* TODO/FIXME - Broken? this doesn't match retropad! */ + uint32_t b = device->btns | (device->exp.cc.classic.btns << 16); + BITS_COPY32_PTR(state, b); } } diff --git a/input/connect/connect_wiiugca.c b/input/connect/connect_wiiugca.c index 0f368e01fe..5705a7acdf 100644 --- a/input/connect/connect_wiiugca.c +++ b/input/connect/connect_wiiugca.c @@ -66,11 +66,12 @@ static void hidpad_wiiugca_deinit(void *data) static void hidpad_wiiugca_get_buttons(void *data, retro_bits_t *state) { struct hidpad_wiiugca_data *device = (struct hidpad_wiiugca_data*)data; - if ( device ) { - RARCH_INPUT_STATE_COPY16_PTR(state, device->buttons); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (device) + { + BITS_COPY16_PTR(state, device->buttons); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t hidpad_wiiugca_get_axis(void *data, unsigned axis) diff --git a/input/connect/connect_wiiupro.c b/input/connect/connect_wiiupro.c index d380e119a0..6356fc94fa 100644 --- a/input/connect/connect_wiiupro.c +++ b/input/connect/connect_wiiupro.c @@ -121,64 +121,48 @@ static void hidpad_wiiupro_deinit(void *data) static void hidpad_wiiupro_get_buttons(void *data, retro_bits_t *state) { struct hidpad_wiiupro_data *device = (struct hidpad_wiiupro_data*)data; - struct wiiupro *rpt = device ? (struct wiiupro*)&device->data : NULL; + struct wiiupro *rpt = device ? + (struct wiiupro*)&device->data : NULL; if (!device || !rpt) return; - RARCH_INPUT_STATE_CLEAR_PTR( state ); + BIT256_CLEAR_ALL_PTR(state); - if ( rpt->btn.r3 ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R3 ); - } - if ( rpt->btn.l3 ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L3 ); - } - if ( rpt->btn.plus ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_START ); - } - if ( rpt->btn.minus ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_SELECT ); - } - if ( rpt->btn.zr ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R2 ); - } - if ( rpt->btn.zl ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L2 ); - } - if ( rpt->btn.r ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_R ); - } - if ( rpt->btn.l ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_L ); - } - if ( rpt->btn.x ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_X ); - } - if ( rpt->btn.a ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_A ); - } - if ( rpt->btn.b ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_B ); - } - if ( rpt->btn.y ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_Y ); - } - if ( rpt->btn.left ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_LEFT ); - } - if ( rpt->btn.down ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_DOWN ); - } - if ( rpt->btn.right ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_RIGHT ); - } - if ( rpt->btn.up ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RETRO_DEVICE_ID_JOYPAD_UP ); - } - if ( rpt->btn.home ) { - RARCH_INPUT_STATE_BIT_SET_PTR( state, RARCH_MENU_TOGGLE ); - } + if (rpt->btn.r3) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_R3); + if (rpt->btn.l3) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_L3); + if (rpt->btn.plus) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_START); + if ( rpt->btn.minus) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_SELECT); + if ( rpt->btn.zr) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_R2); + if ( rpt->btn.zl) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_L2); + if ( rpt->btn.r) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_R); + if ( rpt->btn.l) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_L); + if ( rpt->btn.x) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_X); + if ( rpt->btn.a) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_A); + if ( rpt->btn.b) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_B); + if ( rpt->btn.y) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_Y); + if ( rpt->btn.left) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_LEFT); + if ( rpt->btn.down) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_DOWN); + if ( rpt->btn.right) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_RIGHT); + if ( rpt->btn.up) + BIT256_SET_PTR(state, RETRO_DEVICE_ID_JOYPAD_UP); + if ( rpt->btn.home) + BIT256_SET_PTR(state, RARCH_MENU_TOGGLE); } static int16_t hidpad_wiiupro_get_axis(void *data, unsigned axis) diff --git a/input/connect/joypad_connection.c b/input/connect/joypad_connection.c index 18ae10612d..90cb9cf06b 100644 --- a/input/connect/joypad_connection.c +++ b/input/connect/joypad_connection.c @@ -175,11 +175,10 @@ void pad_connection_packet(joypad_connection_t *joyconn, uint32_t pad, void pad_connection_get_buttons(joypad_connection_t *joyconn, unsigned pad, retro_bits_t* state) { - if (joyconn->iface) { + if (joyconn->iface) joyconn->iface->get_buttons(joyconn->data, state); - } else { - RARCH_INPUT_STATE_CLEAR_PTR( state ); - } + else + BIT256_CLEAR_ALL_PTR( state ); } int16_t pad_connection_get_axis(joypad_connection_t *joyconn, diff --git a/input/drivers/cocoa_input.c b/input/drivers/cocoa_input.c index ceeaf417b1..f14932ab23 100644 --- a/input/drivers/cocoa_input.c +++ b/input/drivers/cocoa_input.c @@ -17,14 +17,17 @@ #include #include +#include + #ifdef HAVE_CONFIG_H #include "../../config.h" #endif #include "../input_driver.h" - #include "../input_keymaps.h" + #include "cocoa_input.h" + #include "../../gfx/video_driver.h" #include "../../driver.h" @@ -56,7 +59,7 @@ static int cocoa_input_find_any_button_ret(cocoa_input_data_t *apple, if (state) for (i = 0; i < 256; i++) - if (RARCH_INPUT_STATE_BIT_GET_PTR(state,i)) + if (BIT256_GET_PTR(state,i)) return i; return -1; } diff --git a/input/drivers/wiiu_input.c b/input/drivers/wiiu_input.c index 7cb9444b3c..7bf5a752e0 100644 --- a/input/drivers/wiiu_input.c +++ b/input/drivers/wiiu_input.c @@ -107,8 +107,8 @@ static int16_t wiiu_pointer_device_state(wiiu_input_t* wiiu, unsigned id) case RETRO_DEVICE_ID_POINTER_PRESSED: { retro_bits_t state; - wiiu->joypad->get_buttons(0,&state); - return RARCH_INPUT_STATE_BIT_GET(state, VPAD_BUTTON_TOUCH) ? 1 : 0; + wiiu->joypad->get_buttons(0, &state); + return BIT256_GET(state, VPAD_BUTTON_TOUCH) ? 1 : 0; } case RETRO_DEVICE_ID_POINTER_X: return wiiu->joypad->axis(0, 0xFFFF0004UL); diff --git a/input/drivers/winraw_input.c b/input/drivers/winraw_input.c index 31f86cadb5..fa6011291d 100644 --- a/input/drivers/winraw_input.c +++ b/input/drivers/winraw_input.c @@ -356,9 +356,8 @@ static bool winraw_keyboard_pressed(winraw_input_t *wr, unsigned key) static bool winraw_mbutton_pressed(winraw_input_t *wr, unsigned port, unsigned key) { unsigned i; - bool result; winraw_mouse_t *mouse = NULL; - settings_t *settings = config_get_ptr(); + settings_t *settings = config_get_ptr(); if (port >= MAX_USERS) return false; diff --git a/input/drivers_hid/btstack_hid.c b/input/drivers_hid/btstack_hid.c index 83eec68c61..9946e1f6dc 100644 --- a/input/drivers_hid/btstack_hid.c +++ b/input/drivers_hid/btstack_hid.c @@ -27,6 +27,7 @@ #endif #include +#include #include #ifdef HAVE_DYNAMIC #include @@ -1369,7 +1370,7 @@ static void btstack_hid_joypad_get_buttons(void *data, unsigned port, retro_bits if (hid) pad_connection_get_buttons(&hid->slots[port], port, state); else - RARCH_INPUT_STATE_CLEAR_PTR(state); + BIT256_CLEAR_ALL_PTR(state); } static bool btstack_hid_joypad_button(void *data, unsigned port, uint16_t joykey) @@ -1383,7 +1384,7 @@ static bool btstack_hid_joypad_button(void *data, unsigned port, uint16_t joykey /* Check the button. */ if ((port < MAX_USERS) && (joykey < 32)) - return (RARCH_INPUT_STATE_BIT_GET(buttons, joykey) != 0); + return (BIT256_GET(buttons, joykey) != 0); return false; } diff --git a/input/drivers_hid/iohidmanager_hid.c b/input/drivers_hid/iohidmanager_hid.c index aac33afd56..8f4e0cb71b 100644 --- a/input/drivers_hid/iohidmanager_hid.c +++ b/input/drivers_hid/iohidmanager_hid.c @@ -114,7 +114,7 @@ static void iohidmanager_hid_joypad_get_buttons(void *data, unsigned port, retro if (hid) return pad_connection_get_buttons(&hid->slots[port], port, state); else - RARCH_INPUT_STATE_CLEAR_PTR(state); + BIT256_CLEAR_ALL_PTR(state); } static bool iohidmanager_hid_joypad_button(void *data, @@ -150,7 +150,7 @@ static bool iohidmanager_hid_joypad_button(void *data, /* Check the button. */ if ((port < MAX_USERS) && (joykey < 32)) - return (RARCH_INPUT_STATE_BIT_GET(buttons, joykey) != 0) + return (BIT256_GET(buttons, joykey) != 0) || ((hid->buttons[port] & (1 << joykey)) != 0); return false; diff --git a/input/drivers_hid/libusb_hid.c b/input/drivers_hid/libusb_hid.c index 257b4819cc..f2fd6d0bca 100644 --- a/input/drivers_hid/libusb_hid.c +++ b/input/drivers_hid/libusb_hid.c @@ -447,9 +447,12 @@ static void libusb_hid_joypad_get_buttons(void *data, unsigned port, retro_bits_ { libusb_hid_t *hid = (libusb_hid_t*)data; if (hid) - return pad_connection_get_buttons(&hid->slots[port], port, state); - else - RARCH_INPUT_STATE_CLEAR_PTR(state); + { + pad_connection_get_buttons(&hid->slots[port], port, state); + return; + } + + BIT256_CLEAR_ALL_PTR(state); } static bool libusb_hid_joypad_button(void *data, @@ -464,7 +467,7 @@ static bool libusb_hid_joypad_button(void *data, /* Check the button. */ if ((port < MAX_USERS) && (joykey < 32)) - return (RARCH_INPUT_STATE_BIT_GET(buttons, joykey) != 0); + return (BIT256_GET(buttons, joykey) != 0); return false; } diff --git a/input/drivers_hid/null_hid.c b/input/drivers_hid/null_hid.c index 34f8bdb7d6..ce657d8b90 100644 --- a/input/drivers_hid/null_hid.c +++ b/input/drivers_hid/null_hid.c @@ -43,7 +43,7 @@ static void null_hid_joypad_get_buttons(void *data, unsigned port, retro_bits_t (void)data; (void)port; - RARCH_INPUT_STATE_CLEAR_PTR(state); + BIT256_CLEAR_ALL_PTR(state); } static bool null_hid_joypad_button(void *data, unsigned port, uint16_t joykey) diff --git a/input/drivers_hid/wiiusb_hid.c b/input/drivers_hid/wiiusb_hid.c index 3f0fdb282c..e50657c64d 100644 --- a/input/drivers_hid/wiiusb_hid.c +++ b/input/drivers_hid/wiiusb_hid.c @@ -482,9 +482,11 @@ static void wiiusb_hid_joypad_get_buttons(void *data, unsigned port, retro_bits_ { wiiusb_hid_t *hid = (wiiusb_hid_t*)data; if (hid) - return pad_connection_get_buttons(&hid->connections[port], port, state); - else - RARCH_INPUT_STATE_CLEAR_PTR(state); + { + pad_connection_get_buttons(&hid->connections[port], port, state); + return; + } + BIT256_CLEAR_ALL_PTR(state); } static bool wiiusb_hid_joypad_button(void *data, unsigned port, uint16_t joykey) @@ -499,7 +501,7 @@ static bool wiiusb_hid_joypad_button(void *data, unsigned port, uint16_t joykey) /* Check the button. */ if ((port < MAX_USERS) && (joykey < 32)) - return (RARCH_INPUT_STATE_BIT_GET(buttons, joykey) != 0); + return (BIT256_GET(buttons, joykey) != 0); return false; } diff --git a/input/drivers_joypad/ctr_joypad.c b/input/drivers_joypad/ctr_joypad.c index a31a7511fe..711b88493d 100644 --- a/input/drivers_joypad/ctr_joypad.c +++ b/input/drivers_joypad/ctr_joypad.c @@ -72,11 +72,12 @@ static bool ctr_joypad_button(unsigned port_num, uint16_t key) static void ctr_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - if ( port_num < MAX_PADS ) { - RARCH_INPUT_STATE_COPY16_PTR( state, pad_state ); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if ( port_num < MAX_PADS ) + { + BITS_COPY16_PTR( state, pad_state ); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t ctr_joypad_axis(unsigned port_num, uint32_t joyaxis) diff --git a/input/drivers_joypad/gx_joypad.c b/input/drivers_joypad/gx_joypad.c index 318eb637ed..392cb602a9 100644 --- a/input/drivers_joypad/gx_joypad.c +++ b/input/drivers_joypad/gx_joypad.c @@ -164,11 +164,12 @@ static bool gx_joypad_button(unsigned port, uint16_t key) static void gx_joypad_get_buttons(unsigned port, retro_bits_t *state) { - if ( port < MAX_PADS ) { - RARCH_INPUT_STATE_COPY16_PTR( state, pad_state[port] ); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (port < MAX_PADS) + { + BITS_COPY16_PTR( state, pad_state[port] ); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t gx_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/hid_joypad.c b/input/drivers_joypad/hid_joypad.c index eaed7efbed..203a272922 100644 --- a/input/drivers_joypad/hid_joypad.c +++ b/input/drivers_joypad/hid_joypad.c @@ -57,11 +57,10 @@ static bool hid_joypad_button(unsigned port, uint16_t joykey) static void hid_joypad_get_buttons(unsigned port, retro_bits_t *state) { - if (generic_hid && generic_hid->get_buttons) { + if (generic_hid && generic_hid->get_buttons) generic_hid->get_buttons((void*)hid_driver_get_data(), port, state); - } else { - RARCH_INPUT_STATE_CLEAR_PTR( state ); - } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t hid_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/linuxraw_joypad.c b/input/drivers_joypad/linuxraw_joypad.c index 212aeb8adc..4d852f406b 100644 --- a/input/drivers_joypad/linuxraw_joypad.c +++ b/input/drivers_joypad/linuxraw_joypad.c @@ -329,11 +329,12 @@ static bool linuxraw_joypad_button(unsigned port, uint16_t joykey) static void linuxraw_joypad_get_buttons(unsigned port, retro_bits_t *state) { const struct linuxraw_joypad *pad = (const struct linuxraw_joypad*)&linuxraw_pads[port]; - if ( pad ) { - RARCH_INPUT_STATE_COPY16_PTR(state, pad->buttons); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (pad) + { + BITS_COPY16_PTR(state, pad->buttons); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t linuxraw_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/mfi_joypad.m b/input/drivers_joypad/mfi_joypad.m index 10964893f0..94f56b2147 100644 --- a/input/drivers_joypad/mfi_joypad.m +++ b/input/drivers_joypad/mfi_joypad.m @@ -223,7 +223,7 @@ static bool apple_gamecontroller_joypad_button(unsigned port, uint16_t joykey) static void apple_gamecontroller_joypad_get_buttons(unsigned port, retro_bits_t *state) { - RARCH_INPUT_STATE_COPY16_PTR(state, mfi_buttons[port]); + BITS_COPY16_PTR(state, mfi_buttons[port]); } static int16_t apple_gamecontroller_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/null_joypad.c b/input/drivers_joypad/null_joypad.c index d364433e06..058d01d5b3 100644 --- a/input/drivers_joypad/null_joypad.c +++ b/input/drivers_joypad/null_joypad.c @@ -39,7 +39,7 @@ static bool null_joypad_button(unsigned port_num, uint16_t joykey) static void null_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - RARCH_INPUT_STATE_CLEAR_PTR( state ); + BIT256_CLEAR_ALL_PTR(state); } static int16_t null_joypad_axis(unsigned port_num, uint32_t joyaxis) diff --git a/input/drivers_joypad/parport_joypad.c b/input/drivers_joypad/parport_joypad.c index 062e6dd958..e236a36fc5 100644 --- a/input/drivers_joypad/parport_joypad.c +++ b/input/drivers_joypad/parport_joypad.c @@ -343,11 +343,12 @@ static bool parport_joypad_button(unsigned port, uint16_t joykey) static void parport_joypad_get_buttons(unsigned port, retro_bits_t *state) { const struct parport_joypad *pad = (const struct parport_joypad*)&parport_pads[port]; - if ( pad ) { - RARCH_INPUT_STATE_COPY16_PTR(state, pad->buttons); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (pad) + { + BITS_COPY16_PTR(state, pad->buttons); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t parport_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/ps3_joypad.c b/input/drivers_joypad/ps3_joypad.c index c14277924c..a85a23fcf9 100644 --- a/input/drivers_joypad/ps3_joypad.c +++ b/input/drivers_joypad/ps3_joypad.c @@ -70,11 +70,12 @@ static bool ps3_joypad_button(unsigned port_num, uint16_t joykey) static void ps3_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - if ( port_num < MAX_PADS ) { - RARCH_INPUT_STATE_COPY16_PTR( state, pad_state[port_num] ); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (port_num < MAX_PADS) + { + BITS_COPY16_PTR( state, pad_state[port_num] ); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t ps3_joypad_axis(unsigned port_num, uint32_t joyaxis) diff --git a/input/drivers_joypad/psp_joypad.c b/input/drivers_joypad/psp_joypad.c index 967e9092e8..d9cb4dd65a 100644 --- a/input/drivers_joypad/psp_joypad.c +++ b/input/drivers_joypad/psp_joypad.c @@ -126,11 +126,12 @@ static bool psp_joypad_button(unsigned port_num, uint16_t key) static void psp_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - if ( port_num < PSP_MAX_PADS ) { - RARCH_INPUT_STATE_COPY16_PTR( state, pad_state[port_num] ); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (port_num < PSP_MAX_PADS) + { + BITS_COPY16_PTR( state, pad_state[port_num] ); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t psp_joypad_axis(unsigned port_num, uint32_t joyaxis) diff --git a/input/drivers_joypad/udev_joypad.c b/input/drivers_joypad/udev_joypad.c index 3aa6ba092a..20ee084ec8 100644 --- a/input/drivers_joypad/udev_joypad.c +++ b/input/drivers_joypad/udev_joypad.c @@ -607,11 +607,12 @@ static bool udev_joypad_button(unsigned port, uint16_t joykey) static void udev_joypad_get_buttons(unsigned port, retro_bits_t *state) { const struct udev_joypad *pad = (const struct udev_joypad*)&udev_pads[port]; - if ( pad ) { - RARCH_INPUT_STATE_COPY16_PTR( state, pad->buttons ); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (pad) + { + BITS_COPY16_PTR( state, pad->buttons ); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t udev_joypad_axis(unsigned port, uint32_t joyaxis) diff --git a/input/drivers_joypad/wiiu_joypad.c b/input/drivers_joypad/wiiu_joypad.c index ed62f14e09..b7c46b995f 100644 --- a/input/drivers_joypad/wiiu_joypad.c +++ b/input/drivers_joypad/wiiu_joypad.c @@ -137,11 +137,12 @@ static bool wiiu_joypad_button(unsigned port_num, uint16_t key) static void wiiu_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - if ( port_num < MAX_PADS ) { - RARCH_INPUT_STATE_COPY16_PTR( state, pad_state[port_num] ); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (port_num < MAX_PADS) + { + BITS_COPY16_PTR( state, pad_state[port_num] ); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t wiiu_joypad_axis(unsigned port_num, uint32_t joyaxis) diff --git a/input/drivers_joypad/xdk_joypad.c b/input/drivers_joypad/xdk_joypad.c index b9e25268b4..517ddaa972 100644 --- a/input/drivers_joypad/xdk_joypad.c +++ b/input/drivers_joypad/xdk_joypad.c @@ -78,11 +78,12 @@ static bool xdk_joypad_button(unsigned port_num, uint16_t joykey) static void xdk_joypad_get_buttons(unsigned port_num, retro_bits_t *state) { - if ( port_num < MAX_PADS ) { - RARCH_INPUT_STATE_COPY16_PTR( state, pad_state[port_num] ); - } else { - RARCH_INPUT_STATE_CLEAR_PTR(state); + if (port_num < MAX_PADS) + { + BITS_COPY16_PTR( state, pad_state[port_num] ); } + else + BIT256_CLEAR_ALL_PTR(state); } static int16_t xdk_joypad_axis(unsigned port_num, uint32_t joyaxis) diff --git a/input/input_defines.h b/input/input_defines.h index fa697c54a4..b005e90f58 100644 --- a/input/input_defines.h +++ b/input/input_defines.h @@ -158,30 +158,6 @@ enum analog_dpad_mode #define GET_HAT_DIR(x) (x & HAT_MASK) #define GET_HAT(x) (x & (~HAT_MASK)) -#define RARCH_INPUT_STATE_BIT_SET(a,bit) ((a).data [((bit) >> 5)] |= (1 << ((bit) & 31))) -#define RARCH_INPUT_STATE_BIT_SET_PTR(a,bit) ((a)->data[((bit) >> 5)] |= (1 << ((bit) & 31))) -#define RARCH_INPUT_STATE_BIT_GET(a,bit) ((a).data [((bit) >> 5)] & (1 << ((bit) & 31))) -#define RARCH_INPUT_STATE_BIT_GET_PTR(a,bit) ((a)->data[((bit) >> 5)] & (1 << ((bit) & 31))) -#define RARCH_INPUT_STATE_CLEAR(a) memset(&a, 0, sizeof(a)); -#define RARCH_INPUT_STATE_CLEAR_PTR(a) memset(a, 0, sizeof(retro_bits_t)); -#define RARCH_INPUT_STATE_ANY_SET(a) ( ((a).data[0])||((a).data[1])||((a).data[2])||((a).data[3])|| \ - ((a).data[4])||((a).data[5])||((a).data[6])||((a).data[7]) ) -#define RARCH_INPUT_STATE_ANY_SET_PTR(a) ( ((a)->data[0])||((a)->data[1])||((a)->data[2])||((a)->data[3])|| \ - ((a)->data[4])||((a)->data[5])||((a)->data[6])||((a)->data[7]) ) -#define RARCH_INPUT_STATE_CLEAR_BITS(a,b) \ - ((a).data[0])&=(~((b).data[0])); \ - ((a).data[1])&=(~((b).data[1])); \ - ((a).data[2])&=(~((b).data[2])); \ - ((a).data[3])&=(~((b).data[3])); \ - ((a).data[4])&=(~((b).data[4])); \ - ((a).data[5])&=(~((b).data[5])); \ - ((a).data[6])&=(~((b).data[6])); \ - ((a).data[7])&=(~((b).data[7])); - -#define RARCH_INPUT_STATE_COPY16_PTR(a,bits) {memset(a, 0, sizeof(retro_bits_t));((a)->data[0] = (bits)&0xffff);} -#define RARCH_INPUT_STATE_COPY32_PTR(a,bits) {memset(a, 0, sizeof(retro_bits_t));((a)->data[0] = (bits));} - - RETRO_END_DECLS #endif diff --git a/input/input_driver.c b/input/input_driver.c index abfba95a91..d17fb5fc61 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -806,8 +806,11 @@ void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) uint8_t port_max = settings->bools.input_all_users_control_menu ? max_users : 1; + + joypad_info.joy_idx = 0; + joypad_info.auto_binds = NULL; - RARCH_INPUT_STATE_CLEAR_PTR( p_new_state ); + BIT256_CLEAR_ALL_PTR(p_new_state); input_driver_block_libretro_input = false; input_driver_block_hotkey = false; @@ -909,7 +912,7 @@ void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) if (pressed) { - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); + BIT256_SET_PTR(p_new_state, i); continue; } } @@ -919,7 +922,7 @@ void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) { if (current_input->meta_key_pressed(current_input_data, i)) { - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); + BIT256_SET_PTR(p_new_state, i); continue; } } @@ -927,7 +930,7 @@ void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) #ifdef HAVE_OVERLAY if (overlay_ptr && input_overlay_key_pressed(overlay_ptr, i)) { - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); + BIT256_SET_PTR(p_new_state, i); continue; } #endif @@ -942,7 +945,7 @@ void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) if (command_get(&handle)) { - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); + BIT256_SET_PTR(p_new_state, i); continue; } } @@ -951,7 +954,7 @@ void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) #ifdef HAVE_NETWORKGAMEPAD if (input_driver_remote && input_remote_key_pressed(i, 0)) { - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); + BIT256_SET_PTR(p_new_state, i); continue; } #endif @@ -1004,9 +1007,10 @@ void input_menu_keys_pressed(void *data, retro_bits_t* p_new_state) for (i = 0; i < 13; i++) { - if (current_input->input_state(current_input_data, joypad_info, binds, 0, + if (current_input->input_state(current_input_data, + joypad_info, binds, 0, RETRO_DEVICE_KEYBOARD, 0, ids[i][0])) - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, ids[i][1]); + BIT256_SET_PTR(p_new_state, ids[i][1]); } } } @@ -1033,7 +1037,7 @@ void input_keys_pressed(void *data, retro_bits_t* p_new_state) const struct retro_keybind *enable_hotkey = &input_config_binds[0][RARCH_ENABLE_HOTKEY]; bool game_focus_toggle_valid = false; - RARCH_INPUT_STATE_CLEAR_PTR( p_new_state ); + BIT256_CLEAR_ALL_PTR(p_new_state); joypad_info.joy_idx = settings->uints.input_joypad_map[0]; joypad_info.auto_binds = input_autoconf_binds[joypad_info.joy_idx]; @@ -1079,7 +1083,7 @@ void input_keys_pressed(void *data, retro_bits_t* p_new_state) 0, RETRO_DEVICE_JOYPAD, 0, i) ) { - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); + BIT256_SET_PTR(p_new_state, i); continue; } @@ -1087,7 +1091,7 @@ void input_keys_pressed(void *data, retro_bits_t* p_new_state) current_input->meta_key_pressed(current_input_data, i) ) { - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); + BIT256_SET_PTR(p_new_state, i); continue; } @@ -1095,7 +1099,7 @@ void input_keys_pressed(void *data, retro_bits_t* p_new_state) if (overlay_ptr && input_overlay_key_pressed(overlay_ptr, i)) { - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); + BIT256_SET_PTR(p_new_state, i); continue; } #endif @@ -1110,7 +1114,7 @@ void input_keys_pressed(void *data, retro_bits_t* p_new_state) if (command_get(&handle)) { - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); + BIT256_SET_PTR(p_new_state, i); continue; } } @@ -1120,7 +1124,7 @@ void input_keys_pressed(void *data, retro_bits_t* p_new_state) if (input_driver_remote && input_remote_key_pressed(i, 0)) { - RARCH_INPUT_STATE_BIT_SET_PTR(p_new_state, i); + BIT256_SET_PTR(p_new_state, i); continue; } #endif diff --git a/intl/msg_hash_de.c b/intl/msg_hash_de.c index 333f191a49..6f56a0dd5a 100644 --- a/intl/msg_hash_de.c +++ b/intl/msg_hash_de.c @@ -904,13 +904,19 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) break; case MENU_ENUM_LABEL_VIDEO_SHADER_SCALE_PASS: snprintf(s, len, + " \n" + ); + { + /* Work around C89 limitations */ + const char * t = "Für diesen durchgang skalieren. \n" " \n" "Der Skalierungsfaktor wird multipliziert, \n" "d.h. 2x im ersten durchgang und 2x im \n" "zweiten durchgang bedeute eine 4x Gesamt- \n" "Skalierung." - " \n" + " \n"; + const char * u = "Wenn es im letzten durchgang einen \n" "Skalierungsfaktor gibt, wird das Ergebnis \n" "mit dem als 'Standardfilter' eingestellten \n" @@ -919,8 +925,10 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Wenn 'Ignorieren' eingestellt ist, wird \n" "entweder einfache Skalierung oder Vollbild- \n" "Streckung verwendet - abhängig davon, ob \n" - "es der letzte durchgang ist oder nicht." - ); + "es der letzte durchgang ist oder nicht."; + strlcpy(s, t, len); + strlcat(s, u, len); + } break; case MENU_ENUM_LABEL_VIDEO_SHADER_NUM_PASSES: snprintf(s, len, @@ -1133,7 +1141,9 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Verwendet für Inhalt, der auf mehreren Datenträgern ausgeliefert wird. "); break; case MENU_ENUM_LABEL_ENABLE_HOTKEY: - snprintf(s, len, + { + /* Work around C89 limitations */ + const char * t = "Andere Tastenkürzel aktivieren. \n" " \n" "Wenn dieses Tastenkürzel entweder einer\n" @@ -1141,14 +1151,18 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Controller-Achse zugeordnet ist, werden alle \n" "anderen Tastenkürzel nur aktiviert, wenn dieses \n" "Tastenkürzel zur gleichen Zeit gehalten wird. \n" - " \n" + " \n"; + const char * u = "Dies ist hilfreich für Implementierungen, die auf \n" "RETRO_KEYBOARD ausgelegt sind und eine große \n" "Fläche auf der Tastatur benötigen, wo es nicht \n" "gewünscht ist, dass es zu Kollisionen mit Tastenkürzeln kommt \n." " \n" "Alternativ können auch alle Tastatur-Kürzel durch \n" - "den Benutzer deaktiviert werden."); + "den Benutzer deaktiviert werden."; + strlcpy(s, t, len); + strlcat(s, u, len); + } break; case MENU_ENUM_LABEL_REWIND_ENABLE: snprintf(s, len, @@ -1165,7 +1179,9 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "Libretro-Core-Implementierungen gesucht wird."); break; case MENU_ENUM_LABEL_VIDEO_REFRESH_RATE_AUTO: - snprintf(s, len, + { + /* Work around C89 limitations */ + const char * t = "Bildwiederholrate.\n" " \n" "Die genaue Bildwiederholrate deines Bildschirms (Hz).\n" @@ -1174,14 +1190,19 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) " \n" "audio_input_rate = Spiel-Eingaberate * Bildschirm- \n" "Wiederholrate / Spiel-Wiederholrate\n" - " \n" + " \n"; + const char * u = "Wenn die Implementierung keinen Wert liefert, \n" "werden aus Kompatiblitätsgründen die Werte für NTSC \n" "angenommen.\n" " \n" "Dieser Wert sollte nahe 60Hz liegen, um Tonsprünge zu vermeiden. \n" "Wenn dein Bildschirm nicht auf 60Hz oder einem ähnlichen Wert läuft, \n" - "deaktiviere VSync und lasse diese Einstellung unverändert. \n"); + "deaktiviere VSync und lasse diese Einstellung unverändert. \n"; + ; + strlcpy(s, t, len); + strlcat(s, u, len); + } break; case MENU_ENUM_LABEL_VIDEO_ROTATION: snprintf(s, len, @@ -1594,20 +1615,26 @@ int menu_hash_get_help_de_enum(enum msg_hash_enums msg, char *s, size_t len) "tritt keine Netplay-Verzögerung auf.\n"); break; case MENU_ENUM_LABEL_NETPLAY_CHECK_FRAMES: - snprintf(s, len, + { + /* Work around C89 limitations */ + const char * t = "Die Frequenz in Einzelbildern, mit der Netplay \n" "sicherstellen wird, dass Host und Clients \n" "synchronisiert sind. \n" " \n" - "Bei den meisten Cores wird diese Einstellungen \n" - "keine sichtbaren Auswirkungen haben und kann ignoriert werden. \n" - "Bei nichtdeterministischen Cores legt dieser Wert fest, \n" - "wie oft die Netplay-Mitglieder miteinander synchronisiert \n" - "werden. Bei fehlerhaften Cores wird ein \n" - "anderer Wert als 0 für diese Einstellung erhebliche \n" - "Leistungsprobleme verursachen. Auf 0 setzen, um keine \n" - "Überprüfungen durchzuführen. Diese Einstellung wird nur \n" - "auf dem Netplay-Host verwendet. \n"); + "Bei den meisten Cores wird diese Einstellungen \n" + "keine sichtbaren Auswirkungen haben und kann ignoriert werden. \n"; + const char *u = + "Bei nichtdeterministischen Cores legt dieser Wert fest, \n" + "wie oft die Netplay-Mitglieder miteinander synchronisiert \n" + "werden. Bei fehlerhaften Cores wird ein \n" + "anderer Wert als 0 für diese Einstellung erhebliche \n" + "Leistungsprobleme verursachen. Auf 0 setzen, um keine \n" + "Überprüfungen durchzuführen. Diese Einstellung wird nur \n" + "auf dem Netplay-Host verwendet. \n"; + strlcpy(s, t, len); + strlcat(s, u, len); + } break; case MENU_ENUM_LABEL_NETPLAY_INPUT_LATENCY_FRAMES_MIN: snprintf(s, len, diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index f912f35260..f2a3b58f4b 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -2313,6 +2313,8 @@ MSG_HASH( ) MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_BOKEH, "Bokeh") +MSG_HASH(MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOWFLAKE, + "Sneeuwvlok") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_ROOMS, "Refresh Room List") MSG_HASH(MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, diff --git a/libretro-common/compat/fopen_utf8.c b/libretro-common/compat/fopen_utf8.c new file mode 100644 index 0000000000..b61c53ebd1 --- /dev/null +++ b/libretro-common/compat/fopen_utf8.c @@ -0,0 +1,32 @@ +#include +#include +#include + +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) +#ifndef LEGACY_WIN32 +#define LEGACY_WIN32 +#endif +#endif + +#ifdef _WIN32 +#undef fopen + +FILE* fopen_utf8(const char * filename, const char * mode) +{ +#if defined(_XBOX) + return fopen(filename, mode); +#elif defined(LEGACY_WIN32) + char * filename_local = utf8_to_local_string_alloc(filename); + FILE* ret = fopen(filename_local, mode); + free(filename_local); + return ret; +#else + wchar_t * filename_w = utf8_to_utf16_string_alloc(filename); + wchar_t * mode_w = utf8_to_utf16_string_alloc(mode); + FILE* ret = _wfopen(filename_w, mode_w); + free(filename_w); + free(mode_w); + return ret; +#endif +} +#endif diff --git a/libretro-common/file/config_file.c b/libretro-common/file/config_file.c index 70f7b64aab..cf105bbc3a 100644 --- a/libretro-common/file/config_file.c +++ b/libretro-common/file/config_file.c @@ -38,6 +38,7 @@ #include #include #include +#include #include #include #include @@ -912,21 +913,26 @@ void config_set_bool(config_file_t *conf, const char *key, bool val) bool config_file_write(config_file_t *conf, const char *path) { - RFILE *file = NULL; - if (!string_is_empty(path)) { - file = filestream_open(path, RFILE_MODE_WRITE, 0x4000); + void* buf = NULL; + FILE *file = fopen_utf8(path, "wb"); if (!file) return false; - config_file_dump(conf, filestream_get_fp(file)); + + /* TODO: this is only useful for a few platforms, find which and add ifdef */ + buf = calloc(1, 0x4000); + setvbuf(file, (char*)buf, _IOFBF, 0x4000); + + config_file_dump(conf, file); + + if (file != stdout) + fclose(file); + free(buf); } else config_file_dump(conf, stdout); - if (file) - filestream_close(file); - return true; } diff --git a/libretro-common/file/file_path.c b/libretro-common/file/file_path.c index 62ee9f20e7..8d9f8414b2 100644 --- a/libretro-common/file/file_path.c +++ b/libretro-common/file/file_path.c @@ -84,8 +84,8 @@ #include /* stat() is defined here */ #endif -/* Assume W-functions do not work below VC2005 and Xbox platforms */ -#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) +/* Assume W-functions do not work below Win2K and Xbox platforms */ +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) #ifndef LEGACY_WIN32 #define LEGACY_WIN32 @@ -936,7 +936,7 @@ bool path_file_remove(const char *path) (void)path_wide; #if defined(_WIN32) && !defined(_XBOX) -#if defined(_MSC_VER) && _MSC_VER < 1400 +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 path_local = utf8_to_local_string_alloc(path); if (path_local) @@ -982,7 +982,7 @@ bool path_file_rename(const char *old_path, const char *new_path) (void)new_path_wide; #if defined(_WIN32) && !defined(_XBOX) -#if defined(_MSC_VER) && _MSC_VER < 1400 +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 old_path_local = utf8_to_local_string_alloc(old_path); new_path_local = utf8_to_local_string_alloc(new_path); diff --git a/libretro-common/file/nbio/nbio_stdio.c b/libretro-common/file/nbio/nbio_stdio.c index 3e6f4094f1..d3425f7de0 100644 --- a/libretro-common/file/nbio/nbio_stdio.c +++ b/libretro-common/file/nbio/nbio_stdio.c @@ -26,8 +26,8 @@ #include #include -/* Assume W-functions do not work below VC2005 and Xbox platforms */ -#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) +/* Assume W-functions do not work below Win2K and Xbox platforms */ +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) #ifndef LEGACY_WIN32 #define LEGACY_WIN32 diff --git a/libretro-common/file/nbio/nbio_unixmmap.c b/libretro-common/file/nbio/nbio_unixmmap.c index 40703ae138..80325da393 100644 --- a/libretro-common/file/nbio/nbio_unixmmap.c +++ b/libretro-common/file/nbio/nbio_unixmmap.c @@ -39,6 +39,20 @@ #include #include +#ifdef __APPLE__ + +#ifndef O_CLOEXEC +#define O_CLOEXEC 0x1000000 +#endif + +#else + +#ifndef O_CLOEXEC +#define O_CLOEXEC 0 +#endif + +#endif + struct nbio_mmap_unix_t { int fd; diff --git a/libretro-common/file/nbio/nbio_windowsmmap.c b/libretro-common/file/nbio/nbio_windowsmmap.c index caf0d72514..25208571b2 100644 --- a/libretro-common/file/nbio/nbio_windowsmmap.c +++ b/libretro-common/file/nbio/nbio_windowsmmap.c @@ -31,8 +31,8 @@ #include -/* Assume W-functions do not work below VC2005 and Xbox platforms */ -#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) +/* Assume W-functions do not work below Win2K and Xbox platforms */ +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) #ifndef LEGACY_WIN32 #define LEGACY_WIN32 diff --git a/libretro-common/file/retro_dirent.c b/libretro-common/file/retro_dirent.c index 98328e30c1..aa221c888c 100644 --- a/libretro-common/file/retro_dirent.c +++ b/libretro-common/file/retro_dirent.c @@ -67,7 +67,7 @@ #include /* stat() is defined here */ #endif -#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) #ifndef LEGACY_WIN32 #define LEGACY_WIN32 #endif diff --git a/libretro-common/gfx/gl_capabilities.c b/libretro-common/gfx/gl_capabilities.c index 221aa2a0b7..695650eee0 100644 --- a/libretro-common/gfx/gl_capabilities.c +++ b/libretro-common/gfx/gl_capabilities.c @@ -179,16 +179,13 @@ bool gl_check_capability(enum gl_capability_enum enum_idx) && !gl_query_extension("EXT_framebuffer_object")) return false; - if (glGenFramebuffers - && glBindFramebuffer - && glFramebufferTexture2D - && glCheckFramebufferStatus - && glDeleteFramebuffers - && glGenRenderbuffers - && glBindRenderbuffer - && glFramebufferRenderbuffer - && glRenderbufferStorage - && glDeleteRenderbuffers) + if (gl_query_extension("ARB_framebuffer_object")) + return true; + + if (gl_query_extension("EXT_framebuffer_object")) + return true; + + if (major >= 3) return true; break; #endif diff --git a/libretro-common/include/compat/fopen_utf8.h b/libretro-common/include/compat/fopen_utf8.h new file mode 100644 index 0000000000..67cc289aa6 --- /dev/null +++ b/libretro-common/include/compat/fopen_utf8.h @@ -0,0 +1,14 @@ +#ifndef __FOPEN_UTF8_H +#define __FOPEN_UTF8_H + +#include + +#ifdef _WIN32 +/* defined to error rather than fopen_utf8, to make it clear to everyone reading the code that not worrying about utf16 is fine */ +/* TODO: enable */ +/* #define fopen (use fopen_utf8 instead) */ +FILE* fopen_utf8(const char * filename, const char * mode); +#else +#define fopen_utf8 fopen +#endif +#endif diff --git a/libretro-common/include/retro_miscellaneous.h b/libretro-common/include/retro_miscellaneous.h index bfa3fcb741..bfebd1f8e8 100644 --- a/libretro-common/include/retro_miscellaneous.h +++ b/libretro-common/include/retro_miscellaneous.h @@ -24,6 +24,8 @@ #define __RARCH_MISCELLANEOUS_H #include +#include +#include #if defined(_WIN32) && !defined(_XBOX) #ifndef WIN32_LEAN_AND_MEAN @@ -40,6 +42,24 @@ #include #endif +static INLINE void bits_clear_bits(uint32_t *a, uint32_t *b, uint32_t count) +{ + uint32_t i; + for (i = 0; i < count;i++) + a[i] &= ~b[i]; +} + +static INLINE bool bits_any_set(uint32_t* ptr, uint32_t count) +{ + uint32_t i; + for (i = 0; i < count; i++) + { + if (ptr[i] != 0) + return true; + } + return false; +} + #ifndef PATH_MAX_LENGTH #if defined(_XBOX1) || defined(_3DS) || defined(PSP) || defined(GEKKO)|| defined(WIIU) #define PATH_MAX_LENGTH 512 @@ -56,35 +76,64 @@ #define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif -#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) +#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) + +#define BITS_GET_ELEM(a, i) ((a).data[i]) +#define BITS_GET_ELEM_PTR(a, i) ((a)->data[i]) #define BIT_SET(a, bit) ((a)[(bit) >> 3] |= (1 << ((bit) & 7))) #define BIT_CLEAR(a, bit) ((a)[(bit) >> 3] &= ~(1 << ((bit) & 7))) -#define BIT_GET(a, bit) ((a)[(bit) >> 3] & (1 << ((bit) & 7))) +#define BIT_GET(a, bit) (((a)[(bit) >> 3] >> ((bit) & 7)) & 1) #define BIT16_SET(a, bit) ((a) |= (1 << ((bit) & 15))) #define BIT16_CLEAR(a, bit) ((a) &= ~(1 << ((bit) & 15))) -#define BIT16_GET(a, bit) (!!((a) & (1 << ((bit) & 15)))) +#define BIT16_GET(a, bit) (((a) >> ((bit) & 15)) & 1) #define BIT16_CLEAR_ALL(a) ((a) = 0) #define BIT32_SET(a, bit) ((a) |= (1 << ((bit) & 31))) #define BIT32_CLEAR(a, bit) ((a) &= ~(1 << ((bit) & 31))) -#define BIT32_GET(a, bit) (!!((a) & (1 << ((bit) & 31)))) +#define BIT32_GET(a, bit) (((a) >> ((bit) & 31)) & 1) #define BIT32_CLEAR_ALL(a) ((a) = 0) #define BIT64_SET(a, bit) ((a) |= (UINT64_C(1) << ((bit) & 63))) #define BIT64_CLEAR(a, bit) ((a) &= ~(UINT64_C(1) << ((bit) & 63))) -#define BIT64_GET(a, bit) (!!((a) & (UINT64_C(1) << ((bit) & 63)))) +#define BIT64_GET(a, bit) (((a) >> ((bit) & 63)) & 1) #define BIT64_CLEAR_ALL(a) ((a) = 0) #define BIT128_SET(a, bit) ((a).data[(bit) >> 5] |= (1 << ((bit) & 31))) #define BIT128_CLEAR(a, bit) ((a).data[(bit) >> 5] &= ~(1 << ((bit) & 31))) -#define BIT128_GET(a, bit) ((a).data[(bit) >> 5] & (1 << ((bit) & 31))) -#define BIT128_CLEAR_ALL(a) memset(&(a), 0, sizeof(a)); +#define BIT128_GET(a, bit) (((a).data[(bit) >> 5] >> ((bit) & 31)) & 1) +#define BIT128_CLEAR_ALL(a) memset(&(a), 0, sizeof(a)) -/* Helper macros and struct to keep track of many booleans. - * To check for multiple bits, use &&, not &. - * For OR, | can be used. */ +#define BIT128_SET_PTR(a, bit) BIT128_SET(*a, bit) +#define BIT128_CLEAR_PTR(a, bit) BIT128_CLEAR(*a, bit) +#define BIT128_GET_PTR(a, bit) BIT128_GET(*a, bit) +#define BIT128_CLEAR_ALL_PTR(a) BIT128_CLEAR_ALL(*a) + +#define BIT256_SET(a, bit) BIT128_SET(a, bit) +#define BIT256_CLEAR(a, bit) BIT128_CLEAR(a, bit) +#define BIT256_GET(a, bit) BIT128_GET(a, bit) +#define BIT256_CLEAR_ALL(a) BIT128_CLEAR_ALL(a) + +#define BIT256_SET_PTR(a, bit) BIT256_SET(*a, bit) +#define BIT256_CLEAR_PTR(a, bit) BIT256_CLEAR(*a, bit) +#define BIT256_GET_PTR(a, bit) BIT256_GET(*a, bit) +#define BIT256_CLEAR_ALL_PTR(a) BIT256_CLEAR_ALL(*a) + +#define BITS_COPY16_PTR(a,bits) \ +{ \ + BIT128_CLEAR_ALL_PTR(a); \ + BITS_GET_ELEM_PTR(a, 0) = (bits) & 0xffff; \ +} + +#define BITS_COPY32_PTR(a,bits) \ +{ \ + BIT128_CLEAR_ALL_PTR(a); \ + BITS_GET_ELEM_PTR(a, 0) = (bits); \ +} + +/* Helper macros and struct to keep track of many booleans. */ +/* This struct has 256 bits. */ typedef struct { uint32_t data[8]; diff --git a/libretro-common/include/streams/file_stream.h b/libretro-common/include/streams/file_stream.h index e6d6bbca1c..06cdf33ded 100644 --- a/libretro-common/include/streams/file_stream.h +++ b/libretro-common/include/streams/file_stream.h @@ -63,10 +63,9 @@ const char *filestream_get_ext(RFILE *stream); * @bufsize : optional buffer size (-1 or 0 to use default) * * Opens a file for reading or writing, depending on the requested mode. - * If bufsize is > 0 for unbuffered modes (like RFILE_MODE_WRITE), file will instead be fully buffered. * Returns a pointer to an RFILE if opened successfully, otherwise NULL. **/ -RFILE *filestream_open(const char *path, unsigned mode, ssize_t bufsize); +RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused); ssize_t filestream_seek(RFILE *stream, ssize_t offset, int whence); @@ -100,9 +99,10 @@ int filestream_printf(RFILE *stream, const char* format, ...); int filestream_error(RFILE *stream); +/* DO NOT put these functions back, unless you want to deal with + the UNAVOIDABLE REGRESSIONS on platforms using unexpected rfile backends int filestream_get_fd(RFILE *stream); - -FILE* filestream_get_fp(RFILE *stream); +FILE* filestream_get_fp(RFILE *stream); */ int filestream_flush(RFILE *stream); diff --git a/libretro-common/streams/file_stream.c b/libretro-common/streams/file_stream.c index c4dcddf0a7..da29d4864d 100644 --- a/libretro-common/streams/file_stream.c +++ b/libretro-common/streams/file_stream.c @@ -65,8 +65,8 @@ #include #endif -/* Assume W-functions do not work below VC2005 and Xbox platforms */ -#if defined(_MSC_VER) && _MSC_VER < 1400 || defined(_XBOX) +/* Assume W-functions do not work below Win2K and Xbox platforms */ +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0500 || defined(_XBOX) #ifndef LEGACY_WIN32 #define LEGACY_WIN32 @@ -114,24 +114,6 @@ struct RFILE char *buf; }; -FILE* filestream_get_fp(RFILE *stream) -{ - if (!stream) - return NULL; - return stream->fp; -} - -int filestream_get_fd(RFILE *stream) -{ - if (!stream) - return -1; -#if defined(HAVE_BUFFERED_IO) - if ((stream->hints & RFILE_HINT_UNBUFFERED) == 0) - return fileno(stream->fp); -#endif - return stream->fd; -} - const char *filestream_get_ext(RFILE *stream) { if (!stream) @@ -166,12 +148,10 @@ void filestream_set_size(RFILE *stream) * @bufsize : optional buffer size (-1 or 0 to use default) * * Opens a file for reading or writing, depending on the requested mode. - * If bufsize is > 0 for unbuffered modes (like RFILE_MODE_WRITE), file will instead be fully buffered. * Returns a pointer to an RFILE if opened successfully, otherwise NULL. **/ RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) { - ssize_t bufsize = 0x4000; int flags = 0; int mode_int = 0; #if defined(HAVE_BUFFERED_IO) @@ -271,7 +251,7 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) #if defined(PSP) stream->fd = sceIoOpen(path, flags, mode_int); - if (stream->fd == -1) + if (stream->fd < 0) goto error; #else #if defined(HAVE_BUFFERED_IO) @@ -298,20 +278,18 @@ RFILE *filestream_open(const char *path, unsigned mode, ssize_t unused) if (!stream->fp) goto error; - if (bufsize > 0) - { - /* Regarding setvbuf: - * - * https://www.freebsd.org/cgi/man.cgi?query=setvbuf&apropos=0&sektion=0&manpath=FreeBSD+11.1-RELEASE&arch=default&format=html - * - * If the size argument is not zero but buf is NULL, a buffer of the given size will be allocated immediately, and - * released on close. This is an extension to ANSI C. - * - * Since C89 does not support specifying a null buffer with a non-zero size, we create and track our own buffer for it. - */ - stream->buf = (char*)calloc(1, bufsize); - setvbuf(stream->fp, stream->buf, _IOFBF, bufsize); - } + /* Regarding setvbuf: + * + * https://www.freebsd.org/cgi/man.cgi?query=setvbuf&apropos=0&sektion=0&manpath=FreeBSD+11.1-RELEASE&arch=default&format=html + * + * If the size argument is not zero but buf is NULL, a buffer of the given size will be allocated immediately, and + * released on close. This is an extension to ANSI C. + * + * Since C89 does not support specifying a null buffer with a non-zero size, we create and track our own buffer for it. + */ + /* TODO: this is only useful for a few platforms, find which and add ifdef */ + stream->buf = (char*)calloc(1, 0x4000); + setvbuf(stream->fp, stream->buf, _IOFBF, 0x4000); } else #endif diff --git a/menu/cbs/menu_cbs_deferred_push.c b/menu/cbs/menu_cbs_deferred_push.c index 538198987c..9a93e60dda 100644 --- a/menu/cbs/menu_cbs_deferred_push.c +++ b/menu/cbs/menu_cbs_deferred_push.c @@ -58,227 +58,6 @@ static int deferred_push_dlist(menu_displaylist_info_t *info, enum menu_displayl return 0; } -static int deferred_push_core_information(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CORE_INFO); -} - -static int deferred_push_system_information(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_SYSTEM_INFO); -} - -static int deferred_push_network_information(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_NETWORK_INFO); -} - -static int deferred_push_achievement_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ACHIEVEMENT_LIST); -} - -static int deferred_push_rdb_collection(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_PLAYLIST_COLLECTION); -} - -static int deferred_main_menu_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_MAIN_MENU); -} - -static int deferred_music_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_MUSIC_LIST); -} - -static int deferred_user_binds_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_USER_BINDS_LIST); -} - -static int deferred_push_accounts_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ACCOUNTS_LIST); -} - -static int deferred_push_driver_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_DRIVER_SETTINGS_LIST); -} - -static int deferred_push_core_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CORE_SETTINGS_LIST); -} - -static int deferred_push_video_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_VIDEO_SETTINGS_LIST); -} - -static int deferred_push_configuration_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CONFIGURATION_SETTINGS_LIST); -} - -static int deferred_push_saving_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_SAVING_SETTINGS_LIST); -} - -static int deferred_push_logging_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_LOGGING_SETTINGS_LIST); -} - -static int deferred_push_frame_throttle_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_FRAME_THROTTLE_SETTINGS_LIST); -} - -static int deferred_push_rewind_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_REWIND_SETTINGS_LIST); -} - -static int deferred_push_onscreen_display_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ONSCREEN_DISPLAY_SETTINGS_LIST); -} - -static int deferred_push_onscreen_notifications_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ONSCREEN_NOTIFICATIONS_SETTINGS_LIST); -} - -static int deferred_push_onscreen_overlay_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ONSCREEN_OVERLAY_SETTINGS_LIST); -} - -static int deferred_push_menu_file_browser_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_MENU_FILE_BROWSER_SETTINGS_LIST); -} - -static int deferred_push_menu_views_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_MENU_VIEWS_SETTINGS_LIST); -} - -static int deferred_push_quick_menu_views_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_QUICK_MENU_VIEWS_SETTINGS_LIST); -} - -static int deferred_push_menu_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_MENU_SETTINGS_LIST); -} - -static int deferred_push_user_interface_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_USER_INTERFACE_SETTINGS_LIST); -} - -static int deferred_push_retro_achievements_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_RETRO_ACHIEVEMENTS_SETTINGS_LIST); -} - -static int deferred_push_updater_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_UPDATER_SETTINGS_LIST); -} - -static int deferred_push_wifi_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_WIFI_SETTINGS_LIST); -} - -static int deferred_push_network_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_NETWORK_SETTINGS_LIST); -} - -static int deferred_push_lakka_services_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_LAKKA_SERVICES_LIST); -} - -static int deferred_push_user_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_USER_SETTINGS_LIST); -} - -static int deferred_push_directory_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_DIRECTORY_SETTINGS_LIST); -} - -static int deferred_push_privacy_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_PRIVACY_SETTINGS_LIST); -} - -static int deferred_push_audio_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_AUDIO_SETTINGS_LIST); -} - -static int deferred_push_input_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_INPUT_SETTINGS_LIST); -} - -static int deferred_push_recording_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_RECORDING_SETTINGS_LIST); -} - -static int deferred_push_playlist_settings_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_PLAYLIST_SETTINGS_LIST); -} - -static int deferred_push_input_hotkey_binds_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_INPUT_HOTKEY_BINDS_LIST); -} - -static int deferred_push_accounts_cheevos_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ACCOUNTS_CHEEVOS_LIST); -} - -static int deferred_push_help(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_HELP_SCREEN_LIST); -} - -static int deferred_push_rdb_entry_detail(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_DATABASE_ENTRY); -} - -static int deferred_push_rpl_entry_actions(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_HORIZONTAL_CONTENT_ACTIONS); -} - -static int deferred_push_core_list_deferred(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CORES_SUPPORTED); -} - -static int deferred_push_core_collection_list_deferred( - menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CORES_COLLECTION_SUPPORTED); -} - static int deferred_push_database_manager_list_deferred( menu_displaylist_info_t *info) { @@ -293,151 +72,108 @@ static int deferred_push_database_manager_list_deferred( return deferred_push_dlist(info, DISPLAYLIST_DATABASE_QUERY); } -static int deferred_push_video_shader_preset_parameters( - menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_SHADER_PARAMETERS_PRESET); +#define generic_deferred_push(name, type) \ +static int (name)(menu_displaylist_info_t *info) \ +{ \ + return deferred_push_dlist(info, type); \ } -static int deferred_push_video_shader_parameters( - menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_SHADER_PARAMETERS); -} - -static int deferred_push_settings(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_SETTINGS_ALL); -} - -static int deferred_push_shader_options(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_OPTIONS_SHADERS); -} - -static int deferred_push_options(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_OPTIONS); -} - -static int deferred_push_netplay(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_NETPLAY_ROOM_LIST); -} - -static int deferred_push_netplay_sublist(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_NETPLAY); -} - -static int deferred_push_content_settings(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CONTENT_SETTINGS); -} - -static int deferred_push_add_content_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ADD_CONTENT_LIST); -} - -static int deferred_push_configurations_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CONFIGURATIONS_LIST); -} - -static int deferred_push_load_content_special(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_LOAD_CONTENT_LIST); -} - -static int deferred_push_load_content_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_LOAD_CONTENT_LIST); -} - -static int deferred_push_information_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_INFORMATION_LIST); -} - -static int deferred_push_management_options(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_OPTIONS_MANAGEMENT); -} - -static int deferred_push_core_counters(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_PERFCOUNTERS_CORE); -} - -static int deferred_push_frontend_counters(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_PERFCOUNTERS_FRONTEND); -} - -static int deferred_push_core_cheat_options(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_OPTIONS_CHEATS); -} - -static int deferred_push_core_input_remapping_options(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_OPTIONS_REMAPPINGS); -} - -static int deferred_push_core_options(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CORE_OPTIONS); -} - -static int deferred_push_disk_options(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_OPTIONS_DISK); -} +generic_deferred_push(deferred_push_video_shader_preset_parameters, DISPLAYLIST_SHADER_PARAMETERS_PRESET) +generic_deferred_push(deferred_push_video_shader_parameters, DISPLAYLIST_SHADER_PARAMETERS) +generic_deferred_push(deferred_push_settings, DISPLAYLIST_SETTINGS_ALL) +generic_deferred_push(deferred_push_shader_options, DISPLAYLIST_OPTIONS_SHADERS) +generic_deferred_push(deferred_push_options, DISPLAYLIST_OPTIONS) +generic_deferred_push(deferred_push_netplay, DISPLAYLIST_NETPLAY_ROOM_LIST) +generic_deferred_push(deferred_push_netplay_sublist, DISPLAYLIST_NETPLAY) +generic_deferred_push(deferred_push_content_settings, DISPLAYLIST_CONTENT_SETTINGS) +generic_deferred_push(deferred_push_add_content_list, DISPLAYLIST_ADD_CONTENT_LIST) +generic_deferred_push(deferred_push_history_list, DISPLAYLIST_HISTORY) +generic_deferred_push(deferred_push_database_manager_list, DISPLAYLIST_DATABASES) +generic_deferred_push(deferred_push_cursor_manager_list, DISPLAYLIST_DATABASE_CURSORS) +generic_deferred_push(deferred_push_content_collection_list, DISPLAYLIST_DATABASE_PLAYLISTS) +generic_deferred_push(deferred_push_configurations_list, DISPLAYLIST_CONFIGURATIONS_LIST) +generic_deferred_push(deferred_push_load_content_special, DISPLAYLIST_LOAD_CONTENT_LIST) +generic_deferred_push(deferred_push_load_content_list, DISPLAYLIST_LOAD_CONTENT_LIST) +generic_deferred_push(deferred_push_information_list, DISPLAYLIST_INFORMATION_LIST) +generic_deferred_push(deferred_archive_action_detect_core, DISPLAYLIST_ARCHIVE_ACTION_DETECT_CORE) +generic_deferred_push(deferred_archive_action, DISPLAYLIST_ARCHIVE_ACTION) +generic_deferred_push(deferred_push_management_options, DISPLAYLIST_OPTIONS_MANAGEMENT) +generic_deferred_push(deferred_push_core_counters, DISPLAYLIST_PERFCOUNTERS_CORE) +generic_deferred_push(deferred_push_frontend_counters, DISPLAYLIST_PERFCOUNTERS_FRONTEND) +generic_deferred_push(deferred_push_core_cheat_options, DISPLAYLIST_OPTIONS_CHEATS) +generic_deferred_push(deferred_push_core_input_remapping_options, DISPLAYLIST_OPTIONS_REMAPPINGS) +generic_deferred_push(deferred_push_core_options, DISPLAYLIST_CORE_OPTIONS) +generic_deferred_push(deferred_push_disk_options, DISPLAYLIST_OPTIONS_DISK) +generic_deferred_push(deferred_push_browse_url_list, DISPLAYLIST_BROWSE_URL_LIST) +generic_deferred_push(deferred_push_browse_url_start, DISPLAYLIST_BROWSE_URL_START) +generic_deferred_push(deferred_push_core_list, DISPLAYLIST_CORES) +generic_deferred_push(deferred_push_configurations, DISPLAYLIST_CONFIG_FILES) +generic_deferred_push(deferred_push_video_shader_preset, DISPLAYLIST_SHADER_PRESET) +generic_deferred_push(deferred_push_video_shader_pass, DISPLAYLIST_SHADER_PASS) +generic_deferred_push(deferred_push_video_filter, DISPLAYLIST_VIDEO_FILTERS) +generic_deferred_push(deferred_push_images, DISPLAYLIST_IMAGES) +generic_deferred_push(deferred_push_audio_dsp_plugin, DISPLAYLIST_AUDIO_FILTERS) +generic_deferred_push(deferred_push_cheat_file_load, DISPLAYLIST_CHEAT_FILES) +generic_deferred_push(deferred_push_remap_file_load, DISPLAYLIST_REMAP_FILES) +generic_deferred_push(deferred_push_record_configfile, DISPLAYLIST_RECORD_CONFIG_FILES) +generic_deferred_push(deferred_push_input_overlay, DISPLAYLIST_OVERLAYS) +generic_deferred_push(deferred_push_video_font_path, DISPLAYLIST_FONTS) +generic_deferred_push(deferred_push_xmb_font_path, DISPLAYLIST_FONTS) +generic_deferred_push(deferred_push_content_history_path, DISPLAYLIST_CONTENT_HISTORY) +generic_deferred_push(deferred_push_core_information, DISPLAYLIST_CORE_INFO) +generic_deferred_push(deferred_push_system_information, DISPLAYLIST_SYSTEM_INFO) +generic_deferred_push(deferred_push_network_information, DISPLAYLIST_NETWORK_INFO) +generic_deferred_push(deferred_push_achievement_list, DISPLAYLIST_ACHIEVEMENT_LIST) +generic_deferred_push(deferred_push_rdb_collection, DISPLAYLIST_PLAYLIST_COLLECTION) +generic_deferred_push(deferred_main_menu_list, DISPLAYLIST_MAIN_MENU) +generic_deferred_push(deferred_music_list, DISPLAYLIST_MUSIC_LIST) +generic_deferred_push(deferred_user_binds_list, DISPLAYLIST_USER_BINDS_LIST) +generic_deferred_push(deferred_push_accounts_list, DISPLAYLIST_ACCOUNTS_LIST) +generic_deferred_push(deferred_push_driver_settings_list, DISPLAYLIST_DRIVER_SETTINGS_LIST) +generic_deferred_push(deferred_push_core_settings_list, DISPLAYLIST_CORE_SETTINGS_LIST) +generic_deferred_push(deferred_push_video_settings_list, DISPLAYLIST_VIDEO_SETTINGS_LIST) +generic_deferred_push(deferred_push_configuration_settings_list, DISPLAYLIST_CONFIGURATION_SETTINGS_LIST) +generic_deferred_push(deferred_push_saving_settings_list, DISPLAYLIST_SAVING_SETTINGS_LIST) +generic_deferred_push(deferred_push_logging_settings_list, DISPLAYLIST_LOGGING_SETTINGS_LIST) +generic_deferred_push(deferred_push_frame_throttle_settings_list, DISPLAYLIST_FRAME_THROTTLE_SETTINGS_LIST) +generic_deferred_push(deferred_push_rewind_settings_list, DISPLAYLIST_REWIND_SETTINGS_LIST) +generic_deferred_push(deferred_push_onscreen_display_settings_list, DISPLAYLIST_ONSCREEN_DISPLAY_SETTINGS_LIST) +generic_deferred_push(deferred_push_onscreen_notifications_settings_list, DISPLAYLIST_ONSCREEN_NOTIFICATIONS_SETTINGS_LIST) +generic_deferred_push(deferred_push_onscreen_overlay_settings_list, DISPLAYLIST_ONSCREEN_OVERLAY_SETTINGS_LIST) +generic_deferred_push(deferred_push_menu_file_browser_settings_list,DISPLAYLIST_MENU_FILE_BROWSER_SETTINGS_LIST) +generic_deferred_push(deferred_push_menu_views_settings_list, DISPLAYLIST_MENU_VIEWS_SETTINGS_LIST) +generic_deferred_push(deferred_push_quick_menu_views_settings_list, DISPLAYLIST_QUICK_MENU_VIEWS_SETTINGS_LIST) +generic_deferred_push(deferred_push_menu_settings_list, DISPLAYLIST_MENU_SETTINGS_LIST) +generic_deferred_push(deferred_push_user_interface_settings_list, DISPLAYLIST_USER_INTERFACE_SETTINGS_LIST) +generic_deferred_push(deferred_push_retro_achievements_settings_list,DISPLAYLIST_RETRO_ACHIEVEMENTS_SETTINGS_LIST) +generic_deferred_push(deferred_push_updater_settings_list, DISPLAYLIST_UPDATER_SETTINGS_LIST) +generic_deferred_push(deferred_push_wifi_settings_list, DISPLAYLIST_WIFI_SETTINGS_LIST) +generic_deferred_push(deferred_push_network_settings_list, DISPLAYLIST_NETWORK_SETTINGS_LIST) +generic_deferred_push(deferred_push_lakka_services_list, DISPLAYLIST_LAKKA_SERVICES_LIST) +generic_deferred_push(deferred_push_user_settings_list, DISPLAYLIST_USER_SETTINGS_LIST) +generic_deferred_push(deferred_push_directory_settings_list, DISPLAYLIST_DIRECTORY_SETTINGS_LIST) +generic_deferred_push(deferred_push_privacy_settings_list, DISPLAYLIST_PRIVACY_SETTINGS_LIST) +generic_deferred_push(deferred_push_audio_settings_list, DISPLAYLIST_AUDIO_SETTINGS_LIST) +generic_deferred_push(deferred_push_input_settings_list, DISPLAYLIST_INPUT_SETTINGS_LIST) +generic_deferred_push(deferred_push_recording_settings_list, DISPLAYLIST_RECORDING_SETTINGS_LIST) +generic_deferred_push(deferred_push_playlist_settings_list, DISPLAYLIST_PLAYLIST_SETTINGS_LIST) +generic_deferred_push(deferred_push_input_hotkey_binds_list, DISPLAYLIST_INPUT_HOTKEY_BINDS_LIST) +generic_deferred_push(deferred_push_accounts_cheevos_list, DISPLAYLIST_ACCOUNTS_CHEEVOS_LIST) +generic_deferred_push(deferred_push_help, DISPLAYLIST_HELP_SCREEN_LIST) +generic_deferred_push(deferred_push_rdb_entry_detail, DISPLAYLIST_DATABASE_ENTRY) +generic_deferred_push(deferred_push_rpl_entry_actions, DISPLAYLIST_HORIZONTAL_CONTENT_ACTIONS) +generic_deferred_push(deferred_push_core_list_deferred, DISPLAYLIST_CORES_SUPPORTED) +generic_deferred_push(deferred_push_core_collection_list_deferred, DISPLAYLIST_CORES_COLLECTION_SUPPORTED) #ifdef HAVE_NETWORKING -static int deferred_push_thumbnails_updater_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_THUMBNAILS_UPDATER); -} - -static int deferred_push_core_updater_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CORES_UPDATER); -} - -static int deferred_push_core_content_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CORE_CONTENT); -} - -static int deferred_push_core_content_dirs_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CORE_CONTENT_DIRS); -} - -static int deferred_push_core_content_dirs_subdir_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CORE_CONTENT_DIRS_SUBDIR); -} - -static int deferred_push_lakka_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_LAKKA); -} - +generic_deferred_push(deferred_push_thumbnails_updater_list, DISPLAYLIST_THUMBNAILS_UPDATER) +generic_deferred_push(deferred_push_core_updater_list, DISPLAYLIST_CORES_UPDATER) +generic_deferred_push(deferred_push_core_content_list, DISPLAYLIST_CORE_CONTENT) +generic_deferred_push(deferred_push_core_content_dirs_list, DISPLAYLIST_CORE_CONTENT_DIRS) +generic_deferred_push(deferred_push_core_content_dirs_subdir_list, DISPLAYLIST_CORE_CONTENT_DIRS_SUBDIR) +generic_deferred_push(deferred_push_lakka_list, DISPLAYLIST_LAKKA) #endif -static int deferred_archive_action_detect_core(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ARCHIVE_ACTION_DETECT_CORE); -} - -static int deferred_archive_action(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_ARCHIVE_ACTION); -} - static int deferred_push_cursor_manager_list_deferred( menu_displaylist_info_t *info) { @@ -523,101 +259,29 @@ end: return ret; } -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_max_users( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_MAX_USERS); +#define generic_deferred_cursor_manager(name, type) \ +static int (name)(menu_displaylist_info_t *info) \ +{ \ + return deferred_push_cursor_manager_list_generic(info, type); \ } -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_famitsu_magazine_rating( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_FAMITSU_MAGAZINE_RATING); -} +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_max_users, DATABASE_QUERY_ENTRY_MAX_USERS) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_famitsu_magazine_rating, DATABASE_QUERY_ENTRY_FAMITSU_MAGAZINE_RATING) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_edge_magazine_rating, DATABASE_QUERY_ENTRY_EDGE_MAGAZINE_RATING) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_edge_magazine_issue, DATABASE_QUERY_ENTRY_EDGE_MAGAZINE_ISSUE) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_elspa_rating, DATABASE_QUERY_ENTRY_ELSPA_RATING) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_cero_rating, DATABASE_QUERY_ENTRY_CERO_RATING) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_pegi_rating, DATABASE_QUERY_ENTRY_PEGI_RATING) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_bbfc_rating, DATABASE_QUERY_ENTRY_BBFC_RATING) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_esrb_rating, DATABASE_QUERY_ENTRY_ESRB_RATING) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_enhancement_hw, DATABASE_QUERY_ENTRY_ENHANCEMENT_HW) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_franchise, DATABASE_QUERY_ENTRY_FRANCHISE) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_publisher, DATABASE_QUERY_ENTRY_PUBLISHER) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_developer, DATABASE_QUERY_ENTRY_DEVELOPER) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_origin, DATABASE_QUERY_ENTRY_ORIGIN) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_releasemonth, DATABASE_QUERY_ENTRY_RELEASEDATE_MONTH) +generic_deferred_cursor_manager(deferred_push_cursor_manager_list_deferred_query_rdb_entry_releaseyear, DATABASE_QUERY_ENTRY_RELEASEDATE_YEAR) -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_edge_magazine_rating( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_EDGE_MAGAZINE_RATING); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_edge_magazine_issue( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_EDGE_MAGAZINE_ISSUE); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_elspa_rating( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_ELSPA_RATING); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_cero_rating( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_CERO_RATING); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_pegi_rating( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_PEGI_RATING); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_bbfc_rating( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_BBFC_RATING); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_esrb_rating( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_ESRB_RATING); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_enhancement_hw( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_ENHANCEMENT_HW); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_franchise( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_FRANCHISE); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_publisher( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_PUBLISHER); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_developer( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_DEVELOPER); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_origin( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_ORIGIN); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_releasemonth( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_RELEASEDATE_MONTH); -} - -static int deferred_push_cursor_manager_list_deferred_query_rdb_entry_releaseyear( - menu_displaylist_info_t *info) -{ - return deferred_push_cursor_manager_list_generic(info, DATABASE_QUERY_ENTRY_RELEASEDATE_YEAR); -} #endif #if 0 @@ -941,111 +605,11 @@ static int deferred_push_default(menu_displaylist_info_t *info) return general_push(info, PUSH_DEFAULT, DISPLAYLIST_DEFAULT); } -static int deferred_push_history_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_HISTORY); -} - -static int deferred_push_database_manager_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_DATABASES); -} - -static int deferred_push_cursor_manager_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_DATABASE_CURSORS); -} - -static int deferred_push_content_collection_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_DATABASE_PLAYLISTS); -} - static int deferred_push_favorites_list(menu_displaylist_info_t *info) { return general_push(info, PUSH_DEFAULT, DISPLAYLIST_FAVORITES); } -static int deferred_push_browse_url_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_BROWSE_URL_LIST); -} - -static int deferred_push_browse_url_start(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_BROWSE_URL_START); -} - -static int deferred_push_core_list(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CORES); -} - -static int deferred_push_configurations(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CONFIG_FILES); -} - -static int deferred_push_video_shader_preset(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_SHADER_PRESET); -} - -static int deferred_push_video_shader_pass(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_SHADER_PASS); -} - -static int deferred_push_video_filter(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_VIDEO_FILTERS); -} - -static int deferred_push_images(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_IMAGES); -} - -static int deferred_push_audio_dsp_plugin(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_AUDIO_FILTERS); -} - -static int deferred_push_cheat_file_load(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CHEAT_FILES); -} - -static int deferred_push_remap_file_load(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_REMAP_FILES); -} - -static int deferred_push_record_configfile(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_RECORD_CONFIG_FILES); -} - -static int deferred_push_input_overlay(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_OVERLAYS); -} - -static int deferred_push_video_font_path(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_FONTS); -} - -static int deferred_push_xmb_font_path(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_FONTS); -} - -static int deferred_push_content_history_path(menu_displaylist_info_t *info) -{ - return deferred_push_dlist(info, DISPLAYLIST_CONTENT_HISTORY); -} - static int menu_cbs_init_bind_deferred_push_compare_label( menu_file_list_cbs_t *cbs, const char *label, uint32_t label_hash) diff --git a/menu/menu_event.c b/menu/menu_event.c index c8fe862dbb..9c2c8eaecc 100644 --- a/menu/menu_event.c +++ b/menu/menu_event.c @@ -160,12 +160,12 @@ unsigned menu_event(retro_bits_t* p_input, retro_bits_t* p_trigger_input) unsigned menu_cancel_btn = (!input_swap_override && settings->bools.input_menu_swap_ok_cancel_buttons) ? RETRO_DEVICE_ID_JOYPAD_A : RETRO_DEVICE_ID_JOYPAD_B; - unsigned ok_current = RARCH_INPUT_STATE_BIT_GET_PTR(p_input, menu_ok_btn ); + unsigned ok_current = BIT256_GET_PTR(p_input, menu_ok_btn ); unsigned ok_trigger = ok_current & ~ok_old; ok_old = ok_current; - if (RARCH_INPUT_STATE_ANY_SET_PTR(p_input)) + if (bits_any_set(p_input->data, ARRAY_SIZE(p_input->data))) { if (!first_held) { @@ -221,31 +221,31 @@ unsigned menu_event(retro_bits_t* p_input, retro_bits_t* p_trigger_input) { menu_event_osk_iterate(); - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) + if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) { if (menu_event_get_osk_ptr() < 33) menu_event_set_osk_ptr(menu_event_get_osk_ptr() + OSK_CHARS_PER_LINE); } - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) + if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) { if (menu_event_get_osk_ptr() >= OSK_CHARS_PER_LINE) menu_event_set_osk_ptr(menu_event_get_osk_ptr() - OSK_CHARS_PER_LINE); } - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) + if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) { if (menu_event_get_osk_ptr() < 43) menu_event_set_osk_ptr(menu_event_get_osk_ptr() + 1); } - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) + if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) { if (menu_event_get_osk_ptr() >= 1) menu_event_set_osk_ptr(menu_event_get_osk_ptr() - 1); } - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) + if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) { if (menu_event_get_osk_idx() > OSK_TYPE_UNKNOWN + 1) menu_event_set_osk_idx((enum osk_type)(menu_event_get_osk_idx() - 1)); @@ -253,7 +253,7 @@ unsigned menu_event(retro_bits_t* p_input, retro_bits_t* p_trigger_input) menu_event_set_osk_idx((enum osk_type)(OSK_TYPE_LAST - 1)); } - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) + if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) { if (menu_event_get_osk_idx() < OSK_TYPE_LAST - 1) menu_event_set_osk_idx((enum osk_type)(menu_event_get_osk_idx() + 1)); @@ -261,50 +261,50 @@ unsigned menu_event(retro_bits_t* p_input, retro_bits_t* p_trigger_input) menu_event_set_osk_idx((enum osk_type)(OSK_TYPE_UNKNOWN + 1)); } - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, menu_ok_btn)) + if (BIT256_GET_PTR(p_trigger_input, menu_ok_btn)) { if (menu_event_get_osk_ptr() >= 0) menu_event_osk_append(menu_event_get_osk_ptr()); } - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, menu_cancel_btn)) + if (BIT256_GET_PTR(p_trigger_input, menu_cancel_btn)) { input_keyboard_event(true, '\x7f', '\x7f', 0, RETRO_DEVICE_KEYBOARD); } /* send return key to close keyboard input window */ - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) + if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) input_keyboard_event(true, '\n', '\n', 0, RETRO_DEVICE_KEYBOARD); - RARCH_INPUT_STATE_CLEAR_PTR(p_trigger_input); + BIT256_CLEAR_ALL_PTR(p_trigger_input); } else { - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) + if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_UP)) ret = MENU_ACTION_UP; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) + else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) ret = MENU_ACTION_DOWN; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) + else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_LEFT)) ret = MENU_ACTION_LEFT; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) + else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_RIGHT)) ret = MENU_ACTION_RIGHT; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) + else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_L)) ret = MENU_ACTION_SCROLL_UP; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) + else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_R)) ret = MENU_ACTION_SCROLL_DOWN; else if (ok_trigger) ret = MENU_ACTION_OK; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, menu_cancel_btn)) + else if (BIT256_GET_PTR(p_trigger_input, menu_cancel_btn)) ret = MENU_ACTION_CANCEL; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_X)) + else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_X)) ret = MENU_ACTION_SEARCH; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_Y)) + else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_Y)) ret = MENU_ACTION_SCAN; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) + else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_START)) ret = MENU_ACTION_START; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + else if (BIT256_GET_PTR(p_trigger_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) ret = MENU_ACTION_INFO; - else if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RARCH_MENU_TOGGLE)) + else if (BIT256_GET_PTR(p_trigger_input, RARCH_MENU_TOGGLE)) ret = MENU_ACTION_TOGGLE; } @@ -314,7 +314,7 @@ unsigned menu_event(retro_bits_t* p_input, retro_bits_t* p_trigger_input) menu_event_kb_set_internal(RETROK_F11, 0); } - if (RARCH_INPUT_STATE_BIT_GET_PTR(p_trigger_input, RARCH_QUIT_KEY)) + if (BIT256_GET_PTR(p_trigger_input, RARCH_QUIT_KEY)) return MENU_ACTION_QUIT; mouse_enabled = settings->bools.menu_mouse_enable; diff --git a/playlist.c b/playlist.c index 2c22d9243d..5ccc40cd2e 100644 --- a/playlist.c +++ b/playlist.c @@ -381,7 +381,6 @@ void playlist_write_file(playlist_t *playlist) { size_t i; RFILE *file = NULL; - FILE *fp = NULL; if (!playlist || !playlist->modified) return; @@ -394,10 +393,8 @@ void playlist_write_file(playlist_t *playlist) return; } - fp = filestream_get_fp(file); - for (i = 0; i < playlist->size; i++) - fprintf(fp, "%s\n%s\n%s\n%s\n%s\n%s\n", + filestream_printf(file, "%s\n%s\n%s\n%s\n%s\n%s\n", playlist->entries[i].path ? playlist->entries[i].path : "", playlist->entries[i].label ? playlist->entries[i].label : "", playlist->entries[i].core_path, diff --git a/retroarch.c b/retroarch.c index 88173a0266..2545b79424 100644 --- a/retroarch.c +++ b/retroarch.c @@ -1931,7 +1931,7 @@ bool retroarch_override_setting_is_set(enum rarch_override_setting enum_idx, voi if (val) { unsigned bit = *val; - return BIT128_GET(has_set_libretro_device, bit); + return BIT256_GET(has_set_libretro_device, bit); } } break; @@ -1980,7 +1980,7 @@ void retroarch_override_setting_set(enum rarch_override_setting enum_idx, void * if (val) { unsigned bit = *val; - BIT128_SET(has_set_libretro_device, bit); + BIT256_SET(has_set_libretro_device, bit); } } break; @@ -2039,7 +2039,7 @@ void retroarch_override_setting_unset(enum rarch_override_setting enum_idx, void if (val) { unsigned bit = *val; - BIT128_CLEAR(has_set_libretro_device, bit); + BIT256_CLEAR(has_set_libretro_device, bit); } } break; @@ -2315,35 +2315,35 @@ static bool input_driver_toggle_button_combo( switch (mode) { case INPUT_TOGGLE_DOWN_Y_L_R: - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_DOWN)) return false; - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_Y)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_Y)) return false; - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L)) return false; - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R)) return false; break; case INPUT_TOGGLE_L3_R3: - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L3)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L3)) return false; - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R3)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R3)) return false; break; case INPUT_TOGGLE_L1_R1_START_SELECT: - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_START)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_START)) return false; - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) return false; - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_L)) return false; - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_R)) return false; break; case INPUT_TOGGLE_START_SELECT: - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_START)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_START)) return false; - if (!RARCH_INPUT_STATE_BIT_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) + if (!BIT256_GET_PTR(p_input, RETRO_DEVICE_ID_JOYPAD_SELECT)) return false; break; default: @@ -2375,7 +2375,7 @@ static enum runloop_state runloop_check_state( retro_bits_t current_input; - if ( menu_is_alive && !(settings->bools.menu_unified_controls && !menu_input_dialog_get_display_kb()) ) + if (menu_is_alive && !(settings->bools.menu_unified_controls && !menu_input_dialog_get_display_kb())) input_menu_keys_pressed(settings, ¤t_input); else input_keys_pressed(settings, ¤t_input); @@ -2391,19 +2391,17 @@ static enum runloop_state runloop_check_state( ((settings->uints.input_menu_toggle_gamepad_combo != INPUT_TOGGLE_NONE) && input_driver_toggle_button_combo( settings->uints.input_menu_toggle_gamepad_combo, &last_input))) - { - RARCH_INPUT_STATE_BIT_SET(current_input, RARCH_MENU_TOGGLE); - } + BIT256_SET(current_input, RARCH_MENU_TOGGLE); #endif if (input_driver_flushing_input) { input_driver_flushing_input = false; - if (RARCH_INPUT_STATE_ANY_SET(current_input)) + if (bits_any_set(current_input.data, ARRAY_SIZE(current_input.data))) { - RARCH_INPUT_STATE_CLEAR( current_input ); + BIT256_CLEAR_ALL(current_input); if (runloop_paused) - RARCH_INPUT_STATE_BIT_SET(current_input, RARCH_PAUSE_TOGGLE); + BIT256_SET(current_input, RARCH_PAUSE_TOGGLE); input_driver_flushing_input = true; } } @@ -2412,14 +2410,14 @@ static enum runloop_state runloop_check_state( #ifdef HAVE_MENU if (menu_driver_binding_state) - RARCH_INPUT_STATE_CLEAR( current_input ); + BIT256_CLEAR_ALL(current_input); #endif #ifdef HAVE_OVERLAY /* Check next overlay */ { static bool old_should_check_next_overlay = false; - bool should_check_next_overlay = runloop_cmd_press( + bool should_check_next_overlay = BIT256_GET( current_input, RARCH_OVERLAY_NEXT); if (should_check_next_overlay && !old_should_check_next_overlay) @@ -2431,7 +2429,7 @@ static enum runloop_state runloop_check_state( /* Check fullscreen toggle */ { - bool fs_toggle_pressed = runloop_cmd_press( + bool fs_toggle_pressed = BIT256_GET( current_input, RARCH_FULLSCREEN_TOGGLE_KEY); fs_toggle_triggered = fs_toggle_pressed && !old_fs_toggle_pressed; @@ -2454,7 +2452,7 @@ static enum runloop_state runloop_check_state( /* Check mouse grab toggle */ { static bool old_pressed = false; - bool pressed = runloop_cmd_press( + bool pressed = BIT256_GET( current_input, RARCH_GRAB_MOUSE_TOGGLE); if (pressed && !old_pressed) @@ -2489,7 +2487,7 @@ static enum runloop_state runloop_check_state( /* Check quit key */ { static bool old_quit_key = false; - bool quit_key = runloop_cmd_press( + bool quit_key = BIT256_GET( current_input, RARCH_QUIT_KEY); bool trig_quit_key = quit_key && !old_quit_key; @@ -2539,12 +2537,12 @@ static enum runloop_state runloop_check_state( retro_ctx.poll_cb(); { - retro_bits_t trigger_input; enum menu_action action; - bool focused; + bool focused = false; + retro_bits_t trigger_input = current_input; - trigger_input = current_input; - RARCH_INPUT_STATE_CLEAR_BITS( trigger_input, old_input ); + bits_clear_bits(trigger_input.data, old_input.data, + ARRAY_SIZE(trigger_input.data)); action = (enum menu_action)menu_event(¤t_input, &trigger_input); focused = pause_nonactive ? is_focused : true; @@ -2583,7 +2581,7 @@ static enum runloop_state runloop_check_state( /* Check game focus toggle */ { static bool old_pressed = false; - bool pressed = runloop_cmd_press( + bool pressed = BIT256_GET( current_input, RARCH_GAME_FOCUS_TOGGLE); if (pressed && !old_pressed) @@ -2596,7 +2594,7 @@ static enum runloop_state runloop_check_state( /* Check menu toggle */ { static bool old_pressed = false; - bool pressed = runloop_cmd_press( + bool pressed = BIT256_GET( current_input, RARCH_MENU_TOGGLE); if (menu_event_kb_is_set(RETROK_F1) == 1) @@ -2646,7 +2644,7 @@ static enum runloop_state runloop_check_state( /* Check screenshot toggle */ { static bool old_pressed = false; - bool pressed = runloop_cmd_press( + bool pressed = BIT256_GET( current_input, RARCH_SCREENSHOT); if (pressed && old_pressed) @@ -2658,7 +2656,7 @@ static enum runloop_state runloop_check_state( /* Check audio mute toggle */ { static bool old_pressed = false; - bool pressed = runloop_cmd_press( + bool pressed = BIT256_GET( current_input, RARCH_MUTE); if (pressed && !old_pressed) @@ -2670,8 +2668,7 @@ static enum runloop_state runloop_check_state( /* Check OSK toggle */ { static bool old_pressed = false; - bool pressed = runloop_cmd_press( - current_input, RARCH_OSK); + bool pressed = BIT256_GET(current_input, RARCH_OSK); if (pressed && !old_pressed) { @@ -2687,9 +2684,9 @@ static enum runloop_state runloop_check_state( old_pressed = pressed; } - if (runloop_cmd_press(current_input, RARCH_VOLUME_UP)) + if (BIT256_GET(current_input, RARCH_VOLUME_UP)) command_event(CMD_EVENT_VOLUME_UP, NULL); - else if (runloop_cmd_press(current_input, RARCH_VOLUME_DOWN)) + else if (BIT256_GET(current_input, RARCH_VOLUME_DOWN)) command_event(CMD_EVENT_VOLUME_DOWN, NULL); #ifdef HAVE_NETWORKING @@ -2697,9 +2694,9 @@ static enum runloop_state runloop_check_state( { static bool old_netplay_flip = false; static bool old_netplay_watch = false; - bool netplay_flip = runloop_cmd_press( + bool netplay_flip = BIT256_GET( current_input, RARCH_NETPLAY_FLIP); - bool netplay_watch = runloop_cmd_press( + bool netplay_watch = BIT256_GET( current_input, RARCH_NETPLAY_GAME_WATCH); if (netplay_flip && !old_netplay_flip) @@ -2718,9 +2715,9 @@ static enum runloop_state runloop_check_state( static bool old_frameadvance = false; static bool old_pause_pressed = false; bool check_is_oneshot = true; - bool frameadvance_pressed = runloop_cmd_press( + bool frameadvance_pressed = BIT256_GET( current_input, RARCH_FRAMEADVANCE); - bool pause_pressed = runloop_cmd_press( + bool pause_pressed = BIT256_GET( current_input, RARCH_PAUSE_TOGGLE); bool trig_frameadvance = frameadvance_pressed && !old_frameadvance; @@ -2744,7 +2741,7 @@ static enum runloop_state runloop_check_state( if (runloop_paused) { check_is_oneshot = trig_frameadvance || - runloop_cmd_press(current_input, RARCH_REWIND); + BIT256_GET(current_input, RARCH_REWIND); if (fs_toggle_triggered) { @@ -2769,9 +2766,9 @@ static enum runloop_state runloop_check_state( { static bool old_button_state = false; static bool old_hold_button_state = false; - bool new_button_state = runloop_cmd_press( + bool new_button_state = BIT256_GET( current_input, RARCH_FAST_FORWARD_KEY); - bool new_hold_button_state = runloop_cmd_press( + bool new_hold_button_state = BIT256_GET( current_input, RARCH_FAST_FORWARD_HOLD_KEY); if (new_button_state && !old_button_state) @@ -2812,9 +2809,9 @@ static enum runloop_state runloop_check_state( { static bool old_should_slot_increase = false; static bool old_should_slot_decrease = false; - bool should_slot_increase = runloop_cmd_press( + bool should_slot_increase = BIT256_GET( current_input, RARCH_STATE_SLOT_PLUS); - bool should_slot_decrease = runloop_cmd_press( + bool should_slot_decrease = BIT256_GET( current_input, RARCH_STATE_SLOT_MINUS); /* Checks if the state increase/decrease keys have been pressed @@ -2865,9 +2862,9 @@ static enum runloop_state runloop_check_state( { static bool old_should_savestate = false; static bool old_should_loadstate = false; - bool should_savestate = runloop_cmd_press( + bool should_savestate = BIT256_GET( current_input, RARCH_SAVE_STATE_KEY); - bool should_loadstate = runloop_cmd_press( + bool should_loadstate = BIT256_GET( current_input, RARCH_LOAD_STATE_KEY); if (should_savestate && !old_should_savestate) @@ -2888,14 +2885,14 @@ static enum runloop_state runloop_check_state( s[0] = '\0'; - if (state_manager_check_rewind(runloop_cmd_press(current_input, RARCH_REWIND), + if (state_manager_check_rewind(BIT256_GET(current_input, RARCH_REWIND), settings->uints.rewind_granularity, runloop_paused, s, sizeof(s), &t)) runloop_msg_queue_push(s, 0, t, true); } /* Checks if slowmotion toggle/hold was being pressed and/or held. */ { - runloop_slowmotion = runloop_cmd_press(current_input, RARCH_SLOWMOTION); + runloop_slowmotion = BIT256_GET(current_input, RARCH_SLOWMOTION); if (runloop_slowmotion) { @@ -2917,7 +2914,7 @@ static enum runloop_state runloop_check_state( /* Check movie record toggle */ { static bool old_pressed = false; - bool pressed = runloop_cmd_press( + bool pressed = BIT256_GET( current_input, RARCH_MOVIE_RECORD_TOGGLE); if (pressed && !old_pressed) @@ -2930,9 +2927,9 @@ static enum runloop_state runloop_check_state( { static bool old_shader_next = false; static bool old_shader_prev = false; - bool shader_next = runloop_cmd_press( + bool shader_next = BIT256_GET( current_input, RARCH_SHADER_NEXT); - bool shader_prev = runloop_cmd_press( + bool shader_prev = BIT256_GET( current_input, RARCH_SHADER_PREV); bool trig_shader_next = shader_next && !old_shader_next; bool trig_shader_prev = shader_prev && !old_shader_prev; @@ -2949,11 +2946,11 @@ static enum runloop_state runloop_check_state( static bool old_disk_eject = false; static bool old_disk_next = false; static bool old_disk_prev = false; - bool disk_eject = runloop_cmd_press( + bool disk_eject = BIT256_GET( current_input, RARCH_DISK_EJECT_TOGGLE); - bool disk_next = runloop_cmd_press( + bool disk_next = BIT256_GET( current_input, RARCH_DISK_NEXT); - bool disk_prev = runloop_cmd_press( + bool disk_prev = BIT256_GET( current_input, RARCH_DISK_PREV); if (disk_eject && !old_disk_eject) @@ -2971,7 +2968,7 @@ static enum runloop_state runloop_check_state( /* Check reset */ { static bool old_state = false; - bool new_state = runloop_cmd_press( + bool new_state = BIT256_GET( current_input, RARCH_RESET); if (new_state && !old_state) @@ -2985,11 +2982,11 @@ static enum runloop_state runloop_check_state( static bool old_cheat_index_plus = false; static bool old_cheat_index_minus = false; static bool old_cheat_index_toggle = false; - bool cheat_index_plus = runloop_cmd_press( + bool cheat_index_plus = BIT256_GET( current_input, RARCH_CHEAT_INDEX_PLUS); - bool cheat_index_minus = runloop_cmd_press( + bool cheat_index_minus = BIT256_GET( current_input, RARCH_CHEAT_INDEX_MINUS); - bool cheat_index_toggle = runloop_cmd_press( + bool cheat_index_toggle = BIT256_GET( current_input, RARCH_CHEAT_TOGGLE); if (cheat_index_plus && !old_cheat_index_plus) diff --git a/retroarch.h b/retroarch.h index 3cd1b742d3..6c45f744c1 100644 --- a/retroarch.h +++ b/retroarch.h @@ -27,8 +27,6 @@ #include "core_type.h" #include "core.h" -#define runloop_cmd_press(current_input, id) (RARCH_INPUT_STATE_BIT_GET(current_input, id)) - RETRO_BEGIN_DECLS enum rarch_ctl_state diff --git a/verbosity.c b/verbosity.c index 83dca5d02f..a260f79949 100644 --- a/verbosity.c +++ b/verbosity.c @@ -35,6 +35,7 @@ #include #include +#include #ifdef HAVE_CONFIG_H #include "config.h" @@ -49,8 +50,8 @@ /* If this is non-NULL. RARCH_LOG and friends * will write to this file. */ -static RFILE *log_file = NULL; static FILE *log_file_fp = NULL; +static void* log_file_buf = NULL; static bool main_verbosity = false; static bool log_file_initialized = false; @@ -96,17 +97,21 @@ void retro_main_log_file_init(const char *path) if (path == NULL) return; - log_file = filestream_open(path, RFILE_MODE_WRITE, -1); - log_file_fp = filestream_get_fp(log_file); + log_file_fp = fopen_utf8(path, "wb"); log_file_initialized = true; + + /* TODO: this is only useful for a few platforms, find which and add ifdef */ + log_file_buf = calloc(1, 0x4000); + setvbuf(log_file_fp, (char*)log_file_buf, _IOFBF, 0x4000); } void retro_main_log_file_deinit(void) { - if (log_file && log_file_fp != stderr) - filestream_close(log_file); - log_file = NULL; + if (log_file_fp && log_file_fp != stderr) + fclose(log_file_fp); + if (log_file_buf) free(log_file_buf); log_file_fp = NULL; + log_file_buf = NULL; } #if !defined(HAVE_LOGGER)