mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
0d064185f5
commit
b40fd97f7b
|
@ -32,12 +32,12 @@ type
|
|||
pwef_node=^wef_node;
|
||||
wef_node=record
|
||||
pNext,pPrev:pwef_node;
|
||||
pParent:Pointer;
|
||||
//
|
||||
thread:THandle;
|
||||
bitPattern:QWORD;
|
||||
ResultPat:QWORD;
|
||||
waitMode:DWORD;
|
||||
ret:Integer;
|
||||
end;
|
||||
|
||||
wef_list=object
|
||||
|
@ -51,11 +51,15 @@ type
|
|||
SceKernelEventFlag_t=packed record
|
||||
valid:DWORD;
|
||||
attr:DWORD;
|
||||
bitPattern:QWORD;
|
||||
refs:DWORD;
|
||||
lock_sing:r_spin_lock;
|
||||
lock_list:r_spin_lock;
|
||||
bitPattern:QWORD;
|
||||
list:wef_list;
|
||||
thread:THandle;
|
||||
single:record
|
||||
thread:THandle;
|
||||
ret:Integer;
|
||||
end;
|
||||
name:array[0..31] of AnsiChar;
|
||||
end;
|
||||
|
||||
|
@ -75,6 +79,7 @@ function ps4_sceKernelWaitEventFlag(
|
|||
|
||||
function ps4_sceKernelSetEventFlag(ef:SceKernelEventFlag;bitPattern:QWORD):Integer; SysV_ABI_CDecl;
|
||||
function ps4_sceKernelClearEventFlag(ef:SceKernelEventFlag;bitPattern:QWORD):Integer; SysV_ABI_CDecl;
|
||||
function ps4_sceKernelDeleteEventFlag(ef:SceKernelEventFlag):Integer; SysV_ABI_CDecl;
|
||||
|
||||
implementation
|
||||
|
||||
|
@ -128,7 +133,13 @@ begin
|
|||
|
||||
if (pName<>nil) then MoveChar0(pName^,data^.name,32);
|
||||
|
||||
ef^:=data;
|
||||
data^.refs:=1;
|
||||
|
||||
if not CAS(ef^,ef^,data) then
|
||||
begin
|
||||
FreeMem(data);
|
||||
end;
|
||||
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
|
@ -227,6 +238,23 @@ begin
|
|||
Result:=(attr and SCE_KERNEL_EVF_ATTR_MULTI)=0;
|
||||
end;
|
||||
|
||||
|
||||
function ef_enter(ef:SceKernelEventFlag):Integer;
|
||||
begin
|
||||
if (ef=nil) then Exit(SCE_KERNEL_ERROR_ESRCH);
|
||||
if not safe_test(ef^.valid,LIFE_EQ) then Exit(SCE_KERNEL_ERROR_EACCES);
|
||||
System.InterlockedIncrement(ef^.refs);
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
procedure ef_leave(ef:SceKernelEventFlag);
|
||||
begin
|
||||
if (System.InterlockedDecrement(ef^.refs)=0) then
|
||||
begin
|
||||
SwFreeMem(ef);
|
||||
end;
|
||||
end;
|
||||
|
||||
function ps4_sceKernelWaitEventFlag(
|
||||
ef:SceKernelEventFlag;
|
||||
bitPattern:QWORD;
|
||||
|
@ -242,11 +270,6 @@ var
|
|||
QTIME:QWORD;
|
||||
node:wef_node;
|
||||
begin
|
||||
Result:=0;
|
||||
|
||||
if (ef=nil) then Exit(SCE_KERNEL_ERROR_ESRCH);
|
||||
if (ef^.valid<>LIFE_EQ) then Exit(SCE_KERNEL_ERROR_EACCES);
|
||||
|
||||
if (bitPattern=0) then Exit(SCE_KERNEL_ERROR_EINVAL);
|
||||
|
||||
Case (waitMode and WOP_MODES) of
|
||||
|
@ -259,6 +282,9 @@ begin
|
|||
t:=_get_curthread;
|
||||
if (t=nil) then Exit(SCE_KERNEL_ERROR_ESRCH);
|
||||
|
||||
Result:=ef_enter(ef);
|
||||
if (Result<>0) then Exit;
|
||||
|
||||
_sig_lock;
|
||||
|
||||
Writeln('>sceKernelWaitEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
|
||||
|
@ -280,17 +306,19 @@ begin
|
|||
begin
|
||||
spin_unlock(ef^.lock_list);
|
||||
_sig_unlock;
|
||||
ef_leave(ef);
|
||||
Exit(SCE_KERNEL_ERROR_EPERM);
|
||||
end;
|
||||
ef^.thread:=t^.handle;
|
||||
ef^.single.thread:=t^.handle;
|
||||
ef^.single.ret:=1;
|
||||
spin_unlock(ef^.lock_list);
|
||||
end else
|
||||
begin
|
||||
node:=Default(wef_node);
|
||||
node.pParent :=ef;
|
||||
node.thread :=t^.handle;
|
||||
node.bitPattern:=bitPattern;
|
||||
node.waitMode :=waitMode;
|
||||
node.ret :=1;
|
||||
|
||||
spin_lock(ef^.lock_list);
|
||||
ef^.list.Insert(@node);
|
||||
|
@ -309,12 +337,13 @@ begin
|
|||
|
||||
end else
|
||||
begin
|
||||
if (node.pParent=nil) then //is signaled
|
||||
if (node.ret<>1) then //is signaled
|
||||
begin
|
||||
if (pResultPat<>nil) then
|
||||
begin
|
||||
pResultPat^:=node.ResultPat;
|
||||
end;
|
||||
Result:=node.ret;
|
||||
Break;
|
||||
end;
|
||||
|
||||
|
@ -376,7 +405,8 @@ begin
|
|||
|
||||
if _is_single(attr) then
|
||||
begin
|
||||
ef^.thread:=0;
|
||||
ef^.single.thread:=0;
|
||||
Result:=ef^.single.ret;
|
||||
spin_unlock(ef^.lock_sing);
|
||||
end else
|
||||
begin
|
||||
|
@ -388,6 +418,7 @@ begin
|
|||
Writeln('<sceKernelWaitEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
|
||||
|
||||
_sig_unlock;
|
||||
ef_leave(ef);
|
||||
end;
|
||||
|
||||
procedure _apc_null(dwParam:PTRUINT); stdcall;
|
||||
|
@ -402,8 +433,8 @@ var
|
|||
AllwaitMode:DWORD;
|
||||
attr:DWORD;
|
||||
begin
|
||||
if (ef=nil) then Exit(SCE_KERNEL_ERROR_ESRCH);
|
||||
if (ef^.valid<>LIFE_EQ) then Exit(SCE_KERNEL_ERROR_ESRCH);
|
||||
Result:=ef_enter(ef);
|
||||
if (Result<>0) then Exit;
|
||||
|
||||
_sig_lock;
|
||||
|
||||
|
@ -413,14 +444,15 @@ begin
|
|||
AllPattern:=0;
|
||||
AllwaitMode:=0;
|
||||
|
||||
attr:=ef^.attr;
|
||||
|
||||
spin_lock(ef^.lock_list);
|
||||
|
||||
attr:=ef^.attr;
|
||||
|
||||
if _is_single(attr) then
|
||||
begin
|
||||
fetch_or(ef^.bitPattern,bitPattern);
|
||||
NtQueueApcThread(ef^.thread,@_apc_null,0,nil,0);
|
||||
ef^.single.ret:=0;
|
||||
NtQueueApcThread(ef^.single.thread,@_apc_null,0,nil,0);
|
||||
end else
|
||||
begin
|
||||
|
||||
|
@ -431,7 +463,7 @@ begin
|
|||
node:=ef^.list.pHead;
|
||||
While (node<>nil) do
|
||||
begin
|
||||
if (node^.pParent<>nil) then
|
||||
if (node^.ret=1) then
|
||||
if _test_by_mode(bits,node^.bitPattern,node^.waitMode) then
|
||||
begin
|
||||
AllPattern :=AllPattern or node^.bitPattern;
|
||||
|
@ -451,11 +483,11 @@ begin
|
|||
node:=ef^.list.pHead;
|
||||
While (node<>nil) do
|
||||
begin
|
||||
if (node^.pParent<>nil) then
|
||||
if (node^.ret=1) then
|
||||
if _test_by_mode(prev,node^.bitPattern,node^.waitMode) then
|
||||
begin
|
||||
node^.ResultPat:=bits;
|
||||
node^.pParent :=nil;
|
||||
node^.ret:=0;
|
||||
NtQueueApcThread(node^.thread,@_apc_null,0,nil,0);
|
||||
end;
|
||||
node:=node^.pNext;
|
||||
|
@ -471,38 +503,77 @@ begin
|
|||
spin_unlock(ef^.lock_list);
|
||||
|
||||
_sig_unlock;
|
||||
ef_leave(ef);
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
function ps4_sceKernelClearEventFlag(ef:SceKernelEventFlag;bitPattern:QWORD):Integer; SysV_ABI_CDecl;
|
||||
var
|
||||
t:Int64;
|
||||
//pt:pthread;
|
||||
begin
|
||||
if (ef=nil) then Exit(SCE_KERNEL_ERROR_ESRCH);
|
||||
if (ef^.valid<>LIFE_EQ) then Exit(SCE_KERNEL_ERROR_ESRCH);
|
||||
Result:=ef_enter(ef);
|
||||
if (Result<>0) then Exit;
|
||||
|
||||
Writeln('sceKernelClearEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
|
||||
|
||||
//pt:=ps4_pthread_self;
|
||||
//if pt^.name='main' then
|
||||
//begin
|
||||
// DebugBreak;
|
||||
//end;
|
||||
|
||||
//t:=-10000;
|
||||
//SwDelayExecution(False,@t); //100ms
|
||||
|
||||
spin_lock(ef^.lock_list);
|
||||
fetch_and(ef^.bitPattern,bitPattern);
|
||||
spin_unlock(ef^.lock_list);
|
||||
|
||||
ef_leave(ef);
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
function ps4_sceKernelDeleteEventFlag(ef:SceKernelEventFlag):Integer; SysV_ABI_CDecl;
|
||||
var
|
||||
node:pwef_node;
|
||||
attr:DWORD;
|
||||
begin
|
||||
Result:=ef_enter(ef);
|
||||
if (Result<>0) then Exit(SCE_KERNEL_ERROR_ESRCH);
|
||||
|
||||
if not CAS(ef^.valid,LIFE_EQ,DEAD_EQ) then
|
||||
begin
|
||||
ef_leave(ef);
|
||||
Exit(SCE_KERNEL_ERROR_ESRCH);
|
||||
end;
|
||||
|
||||
_sig_lock;
|
||||
|
||||
Writeln('>sceKernelDeleteEventFlag:',HexStr(ef),':',ef^.name);
|
||||
|
||||
spin_lock(ef^.lock_list);
|
||||
|
||||
attr:=ef^.attr;
|
||||
|
||||
//cancel all
|
||||
if _is_single(attr) then
|
||||
begin
|
||||
ef^.single.ret:=SCE_KERNEL_ERROR_EACCES;
|
||||
NtQueueApcThread(ef^.single.thread,@_apc_null,0,nil,0);
|
||||
end else
|
||||
begin
|
||||
node:=ef^.list.pHead;
|
||||
While (node<>nil) do
|
||||
begin
|
||||
if (node^.ret=1) then
|
||||
begin
|
||||
node^.ResultPat:=ef^.bitPattern;
|
||||
node^.ret:=SCE_KERNEL_ERROR_EACCES;
|
||||
NtQueueApcThread(node^.thread,@_apc_null,0,nil,0);
|
||||
end;
|
||||
node:=node^.pNext;
|
||||
end;
|
||||
end;
|
||||
|
||||
spin_unlock(ef^.lock_list);
|
||||
|
||||
_sig_unlock;
|
||||
|
||||
System.InterlockedDecrement(ef^.refs);
|
||||
ef_leave(ef);
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
{
|
||||
int sceKernelDeleteEventFlag(SceKernelEventFlag ef);
|
||||
|
||||
int sceKernelPollEventFlag(SceKernelEventFlag ef, uint64_t bitPattern,
|
||||
uint32_t waitMode, uint64_t *pResultPat);
|
||||
int sceKernelCancelEventFlag(SceKernelEventFlag ef, uint64_t setPattern,
|
||||
|
|
|
@ -900,6 +900,7 @@ begin
|
|||
lib^.set_proc($253BC17E58586B34,@ps4_sceKernelWaitEventFlag);
|
||||
lib^.set_proc($20E9D2BC7CEABBA0,@ps4_sceKernelSetEventFlag);
|
||||
lib^.set_proc($EEE8411564404BAD,@ps4_sceKernelClearEventFlag);
|
||||
lib^.set_proc($F26AA5F4E7109DDE,@ps4_sceKernelDeleteEventFlag);
|
||||
|
||||
//event_flag
|
||||
|
||||
|
|
|
@ -12,17 +12,44 @@ uses
|
|||
|
||||
implementation
|
||||
|
||||
const
|
||||
//SceCommonDialogStatus
|
||||
Const
|
||||
//SceCommonDialogStatus
|
||||
SCE_COMMON_DIALOG_STATUS_NONE = 0;
|
||||
SCE_COMMON_DIALOG_STATUS_INITIALIZED = 1;
|
||||
SCE_COMMON_DIALOG_STATUS_RUNNING = 2;
|
||||
SCE_COMMON_DIALOG_STATUS_FINISHED = 3;
|
||||
|
||||
//SceCommonDialogResult {
|
||||
SCE_COMMON_DIALOG_RESULT_OK = 0;
|
||||
SCE_COMMON_DIALOG_RESULT_USER_CANCELED = 1;
|
||||
//SceCommonDialogResult
|
||||
SCE_COMMON_DIALOG_RESULT_OK =0;
|
||||
SCE_COMMON_DIALOG_RESULT_USER_CANCELED=1;
|
||||
|
||||
SCE_COMMON_DIALOG_MAGIC_NUMBER=$C0D1A109;
|
||||
|
||||
//SceMsgDialogMode
|
||||
SCE_MSG_DIALOG_MODE_INVALID =(0);
|
||||
SCE_MSG_DIALOG_MODE_USER_MSG =(1);
|
||||
SCE_MSG_DIALOG_MODE_PROGRESS_BAR=(2);
|
||||
SCE_MSG_DIALOG_MODE_SYSTEM_MSG =(3);
|
||||
|
||||
//SceMsgDialogButtonType
|
||||
SCE_MSG_DIALOG_BUTTON_TYPE_OK =(0);
|
||||
SCE_MSG_DIALOG_BUTTON_TYPE_YESNO =(1);
|
||||
SCE_MSG_DIALOG_BUTTON_TYPE_NONE =(2);
|
||||
SCE_MSG_DIALOG_BUTTON_TYPE_OK_CANCEL =(3);
|
||||
SCE_MSG_DIALOG_BUTTON_TYPE_WAIT =(5);
|
||||
SCE_MSG_DIALOG_BUTTON_TYPE_WAIT_CANCEL =(6);
|
||||
SCE_MSG_DIALOG_BUTTON_TYPE_YESNO_FOCUS_NO =(7);
|
||||
SCE_MSG_DIALOG_BUTTON_TYPE_OK_CANCEL_FOCUS_CANCEL=(8);
|
||||
SCE_MSG_DIALOG_BUTTON_TYPE_2BUTTONS =(9);
|
||||
|
||||
//SceMsgDialogProgressBarType
|
||||
SCE_MSG_DIALOG_PROGRESSBAR_TYPE_PERCENTAGE =(0);
|
||||
SCE_MSG_DIALOG_PROGRESSBAR_TYPE_PERCENTAGE_CANCEL=(1);
|
||||
|
||||
//SceMsgDialogSystemMessageType;
|
||||
SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_EMPTY_STORE =(0);
|
||||
SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION=(1);
|
||||
SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_UGC_RESTRICTION =(2);
|
||||
|
||||
function ps4_sceCommonDialogInitialize():Integer; SysV_ABI_CDecl;
|
||||
begin
|
||||
|
@ -82,12 +109,93 @@ begin
|
|||
Result:=SCE_COMMON_DIALOG_ERROR_NOT_FINISHED;
|
||||
end;
|
||||
|
||||
//
|
||||
|
||||
function ps4_sceMsgDialogInitialize():Integer; SysV_ABI_CDecl;
|
||||
begin
|
||||
Writeln('sceMsgDialogInitialize');
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
type
|
||||
SceCommonDialogBaseParam=packed record
|
||||
size:QWORD;
|
||||
reserved:array[0..31] of Byte;
|
||||
magic:DWORD;
|
||||
_align:Integer;
|
||||
end; //__attribute__ ((__aligned__(8)));
|
||||
|
||||
pSceMsgDialogButtonsParam=^SceMsgDialogButtonsParam;
|
||||
SceMsgDialogButtonsParam=packed record
|
||||
msg1,msg2:Pchar;
|
||||
reserved:array[0..31] of Byte;
|
||||
end;
|
||||
|
||||
pSceMsgDialogUserMessageParam=^SceMsgDialogUserMessageParam;
|
||||
SceMsgDialogUserMessageParam=packed record
|
||||
buttonType:Integer; //SceMsgDialogButtonType
|
||||
_align:Integer;
|
||||
msg:PChar;
|
||||
buttonsParam:pSceMsgDialogButtonsParam;
|
||||
reserved:array[0..23] of Byte;
|
||||
end;
|
||||
|
||||
pSceMsgDialogProgressBarParam=^SceMsgDialogProgressBarParam;
|
||||
SceMsgDialogProgressBarParam=packed record
|
||||
barType:Integer; //SceMsgDialogProgressBarType
|
||||
_align:Integer;
|
||||
msg:PChar;
|
||||
reserved:array[0..63] of Byte;
|
||||
end;
|
||||
|
||||
pSceMsgDialogSystemMessageParam=^SceMsgDialogSystemMessageParam;
|
||||
SceMsgDialogSystemMessageParam=packed record
|
||||
sysMsgType:Integer; //SceMsgDialogSystemMessageType
|
||||
reserved:array[0..31] of Byte;
|
||||
end;
|
||||
|
||||
pSceMsgDialogParam=^SceMsgDialogParam;
|
||||
SceMsgDialogParam=packed record
|
||||
baseParam:SceCommonDialogBaseParam;
|
||||
size:QWORD;
|
||||
mode:Integer; //SceMsgDialogMode
|
||||
_align1:Integer;
|
||||
userMsgParam:pSceMsgDialogUserMessageParam;
|
||||
progBarParam:pSceMsgDialogProgressBarParam;
|
||||
sysMsgParam:pSceMsgDialogSystemMessageParam;
|
||||
userId:Integer; //SceUserServiceUserId
|
||||
reserved:array[0..39] of Byte;
|
||||
_align2:Integer;
|
||||
end;
|
||||
|
||||
const
|
||||
SCE_COMMON_DIALOG_ERROR_PARAM_INVALID=-2135425014; // 0x80B8000A
|
||||
SCE_COMMON_DIALOG_ERROR_ARG_NULL =-2135425011; // 0x80B8000D
|
||||
|
||||
function ps4_sceMsgDialogOpen(param:pSceMsgDialogParam):Integer; SysV_ABI_CDecl;
|
||||
begin
|
||||
if (param=nil) then Exit(SCE_COMMON_DIALOG_ERROR_ARG_NULL);
|
||||
|
||||
Case param^.mode of
|
||||
SCE_MSG_DIALOG_MODE_USER_MSG:
|
||||
begin
|
||||
if (param^.userMsgParam=nil) then Exit(SCE_COMMON_DIALOG_ERROR_PARAM_INVALID);
|
||||
|
||||
Writeln(param^.userMsgParam^.msg);
|
||||
|
||||
//TODO
|
||||
end;
|
||||
else
|
||||
Assert(false,'TODO');
|
||||
end;
|
||||
|
||||
Result:=0;
|
||||
end;
|
||||
|
||||
//nop nid:libSceMsgDialog:E9F202DD72ADDA4D:sceMsgDialogUpdateStatus
|
||||
|
||||
//
|
||||
|
||||
function Load_libSceCommonDialog(Const name:RawByteString):TElf_node;
|
||||
var
|
||||
lib:PLIBRARY;
|
||||
|
@ -145,6 +253,7 @@ begin
|
|||
Result.pFileName:=name;
|
||||
lib:=Result._add_lib('libSceMsgDialog');
|
||||
lib^.set_proc($943AB1698D546C4A,@ps4_sceMsgDialogInitialize);
|
||||
lib^.set_proc($6F4E878740CF11A1,@ps4_sceMsgDialogOpen);
|
||||
end;
|
||||
|
||||
initialization
|
||||
|
|
|
@ -10,6 +10,9 @@ uses
|
|||
SysUtils;
|
||||
|
||||
Const
|
||||
SCE_SAVE_DATA_TITLE_ID_DATA_SIZE=10;
|
||||
SCE_SAVE_DATA_FINGERPRINT_DATA_SIZE=65;
|
||||
|
||||
SCE_SAVE_DATA_TITLE_MAXSIZE =128;
|
||||
SCE_SAVE_DATA_SUBTITLE_MAXSIZE=128;
|
||||
SCE_SAVE_DATA_DETAIL_MAXSIZE =1024;
|
||||
|
@ -61,6 +64,30 @@ type
|
|||
PSceSaveDataMountPoint=^SceSaveDataMountPoint;
|
||||
SceSaveDataMountPoint=array[0..SCE_SAVE_DATA_MOUNT_POINT_DATA_MAXSIZE-1] of Char;
|
||||
|
||||
pSceSaveDataTitleId=^SceSaveDataTitleId;
|
||||
SceSaveDataTitleId=packed record
|
||||
data:array[0..SCE_SAVE_DATA_TITLE_ID_DATA_SIZE-1] of Char;
|
||||
padding:array[0..5] of Byte;
|
||||
end;
|
||||
|
||||
pSceSaveDataFingerprint=^SceSaveDataFingerprint;
|
||||
SceSaveDataFingerprint=packed record
|
||||
data:array[0..SCE_SAVE_DATA_FINGERPRINT_DATA_SIZE-1] of Byte;
|
||||
padding:array[0..14] of Byte;
|
||||
end;
|
||||
|
||||
pSceSaveDataMount=^SceSaveDataMount;
|
||||
SceSaveDataMount=packed record
|
||||
userId:Integer; //SceUserServiceUserId
|
||||
align1:Integer;
|
||||
titleId:pSceSaveDataTitleId;
|
||||
dirName:PSceSaveDataDirName;
|
||||
fingerprint:pSceSaveDataFingerprint;
|
||||
blocks:QWORD; //SceSaveDataBlocks
|
||||
mountMode:DWORD; //SceSaveDataMountMode
|
||||
reserved:array[0..31] of Byte;
|
||||
end;
|
||||
|
||||
PSceSaveDataMount2=^SceSaveDataMount2;
|
||||
SceSaveDataMount2=packed record
|
||||
userId:Integer;
|
||||
|
@ -138,6 +165,14 @@ const
|
|||
SCE_SAVE_DATA_ERROR_MOUNT_FULL =-2137063412; // 0x809F000C
|
||||
SCE_SAVE_DATA_ERROR_NOT_MOUNTED=-2137063420; // 0x809F0004
|
||||
|
||||
function ps4_sceSaveDataMount(mount:pSceSaveDataMount;mountResult:pSceSaveDataMountResult):Integer; SysV_ABI_CDecl;
|
||||
begin
|
||||
if (mount=nil) or (mountResult=nil) then Exit(SCE_SAVE_DATA_ERROR_PARAMETER);
|
||||
_sig_lock;
|
||||
Result:=FetchMount(PChar(mount^.dirName),@mountResult^.mountPoint);
|
||||
_sig_unlock;
|
||||
end;
|
||||
|
||||
function ps4_sceSaveDataMount2(mount:PSceSaveDataMount2;mountResult:PSceSaveDataMountResult):Integer; SysV_ABI_CDecl;
|
||||
begin
|
||||
if (mount=nil) or (mountResult=nil) then Exit(SCE_SAVE_DATA_ERROR_PARAMETER);
|
||||
|
@ -179,6 +214,7 @@ begin
|
|||
lib^.set_proc($BFB00000CA342F3E,@ps4_sceSaveDataSetupSaveDataMemory);
|
||||
lib^.set_proc($EC1B79A410BF01CA,@ps4_sceSaveDataGetSaveDataMemory);
|
||||
lib^.set_proc($8776144735C64954,@ps4_sceSaveDataSetSaveDataMemory);
|
||||
lib^.set_proc($DF61D0010770336A,@ps4_sceSaveDataMount);
|
||||
lib^.set_proc($D33E393C81FE48D2,@ps4_sceSaveDataMount2);
|
||||
lib^.set_proc($04C47817F51E9371,@ps4_sceSaveDataUmount);
|
||||
lib^.set_proc($F39CEE97FFDE197B,@ps4_sceSaveDataSetParam);
|
||||
|
|
207
vulkan/vFlip.pas
207
vulkan/vFlip.pas
|
@ -644,17 +644,11 @@ var
|
|||
|
||||
FCurSet:TvDescriptorSet;
|
||||
|
||||
//beginInfo:TVkCommandBufferBeginInfo;
|
||||
imgBlitRegion:TVkImageBlit;
|
||||
FLocalSize:TVkOffset3D;
|
||||
|
||||
//submitInfo:TVkSubmitInfo;
|
||||
//wstage:TVkPipelineStageFlags;
|
||||
prInfo:TVkPresentInfoKHR;
|
||||
|
||||
//tmp_reg:TVkBufferImageCopy;
|
||||
//tmp_buf:TURDevcImage;
|
||||
|
||||
img_reg:TVkImageCopy;
|
||||
|
||||
ur:TvImage2;
|
||||
|
@ -703,28 +697,16 @@ begin
|
|||
until false;
|
||||
SwapImage:=FSwapChain.FImage[imageIndex];
|
||||
|
||||
//buf^.cmdfence.Wait(High(uint64));
|
||||
//buf^.cmdfence.Reset;
|
||||
|
||||
//Writeln('>Flip.Fence.Wait');
|
||||
buf^.cmdbuf.Fence.Wait(High(uint64));
|
||||
//Writeln('<Flip.Fence.Wait');
|
||||
|
||||
buf^.cmdbuf.Fence.Reset;
|
||||
buf^.cmdbuf.ReleaseResource;
|
||||
|
||||
buf^.Cursors[0].SetPending(nil);
|
||||
buf^.Cursors[1].SetPending(nil);
|
||||
|
||||
{
|
||||
beginInfo:=Default(TVkCommandBufferBeginInfo);
|
||||
beginInfo.sType:=VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
|
||||
beginInfo.flags:=ord(VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT);
|
||||
beginInfo.pInheritanceInfo:=nil;
|
||||
r:=vkBeginCommandBuffer(buf^.cmdbuf,@beginInfo);
|
||||
if (r<>VK_SUCCESS) then
|
||||
begin
|
||||
Writeln('vkBeginCommandBuffer:',r);
|
||||
Exit;
|
||||
end;
|
||||
}
|
||||
if not buf^.cmdbuf.BeginCmdBuffer then Exit;
|
||||
|
||||
ur:=FindImage(buf^.cmdbuf,buf^.Addr,cformat);
|
||||
|
@ -741,17 +723,6 @@ begin
|
|||
|
||||
FCurSet.BindSTI(1,0,buf^.ImgViewDst.FHandle,VK_IMAGE_LAYOUT_GENERAL);
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// buf^.DstImgNORM.FHandle,
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// ord(VK_ACCESS_SHADER_WRITE_BIT),
|
||||
// VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
// VK_IMAGE_LAYOUT_GENERAL,
|
||||
// ord(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
buf^.cmdbuf.PushImageBarrier(buf^.DstImgNORM.FHandle,
|
||||
SubresColor,
|
||||
ord(VK_ACCESS_SHADER_WRITE_BIT),
|
||||
|
@ -767,48 +738,23 @@ begin
|
|||
ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT));
|
||||
end;
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// buf^.DstImgSRGB.FHandle,
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// ord(VK_ACCESS_SHADER_WRITE_BIT),
|
||||
// VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
// VK_IMAGE_LAYOUT_GENERAL,
|
||||
// ord(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
//vkCmdBindPipeline(buf^.cmdbuf,VK_PIPELINE_BIND_POINT_COMPUTE,FPipelineFlip.FHandle);
|
||||
buf^.cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE,FPipelineFlip.FHandle);
|
||||
buf^.cmdbuf.BindLayout(VK_PIPELINE_BIND_POINT_COMPUTE,FLayout);
|
||||
|
||||
Fcfg.Width[0]:=1;
|
||||
Fcfg.Width[1]:=buf^.PITCH;
|
||||
|
||||
//vkCmdPushConstants(buf^.cmdbuf.cmdbuf,
|
||||
// FLayout.FHandle,
|
||||
// ord(VK_SHADER_STAGE_COMPUTE_BIT),
|
||||
// 0,
|
||||
// SizeOf(TFlipCfg),
|
||||
// @Fcfg);
|
||||
|
||||
buf^.cmdbuf.PushConstant(VK_PIPELINE_BIND_POINT_COMPUTE,
|
||||
ord(VK_SHADER_STAGE_COMPUTE_BIT),
|
||||
0,SizeOf(TFlipCfg),@Fcfg);
|
||||
|
||||
buf^.cmdbuf.BindSet(VK_PIPELINE_BIND_POINT_COMPUTE,0,FCurSet.FHandle);
|
||||
|
||||
//vkCmdBindDescriptorSets(buf^.cmdbuf.cmdbuf,
|
||||
// VK_PIPELINE_BIND_POINT_COMPUTE,
|
||||
// FLayout.FHandle,0,1,
|
||||
// @FCurSet.FHandle,0,nil);
|
||||
|
||||
FLocalSize:=TvShaderCompute(FPipelineFlip.FComputeShader).FLocalSize;
|
||||
|
||||
FLocalSize.x:=(buf^.DstImgNORM.FExtent.width +(FLocalSize.x-1)) div FLocalSize.x;
|
||||
FLocalSize.y:=(buf^.DstImgNORM.FExtent.height+(FLocalSize.y-1)) div FLocalSize.y;
|
||||
|
||||
//vkCmdDispatch(buf^.cmdbuf.cmdbuf,FLocalSize.x,FLocalSize.y,1);
|
||||
buf^.cmdbuf.DispatchDirect(FLocalSize.x,FLocalSize.y,1);
|
||||
end else
|
||||
begin
|
||||
|
@ -823,28 +769,6 @@ begin
|
|||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// {buf^.}ur{.FImage}.FHandle,
|
||||
// ord(VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT),
|
||||
// ord(VK_ACCESS_TRANSFER_READ_BIT),
|
||||
// VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
|
||||
// VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
// ord(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_TRANSFER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// buf^.DstImgNORM.FHandle,
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// ord(VK_ACCESS_TRANSFER_WRITE_BIT),
|
||||
// VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
// VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
// ord(VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_TRANSFER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
if (buf^.DstImgSRGB<>nil) and (ur.key.cformat=VK_FORMAT_R8G8B8A8_SRGB) then
|
||||
begin
|
||||
buf^.cmdbuf.PushImageBarrier(buf^.DstImgSRGB.FHandle,
|
||||
|
@ -928,7 +852,6 @@ begin
|
|||
|
||||
if (FCursors[0].enable or FCursors[1].enable) then
|
||||
begin
|
||||
//vkCmdBindPipeline(buf^.cmdbuf,VK_PIPELINE_BIND_POINT_COMPUTE,FPipelineCursor.FHandle);
|
||||
buf^.cmdbuf.BindPipeline(VK_PIPELINE_BIND_POINT_COMPUTE,FPipelineCursor.FHandle);
|
||||
|
||||
FLocalSize:=TvShaderCompute(FPipelineCursor.FComputeShader).FLocalSize;
|
||||
|
@ -957,17 +880,6 @@ begin
|
|||
|
||||
FCurSet.BindSTI(1,0,buf^.ImgViewDst.FHandle,VK_IMAGE_LAYOUT_GENERAL);
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// buf^.DstImgNORM.FHandle,
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// ord(VK_ACCESS_SHADER_WRITE_BIT),
|
||||
// VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
// VK_IMAGE_LAYOUT_GENERAL,
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
if (buf^.DstImgSRGB<>nil) then
|
||||
begin
|
||||
buf^.cmdbuf.PushImageBarrier(buf^.DstImgSRGB.FHandle,
|
||||
|
@ -984,36 +896,12 @@ begin
|
|||
ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT));
|
||||
end;
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// buf^.DstImgSRGB.FHandle,
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// ord(VK_ACCESS_SHADER_WRITE_BIT),
|
||||
// VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
// VK_IMAGE_LAYOUT_GENERAL,
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
buf^.cmdbuf.PushConstant(VK_PIPELINE_BIND_POINT_COMPUTE,
|
||||
ord(VK_SHADER_STAGE_COMPUTE_BIT),
|
||||
0,SizeOf(TFlipCfg),@Fcfg);
|
||||
|
||||
//vkCmdPushConstants(buf^.cmdbuf.cmdbuf,
|
||||
// FLayout.FHandle,
|
||||
// ord(VK_SHADER_STAGE_COMPUTE_BIT),
|
||||
// 0,
|
||||
// SizeOf(TFlipCfg),
|
||||
// @Fcfg);
|
||||
|
||||
buf^.cmdbuf.BindSet(VK_PIPELINE_BIND_POINT_COMPUTE,0,FCurSet.FHandle);
|
||||
|
||||
//vkCmdBindDescriptorSets(buf^.cmdbuf.cmdbuf,
|
||||
// VK_PIPELINE_BIND_POINT_COMPUTE,
|
||||
// FLayout.FHandle,0,1,
|
||||
// @FCurSet.FHandle,0,nil);
|
||||
|
||||
//vkCmdDispatch(buf^.cmdbuf.cmdbuf,64 div FLocalSize.x,64 div FLocalSize.y,1);
|
||||
buf^.cmdbuf.DispatchDirect(64 div FLocalSize.x,64 div FLocalSize.y,1);
|
||||
end else
|
||||
begin
|
||||
|
@ -1048,17 +936,6 @@ begin
|
|||
|
||||
FCurSet.BindSTI(1,0,buf^.ImgViewDst.FHandle,VK_IMAGE_LAYOUT_GENERAL);
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// buf^.DstImgNORM.FHandle,
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// ord(VK_ACCESS_SHADER_WRITE_BIT),
|
||||
// VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
// VK_IMAGE_LAYOUT_GENERAL,
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
if (buf^.DstImgSRGB<>nil) then
|
||||
begin
|
||||
buf^.cmdbuf.PushImageBarrier(buf^.DstImgSRGB.FHandle,
|
||||
|
@ -1075,36 +952,12 @@ begin
|
|||
ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT));
|
||||
end;
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// buf^.DstImgSRGB.FHandle,
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// ord(VK_ACCESS_SHADER_WRITE_BIT),
|
||||
// VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
// VK_IMAGE_LAYOUT_GENERAL,
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
//vkCmdPushConstants(buf^.cmdbuf.cmdbuf,
|
||||
// FLayout.FHandle,
|
||||
// ord(VK_SHADER_STAGE_COMPUTE_BIT),
|
||||
// 0,
|
||||
// SizeOf(TFlipCfg),
|
||||
// @Fcfg);
|
||||
|
||||
buf^.cmdbuf.PushConstant(VK_PIPELINE_BIND_POINT_COMPUTE,
|
||||
ord(VK_SHADER_STAGE_COMPUTE_BIT),
|
||||
0,SizeOf(TFlipCfg),@Fcfg);
|
||||
|
||||
buf^.cmdbuf.BindSet(VK_PIPELINE_BIND_POINT_COMPUTE,0,FCurSet.FHandle);
|
||||
|
||||
//vkCmdBindDescriptorSets(buf^.cmdbuf.cmdbuf,
|
||||
// VK_PIPELINE_BIND_POINT_COMPUTE,
|
||||
// FLayout.FHandle,0,1,
|
||||
// @FCurSet.FHandle,0,nil);
|
||||
|
||||
//vkCmdDispatch(buf^.cmdbuf.cmdbuf,64 div FLocalSize.x,64 div FLocalSize.y,1);
|
||||
buf^.cmdbuf.DispatchDirect(64 div FLocalSize.x,64 div FLocalSize.y,1);
|
||||
end else
|
||||
begin
|
||||
|
@ -1121,17 +974,6 @@ begin
|
|||
buf^.Cursors[1].Free;
|
||||
end;
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// buf^.DstImgNORM.FHandle,
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// ord(VK_ACCESS_TRANSFER_READ_BIT),
|
||||
// VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
// VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_TRANSFER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
if (buf^.DstImgSRGB<>nil) then
|
||||
begin
|
||||
buf^.cmdbuf.PushImageBarrier(buf^.DstImgSRGB.FHandle,
|
||||
|
@ -1148,34 +990,12 @@ begin
|
|||
ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
|
||||
end;
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// buf^.DstImgSRGB.FHandle,
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// ord(VK_ACCESS_TRANSFER_READ_BIT),
|
||||
// VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
// VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
// ord(VK_PIPELINE_STAGE_COMPUTE_SHADER_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_TRANSFER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
buf^.cmdbuf.PushImageBarrier(SwapImage,
|
||||
SubresColor,
|
||||
ord(VK_ACCESS_TRANSFER_WRITE_BIT),
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// SwapImage,
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// ord(VK_ACCESS_TRANSFER_WRITE_BIT),
|
||||
// VK_IMAGE_LAYOUT_UNDEFINED,
|
||||
// VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
// ord(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_TRANSFER_BIT),
|
||||
// SubresColor);
|
||||
|
||||
imgBlitRegion:=Default(TVkImageBlit);
|
||||
imgBlitRegion.srcSubresource.aspectMask:=ord(VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
imgBlitRegion.srcSubresource.layerCount:=1;
|
||||
|
@ -1211,31 +1031,12 @@ begin
|
|||
VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||
ord(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT));
|
||||
|
||||
//vkImageMemoryBarrier(
|
||||
// buf^.cmdbuf.cmdbuf,
|
||||
// SwapImage,
|
||||
// ord(VK_ACCESS_TRANSFER_WRITE_BIT),
|
||||
// ord(VK_ACCESS_NONE_KHR),
|
||||
// VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
// VK_IMAGE_LAYOUT_PRESENT_SRC_KHR,
|
||||
// ord(VK_PIPELINE_STAGE_TRANSFER_BIT),
|
||||
// ord(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT),
|
||||
// SubresColor);
|
||||
|
||||
//vkEndCommandBuffer(buf^.cmdbuf);
|
||||
buf^.cmdbuf.EndCmdBuffer;
|
||||
|
||||
buf^.cmdbuf.AddWaitSemaphore(imageAvailableSemaphore,ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
|
||||
buf^.cmdbuf.SignalSemaphore:=renderFinishedSemaphore;
|
||||
buf^.cmdbuf.QueueSubmit;
|
||||
|
||||
{r:=vkQueueSubmit(FlipQueue,1,@submitInfo,buf^.cmdbuf.Fence.FHandle);
|
||||
//r:=vkQueueSubmit(FlipQueue,1,@submitInfo,buf^.cmdfence.FHandle);
|
||||
if (r<>VK_SUCCESS) then
|
||||
begin
|
||||
Writeln('vkQueueSubmit:',r);
|
||||
exit;
|
||||
end;}
|
||||
buf^.cmdbuf.QueueSubmit;
|
||||
|
||||
prInfo:=Default(TVkPresentInfoKHR);
|
||||
prInfo.sType :=VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
|
||||
|
|
Loading…
Reference in New Issue