Merge git://github.com/libretro/RetroArch

Conflicts:
	frontend/frontend.c
This commit is contained in:
Themaister 2013-07-28 10:34:01 +02:00
commit c8f02607d2
30 changed files with 481 additions and 1149 deletions

View File

@ -3,6 +3,7 @@ include config.mk
TARGET = retroarch tools/retroarch-joyconfig tools/retrolaunch/retrolaunch
OBJ = frontend/frontend.o \
frontend/frontend_context.o \
retroarch.o \
file.o \
file_path.o \

View File

@ -39,7 +39,7 @@ LIBS := -lfat -lwiiuse -logc -lbte
APP_BOOTER_DIR = wii/app_booter
OBJ = frontend/frontend_salamander.o file_path.o compat/compat.o conf/config_file.o $(APP_BOOTER_DIR)/app_booter.binobj
OBJ = frontend/frontend_salamander.o frontend/frontend_context.o file_path.o compat/compat.o conf/config_file.o $(APP_BOOTER_DIR)/app_booter.binobj
ifeq ($(HAVE_LOGGER), 1)
CFLAGS += -DHAVE_LOGGER

View File

@ -2,6 +2,7 @@ TARGET = retroarch.exe
JTARGET = tools/retroarch-joyconfig.exe
OBJ = frontend/frontend.o \
frontend/frontend_context.o \
retroarch.o \
file.o \
file_path.o \

View File

@ -18,18 +18,8 @@
#include "../conf/config_file.h"
#include "../file.h"
#if defined(RARCH_CONSOLE)
#include "frontend_context.h"
frontend_ctx_driver_t *frontend_ctx;
#endif
#if defined(__QNX__)
#include <bps/bps.h>
#elif defined(__APPLE__)
#include <dispatch/dispatch.h>
#include <pthread.h>
#include "../apple/RetroArch/rarch_wrapper.h"
#endif
#if defined(HAVE_RGUI) || defined(HAVE_RMENU) || defined(HAVE_RMENU_XUI)
#define HAVE_MENU
@ -79,64 +69,38 @@ static bool libretro_install_core(const char *path_prefix,
return true;
}
#define MAKE_DIR(x, name) { \
RARCH_LOG("Checking directory name %s [%s]\n", name, x); \
if (strlen(x) > 0) \
{ \
if (!path_is_directory((x)) )\
{ \
RARCH_WARN("Directory \"%s\" does not exists, creating\n", (x)); \
if (mkdir((x), 0777) != 0) \
{ \
RARCH_ERR("Could not create directory \"%s\"\n", (x)); \
} \
} \
} \
}
#endif
static void system_preinit(void)
void rarch_make_dir(const char *x, const char *name)
{
#if defined(__QNX__) && !defined(HAVE_BB10)
//Initialize BPS libraries
bps_initialize();
#elif defined(RARCH_CONSOLE)
if (frontend_ctx->init)
frontend_ctx->init();
#endif
RARCH_LOG("Checking directory name %s [%s]\n", name, x);
if (strlen(x) > 0)
{
if (!path_is_directory(x))
{
RARCH_WARN("Directory \"%s\" does not exists, creating\n", x);
if (mkdir((x), 0777) != 0)
RARCH_ERR("Could not create directory \"%s\"\n", x);
}
}
}
#endif
static void rarch_get_environment(int argc, char *argv[])
{
#if defined(__QNX__) && !defined(HAVE_BB10)
strlcpy(g_settings.libretro, "app/native/lib", sizeof(g_settings.libretro));
strlcpy(g_extern.config_path, "app/native/retroarch.cfg", sizeof(g_extern.config_path));
strlcpy(g_settings.video.shader_dir, "app/native/shaders_glsl", sizeof(g_settings.video.shader_dir));
config_load();
g_extern.verbose = true;
#elif defined(RARCH_CONSOLE)
#if defined(HAVE_LOGGER)
g_extern.verbose = true;
logger_init();
#elif defined(HAVE_FILE_LOGGER)
g_extern.verbose = true;
g_extern.log_file = fopen("/retroarch-log.txt", "w");
#endif
g_extern.verbose = true;
if (frontend_ctx->get_environment_settings)
frontend_ctx->get_environment_settings(argc, argv);
MAKE_DIR(default_paths.port_dir, "port_dir");
MAKE_DIR(default_paths.system_dir, "system_dir");
MAKE_DIR(default_paths.savestate_dir, "savestate_dir");
MAKE_DIR(default_paths.sram_dir, "sram_dir");
MAKE_DIR(default_paths.input_presets_dir, "input_presets_dir");
if (frontend_ctx && frontend_ctx->environment_get)
frontend_ctx->environment_get(argc, argv);
config_load();
#if defined(RARCH_CONSOLE)
init_libretro_sym(false);
rarch_init_system_info();
@ -176,91 +140,19 @@ static void rarch_get_environment(int argc, char *argv[])
#endif
}
static void system_shutdown(void)
{
#if defined(__QNX__)
bps_shutdown();
#elif defined(__APPLE__)
dispatch_async_f(dispatch_get_main_queue(), 0, apple_rarch_exited);
#endif
}
static int system_ctx_init(void)
{
#ifdef RARCH_CONSOLE
if ((frontend_ctx = (frontend_ctx_driver_t*)frontend_ctx_init_first()) == NULL)
return -1;
#endif
return 0;
}
#if defined(__APPLE__)
static pthread_mutex_t apple_event_queue_lock = PTHREAD_MUTEX_INITIALIZER;
static struct
{
void (*function)(void*);
void* userdata;
} apple_event_queue[16];
static uint32_t apple_event_queue_size;
void apple_frontend_post_event(void (*fn)(void*), void* userdata)
{
pthread_mutex_lock(&apple_event_queue_lock);
if (apple_event_queue_size < 16)
{
apple_event_queue[apple_event_queue_size].function = fn;
apple_event_queue[apple_event_queue_size].userdata = userdata;
apple_event_queue_size ++;
}
pthread_mutex_unlock(&apple_event_queue_lock);
}
static void apple_free_main_wrap(struct rarch_main_wrap* wrap)
{
if (wrap)
{
free((char*)wrap->libretro_path);
free((char*)wrap->rom_path);
free((char*)wrap->sram_path);
free((char*)wrap->state_path);
free((char*)wrap->config_path);
}
free(wrap);
}
static void process_events(void)
{
pthread_mutex_lock(&apple_event_queue_lock);
for (int i = 0; i < apple_event_queue_size; i ++)
apple_event_queue[i].function(apple_event_queue[i].userdata);
apple_event_queue_size = 0;
pthread_mutex_unlock(&apple_event_queue_lock);
}
void* rarch_main(void* args)
#else
int rarch_main(int argc, char *argv[])
#endif
{
if (system_ctx_init() != 0)
return 0;
frontend_ctx = (frontend_ctx_driver_t*)frontend_ctx_init_first();
system_preinit();
if (frontend_ctx && frontend_ctx->init)
frontend_ctx->init();
#if !defined(__APPLE__)
rarch_main_clear_state();
rarch_get_environment(argc, argv);
#endif
#if !defined(RARCH_CONSOLE)
#if defined(__APPLE__)
@ -282,18 +174,12 @@ int rarch_main(int argc, char *argv[])
#endif
#ifdef HAVE_MENU
#ifdef IOS
char* system_directory = ios_get_rarch_system_directory();
strlcpy(g_extern.savestate_dir, system_directory, sizeof(g_extern.savestate_dir));
strlcpy(g_extern.savefile_dir, system_directory, sizeof(g_extern.savefile_dir));
free(system_directory);
#endif
menu_init();
#ifdef RARCH_CONSOLE
if (frontend_ctx->process_args)
if (frontend_ctx && frontend_ctx->process_args)
frontend_ctx->process_args(argc, argv);
#ifdef RARCH_CONSOLE
g_extern.lifecycle_mode_state |= 1ULL << MODE_LOAD_GAME;
#else
g_extern.lifecycle_mode_state |= 1ULL << MODE_GAME;
@ -322,11 +208,9 @@ int rarch_main(int argc, char *argv[])
#if defined(RARCH_CONSOLE) || defined(__QNX__)
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU);
#else
#if defined(__APPLE__)
// This needs to be here to tell the GUI thread that the emulator loop has stopped,
// the (void*)1 makes it display the 'Failed to load game' message.
dispatch_async_f(dispatch_get_main_queue(), (void*)1, apple_rarch_exited);
#endif
if (frontend_ctx && frontend_ctx->shutdown)
frontend_ctx->shutdown(true);
return 1;
#endif
}
@ -337,16 +221,14 @@ int rarch_main(int argc, char *argv[])
{
#ifdef RARCH_CONSOLE
driver.input->poll(NULL);
#endif
if (driver.video_poke->set_aspect_ratio)
driver.video_poke->set_aspect_ratio(driver.video_data, g_settings.video.aspect_ratio_idx);
#endif
while ((g_extern.is_paused && !g_extern.is_oneshot) ? rarch_main_idle_iterate() : rarch_main_iterate())
{
#if defined(__APPLE__)
process_events();
#endif
if (frontend_ctx && frontend_ctx->process_events)
frontend_ctx->process_events();
if (!(g_extern.lifecycle_mode_state & (1ULL << MODE_GAME)))
break;
@ -364,9 +246,8 @@ int rarch_main(int argc, char *argv[])
while (!g_extern.system.shutdown && menu_iterate())
{
#if defined(__APPLE__)
process_events();
#endif
if (frontend_ctx && frontend_ctx->process_events)
frontend_ctx->process_events();
if (!(g_extern.lifecycle_mode_state & (1ULL << MODE_MENU)))
break;
@ -419,7 +300,6 @@ int rarch_main(int argc, char *argv[])
rarch_perf_log();
#endif
#ifdef RARCH_CONSOLE
#if defined(HAVE_LOGGER)
logger_shutdown();
#elif defined(HAVE_FILE_LOGGER)
@ -427,19 +307,18 @@ int rarch_main(int argc, char *argv[])
fclose(g_extern.log_file);
g_extern.log_file = NULL;
#endif
if (frontend_ctx->deinit)
if (frontend_ctx && frontend_ctx->deinit)
frontend_ctx->deinit();
if (g_extern.lifecycle_mode_state & (1ULL << MODE_EXITSPAWN) && frontend_ctx->exitspawn)
if (g_extern.lifecycle_mode_state & (1ULL << MODE_EXITSPAWN) && frontend_ctx
&& frontend_ctx->exitspawn)
frontend_ctx->exitspawn();
#endif
rarch_main_clear_state();
#ifdef __QNX__
bps_shutdown();
#endif
system_shutdown();
if (frontend_ctx && frontend_ctx->shutdown)
frontend_ctx->shutdown(false);
return 0;
}

View File

@ -30,6 +30,12 @@ static const frontend_ctx_driver_t *frontend_ctx_drivers[] = {
#if defined(GEKKO)
&frontend_ctx_gx,
#endif
#if defined(__QNX__)
&frontend_ctx_qnx,
#endif
#if defined(IOS) || defined(OSX)
&frontend_ctx_apple,
#endif
};
const frontend_ctx_driver_t *frontend_ctx_find_driver(const char *ident)

View File

@ -32,14 +32,16 @@
typedef struct frontend_ctx_driver
{
void (*get_environment_settings)(int argc, char *argv[]);
void (*environment_get)(int argc, char *argv[]);
void (*init)(void);
void (*deinit)(void);
void (*exitspawn)(void);
int (*process_args)(int argc, char *argv[]);
int (*process_events)(void);
void (*exec)(const char *, bool);
void (*shutdown)(bool);
// Human readable string.
const char *ident;
@ -48,8 +50,14 @@ typedef struct frontend_ctx_driver
extern const frontend_ctx_driver_t frontend_ctx_gx;
extern const frontend_ctx_driver_t frontend_ctx_ps3;
extern const frontend_ctx_driver_t frontend_ctx_xdk;
extern const frontend_ctx_driver_t frontend_ctx_qnx;
extern const frontend_ctx_driver_t frontend_ctx_apple;
const frontend_ctx_driver_t *frontend_ctx_find_driver(const char *ident); // Finds driver with ident. Does not initialize.
const frontend_ctx_driver_t *frontend_ctx_init_first(void); // Finds first suitable driver and initializes.
#ifdef RARCH_CONSOLE
extern void rarch_make_dir(const char *x, const char *name);
#endif
#endif

View File

@ -458,7 +458,6 @@ void load_menu_game_history(unsigned game_index)
#if !defined( HAVE_DYNAMIC) && defined(RARCH_CONSOLE)
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN_START_GAME);
#elif defined(HAVE_DYNAMIC)

View File

@ -246,7 +246,6 @@ rgui_handle_t *rgui_init(void)
/* TODO - should be refactored - perhaps don't do rarch_fail but instead
* exit program */
g_extern.lifecycle_mode_state &= ~((1ULL << MODE_MENU) | (1ULL << MODE_GAME));
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
return NULL;
}
@ -1063,7 +1062,6 @@ static int rgui_settings_toggle_setting(rgui_handle_t *rgui, unsigned setting, r
sizeof(g_extern.fullpath));
#endif
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN);
return -1;
}
@ -1079,7 +1077,6 @@ static int rgui_settings_toggle_setting(rgui_handle_t *rgui, unsigned setting, r
if (action == RGUI_ACTION_OK)
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
return -1;
}
break;
@ -2654,7 +2651,6 @@ int rgui_iterate(rgui_handle_t *rgui)
fill_pathname_join(g_extern.fullpath, default_paths.core_dir,
SALAMANDER_FILE, sizeof(g_extern.fullpath));
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN);
ret = -1;
#endif

