diff --git a/ps4_libkernel/ps4_event_flag.pas b/ps4_libkernel/ps4_event_flag.pas index 682c5eab..886f1f66 100644 --- a/ps4_libkernel/ps4_event_flag.pas +++ b/ps4_libkernel/ps4_event_flag.pas @@ -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('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, diff --git a/ps4_libkernel/ps4_libkernel.pas b/ps4_libkernel/ps4_libkernel.pas index 438c4399..3443de35 100644 --- a/ps4_libkernel/ps4_libkernel.pas +++ b/ps4_libkernel/ps4_libkernel.pas @@ -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 diff --git a/ps4_libscedialogs.pas b/ps4_libscedialogs.pas index 66050aa9..4d3c7c71 100644 --- a/ps4_libscedialogs.pas +++ b/ps4_libscedialogs.pas @@ -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 diff --git a/ps4_libscesavedata.pas b/ps4_libscesavedata.pas index 876f3203..87bb9345 100644 --- a/ps4_libscesavedata.pas +++ b/ps4_libscesavedata.pas @@ -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); diff --git a/vulkan/vFlip.pas b/vulkan/vFlip.pas index bf437f64..fb3429fb 100644 --- a/vulkan/vFlip.pas +++ b/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('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;