This commit is contained in:
Pavel 2022-06-06 11:48:13 +03:00
parent 0d064185f5
commit b40fd97f7b
5 changed files with 263 additions and 245 deletions

View File

@ -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,

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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;