View File

@ -559,21 +559,14 @@ static int select_file(void *data, uint64_t input)
driver.video_poke->set_texture_frame(driver.video_data, menu_texture->pixels,
true, menu_texture->width, menu_texture->height, 1.0f);
break;
}
if (rgui->menu_type == LIBRETRO_CHOICE)
{
strlcpy(g_settings.libretro, path, sizeof(g_settings.libretro));
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN);
return -1;
case LIBRETRO_CHOICE:
strlcpy(g_settings.libretro, path, sizeof(g_settings.libretro));
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN);
return -1;
}
pop_menu_stack = true;
}
if (!ret)
msg_queue_push(g_extern.msg_queue, "INFO - You need to restart RetroArch.", 1, 180);
}
else if ((input & (1ULL << DEVICE_NAV_X)) || (input & (1ULL << DEVICE_NAV_MENU)))
pop_menu_stack = true;
@ -743,7 +736,7 @@ static bool osk_callback_enter_rsound(void *data)
return false;
do_exit:
g_extern.lifecycle_mode_state &= ~((1ULL << MODE_OSK_DRAW) | (1ULL << MODE_OSK_ENTRY_SUCCESS) |
g_extern.lifecycle_mode_state &= ~((1ULL << MODE_OSK_ENTRY_SUCCESS) |
(1ULL << MODE_OSK_ENTRY_FAIL));
return true;
}
@ -797,7 +790,7 @@ static bool osk_callback_enter_filename(void *data)
return false;
do_exit:
g_extern.lifecycle_mode_state &= ~((1ULL << MODE_OSK_DRAW) | (1ULL << MODE_OSK_ENTRY_SUCCESS) |
g_extern.lifecycle_mode_state &= ~((1ULL << MODE_OSK_ENTRY_SUCCESS) |
(1ULL << MODE_OSK_ENTRY_FAIL));
return true;
}
@ -847,7 +840,6 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_VIDEO_PAL_ENABLE);
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_VIDEO_PAL_TEMPORAL_ENABLE);
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_VIDEO_PAL_VSYNC_BLOCK);
}
@ -863,12 +855,10 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
if (g_extern.lifecycle_mode_state & (1ULL << MODE_VIDEO_PAL_TEMPORAL_ENABLE))
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_VIDEO_PAL_TEMPORAL_ENABLE);
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_VIDEO_PAL_VSYNC_BLOCK);
}
else
{
g_extern.lifecycle_mode_state |= (1ULL << MODE_VIDEO_PAL_TEMPORAL_ENABLE);
g_extern.lifecycle_mode_state |= (1ULL << MODE_VIDEO_PAL_VSYNC_BLOCK);
}
driver.video->restart();
@ -881,7 +871,6 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
if (g_extern.lifecycle_mode_state & (1ULL << MODE_VIDEO_PAL_ENABLE))
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_VIDEO_PAL_TEMPORAL_ENABLE);
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_VIDEO_PAL_VSYNC_BLOCK);
driver.video->restart();
rgui_init_textures();
@ -1455,7 +1444,6 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN_MULTIMAN);
return -1;
@ -1466,7 +1454,6 @@ static int set_setting_action(uint8_t menu_type, unsigned switchvalue, uint64_t
if (input & (1ULL << DEVICE_NAV_B))
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_MENU_INGAME_EXIT);
return -1;
}
@ -2898,10 +2885,7 @@ int rgui_input_postprocess(void *data, uint64_t old_state)
device_ptr->ctx_driver->check_window(&quit, &resize, &width, &height, frame_count);
if (quit)
{
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
ret = -1;
}
if (g_extern.lifecycle_mode_state & (1ULL << MODE_MENU_INGAME_EXIT))
{

View File

@ -1224,7 +1224,6 @@ HRESULT CRetroArchCoreBrowser::OnNotifyPress( HXUIOBJ hObjPressed, BOOL& bHandle
{
snprintf(g_settings.libretro, sizeof(g_settings.libretro), "%s\\%s",
rgui->browser->current_dir.directory_path, str_buffer);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXITSPAWN);
process_input_ret = -1;
}
@ -1409,7 +1408,6 @@ HRESULT CRetroArchMain::OnControlNavigate(XUIMessageControlNavigate *pControlNav
if (input == XUI_CONTROL_NAVIGATE_OK)
{
g_extern.lifecycle_mode_state &= ~(1ULL << MODE_GAME);
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
process_input_ret = -1;
}
break;

View File

@ -0,0 +1,107 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2013 - Hans-Kristian Arntzen
* Copyright (C) 2011-2013 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
* * You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include <dispatch/dispatch.h>
#include <pthread.h>
#include "../apple/RetroArch/rarch_wrapper.h"
#include <stdint.h>
#include "../../boolean.h"
#include <stddef.h>
#include <string.h>
static pthread_mutex_t apple_event_queue_lock = PTHREAD_MUTEX_INITIALIZER;
static struct
{
void (*function)(void*);
void* userdata;
} apple_event_queue[16];
static uint32_t apple_event_queue_size;
void apple_frontend_post_event(void (*fn)(void*), void* userdata)
{
pthread_mutex_lock(&apple_event_queue_lock);
if (apple_event_queue_size < 16)
{
apple_event_queue[apple_event_queue_size].function = fn;
apple_event_queue[apple_event_queue_size].userdata = userdata;
apple_event_queue_size ++;
}
pthread_mutex_unlock(&apple_event_queue_lock);
}
static void apple_free_main_wrap(struct rarch_main_wrap* wrap)
{
if (wrap)
{
free((char*)wrap->libretro_path);
free((char*)wrap->rom_path);
free((char*)wrap->sram_path);
free((char*)wrap->state_path);
free((char*)wrap->config_path);
}
free(wrap);
}
static void process_events(void)
{
pthread_mutex_lock(&apple_event_queue_lock);
for (int i = 0; i < apple_event_queue_size; i ++)
apple_event_queue[i].function(apple_event_queue[i].userdata);
apple_event_queue_size = 0;
pthread_mutex_unlock(&apple_event_queue_lock);
}
static void system_shutdown(bool force)
{
/* force set to true makes it display the 'Failed to load game' message. */
if (force)
dispatch_async_f(dispatch_get_main_queue(), (void*)1, apple_rarch_exited);
else
dispatch_async_f(dispatch_get_main_queue(), 0, apple_rarch_exited);
}
static void environment_get(int argc, char *argv[])
{
(void)argc;
(void)argv;
#ifdef IOS
char* system_directory = ios_get_rarch_system_directory();
strlcpy(g_extern.savestate_dir, system_directory, sizeof(g_extern.savestate_dir));
strlcpy(g_extern.savefile_dir, system_directory, sizeof(g_extern.savefile_dir));
free(system_directory);
#endif
}
const frontend_ctx_driver_t frontend_ctx_apple = {
environment_get, /* environment_get */
NULL, /* init */
NULL, /* deinit */
NULL, /* exitspawn */
NULL, /* process_args */
process_events, /* process_events */
NULL, /* exec */
system_shutdown, /* shutdown */
"apple",
};

View File

@ -265,6 +265,14 @@ static void get_environment_settings(int argc, char *argv[])
else
gx_rom_path[0] = '\0';
#endif
#ifndef IS_SALAMANDER
rarch_make_dir(default_paths.port_dir, "port_dir");
rarch_make_dir(default_paths.system_dir, "system_dir");
rarch_make_dir(default_paths.savestate_dir, "savestate_dir");
rarch_make_dir(default_paths.sram_dir, "sram_dir");
rarch_make_dir(default_paths.input_presets_dir, "input_presets_dir");
#endif
}
extern void __exception_setreload(int t);
@ -308,20 +316,22 @@ static void system_init(void)
#endif
}
static void system_exec(const char *path, bool should_load_game);
static void system_exitspawn(void)
{
#if defined(IS_SALAMANDER)
rarch_console_exec(default_paths.libretro_path, gx_rom_path[0] != '\0' ? true : false);
system_exec(default_paths.libretro_path, gx_rom_path[0] != '\0' ? true : false);
#elif defined(HW_RVL)
bool should_load_game = false;
if (g_extern.lifecycle_mode_state & (1ULL << MODE_EXITSPAWN_START_GAME))
should_load_game = true;
rarch_console_exec(g_settings.libretro, should_load_game);
system_exec(g_settings.libretro, should_load_game);
// direct loading failed (out of memory), try to jump to salamander then load the correct core
char boot_dol[PATH_MAX];
snprintf(boot_dol, sizeof(boot_dol), "%s/boot.dol", default_paths.core_dir);
rarch_console_exec(boot_dol, should_load_game);
system_exec(boot_dol, should_load_game);
#endif
}
@ -444,11 +454,13 @@ static void dol_copy_argv_path(const char *dolpath, const char *argpath)
argv->length = len;
DCFlushRange(ARGS_ADDR, sizeof(struct __argv) + argv->length);
}
#endif
// WARNING: after we move any data into EXECUTE_ADDR, we can no longer use any
// heap memory and are restricted to the stack only
static void system_exec(const char *path, bool should_load_game)
{
#ifdef HW_RVL
char game_path[PATH_MAX];
RARCH_LOG("Attempt to load executable: [%s] %d.\n", path, sizeof(game_path));
@ -507,19 +519,17 @@ static void system_exec(const char *path, bool should_load_game)
RARCH_LOG("jumping to %08x\n", (unsigned) BOOTER_ADDR);
SYS_ResetSystem(SYS_SHUTDOWN,0,0);
__lwp_thread_stopmultitasking((void (*)(void)) BOOTER_ADDR);
}
#endif
}
const frontend_ctx_driver_t frontend_ctx_gx = {
get_environment_settings,
system_init,
system_deinit,
system_exitspawn,
system_process_args,
#ifdef HW_RVL
system_exec,
#else
NULL,
#endif
get_environment_settings, /* get_environment_settings */
system_init, /* init */
system_deinit, /* deinit */
system_exitspawn, /* exitspawn */
system_process_args, /* process_args */
NULL, /* process_events */
system_exec, /* exec */
NULL, /* shutdown */
"gx",
};

