mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-29 22:20:48 +00:00
cellSaveData: improve ppu schedule during dialogs
This commit is contained in:
parent
c4b4ce46b8
commit
45dc5d9b02
@ -164,23 +164,24 @@ static error_code select_and_delete(ppu_thread& ppu)
|
|||||||
|
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
// Yield
|
// Yield before a blocking dialog is being spawned
|
||||||
lv2_obj::sleep(ppu);
|
lv2_obj::sleep(ppu);
|
||||||
|
|
||||||
// Display Save Data List asynchronously in the GUI thread.
|
// Display a blocking Save Data List asynchronously in the GUI thread.
|
||||||
if (auto save_dialog = Emu.GetCallbacks().get_save_dialog())
|
if (auto save_dialog = Emu.GetCallbacks().get_save_dialog())
|
||||||
{
|
{
|
||||||
selected = save_dialog->ShowSaveDataList(save_entries, focused, SAVEDATA_OP_LIST_DELETE, vm::null);
|
selected = save_dialog->ShowSaveDataList(save_entries, focused, SAVEDATA_OP_LIST_DELETE, vm::null);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reschedule after a blocking dialog returns
|
||||||
|
if (ppu.check_state())
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Abort if dialog was canceled or selection is invalid in this context
|
// Abort if dialog was canceled or selection is invalid in this context
|
||||||
if (selected < 0)
|
if (selected < 0)
|
||||||
{
|
{
|
||||||
// Reschedule
|
|
||||||
if (ppu.check_state())
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return CELL_CANCEL;
|
return CELL_CANCEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -191,11 +192,16 @@ static error_code select_and_delete(ppu_thread& ppu)
|
|||||||
SaveDataEntry entry = save_entries[selected];
|
SaveDataEntry entry = save_entries[selected];
|
||||||
const std::string info = entry.title + "\n" + entry.subtitle + "\n" + entry.details;
|
const std::string info = entry.title + "\n" + entry.subtitle + "\n" + entry.details;
|
||||||
|
|
||||||
// Get user confirmation
|
// Reusable display message string
|
||||||
std::string msg = "Do you really want to delete this entry?\n\n" + info;
|
std::string msg = "Do you really want to delete this entry?\n\n" + info;
|
||||||
|
|
||||||
|
// Yield before a blocking dialog is being spawned
|
||||||
|
lv2_obj::sleep(ppu);
|
||||||
|
|
||||||
|
// Get user confirmation by opening a blocking dialog
|
||||||
error_code res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_YESNO, vm::make_str(msg));
|
error_code res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_YESNO, vm::make_str(msg));
|
||||||
|
|
||||||
// Reschedule
|
// Reschedule after a blocking dialog returns
|
||||||
if (ppu.check_state())
|
if (ppu.check_state())
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -222,23 +228,35 @@ static error_code select_and_delete(ppu_thread& ppu)
|
|||||||
focused = -1;
|
focused = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Display success message (return value should be irrelevant here)
|
// Update display message
|
||||||
msg = "Successfully removed entry!\n\n" + info;
|
msg = "Successfully removed entry!\n\n" + info;
|
||||||
cellSaveData.success("%s", msg);
|
cellSaveData.success("%s", msg);
|
||||||
|
|
||||||
|
// Yield before blocking dialog is being spawned
|
||||||
|
lv2_obj::sleep(ppu);
|
||||||
|
|
||||||
|
// Display success message by opening a blocking dialog (return value should be irrelevant here)
|
||||||
res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_OK, vm::make_str(msg));
|
res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_OK, vm::make_str(msg));
|
||||||
|
|
||||||
|
// Reschedule after blocking dialog returns
|
||||||
|
if (ppu.check_state())
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return CELL_CANCEL;
|
return CELL_CANCEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Displays a savedata error message. error_code is not returned since the caller errored already.
|
// Displays a CellSaveDataCBResult error message.
|
||||||
static void display_error_message(vm::ptr<CellSaveDataCBResult> result)
|
static error_code display_callback_result_error_message(ppu_thread& ppu, vm::ptr<CellSaveDataCBResult> result)
|
||||||
{
|
{
|
||||||
if (!result)
|
if (!result)
|
||||||
return;
|
return CELL_SAVEDATA_ERROR_CBRESULT;
|
||||||
|
|
||||||
std::string msg;
|
std::string msg;
|
||||||
|
bool use_invalid_message = false;
|
||||||
|
|
||||||
switch (result->result)
|
switch (result->result)
|
||||||
{
|
{
|
||||||
@ -256,13 +274,25 @@ static void display_error_message(vm::ptr<CellSaveDataCBResult> result)
|
|||||||
break;
|
break;
|
||||||
case CELL_SAVEDATA_CBRESULT_ERR_INVALID:
|
case CELL_SAVEDATA_CBRESULT_ERR_INVALID:
|
||||||
if (result->invalidMsg)
|
if (result->invalidMsg)
|
||||||
error_code res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_OK, result->invalidMsg);
|
use_invalid_message = true;
|
||||||
return;
|
break;
|
||||||
default:
|
default:
|
||||||
return;
|
return CELL_SAVEDATA_ERROR_CBRESULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
error_code res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_OK, vm::make_str(msg));
|
// Yield before a blocking dialog is being spawned
|
||||||
|
lv2_obj::sleep(ppu);
|
||||||
|
|
||||||
|
// Get user confirmation by opening a blocking dialog (return value should be irrelevant here)
|
||||||
|
error_code res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_OK, use_invalid_message ? result->invalidMsg : vm::make_str(msg));
|
||||||
|
|
||||||
|
// Reschedule after a blocking dialog returns
|
||||||
|
if (ppu.check_state())
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CELL_SAVEDATA_ERROR_CBRESULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string get_confirmation_message(u32 operation)
|
static std::string get_confirmation_message(u32 operation)
|
||||||
@ -654,10 +684,9 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
|
|||||||
|
|
||||||
if (result->result < 0)
|
if (result->result < 0)
|
||||||
{
|
{
|
||||||
display_error_message(result);
|
|
||||||
|
|
||||||
cellSaveData.warning("savedata_op(): funcList returned result=%d.", result->result);
|
cellSaveData.warning("savedata_op(): funcList returned result=%d.", result->result);
|
||||||
return CELL_SAVEDATA_ERROR_CBRESULT;
|
|
||||||
|
return display_callback_result_error_message(ppu, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if the callback has returned ok, lets return OK.
|
// if the callback has returned ok, lets return OK.
|
||||||
@ -797,10 +826,10 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
|
|||||||
|
|
||||||
while (funcList)
|
while (funcList)
|
||||||
{
|
{
|
||||||
// Yield
|
// Yield before a blocking dialog is being spawned
|
||||||
lv2_obj::sleep(ppu);
|
lv2_obj::sleep(ppu);
|
||||||
|
|
||||||
// Display Save Data List asynchronously in the GUI thread.
|
// Display a blocking Save Data List asynchronously in the GUI thread.
|
||||||
if (auto save_dialog = Emu.GetCallbacks().get_save_dialog())
|
if (auto save_dialog = Emu.GetCallbacks().get_save_dialog())
|
||||||
{
|
{
|
||||||
selected = save_dialog->ShowSaveDataList(save_entries, focused, operation, listSet);
|
selected = save_dialog->ShowSaveDataList(save_entries, focused, operation, listSet);
|
||||||
@ -810,14 +839,15 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
|
|||||||
selected = -2;
|
selected = -2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reschedule after a blocking dialog returns
|
||||||
|
if (ppu.check_state())
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
// Cancel selected in UI
|
// Cancel selected in UI
|
||||||
if (selected == -2)
|
if (selected == -2)
|
||||||
{
|
{
|
||||||
// Reschedule
|
|
||||||
if (ppu.check_state())
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
return CELL_CANCEL;
|
return CELL_CANCEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -837,10 +867,13 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
|
|||||||
message = get_confirmation_message(operation) + "\n\n" + entry.title + "\n" + entry.subtitle + "\n" + entry.details;
|
message = get_confirmation_message(operation) + "\n\n" + entry.title + "\n" + entry.subtitle + "\n" + entry.details;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get user confirmation
|
// Yield before a blocking dialog is being spawned
|
||||||
|
lv2_obj::sleep(ppu);
|
||||||
|
|
||||||
|
// Get user confirmation by opening a blocking dialog
|
||||||
error_code res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_YESNO, vm::make_str(message));
|
error_code res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_YESNO, vm::make_str(message));
|
||||||
|
|
||||||
// Reschedule
|
// Reschedule after a blocking dialog returns
|
||||||
if (ppu.check_state())
|
if (ppu.check_state())
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -862,10 +895,9 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
|
|||||||
|
|
||||||
if (result->result < 0)
|
if (result->result < 0)
|
||||||
{
|
{
|
||||||
display_error_message(result);
|
|
||||||
|
|
||||||
cellSaveData.warning("savedata_op(): funcDone returned result=%d.", result->result);
|
cellSaveData.warning("savedata_op(): funcDone returned result=%d.", result->result);
|
||||||
return CELL_SAVEDATA_ERROR_CBRESULT;
|
|
||||||
|
return display_callback_result_error_message(ppu, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result->result == CELL_SAVEDATA_CBRESULT_OK_LAST || result->result == CELL_SAVEDATA_CBRESULT_OK_LAST_NOCONFIRM)
|
if (result->result == CELL_SAVEDATA_CBRESULT_OK_LAST || result->result == CELL_SAVEDATA_CBRESULT_OK_LAST_NOCONFIRM)
|
||||||
@ -905,10 +937,9 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
|
|||||||
|
|
||||||
if (result->result < 0)
|
if (result->result < 0)
|
||||||
{
|
{
|
||||||
display_error_message(result);
|
|
||||||
|
|
||||||
cellSaveData.warning("savedata_op(): funcFixed returned result=%d.", result->result);
|
cellSaveData.warning("savedata_op(): funcFixed returned result=%d.", result->result);
|
||||||
return CELL_SAVEDATA_ERROR_CBRESULT;
|
|
||||||
|
return display_callback_result_error_message(ppu, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fixedSet->dirName)
|
if (!fixedSet->dirName)
|
||||||
@ -944,10 +975,13 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
|
|||||||
message = get_confirmation_message(operation) + "\n\n" + entry.title + "\n" + entry.subtitle + "\n" + entry.details;
|
message = get_confirmation_message(operation) + "\n\n" + entry.title + "\n" + entry.subtitle + "\n" + entry.details;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get user confirmation
|
// Yield before a blocking dialog is being spawned
|
||||||
|
lv2_obj::sleep(ppu);
|
||||||
|
|
||||||
|
// Get user confirmation by opening a blocking dialog
|
||||||
error_code res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_YESNO, vm::make_str(message));
|
error_code res = open_msg_dialog(true, CELL_MSGDIALOG_TYPE_SE_TYPE_NORMAL | CELL_MSGDIALOG_TYPE_BUTTON_TYPE_YESNO, vm::make_str(message));
|
||||||
|
|
||||||
// Reschedule
|
// Reschedule after a blocking dialog returns
|
||||||
if (ppu.check_state())
|
if (ppu.check_state())
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
@ -976,10 +1010,9 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
|
|||||||
|
|
||||||
if (result->result < 0)
|
if (result->result < 0)
|
||||||
{
|
{
|
||||||
display_error_message(result);
|
|
||||||
|
|
||||||
cellSaveData.warning("savedata_op(): funcDone_ returned result=%d.", result->result);
|
cellSaveData.warning("savedata_op(): funcDone_ returned result=%d.", result->result);
|
||||||
return CELL_SAVEDATA_ERROR_CBRESULT;
|
|
||||||
|
return display_callback_result_error_message(ppu, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return CELL_OK;
|
return CELL_OK;
|
||||||
@ -1158,9 +1191,7 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
|
|||||||
|
|
||||||
if (result->result < CELL_SAVEDATA_CBRESULT_OK_NEXT)
|
if (result->result < CELL_SAVEDATA_CBRESULT_OK_NEXT)
|
||||||
{
|
{
|
||||||
display_error_message(result);
|
return display_callback_result_error_message(ppu, result);
|
||||||
|
|
||||||
return CELL_SAVEDATA_ERROR_CBRESULT;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Skip and return without error
|
// Skip and return without error
|
||||||
@ -1561,7 +1592,7 @@ static NEVER_INLINE error_code savedata_op(ppu_thread& ppu, u32 operation, u32 v
|
|||||||
|
|
||||||
if (savedata_result == CELL_SAVEDATA_ERROR_CBRESULT)
|
if (savedata_result == CELL_SAVEDATA_ERROR_CBRESULT)
|
||||||
{
|
{
|
||||||
display_error_message(result);
|
return display_callback_result_error_message(ppu, result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return savedata_result;
|
return savedata_result;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user