/** * gfx_ctx_init: * @data : Input data. * @ctx : Graphics context driver to initialize. * @ident : Identifier of graphics context driver to find. * @api : API of higher-level graphics API. * @major : Major version number of higher-level graphics API. * @minor : Minor version number of higher-level graphics API. * @hw_render_ctx : Request a graphics context driver capable of * hardware rendering? * * Initialize graphics context driver. * * Returns: graphics context driver if successfully initialized, otherwise NULL. **/ static const gfx_ctx_driver_t *gfx_ctx_init(void *data, const gfx_ctx_driver_t *ctx, const char *ident, enum gfx_ctx_api api, unsigned major, unsigned minor, bool hw_render_ctx) { settings_t *settings = config_get_ptr(); if (ctx->bind_api(data, api, major, minor)) { void *ctx_data = ctx->init(data); if (!ctx_data) return NULL; if (ctx->bind_hw_render) ctx->bind_hw_render(ctx_data, settings->video.shared_context && hw_render_ctx); gfx_ctx_ctl(GFX_CTL_SET_VIDEO_CONTEXT_DATA, ctx_data); return ctx; } #ifndef _WIN32 RARCH_WARN("Failed to bind API (#%u, version %u.%u) on context driver \"%s\".\n", (unsigned)api, major, minor, ctx->ident); #endif return NULL; }
static const shader_backend_t *video_shader_set_backend(enum rarch_shader_type type) { switch (type) { case RARCH_SHADER_CG: { #ifdef HAVE_CG gfx_ctx_flags_t flags; gfx_ctx_ctl(GFX_CTL_GET_FLAGS, &flags); if (BIT32_GET(flags.flags, GFX_CTX_FLAGS_GL_CORE_CONTEXT)) { RARCH_ERR("[Shader driver]: Cg cannot be used with core GL context. Trying to fall back to GLSL...\n"); return video_shader_set_backend(RARCH_SHADER_GLSL); } RARCH_LOG("[Shader driver]: Using Cg shader backend.\n"); return &gl_cg_backend; #else break; #endif } case RARCH_SHADER_GLSL: #ifdef HAVE_GLSL RARCH_LOG("[Shader driver]: Using GLSL shader backend.\n"); return &gl_glsl_backend; #else break; #endif case RARCH_SHADER_NONE: default: break; } return NULL; }
static int menu_input_pointer_post_iterate( menu_file_list_cbs_t *cbs, menu_entry_t *entry, unsigned action) { unsigned header_height; size_t selection; static bool pointer_oldpressed[2]; static bool pointer_oldback = false; static int16_t start_x = 0; static int16_t start_y = 0; static int16_t pointer_old_x = 0; static int16_t pointer_old_y = 0; int ret = 0; menu_input_t *menu_input = menu_input_get_ptr(); settings_t *settings = config_get_ptr(); bool check_overlay = false; if (settings) check_overlay = !settings->menu.pointer.enable; if (!menu_input) return -1; if (!menu_navigation_ctl(MENU_NAVIGATION_CTL_GET_SELECTION, &selection)) return -1; menu_display_ctl(MENU_DISPLAY_CTL_HEADER_HEIGHT, &header_height); #ifdef HAVE_OVERLAY check_overlay = check_overlay || (settings->input.overlay_enable && input_overlay_is_alive()); #endif if (check_overlay) return 0; if (menu_input->pointer.pressed[0]) { gfx_ctx_metrics_t metrics; float dpi; static float accel0 = 0.0f; static float accel1 = 0.0f; int16_t pointer_x = menu_input_pointer_state(MENU_POINTER_X_AXIS); int16_t pointer_y = menu_input_pointer_state(MENU_POINTER_Y_AXIS); metrics.type = DISPLAY_METRIC_DPI; metrics.value = &dpi; gfx_ctx_ctl(GFX_CTL_GET_METRICS, &metrics); if (!pointer_oldpressed[0]) { menu_input->pointer.accel = 0; accel0 = 0; accel1 = 0; start_x = pointer_x; start_y = pointer_y; pointer_old_x = pointer_x; pointer_old_y = pointer_y; pointer_oldpressed[0] = true; } else if (abs(pointer_x - start_x) > (dpi / 10) || abs(pointer_y - start_y) > (dpi / 10)) { float s, delta_time; menu_input_ctl(MENU_INPUT_CTL_SET_POINTER_DRAGGED, NULL); menu_input->pointer.dx = pointer_x - pointer_old_x; menu_input->pointer.dy = pointer_y - pointer_old_y; pointer_old_x = pointer_x; pointer_old_y = pointer_y; menu_animation_ctl(MENU_ANIMATION_CTL_DELTA_TIME, &delta_time); s = (menu_input->pointer.dy * 550000000.0 ) / ( dpi * delta_time ); menu_input->pointer.accel = (accel0 + accel1 + s) / 3; accel0 = accel1; accel1 = menu_input->pointer.accel; } } else { if (pointer_oldpressed[0]) { if (!menu_input_ctl(MENU_INPUT_CTL_IS_POINTER_DRAGGED, NULL)) { menu_ctx_pointer_t point; point.x = start_x; point.y = start_y; point.ptr = menu_input->pointer.ptr; point.cbs = cbs; point.entry = entry; point.action = action; menu_driver_ctl(RARCH_MENU_CTL_POINTER_TAP, &point); ret = point.retcode; } pointer_oldpressed[0] = false; start_x = 0; start_y = 0; pointer_old_x = 0; pointer_old_y = 0; menu_input->pointer.dx = 0; menu_input->pointer.dy = 0; menu_input_ctl(MENU_INPUT_CTL_UNSET_POINTER_DRAGGED, NULL); } } if (menu_input->pointer.back) { if (!pointer_oldback) { pointer_oldback = true; menu_entries_pop_stack(&selection, 0, 1); menu_navigation_ctl(MENU_NAVIGATION_CTL_SET_SELECTION, &selection); } } pointer_oldback = menu_input->pointer.back; return ret; }