View File

@ -110,13 +110,9 @@ static void salamander_init_settings(void)
}
if (!config_file_exists || !strcmp(default_paths.libretro_path, ""))
{
find_and_set_first_file();
}
else
{
RARCH_LOG("Start [%s] found in retroarch.cfg.\n", default_paths.libretro_path);
}
if (!config_file_exists)
{
@ -152,7 +148,6 @@ static void callback_sysutil_exit(uint64_t status, uint64_t param, void *userdat
case CELL_SYSUTIL_REQUEST_EXITGAME:
gl->quitting = true;
g_extern.lifecycle_mode_state &= ~((1ULL << MODE_MENU) | (1ULL << MODE_GAME));
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
break;
#ifdef HAVE_OSKUTIL
case CELL_SYSUTIL_OSKDIALOG_LOADED:
@ -281,6 +276,14 @@ static void get_environment_settings(int argc, char *argv[])
snprintf(g_extern.config_path, sizeof(g_extern.config_path), "%s/retroarch.cfg", default_paths.port_dir);
#endif
}
#ifndef IS_SALAMANDER
rarch_make_dir(default_paths.port_dir, "port_dir");
rarch_make_dir(default_paths.system_dir, "system_dir");
rarch_make_dir(default_paths.savestate_dir, "savestate_dir");
rarch_make_dir(default_paths.sram_dir, "sram_dir");
rarch_make_dir(default_paths.input_presets_dir, "input_presets_dir");
#endif
}
static void system_init(void)
@ -437,7 +440,8 @@ static void system_exec(const char *path, bool should_load_game)
RARCH_LOG("Attempt to load executable: [%s].\n", path);
char spawn_data[256];
char game_path[256];
(void)game_path;
game_path[0] = '\0';
for(unsigned int i = 0; i < sizeof(spawn_data); ++i)
spawn_data[i] = i & 0xff;
@ -469,11 +473,13 @@ static void system_exec(const char *path, bool should_load_game)
}
const frontend_ctx_driver_t frontend_ctx_ps3 = {
get_environment_settings,
system_init,
system_deinit,
system_exitspawn,
system_process_args,
system_exec,
get_environment_settings, /* get_environment_settings */
system_init, /* init */
system_deinit, /* deinit */
system_exitspawn, /* exitspawn */
system_process_args, /* process_args */
NULL, /* process_events */
system_exec, /* exec */
NULL, /* shutdown */
"ps3",
};

View File

@ -67,6 +67,14 @@ static void get_environment_settings(int argc, char *argv[])
snprintf(default_paths.input_presets_dir, sizeof(default_paths.input_presets_dir), "%s/presets", default_paths.core_dir);
snprintf(default_paths.border_dir, sizeof(default_paths.border_dir), "%s/borders", default_paths.core_dir);
snprintf(g_extern.config_path, sizeof(g_extern.config_path), "%s/retroarch.cfg", default_paths.port_dir);
#ifndef IS_SALAMANDER
rarch_make_dir(default_paths.port_dir, "port_dir");
rarch_make_dir(default_paths.system_dir, "system_dir");
rarch_make_dir(default_paths.savestate_dir, "savestate_dir");
rarch_make_dir(default_paths.sram_dir, "sram_dir");
rarch_make_dir(default_paths.input_presets_dir, "input_presets_dir");
#endif
}
int callback_thread(SceSize args, void *argp)
@ -97,28 +105,19 @@ static void system_init(void)
setup_callback();
}
static int system_process_args(int argc, char *argv[])
{
(void)argc;
(void)argv;
return 0;
}
static void system_deinit(void)
{
sceKernelExitGame();
}
static void system_exitspawn(void)
{
}
const frontend_ctx_driver_t frontend_ctx_xdk = {
get_environment_settings,
system_init,
system_deinit,
system_exitspawn,
system_process_args,
NULL,
const frontend_ctx_driver_t frontend_ctx_psp = {
get_environment_settings, /* get_environment_settings */
system_init, /* init */
system_deinit, /* deinit */
NULL, /* exitspawn */
NULL, /* process_args */
NULL, /* process_events */
NULL, /* exec */
NULL, /* shutdown */
"psp",
};

View File

@ -0,0 +1,60 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2013 - Hans-Kristian Arntzen
* Copyright (C) 2011-2013 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include <bps/bps.h>
#include <stdint.h>
#include "../../boolean.h"
#include <stddef.h>
#include <string.h>
static void get_environment_settings(int argc, char *argv[])
{
(void)argc;
(void)argv;
/* FIXME - should this apply for both BB10 and PB? */
#if defined(__QNX__) && !defined(HAVE_BB10)
strlcpy(g_settings.libretro, "app/native/lib", sizeof(g_settings.libretro));
strlcpy(g_extern.config_path, "app/native/retroarch.cfg", sizeof(g_extern.config_path));
strlcpy(g_settings.video.shader_dir, "app/native/shaders_glsl", sizeof(g_settings.video.shader_dir));
#endif
}
static void system_init(void)
{
/* FIXME - should this apply for both BB10 and PB? */
#if defined(__QNX__) && !defined(HAVE_BB10)
bps_initialize();
#endif
}
static void system_shutdown(void)
{
bps_shutdown();
}
const frontend_ctx_driver_t frontend_ctx_qnx = {
get_environment_settings, /* get_environment_settings */
system_init, /* init */
NULL, /* deinit */
NULL, /* exitspawn */
NULL, /* process_args */
NULL, /* process_events */
NULL, /* exec */
system_shutdown, /* shutdown */
"qnx",
};

View File

@ -247,6 +247,14 @@ static void get_environment_settings(int argc, char *argv[])
strlcpy(default_paths.system_dir, "game:\\system", sizeof(default_paths.system_dir));
strlcpy(default_paths.filebrowser_startup_dir, "game:", sizeof(default_paths.filebrowser_startup_dir));
#endif
#ifndef IS_SALAMANDER
rarch_make_dir(default_paths.port_dir, "port_dir");
rarch_make_dir(default_paths.system_dir, "system_dir");
rarch_make_dir(default_paths.savestate_dir, "savestate_dir");
rarch_make_dir(default_paths.sram_dir, "sram_dir");
rarch_make_dir(default_paths.input_presets_dir, "input_presets_dir");
#endif
}
static void system_init(void)
@ -299,18 +307,18 @@ static int system_process_args(int argc, char *argv[])
return 0;
}
static void system_deinit(void) {}
static void system_exec(const char *path, bool should_load_game);
static void system_exitspawn(void)
{
#ifdef IS_SALAMANDER
rarch_console_exec(default_paths.libretro_path, false);
system_exec(default_paths.libretro_path, false);
#else
bool should_load_game = false;
if (g_extern.lifecycle_mode_state & (1ULL << MODE_EXITSPAWN_START_GAME))
should_load_game = true;
rarch_console_exec(g_settings.libretro, should_load_game);
system_exec(g_settings.libretro, should_load_game);
#endif
}
@ -351,11 +359,13 @@ static void system_exec(const char *path, bool should_load_game)
}
const frontend_ctx_driver_t frontend_ctx_xdk = {
get_environment_settings,
system_init,
system_deinit,
system_exitspawn,
system_process_args,
system_exec,
get_environment_settings, /* get_environment_settings */
system_init, /* init */
NULL, /* deinit */
system_exitspawn, /* exitspawn */
system_process_args, /* process_args */
NULL, /* process_events */
system_exec, /* exec */
NULL, /* shutdown */
"xdk",
};

View File

@ -109,7 +109,6 @@ enum menu_enums
{
MODE_GAME = 0,
MODE_LOAD_GAME,
MODE_INIT,
MODE_MENU,
MODE_MENU_WIDESCREEN,
MODE_MENU_HD,
@ -118,7 +117,6 @@ enum menu_enums
MODE_INFO_DRAW,
MODE_FPS_DRAW,
MODE_EXTLAUNCH_MULTIMAN,
MODE_EXIT,
MODE_EXITSPAWN,
MODE_EXITSPAWN_START_GAME,
MODE_EXITSPAWN_MULTIMAN,
@ -128,9 +126,7 @@ enum menu_enums
MODE_VIDEO_SOFT_FILTER_ENABLE,
MODE_VIDEO_PAL_ENABLE,
MODE_VIDEO_PAL_TEMPORAL_ENABLE,
MODE_VIDEO_PAL_VSYNC_BLOCK,
MODE_AUDIO_CUSTOM_BGM_ENABLE,
MODE_OSK_DRAW,
MODE_OSK_ENTRY_SUCCESS,
MODE_OSK_ENTRY_FAIL,
};

View File

@ -216,10 +216,8 @@ VIDEO DRIVER
#if defined(GEKKO)
#include "../gx/gx_video.c"
#elif defined(SN_TARGET_PSP2)
#include "../vita/vita_video.c"
//#elif defined(PSP)
//#include "../psp1/psp1_video.c"
#elif defined(PSP)
#include "../psp1/psp1_video.c"
#elif defined(XENON)
#include "../xenon/xenon360_video.c"
#endif
@ -462,6 +460,10 @@ FRONTEND
#include "../frontend/platform/platform_xdk.c"
#elif defined(PSP)
#include "../frontend/platform/platform_psp.c"
#elif defined(__QNX__)
#include "../frontend/platform/platform_qnx.c"
#elif defined(OSX) || defined(IOS)
#include "../frontend/platform/platform_apple.c"
#endif
/*============================================================

View File

@ -1012,17 +1012,6 @@ static void gx_set_rotation(void *data, unsigned orientation)
gx->should_resize = true;
}
static bool gx_set_shader(void *data, enum rarch_shader_type type, const char *path)
{
(void)data;
(void)type;
(void)path;
(void)index;
RARCH_WARN("Shader support is not implemented for GX.\n");
return false;
}
static void gx_set_texture_frame(void *data, const void *frame,
bool rgb32, unsigned width, unsigned height, float alpha)
{

View File

@ -267,6 +267,7 @@
</ClCompile>
<ClCompile Include="..\..\file_path.c" />
<ClCompile Include="..\..\frontend\frontend_salamander.c" />
<ClCompile Include="..\..\frontend\frontend_context.c" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">

View File

@ -26,8 +26,11 @@
<ClCompile Include="..\..\file_path.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\frontend\frontend_console.c">
<ClCompile Include="..\..\frontend\frontend_salamander.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\frontend\frontend_context.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>
</Project>

View File

@ -404,6 +404,39 @@
CompileAs="2"/>
</FileConfiguration>
</File>
<File
RelativePath="..\..\frontend\frontend_context.c">
<FileConfiguration
Name="Debug|Xbox">
<Tool
Name="VCCLCompilerTool"
CompileAs="2"/>
</FileConfiguration>
<FileConfiguration
Name="Profile|Xbox">
<Tool
Name="VCCLCompilerTool"
CompileAs="2"/>
</FileConfiguration>
<FileConfiguration
Name="Profile_FastCap|Xbox">
<Tool
Name="VCCLCompilerTool"
CompileAs="2"/>
</FileConfiguration>
<FileConfiguration
Name="Release|Xbox">
<Tool
Name="VCCLCompilerTool"
CompileAs="2"/>
</FileConfiguration>
<FileConfiguration
Name="Release_LTCG|Xbox">
<Tool
Name="VCCLCompilerTool"
CompileAs="2"/>
</FileConfiguration>
</File>
</Filter>
<Filter
Name="Header Files"

View File

@ -262,6 +262,8 @@
</ClCompile>
<ClCompile Include="..\..\frontend\frontend.c">
</ClCompile>
<ClCompile Include="..\..\frontend\frontend_context.c">
</ClCompile>
<ClCompile Include="..\..\retroarch.c">
</ClCompile>
<ClCompile Include="..\..\rewind.c">

View File

@ -1,254 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
<Filter Include="Source Files\gfx">
<UniqueIdentifier>{ddc648c9-0965-4fbf-bfcd-4ece568acebe}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\audio">
<UniqueIdentifier>{547c32fb-8ea0-46d7-a80c-9dad57f9893e}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\gfx\context">
<UniqueIdentifier>{67110ea9-781d-4a95-a61e-79864b7a8cec}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\input">
<UniqueIdentifier>{7aabbafd-18bf-4c51-abf8-01cefd46b2e3}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\conf">
<UniqueIdentifier>{51dd4d92-c39d-4eb3-83a1-54ebb63bcf00}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\compat">
<UniqueIdentifier>{7ca1fa21-74fe-4fc2-afff-92b1c2fd15ed}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\gfx\math">
<UniqueIdentifier>{7b1aab1c-310c-48fd-b699-e3a6e69b0b8c}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\gfx\scaler">
<UniqueIdentifier>{9c758b58-d6ce-4b66-8b17-8cc7ceb78c82}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\gfx\fonts">
<UniqueIdentifier>{eaaf6f28-b845-41f3-8211-e069a1ac1063}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\gfx\d3d9">
<UniqueIdentifier>{ae4f70af-fc87-4c8d-84a5-b2c4cd57e722}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\deps">
<UniqueIdentifier>{a1975595-d469-4d96-81bf-d6a4f0be32f5}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\gfx\rpng">
<UniqueIdentifier>{a1302353-aa00-4f85-a62f-3c40160a5fa3}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files\rgui">
<UniqueIdentifier>{a3ec9cd6-b3f2-4711-9585-e09c8dbb63ef}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\..\autosave.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\performance.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\command.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\driver.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\dynamic.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\fifo_buffer.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\file.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\file_path.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\hash.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\message.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\movie.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\netplay.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\patch.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\retroarch.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\rewind.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\screenshot.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\settings.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\thread.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\audio\dsound.c">
<Filter>Source Files\audio</Filter>
</ClCompile>
<ClCompile Include="..\..\audio\utils.c">
<Filter>Source Files\audio</Filter>
</ClCompile>
<ClCompile Include="..\..\audio\xaudio.c">
<Filter>Source Files\audio</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\context\wgl_ctx.c">
<Filter>Source Files\gfx\context</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\gfx_common.c">
<Filter>Source Files\gfx</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\gfx_context.c">
<Filter>Source Files\gfx</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\gl.c">
<Filter>Source Files\gfx</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\image.c">
<Filter>Source Files\gfx</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\state_tracker.c">
<Filter>Source Files\gfx</Filter>
</ClCompile>
<ClCompile Include="..\..\input\dinput.c">
<Filter>Source Files\input</Filter>
</ClCompile>
<ClCompile Include="..\..\input\input_common.c">
<Filter>Source Files\input</Filter>
</ClCompile>
<ClCompile Include="..\..\conf\config_file.c">
<Filter>Source Files\conf</Filter>
</ClCompile>
<ClCompile Include="..\..\compat\compat.c">
<Filter>Source Files\compat</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\scaler\filter.c">
<Filter>Source Files\gfx\scaler</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\scaler\pixconv.c">
<Filter>Source Files\gfx\scaler</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\scaler\scaler.c">
<Filter>Source Files\gfx\scaler</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\scaler\scaler_int.c">
<Filter>Source Files\gfx\scaler</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\math\matrix.c">
<Filter>Source Files\gfx\math</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\math\matrix_3x3.c">
<Filter>Source Files\gfx\math</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\d3d9\d3d9.cpp">
<Filter>Source Files\gfx\d3d9</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\d3d9\render_chain.cpp">
<Filter>Source Files\gfx\d3d9</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\shader_cg.c">
<Filter>Source Files\gfx</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\fonts\gl_font.c">
<Filter>Source Files\gfx\fonts</Filter>
</ClCompile>
<ClCompile Include="..\..\audio\sinc.c">
<Filter>Source Files\audio</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\fonts\gl_raster_font.c">
<Filter>Source Files\gfx\fonts</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\fonts\bitmapfont.c">
<Filter>Source Files\gfx\fonts</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\fonts\fonts.c">
<Filter>Source Files\gfx\fonts</Filter>
</ClCompile>
<ClCompile Include="..\..\audio\xaudio-c\xaudio-c.cpp">
<Filter>Source Files\audio</Filter>
</ClCompile>
<ClCompile Include="..\..\compat\rxml\rxml.c">
<Filter>Source Files\compat</Filter>
</ClCompile>
<ClCompile Include="..\..\audio\resampler.c">
<Filter>Source Files\audio</Filter>
</ClCompile>
<ClCompile Include="..\..\cheats.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\shader_glsl.c">
<Filter>Source Files\gfx</Filter>
</ClCompile>
<ClCompile Include="..\..\file_extract.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\rpng\rpng.c">
<Filter>Source Files\gfx\rpng</Filter>
</ClCompile>
<ClCompile Include="..\..\deps\miniz\miniz.c">
<Filter>Source Files\deps</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\thread_wrapper.c">
<Filter>Source Files\gfx</Filter>
</ClCompile>
<ClCompile Include="..\..\input\overlay.c">
<Filter>Source Files\input</Filter>
</ClCompile>
<ClCompile Include="..\..\frontend\frontend.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\gfx\shader_parse.c">
<Filter>Source Files\gfx</Filter>
</ClCompile>
<ClCompile Include="..\..\core_options.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\frontend\menu\rgui.c">
<Filter>Source Files\rgui</Filter>
</ClCompile>
<ClCompile Include="..\..\frontend\menu\menu_common.c">
<Filter>Source Files\rgui</Filter>
</ClCompile>
<ClCompile Include="..\..\dynamic_dummy.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\..\frontend\menu\history.c">
<Filter>Source Files\rgui</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="resource.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="..\..\media\rarch.rc">
<Filter>Resource Files</Filter>
</ResourceCompile>
</ItemGroup>
</Project>

View File

@ -366,7 +366,6 @@ bool oskutil_start(oskutil_params *params)
goto do_deinit;
params->flags |= OSK_IN_USE;
g_extern.lifecycle_mode_state |= (1ULL << MODE_OSK_DRAW);
return true;

View File

@ -27,41 +27,41 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat)
#define SUBPIXEL_ADJUST (0.5/(1<<SUBPIXEL_BITS))
#define rglGcmSetVertexData4f(thisContext, index, v) \
thisContext->current[0] = (((4) << (18)) | ((0x00001c00) + (index) * 16)); \
thisContext->current[0] = (((4) << (18)) | (CELL_GCM_NV4097_SET_VERTEX_DATA4F_M + (index) * 16)); \
__builtin_memcpy(&thisContext->current[1], v, sizeof(float)*4); \
thisContext->current += 5;
#define rglGcmSetVertexDataArray(thisContext, index, frequency, stride, size, type, location, offset) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001740) + ((index)) * 4)); \
(thisContext->current)[0] = (((1) << (18)) | (CELL_GCM_NV4097_SET_VERTEX_DATA_ARRAY_FORMAT + ((index)) * 4)); \
(thisContext->current)[1] = ((((frequency)) << 16) | (((stride)) << 8) | (((size)) << 4) | ((type))); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001680) + ((index)) * 4)); \
(thisContext->current)[0] = (((1) << (18)) | (CELL_GCM_NV4097_SET_VERTEX_DATA_ARRAY_OFFSET + ((index)) * 4)); \
(thisContext->current)[1] = ((((location)) << 31) | (offset)); \
(thisContext->current) += 2;
#define rglGcmSetInlineTransferPointer(thisContext, offset, count, pointer) \
(thisContext->current)[0] = (((1) << (18)) | ((0x0000630C))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV3062_SET_OFFSET_DESTIN); \
(thisContext->current)[1] = (offset & ~63); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((2) << (18)) | ((0x00006300))); \
(thisContext->current)[0] = (((2) << (18)) | CELL_GCM_NV3062_SET_COLOR_FORMAT); \
(thisContext->current)[1] = (CELL_GCM_TRANSFER_SURFACE_FORMAT_Y32); \
(thisContext->current)[2] = ((0x1000) | ((0x1000) << 16)); \
(thisContext->current) += 3; \
(thisContext->current)[0] = (((3) << (18)) | ((0x0000A304))); \
(thisContext->current)[0] = (((3) << (18)) | CELL_GCM_NV308A_POINT); \
(thisContext->current)[1] = (((0) << 16) | ((offset & 63) >> 2)); \
(thisContext->current)[2] = (((1) << 16) | (count)); \
(thisContext->current)[3] = (((1) << 16) | (count)); \
(thisContext->current) += 4; \
thisContext->current[0] = ((((count + 1) & ~1) << (18)) | ((0x0000A400))); \
thisContext->current[0] = ((((count + 1) & ~1) << (18)) | CELL_GCM_NV308A_COLOR); \
thisContext->current += 1; \
pointer = thisContext->current; \
thisContext->current += ((count + 1) & ~1);
#define rglGcmSetWriteBackEndLabel(thisContext, index, value) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001d6c))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_SEMAPHORE_OFFSET); \
(thisContext->current)[1] = 0x10 * index; /* offset */ \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001d70))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_BACK_END_WRITE_SEMAPHORE_RELEASE); \
(thisContext->current)[1] = ( value & 0xff00ff00) | ((value >> 16) & 0xff) | (((value >> 0 ) & 0xff) << 16); \
(thisContext->current) += 2;
@ -74,50 +74,50 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat)
(thisContext->current) += 2;
#define rglGcmSetInvalidateVertexCache(thisContext) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001710))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_INVALIDATE_VERTEX_CACHE_FILE); \
(thisContext->current)[1] = 0; \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001714))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_INVALIDATE_VERTEX_FILE); \
(thisContext->current)[1] = 0; \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001714))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_INVALIDATE_VERTEX_FILE); \
(thisContext->current)[1] = 0; \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001714))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_INVALIDATE_VERTEX_FILE); \
(thisContext->current)[1] = 0; \
(thisContext->current) += 2;
#define rglGcmSetClearSurface(thisContext, mask) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001d94))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_CLEAR_SURFACE); \
(thisContext->current)[1] = (mask); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00000100))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_NO_OPERATION); \
(thisContext->current)[1] = 0; \
(thisContext->current) += 2;
#define rglGcmSetTextureControl(thisContext, index, enable, minlod, maxlod, maxaniso) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001a0c) + 0x20 * ((index)))); \
(thisContext->current)[0] = (((1) << (18)) | (CELL_GCM_NV4097_SET_TEXTURE_CONTROL0 + 0x20 * ((index)))); \
(thisContext->current)[1] = ((((0) << 2) | ((maxaniso)) << 4) | (((maxlod)) << 7) | (((minlod)) << 19) | ((enable) << 31)); \
(thisContext->current) += 2;
#define rglGcmSetTextureRemap(thisContext, index, remap) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001a10) + ((index)) * 32)); \
(thisContext->current)[0] = (((1) << (18)) | (CELL_GCM_NV4097_SET_TEXTURE_CONTROL1 + ((index)) * 32)); \
(thisContext->current)[1] = (remap); \
(thisContext->current) += 2;
#define rglGcmSetTransferLocation(thisContext, location) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00006188))); \
(thisContext->current)[1] = ((0xFEED0000) + location); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV3062_SET_CONTEXT_DMA_IMAGE_DESTIN); \
(thisContext->current)[1] = (CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER + location); \
(thisContext->current) += 2;
#define rglGcmInlineTransfer(thisContext, dstOffset, srcAdr, sizeInWords, location) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00006188))); \
(thisContext->current)[1] = ((0xFEED0000) + location); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV3062_SET_CONTEXT_DMA_IMAGE_DESTIN); \
(thisContext->current)[1] = (CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER + location); \
(thisContext->current) += 2; \
cellGcmSetInlineTransferUnsafeInline(thisContext, dstOffset, srcAdr, sizeInWords);
#define rglGcmSetClearColor(thisContext, color) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001d90))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_COLOR_CLEAR_VALUE); \
(thisContext->current)[1] = (color); \
(thisContext->current) += 2;
@ -128,27 +128,27 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat)
imagerect = texture->height | (texture->width << 16); \
control1 = texture->remap; \
control3 = texture->pitch | (texture->depth << 20); \
(thisContext->current)[0] = (((2) << (18)) | ((0x00001a00) + ((index)) * 32)); \
(thisContext->current)[0] = (((2) << (18)) | (CELL_GCM_NV4097_SET_TEXTURE_OFFSET + ((index)) * 32)); \
(thisContext->current)[1] = (offset); \
(thisContext->current)[2] = (format); \
(thisContext->current) += 3; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001a18) + ((index)) * 32)); \
(thisContext->current)[0] = (((1) << (18)) | (CELL_GCM_NV4097_SET_TEXTURE_IMAGE_RECT + ((index)) * 32)); \
(thisContext->current)[1] = (imagerect); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001840) + ((index)) * 4)); \
(thisContext->current)[0] = (((1) << (18)) | (CELL_GCM_NV4097_SET_TEXTURE_CONTROL3 + ((index)) * 4)); \
(thisContext->current)[1] = (control3); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001a10) + ((index)) * 32)); \
(thisContext->current)[0] = (((1) << (18)) | (CELL_GCM_NV4097_SET_TEXTURE_CONTROL1 + ((index)) * 32)); \
(thisContext->current)[1] = (control1); \
(thisContext->current) += 2;
#define rglGcmSetUserClipPlaneControl(thisContext, plane0, plane1, plane2, plane3, plane4, plane5) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001478))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_USER_CLIP_PLANE_CONTROL); \
(thisContext->current)[1] = ((plane0) | ((plane1) << 4) | ((plane2) << 8) | ((plane3) << 12) | ((plane4) << 16) | ((plane5) << 20)); \
(thisContext->current) += 2;
#define rglGcmSetInvalidateTextureCache(thisContext, value) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001fd8))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_INVALIDATE_L2); \
(thisContext->current)[1] = (value); \
(thisContext->current) += 2;
@ -165,15 +165,15 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat)
s[1].f = scale[1]; \
s[2].f = scale[2]; \
s[3].f = scale[3]; \
(thisContext->current)[0] = (((2) << (18)) | ((0x00000a00))); \
(thisContext->current)[0] = (((2) << (18)) | CELL_GCM_NV4097_SET_VIEWPORT_HORIZONTAL); \
(thisContext->current)[1] = (((x)) | (((w)) << 16)); \
(thisContext->current)[2] = (((y)) | (((h)) << 16)); \
(thisContext->current) += 3; \
(thisContext->current)[0] = (((2) << (18)) | ((0x00000394))); \
(thisContext->current)[0] = (((2) << (18)) | CELL_GCM_NV4097_SET_CLIP_MIN); \
(thisContext->current)[1] = (d0.u); \
(thisContext->current)[2] = (d1.u); \
(thisContext->current) += 3; \
(thisContext->current)[0] = (((8) << (18)) | ((0x00000a20))); \
(thisContext->current)[0] = (((8) << (18)) | CELL_GCM_NV4097_SET_VIEWPORT_OFFSET); \
(thisContext->current)[1] = (o[0].u); \
(thisContext->current)[2] = (o[1].u); \
(thisContext->current)[3] = (o[2].u); \
@ -183,7 +183,7 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat)
(thisContext->current)[7] = (s[2].u); \
(thisContext->current)[8] = (s[3].u); \
(thisContext->current) += 9; \
(thisContext->current)[0] = (((8) << (18)) | ((0x00000a20))); \
(thisContext->current)[0] = (((8) << (18)) | CELL_GCM_NV4097_SET_VIEWPORT_OFFSET); \
(thisContext->current)[1] = (o[0].u); \
(thisContext->current)[2] = (o[1].u); \
(thisContext->current)[3] = (o[2].u); \
@ -195,22 +195,22 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat)
(thisContext->current) += 9;
#define rglGcmSetDitherEnable(thisContext, enable) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00000300))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_DITHER_ENABLE); \
(thisContext->current)[1] = (enable); \
(thisContext->current) += 2;
#define rglGcmSetReferenceCommand(thisContext, ref) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00000050))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV406E_SET_REFERENCE); \
(thisContext->current)[1] = (ref); \
(thisContext->current) += 2;
#define rglGcmSetZMinMaxControl(thisContext, cullNearFarEnable, zclampEnable, cullIgnoreW) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001d78))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_ZMIN_MAX_CONTROL); \
(thisContext->current)[1] = ((cullNearFarEnable) | ((zclampEnable) << 4) | ((cullIgnoreW)<<8)); \
(thisContext->current) += 2;
#define rglGcmSetVertexAttribOutputMask(thisContext, mask) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001ff4))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK); \
(thisContext->current)[1] = (mask); \
(thisContext->current) += 2;
@ -220,7 +220,7 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat)
thisContext->current += count;
#define rglGcmSetAntiAliasingControl(thisContext, enable, alphaToCoverage, alphaToOne, sampleMask) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001d7c))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_ANTI_ALIASING_CONTROL); \
(thisContext->current)[1] = ((enable) | ((alphaToCoverage) << 4) | ((alphaToOne) << 8) | ((sampleMask) << 16)); \
(thisContext->current) += 2;
@ -240,20 +240,20 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat)
fifo->lastSWReferenceFlushed = fifo->lastSWReferenceWritten;
#define rglGcmSetSurface(thisContext, surface, origin, pixelCenter, log2Width, log2Height) \
(thisContext->current)[0] = (((1) << (18)) | ((0x00000194))); \
(thisContext->current)[1] = ((0xFEED0000)+surface->colorLocation[0]); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_CONTEXT_DMA_COLOR_A); \
(thisContext->current)[1] = (CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER + surface->colorLocation[0]); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((1) << (18)) | ((0x0000018c))); \
(thisContext->current)[1] = ((0xFEED0000)+surface->colorLocation[1]); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_CONTEXT_DMA_COLOR_B); \
(thisContext->current)[1] = (CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER + surface->colorLocation[1]); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((2) << (18)) | ((0x000001b4))); \
(thisContext->current)[1] = ((0xFEED0000)+surface->colorLocation[2]); \
(thisContext->current)[2] = ((0xFEED0000)+surface->colorLocation[3]); \
(thisContext->current)[0] = (((2) << (18)) | CELL_GCM_NV4097_SET_CONTEXT_DMA_COLOR_C); \
(thisContext->current)[1] = (CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER + surface->colorLocation[2]); \
(thisContext->current)[2] = (CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER + surface->colorLocation[3]); \
(thisContext->current) += 3; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00000198))); \
(thisContext->current)[1] = ((0xFEED0000)+surface->depthLocation); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_CONTEXT_DMA_ZETA); \
(thisContext->current)[1] = (CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER + surface->depthLocation); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((6) << (18)) | ((0x00000208))); \
(thisContext->current)[0] = (((6) << (18)) | CELL_GCM_NV4097_SET_SURFACE_FORMAT); \
(thisContext->current)[1] = ((surface->colorFormat) | ((surface->depthFormat) << 5) | ((surface->type) << 8) | ((surface->antialias) << 12) | ((log2Width) << 16) | ((log2Height) << 24)); \
(thisContext->current)[2] = (surface->colorPitch[0]); \
(thisContext->current)[3] = (surface->colorOffset[0]); \
@ -261,26 +261,26 @@ static inline GLuint rglPlatformGetBitsPerPixel (GLenum internalFormat)
(thisContext->current)[5] = (surface->colorOffset[1]); \
(thisContext->current)[6] = (surface->colorPitch[1]); \
(thisContext->current) += 7; \
(thisContext->current)[0] = (((1) << (18)) | ((0x0000022c))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_SURFACE_PITCH_Z); \
(thisContext->current)[1] = (surface->depthPitch); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((4) << (18)) | ((0x00000280))); \
(thisContext->current)[0] = (((4) << (18)) | CELL_GCM_NV4097_SET_SURFACE_PITCH_C); \
(thisContext->current)[1] = (surface->colorPitch[2]); \
(thisContext->current)[2] = (surface->colorPitch[3]); \
(thisContext->current)[3] = (surface->colorOffset[2]); \
(thisContext->current)[4] = (surface->colorOffset[3]); \
(thisContext->current) += 5; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00000220))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_SURFACE_COLOR_TARGET); \
(thisContext->current)[1] = ((surface->colorTarget)); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((1) << (18)) | ((0x000002b8))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_WINDOW_OFFSET); \
(thisContext->current)[1] = ((surface->x) | ((surface->y) << 16)); \
(thisContext->current) += 2; \
(thisContext->current)[0] = (((2) << (18)) | ((0x00000200))); \
(thisContext->current)[0] = (((2) << (18)) | CELL_GCM_NV4097_SET_SURFACE_CLIP_HORIZONTAL); \
(thisContext->current)[1] = ((surface->x) | ((surface->width) << 16)); \
(thisContext->current)[2] = ((surface->y) | ((surface->height) << 16)); \
(thisContext->current) += 3; \
(thisContext->current)[0] = (((1) << (18)) | ((0x00001d88))); \
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_SHADER_WINDOW); \
(thisContext->current)[1] = ((surface->height - (((surface->height) & 0x1000) >> 12)) | ((origin) << 12) | ((pixelCenter) << 16)); \
(thisContext->current) += 2;
@ -295,13 +295,13 @@ static inline void rglGcmSetFragmentProgramLoad(struct CellGcmContextData *thisC
uint32_t texMaskCentroid;
uint32_t i;
(thisContext->current)[0] = (((1) << (18)) | ((0x000008e4)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_SHADER_PROGRAM);
(thisContext->current)[1] = ((location+1) | (rawData));
(thisContext->current) += 2;
inMask = conf->attributeInputMask;
(thisContext->current)[0] = (((1) << (18)) | ((0x00001ff4)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_VERTEX_ATTRIB_OUTPUT_MASK);
(thisContext->current)[1] = (inMask);
(thisContext->current) += 2;
@ -312,10 +312,10 @@ static inline void rglGcmSetFragmentProgramLoad(struct CellGcmContextData *thisC
for(i=0; texMask; i++)
{
if (texMask&1)
if (texMask & 1)
{
uint32_t hwTexCtrl = (texMask2D & 1) | ((texMaskCentroid & 1) << 4);
(thisContext->current)[0] = (((1) << (18)) | ((0x00000b40) + (i) * 4));
(thisContext->current)[0] = (((1) << (18)) | (CELL_GCM_NV4097_SET_TEX_COORD_CONTROL + (i) * 4));
(thisContext->current)[1] = (hwTexCtrl);
(thisContext->current) += 2;
}
@ -331,12 +331,12 @@ static inline void rglGcmSetFragmentProgramLoad(struct CellGcmContextData *thisC
registerCount = 2;
shCtrl0 = conf->fragmentControl | (registerCount << 24);
(thisContext->current)[0] = (((1) << (18)) | ((0x00001d60)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_SHADER_CONTROL);
(thisContext->current)[1] = (shCtrl0);
(thisContext->current) += 2;
}
static inline void rglGcmSetDrawArrays(struct CellGcmContextData *thisContext, uint8_t mode,
static void rglGcmSetDrawArraysSlow(struct CellGcmContextData *thisContext, uint8_t mode,
uint32_t first, uint32_t count)
{
uint32_t lcount;
@ -349,16 +349,16 @@ static inline void rglGcmSetDrawArrays(struct CellGcmContextData *thisContext, u
loop = count / (2047);
rest = count % (2047);
(thisContext->current)[0] = (((3) << (18)) | ((0x00001714)) | (0x40000000));
(thisContext->current)[0] = (((3) << (18)) | CELL_GCM_NV4097_INVALIDATE_VERTEX_FILE | (0x40000000));
(thisContext->current)[1] = 0;
(thisContext->current)[2] = 0;
(thisContext->current)[3] = 0; ; (thisContext->current) += 4;
(thisContext->current)[0] = (((1) << (18)) | ((0x00001808)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_BEGIN_END);
(thisContext->current)[1] = ((mode));
(thisContext->current) += 2;
(thisContext->current)[0] = (((1) << (18)) | ((0x00001814)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_DRAW_ARRAYS);
(thisContext->current)[1] = ((first) | ((lcount)<<24));
(thisContext->current) += 2;
first += lcount + 1;
@ -367,7 +367,7 @@ static inline void rglGcmSetDrawArrays(struct CellGcmContextData *thisContext, u
for(i=0;i<loop;i++)
{
thisContext->current[0] = ((((2047)) << (18)) | ((0x00001814)) | (0x40000000));
thisContext->current[0] = ((((2047)) << (18)) | CELL_GCM_NV4097_DRAW_ARRAYS | (0x40000000));
thisContext->current++;
for(j=0;j<(2047);j++)
@ -380,7 +380,7 @@ static inline void rglGcmSetDrawArrays(struct CellGcmContextData *thisContext, u
if(rest)
{
thisContext->current[0] = (((rest) << (18)) | ((0x00001814)) | (0x40000000));
thisContext->current[0] = (((rest) << (18)) | CELL_GCM_NV4097_DRAW_ARRAYS | (0x40000000));
thisContext->current++;
for(j=0;j<rest;j++)
@ -391,11 +391,39 @@ static inline void rglGcmSetDrawArrays(struct CellGcmContextData *thisContext, u
}
}
(thisContext->current)[0] = (((1) << (18)) | ((0x00001808)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_BEGIN_END);
(thisContext->current)[1] = (0);
(thisContext->current) += 2;
}
static inline void rglGcmSetDrawArrays(struct CellGcmContextData *thisContext, uint8_t mode,
uint32_t first, uint32_t count)
{
if (mode == GL_TRIANGLE_STRIP && first == 0 && count == 4)
{
(thisContext->current)[0] = (((3) << (18)) | CELL_GCM_NV4097_INVALIDATE_VERTEX_FILE | (0x40000000));
(thisContext->current)[1] = 0;
(thisContext->current)[2] = 0;
(thisContext->current)[3] = 0;
(thisContext->current) += 4;
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_BEGIN_END);
(thisContext->current)[1] = ((mode));
(thisContext->current) += 2;
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_DRAW_ARRAYS);
(thisContext->current)[1] = ((first) | (3 <<24));
(thisContext->current) += 2;
first += 4;
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_BEGIN_END);
(thisContext->current)[1] = (0);
(thisContext->current) += 2;
}
else
rglGcmSetDrawArraysSlow(thisContext, mode, first, count);
}
static inline void rglGcmSetVertexProgramLoad(struct CellGcmContextData *thisContext, const CellCgbVertexProgramConfiguration *conf, const void *ucode)
{
const uint32_t *rawData;
@ -410,7 +438,7 @@ static inline void rglGcmSetVertexProgramLoad(struct CellGcmContextData *thisCon
loop = instCount / 8;
rest = (instCount % 8) * 4;
(thisContext->current)[0] = (((2) << (18)) | ((0x00001e9c)));
(thisContext->current)[0] = (((2) << (18)) | CELL_GCM_NV4097_SET_TRANSFORM_PROGRAM_LOAD);
(thisContext->current)[1] = (instIndex);
(thisContext->current)[2] = (instIndex);
(thisContext->current) += 3;
@ -419,7 +447,7 @@ static inline void rglGcmSetVertexProgramLoad(struct CellGcmContextData *thisCon
for (i = 0; i < loop; i++)
{
thisContext->current[0] = (((32) << (18)) | ((0x00000b80)));
thisContext->current[0] = (((32) << (18)) | CELL_GCM_NV4097_SET_TRANSFORM_PROGRAM);
__builtin_memcpy(&thisContext->current[1], &rawData[0], sizeof(uint32_t)*16);
__builtin_memcpy(&thisContext->current[17], &rawData[16], sizeof(uint32_t)*16);
@ -430,18 +458,18 @@ static inline void rglGcmSetVertexProgramLoad(struct CellGcmContextData *thisCon
if (rest > 0)
{
thisContext->current[0] = (((rest) << (18)) | ((0x00000b80)));
thisContext->current[0] = (((rest) << (18)) | CELL_GCM_NV4097_SET_TRANSFORM_PROGRAM);
for (j = 0; j < rest; j++)
thisContext->current[j+1] = rawData[j];
thisContext->current += (1 + rest);
}
(thisContext->current)[0] = (((1) << (18)) | ((0x00001ff0)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_VERTEX_ATTRIB_INPUT_MASK);
(thisContext->current)[1] = ((conf->attributeInputMask));
(thisContext->current) += 2;
(thisContext->current)[0] = (((1) << (18)) | ((0x00001ef8)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV4097_SET_TRANSFORM_TIMEOUT);
if (conf->registerCount <= 32)
(thisContext->current)[1] = ((0xFFFF) | ((32) << 16));
@ -523,16 +551,16 @@ static inline void rglGcmFifoGlViewport(void *data, GLclampf zNear, GLclampf zFa
static inline void rglGcmSetTransferImage(struct CellGcmContextData *thisContext, uint8_t mode, uint32_t dstOffset, uint32_t dstPitch, uint32_t dstX, uint32_t dstY, uint32_t srcOffset, uint32_t srcPitch, uint32_t srcX, uint32_t srcY, uint32_t width, uint32_t height, uint32_t bytesPerPixel)
{
(thisContext->current)[0] = (((1) << (18)) | ((0x00006188)));
(thisContext->current)[1] = 0xFEED0000; /* CELL_GCM_TRANSFER_LOCAL_TO_LOCAL */
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV3062_SET_CONTEXT_DMA_IMAGE_DESTIN);
(thisContext->current)[1] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; /* CELL_GCM_TRANSFER_LOCAL_TO_LOCAL */
(thisContext->current) += 2;
(thisContext->current)[0] = (((1) << (18)) | ((0x0000C184)));
(thisContext->current)[1] = 0xFEED0000; /* CELL_GCM_TRANSFER_LOCAL_TO_LOCAL */
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV3089_SET_CONTEXT_DMA_IMAGE);
(thisContext->current)[1] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; /* CELL_GCM_TRANSFER_LOCAL_TO_LOCAL */
(thisContext->current) += 2;
(thisContext->current)[0] = (((1) << (18)) | ((0x0000C198)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV3089_SET_CONTEXT_SURFACE);
(thisContext->current)[1] = ((0x313371C3));
(thisContext->current) += 2;
@ -574,16 +602,16 @@ static inline void rglGcmSetTransferImage(struct CellGcmContextData *thisContext
uint32_t srcBlockOffset = bytesPerPixel * (srcX + x-dstX) + srcPitch * (srcY + y-dstY);
uint32_t safeDstBltWidth = (dstBltWidth < 16) ? 16 : (dstBltWidth + 1) & ~1;
(thisContext->current)[0] = (((1) << (18)) | ((0x0000630C)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV3062_SET_OFFSET_DESTIN);
(thisContext->current)[1] = dstOffset + dstBlockOffset;
(thisContext->current) += 2;
(thisContext->current)[0] = (((2) << (18)) | ((0x00006300)));
(thisContext->current)[0] = (((2) << (18)) | CELL_GCM_NV3062_SET_COLOR_FORMAT);
(thisContext->current)[1] = (dstFormat);
(thisContext->current)[2] = ((dstPitch) | ((dstPitch) << 16));
(thisContext->current) += 3;
(thisContext->current)[0] = (((9) << (18)) | ((0x0000C2FC)));
(thisContext->current)[0] = (((9) << (18)) | CELL_GCM_NV3089_SET_COLOR_CONVERSION);
(thisContext->current)[1] = (CELL_GCM_TRANSFER_CONVERSION_TRUNCATE);
(thisContext->current)[2] = (srcFormat);
(thisContext->current)[3] = (CELL_GCM_TRANSFER_OPERATION_SRCCOPY);
@ -595,7 +623,7 @@ static inline void rglGcmSetTransferImage(struct CellGcmContextData *thisContext
(thisContext->current)[9] = 1048576;
(thisContext->current) += 10;
(thisContext->current)[0] = (((4) << (18)) | ((0x0000C400)));
(thisContext->current)[0] = (((4) << (18)) | CELL_GCM_NV3089_IMAGE_IN_SIZE);
(thisContext->current)[1] = (((dstBltHeight) << 16) | (safeDstBltWidth));
(thisContext->current)[2] = ((srcPitch) | ((CELL_GCM_TRANSFER_ORIGIN_CORNER) << 16) | ((CELL_GCM_TRANSFER_INTERPOLATOR_ZOH) << 24));
(thisContext->current)[3] = (srcOffset + srcBlockOffset);
@ -785,9 +813,9 @@ static inline void rglGcmTransferData
GLuint dstOffset = gmmIdToOffset(dstId) + dstIdOffset;
GLuint srcOffset = gmmIdToOffset(srcId) + srcIdOffset;
(thisContext->current)[0] = (((2) << (18)) | ((0x00002184)));
(thisContext->current)[1] = 0xFEED0000; /* CELL_GCM_TRANSFER_LOCAL_TO_LOCAL */
(thisContext->current)[2] = 0xFEED0000; /* CELL_GCM_TRANSFER_LOCAL_TO_LOCAL */
(thisContext->current)[0] = (((2) << (18)) | CELL_GCM_NV0039_SET_CONTEXT_DMA_BUFFER_IN);
(thisContext->current)[1] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; /* CELL_GCM_TRANSFER_LOCAL_TO_LOCAL */
(thisContext->current)[2] = CELL_GCM_CONTEXT_DMA_MEMORY_FRAME_BUFFER; /* CELL_GCM_TRANSFER_LOCAL_TO_LOCAL */
(thisContext->current) += 3;
uint32_t colCount;
@ -811,7 +839,7 @@ static inline void rglGcmTransferData
{
cols = (colCount > CL0039_MAX_LINES) ? CL0039_MAX_LINES : colCount;
(thisContext->current)[0] = (((8) << (18)) | ((0x0000230C)));
(thisContext->current)[0] = (((8) << (18)) | CELL_GCM_NV0039_OFFSET_IN);
(thisContext->current)[1] = (srcOffset + (bytesPerRow - colCount));
(thisContext->current)[2] = (dstOffset + (bytesPerRow - colCount));
(thisContext->current)[3] = (0);
@ -837,7 +865,7 @@ static inline void rglGcmTransferData
{
cols = (colCount > CL0039_MAX_LINES) ? CL0039_MAX_LINES : colCount;
(thisContext->current)[0] = (((8) << (18)) | ((0x0000230C)));
(thisContext->current)[0] = (((8) << (18)) | CELL_GCM_NV0039_OFFSET_IN);
(thisContext->current)[1] = (srcOffset + (bytesPerRow - colCount));
(thisContext->current)[2] = (dstOffset + (bytesPerRow - colCount));
(thisContext->current)[3] = (srcPitch);
@ -854,7 +882,7 @@ static inline void rglGcmTransferData
}
}
(thisContext->current)[0] = (((1) << (18)) | ((0x00002310)));
(thisContext->current)[0] = (((1) << (18)) | CELL_GCM_NV0039_OFFSET_OUT);
(thisContext->current)[1] = (0);
(thisContext->current) += 2;
}

View File

@ -3130,7 +3130,7 @@ GLAPI void RGL_EXPORT psglSwap (void)
rglGcmDriver *driver = (rglGcmDriver*)_CurrentDevice->rasterDriver;
float * __restrict v = (float*)driver->sharedVPConstants;
thisContext->current[0] = (((33) << (18)) | ((0x00001efc)));
thisContext->current[0] = (((33) << (18)) | CELL_GCM_NV4097_SET_TRANSFORM_CONSTANT_LOAD);
thisContext->current[1] = 0;
__builtin_memcpy(&thisContext->current[2], v, sizeof(float)*16);

View File

@ -188,7 +188,7 @@ template<int SIZE> static void setVectorTypeSharedvpIndex (void *data, const voi
memcpy(driver->sharedVPConstants + resource * 4 * sizeof( float ),
dst, 4 * sizeof(float));
thisContext->current[0] = (((5) << (18)) | ((0x00001efc)));
thisContext->current[0] = (((5) << (18)) | CELL_GCM_NV4097_SET_TRANSFORM_CONSTANT_LOAD);
thisContext->current[1] = resource;
thisContext->current += 2;
@ -214,7 +214,7 @@ template<int SIZE> static void setVectorTypeSharedvpIndexArray (void *data, cons
memcpy(driver->sharedVPConstants + resource * 4 * sizeof( float ),
dst, 4 * sizeof(float));
thisContext->current[0] = (((5) << (18)) | ((0x00001efc)));
thisContext->current[0] = (((5) << (18)) | CELL_GCM_NV4097_SET_TRANSFORM_CONSTANT_LOAD);
thisContext->current[1] = resource;
thisContext->current += 2;
@ -1814,9 +1814,18 @@ GLAPI void APIENTRY glDrawArrays (GLenum mode, GLint first, GLsizei count)
// set 3 consts
{
GLfloat v2[12];
v2[0] = value[0];v2[1] = value[3];v2[2] = value[6];v2[3] = 0;
v2[4] = value[1];v2[5] = value[4];v2[6] = value[7];v2[7] = 0;
v2[8] = value[2];v2[9] = value[5];v2[10] = value[8];v2[11] = 0;
v2[0] = value[0];
v2[1] = value[3];
v2[2] = value[6];
v2[3] = 0;
v2[4] = value[1];
v2[5] = value[4];
v2[6] = value[7];
v2[7] = 0;
v2[8] = value[2];
v2[9] = value[5];
v2[10] = value[8];
v2[11] = 0;
GCM_FUNC( cellGcmSetVertexProgramParameterBlock, parameterResource->resource, 3, v2 );
}
break;

View File

@ -3020,17 +3020,11 @@ bool rarch_main_iterate(void)
// SHUTDOWN on consoles should exit RetroArch completely.
if (g_extern.system.shutdown)
{
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
return false;
}
// Time to drop?
if (input_key_pressed_func(RARCH_QUIT_KEY) || !video_alive_func())
{
g_extern.lifecycle_mode_state |= (1ULL << MODE_EXIT);
return false;
}
if (check_enter_rgui())
return false; // Enter menu, don't exit.

View File

@ -1,534 +0,0 @@
/* RetroArch - A frontend for libretro.
* Copyright (C) 2010-2013 - Hans-Kristian Arntzen
* Copyright (C) 2011-2013 - Daniel De Matteis
*
* RetroArch is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with RetroArch.
* If not, see <http://www.gnu.org/licenses/>.
*/
/* DONE:
* - Context creation (mostly)
* TODO:
* - Shader code
* - Texture reinitialization (16bpp support, etc)
* - Viewports
* - Implement video frame logic inbetween Begin/End
* - Actually run and test this to make sure it does work
*/
#include "../psp/sdk_defines.h"
#include "../general.h"
#include "../driver.h"
#define MALLOC_PARAMS_FRAGMENT_FLAG (1 << 0)
#define MALLOC_PARAMS_VERTEX_FLAG (1 << 1)
#define GXM_ALIGN(x, a) (((x) + ((a) - 1)) & ~((a) - 1))
#define DISPLAY_BUFFER_COUNT 3
#define DISPLAY_BUFFER_SIZE (GXM_ALIGN(PSP_PITCH_PIXELS * PSP_FB_HEIGHT * 4, 1024 * 1024))
#define DISPLAY_MAX_PENDING_SWAPS 2
typedef struct vita_video
{
SceGxmContext *gxm_ctx;
void *context_host_mem;
void *disp_buf_data[DISPLAY_BUFFER_COUNT];
SceUID disp_buf_uid[DISPLAY_BUFFER_COUNT];
SceGxmColorSurface disp_surface[DISPLAY_BUFFER_COUNT];
SceGxmSyncObject *disp_buf_sync[DISPLAY_BUFFER_COUNT];
SceGxmShaderPatcher *shader_patcher;
SceGxmRenderTarget *rt;
SceUID vid_rb_uid;
SceUID vtx_rb_uid;
SceUID fp_rb_uid;
SceUID patcher_buf_id;
SceUID patcher_vertex_usse_uid;
SceUID patcher_fragment_usse_uid;
SceUID shader_patcher;
SceUID fp_usse_rb_uid;
SceUID patcher_buf_uid;
unsigned disp_back_buf_index;
unsigned disp_front_buf_index;
} vita_video_t;
typedef struct
{
uint32_t *address;
} DisplayData;
static void *malloc_gpu(SceKernelMemBlockType type, uint32_t size,
uint32_t attribs, SceUID *uid, uint32_t params, uint32_t *offset)
{
int ret = SCE_OK;
if (type == SCE_KERNEL_MEMBLOCK_TYPE_USER_CDRAM_RWDATA)
size = GXM_ALIGN(size, 262144);
else
size = GXM_ALIGN(size, 4096);
if(((params & MALLOC_PARAMS_FRAGMENT_FLAG) == MALLOC_PARAMS_FRAGMENT_FLAG) ||
((params & MALLOC_PARAMS_VERTEX_FLAG) == MALLOC_PARAMS_VERTEX_FLAG))
type = SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA_UNCACHE;
*uid = sceKernelAllocMemBlock("basic", type, size, NULL);
if (uid != SCE_OK)
goto error;
void *mem = NULL;
ret = sceKernelGetMemBlockBase(*uid, &mem);
if (ret != SCE_OK)
goto error;
if((params & MALLOC_PARAMS_FRAGMENT_FLAG) == MALLOC_PARAMS_FRAGMENT_FLAG)
ret = sceGxmMapFragmentUsseMemory(mem, size, offset);
else if((params & MALLOC_PARAMS_VERTEX_FLAG) == MALLOC_PARAMS_VERTEX_FLAG)
ret = sceGxmMapVertexUsseMemory(mem, size, offset);
else
ret = sceGxmMapMemory(mem, size, attribs);
if (ret != SCE_OK)
goto error;
return mem;
error:
RARCH_ERR("Error during GPU memory allocation.\n");
return NULL;
}
static void free_gpu(SceUID uid, uint32_t params)
{
int ret = SCE_OK;
void *mem = NULL;
ret = sceKernelGetMemBlockBase(uid, &mem);
if (ret != SCE_OK)
goto error;
if((params & MALLOC_PARAMS_FRAGMENT_FLAG) == MALLOC_PARAMS_FRAGMENT_FLAG)
ret = sceGxmUnmapFragmentUsseMemory(mem);
else if((params & MALLOC_PARAMS_VERTEX_FLAG) == MALLOC_PARAMS_VERTEX_FLAG)
ret = sceGxmUnmapVertexUsseMemory(mem);
else
ret = sceGxmUnmapMemory(mem);
if (ret != SCE_OK)
goto error;
ret = sceKernelFreeMemBlock(uid);
if (ret != SCE_OK)
goto error;
error:
RARCH_ERR("Error during GPU memory deallocation.\n");
}
static void vita_gfx_init_fbo(void *data, const video_info_t *video)
{
vita_video_t *vid = (vita_video_t*)driver.video_data;
SceGxmRenderTargetParams rtparams;
memset(&rtparams, 0, sizeof(SceGxmRenderTargetParams));
rtparams.flags = 0;
rtparams.width = PSP_FB_WIDTH;
rtparams.height = PSP_FB_HEIGHT;
rtparams.scenesPerFrame = 1;
rtparams.multisampleMode = SCE_GXM_MULTISAMPLE_NONE;
rtparams.multisampleLocations = 0;
rtparams.hostMem = NULL;
rtparams.hostMemSize = 0;
rtparams.driverMemBlock = -1;
// compute size
uint32_t host_mem_size, driver_mem_size;
sceGxmGetRenderTargetMemSizes(&rtparams, &host_mem_size, &driver_mem_size);
rtparams.hostMem = malloc(host_mem_size);
rtparams.hostMemSize = host_mem_size;
rtparams.driverMemBlock = sceKernelAllocMemBlock(
"SampleRT",
SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA_UNCACHE,
driver_mem_sie, NULL);
int ret = sceGxmCreateRenderTarget(&rtparams, &vid->rt);
return ret;
}
static void disp_callback(const void *callback_data)
{
int ret = SCE_OK;
#if defined(SN_TARGET_PSP2)
SceDisplayFrameBuf framebuf;
const DisplayData *display_data = (const DisplayData*)callback_data;
memset(&framebuf, 0, sizeof(SceDisplayFrameBuf));
framebuf.size = sizeof(SceDisplayFrameBuf);
framebuf.base = display_data->address;
framebuf.pitch = PSP_PITCH_PIXELS;
framebuf.pixelformat = PSP_DISPLAY_PIXELFORMAT_8888;
framebuf.width = PSP_FB_WIDTH;
framebuf.height = PSP_FB_HEIGHT;
ret = DisplaySetFrameBuf(&framebuf, PSP_FB_WIDTH, PSP_DISPLAY_PIXELFORMAT_8888, SCE_DISPLAY_UPDATETIMING_NEXTVSYNC);
#elif defined(PSP)
ret = DisplaySetFrameBuf(&display_data->address, PSP_FB_WIDTH, PSP_DISPLAY_PIXELFORMAT_8888, SCE_DISPLAY_UPDATETIMING_NEXTVSYNC);
#endif
/* TODO - Don't bother with error checking for now in here */
// Block until swap has occurred and the old buffer is no longer displayed
ret = sceDisplayWaitSetFrameBuf();
}
static void *patcher_host_alloc(void *user_data, uint32_t size)
{
(void)user_data;
return malloc(size);
}
static void patcher_host_free(void *user_data, void *mem)
{
(void)user_data;
free(mem);
}
static int vita_gfx_init_shader_patcher(const video_info_t *video)
{
ps2p_video_t *vid = (vita_video_t*)driver.video_data;
SceGxmShaderPatcherParams patcher_params;
uint32_t patcherVertexUsseOffset, patcherFragmentUsseOffset;
memset(&patcher_params, 0, sizeof(SceGxmShaderPatcherParams));
patcher_params.userData = NULL;
patcher_params.hostAllocCallback = &patcher_host_alloc;
patcher_params.hostFreeCallback = &patcher_host_free;
patcher_params.bufferAllocCallback = NULL;
patcher_params.bufferreeCallback = NULL;
patcher_params.bufferMem = malloc_gpu(
SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA_UNCACHE,
64 * 1024,
SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE,
&vid->patcher_buf_uid, 0, NULL);
patcher_params.bufferMemSize = 64 * 1024;
patcher_params.vertexUsseAllocCallback = NULL;
patcher_params.vertexUsseFreeCallback = NULL;
patcher_params.vertexUsseMem = malloc_gpu(
0,
64 * 1024,
0,
&vid->patcher_vertex_usse_uid,
MALLOC_PARAMS_VERTEX_FLAG,
&patcherVertexUsseOffset);
patcher_params.vertexUsseMemSize = 64 * 1024;
patcher_params.vertexUsseOffset = patcherVertexUsseOffset;
patcher_params.fragmentUsseAllocCallback = NULL;
patcher_params.fragmentUsseFreeCallback = NULL;
patcher_params.fragmentUsseMem = malloc_gpu(
0,
64 * 1024,
0,
&vid->patcher_fragment_usse_uid,
MALLOC_PARAMS_FRAGMENT_FLAG,
&patcherFragmentUsseOffset);
patcher_params.fragmentUsseMemSize = 64 * 1024;
patcher_params.fragmentUsseOffset = patcherFragmentUsseOffset;
int ret = sceGxmShaderPatcherCreate(&patcher_params, &vid->shader_patcher);
return ret;
}
static void vita_gfx_init_sync_objects(const video_info_t *video)
{
vita_video_t *vid = (vita_video_t*)driver.video_data;
for (unsigned i = 0; i < DISPLAY_BUFFER_COUNT; ++i)
{
vid->disp_buf_data[i] = malloc_gpu(
SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA_UNCACHE,
DISPLAY_BUFFER_SIZE,
SCE_GXM_MEMORY_ATTRIB_READ | SCE_GXM_MEMORY_ATTRIB_WRITE,
&vid->disp_buf_uid[i], 0, NULL);
int ret = sceGxmColorSurfaceInit(
&vid->disp_surface[i],
SCE_GXM_COLOR_FORMAT_A8B8G8R8, //TODO - Add toggle between 16bpp and 32bpp here
SCE_GXM_COLOR_SURFACE_LINEAR,
SCE_GXM_COLOR_SURFACE_SCALE_NONE,
SCE_GXM_OUTPUT_REGISTER_SIZE_32BIT,
PSP_FB_WIDTH,
PSP_FB_HEIGHT,
PSP_PITCH_PIXELS,
vid->disp_buf_data[i]);
if(ret != SCE_OK)
{
RARCH_ERR("Initialization of color surface %d failed.\n", i);
}
else
{
ret = sceGxmSyncObjectCreate(&vid->disp_buffer_sync[i]);
if(ret != SCE_OK)
RARCH_ERR("Initialization of sync object %d failed.\n");
}
}
}
static void *vita_gfx_init(const video_info_t *video,
const input_driver_t **input, void **input_data)
{
*input = NULL;
*input_data = NULL;
(void)video;
if (driver.video_data)
{
vita_video_t *vid = (vita_video_t*)driver.video_data;
/* TODO - Reinitialize textures here */
return driver.video_data;
}
vita_video_t *vid = (vita_video_t*)calloc(1, sizeof(vita_video_t));
if (!vid)
goto error;
driver.video_data = vid;
int ret;
SceGxmInitializeParams params;
memset(&params, 0, sizeof(SceGxmInitializeParams));
params.flags = 0;
params.displayQueueMaxPendingCount = DISPLAY_MAX_PENDING_SWAPS;
params.displayQueueCallback = disp_callback;
params.displayQueueCallbackDataSize = sizeof(DisplayData);
params.parameterBufferSize = SCE_GXM_DEFAULT_PARAMETER_BUFFER_SIZE;
ret = sceGxmInitialize(&params);
if(ret != SCE_OK)
goto error;
SceGxmContextParams ctx_params;
memset(&ctx_params, 0, sizeof(SceGxmContextParams));
uint32_t fp_usse_ring_buffer_offset;
vid->context_host_mem = malloc(SCE_GXM_MINIMUM_CONTEXT_HOST_MEM_SIZE);
ctx_params.hostMem = vid->context_host_mem;
ctx_params.hostMemSize = SCE_GXM_MINIMUM_CONTEXT_HOST_MEM_SIZE;
ctx_params.vdmRingBufferMem = malloc_gpu(
SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA_UNCACHE,
SCE_GXM_DEFAULT_VDM_RING_BUFFER_SIZE,
SCE_GXM_MEMORY_ATTRIB_READ,
&vid->rb_uid, 0, NULL);
ctx_params.vdmRingBufferMemSize = SCE_GXM_DEFAULT_VDM_RING_BUFFER_SIZE;
ctx_params.vertexRingBufferMem = malloc_gpu(
SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA_UNCACHE,
SCE_GXM_DEFAULT_VERTEX_RING_BUFFER_SIZE,
SCE_GXM_MEMORY_ATTRIB_READ,
&vid->vtx_rb_uid, 0, NULL);
ctx_params.vertexRingBufferMemSize = SCE_GXM_DEFAULT_VERTEX_RING_BUFFER_SIZE;
ctx_params.fragmentRingBufferMem = malloc_gpu(
SCE_KERNEL_MEMBLOCK_TYPE_USER_RWDATA_UNCACHE,
SCE_GXM_DEFAULT_FRAGMENT_RING_BUFFER_SIZE,
SCE_GXM_MEMORY_ATTRIB_READ,
&vid->fp_rb_uid, 0, NULL);
ctx_params.fragmentRingBufferMemSize = SCE_GXM_DEFAULT_FRAGMENT_RING_BUFFER_SIZE;
ctx_params.fragmentUsseRingBufferMem = malloc_gpu(
0,
SCE_GXM_DEFAULT_FRAGMENT_USSE_RING_BUFFER_SIZE,
0,
&vid->fp_usse_rb_uid,
MALLOC_PARAMS_FRAGMENT_FLAG,
&fp_usse_ring_buffer_offset);
ctx_params.fragmentUsseRingBufferMemSize = SCE_GXM_DEFAULT_FRAGMENT_USSE_RING_BUFFER_SIZE;
ctx_params.fragmentUsseRingBufferOffset = vid->fp_rb_uid;
vid->gxm_ctx = NULL;
ret = sceGxmCreateContext(&ctx_params, &vid->gxm_ctx);
if (ret != SCE_OK)
goto error;
if((vita_gfx_init_fbo()) != SCE_OK)
goto error;
else
RARCH_LOG("FBO initialized successfully.\n");
if((vita_gfx_init_shader_patcher()) != SCE_OK)
goto error;
else
RARCH_LOG("Shader patcher initialized successfully.\n");
vita_gfx_init_sync_objects(video);
/* Clear display buffer for first swap */
memset(vid->disp_buf_data[vid>disp_front_buf_index], 0x00, DISPLAY_BUFFER_SIZE);
/* Swap to the current front buffer with Vsync */
disp_callback(NULL);
return vid;
error:
RARCH_ERR("Vita libgxm video could not be initialized.\n");
return (void*)-1;
}
static inline void vita_gfx_swap(void)
{
vita_video_t *vid = (vita_video_t*)driver.video_data;
DisplayData display_data;
display_data.address = vid->disp_buf_data[vid->disp_back_buf_index];
/* queue swap for this frame */
int ret = sceGxmDisplayQueueAddEntry(
vid->disp_buffer_sync[vid->disp_front_buf_index],
vid->disp_buffer_sync[vid->disp_back_buf_index],
&display_data);
vid->disp_front_buf_index = vid->disp_back_buf_index;
vid->disp_back_buf_index = (vid->disp_back_buf_index + 1) & DISPLAY_BUFFER_COUNT;
}
static bool vita_gfx_frame(void *data, const void *frame,
unsigned width, unsigned height, unsigned pitch, const char *msg)
{
(void)data;
(void)frame;
(void)width;
(void)height;
(void)pitch;
(void)msg;
vita_video_t *vid = (vita_video_t*)data;
sceGxmBeginScene(vid->gcm_ctx, 0, vid->rt, NULL,
NULL, vid->disp_buf_sync[vid->disp_back_buf_index]);
/* TODO - code comes inbetween */
sceGxmEndScene(vid->gxm_ctx, NULL, NULL);
/* notify end of frame */
sceGxmPadHeartBeat(&vid->disp_surface[vid->disp_back_buf_index], vid->disp_buf_sync[vid->disp_back_buf_index]);
vita_gfx_swap();
return true;
}
static void vita_gfx_set_nonblock_state(void *data, bool toggle)
{
(void)data;
(void)toggle;
}
static bool vita_gfx_alive(void *data)
{
(void)data;
return true;
}
static bool vita_gfx_focus(void *data)
{
(void)data;
return true;
}
static void vita_gfx_free(void *data)
{
(void)data;
void *hostmem;
int ret;
SceUID drivermemblock;
/* TDO: error checking */
vita_video_t *vid = (vita_video_t*)driver.video_data;
sceGxmFinish(vid->gxm_ctx);
ret = sceGxmRenderTargetGetHostMem(vid->rt, &hostmem);
ret = sceGxmRenderTargetGetDriverMemBlock(vid->rt, &drivermemblock);
ret = sceGxmDestroyRenderTarget(vid->rt);
sceKernelFreeMemBlock(drivermemblock);
free(hostmem);
// wait until display queue is finished before deallocating display buffers
int ret = sceGxmDisplayQueueFinish();
for (int i = 0; i < DISPLAY_BUFFER_COUNT; ++i)
{
free_gpu(vid->disp_buf_uid[i], 0);
ret = sceGxmSyncObjectDestroy(vid->disp_buf_sync[i]);
}
ret = sceGxmShaderPatcherDestroy(vid->shader_patcher);
free_gpu(vid->patcher_fragment_usse_uid, MALLOC_PARAMS_FRAGMENT_FLAG);
free_gpu(vid->patcher_vertex_usse_uid, MALLOC_PARAMS_VERTEX_FLAG);
free_gpu(vid->patcher_buf_uid, 0);
ret = sceGxmDestroyContext(vid->gxm_ctx);
free_gpu(vid->fp_rb_uid, MALLOC_PARAMS_FRAGMENT_FLAG);
free_gpu(vid->vtx_rb_uid, MALLOC_PARAMS_VERTEX_FLAG);
free_gpu(vid->vid_rb_uid, 0);
free(vid->context_host_mem, 0);
sceGxmTerminate();
}
#ifdef RARCH_CONSOLE
static void vita_gfx_start(void) {}
static void vita_gfx_restart(void) {}
#endif
const video_driver_t video_vita = {
vita_gfx_init,
vita_gfx_frame,
vita_gfx_set_nonblock_state,
vita_gfx_alive,
vita_gfx_focus,
NULL,
vita_gfx_free,
"vita",
#ifdef RARCH_CONSOLE
vita_gfx_start,
vita_gfx_restart,
#endif
};