mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
70b09660c4
commit
1ccea6b026
|
@ -468,15 +468,21 @@ begin
|
|||
|
||||
//write back
|
||||
|
||||
if (CmdBuffer.QueueSubmit<>VK_SUCCESS) then
|
||||
r:=CmdBuffer.QueueSubmit;
|
||||
|
||||
if (r<>VK_SUCCESS) then
|
||||
begin
|
||||
Assert(false,'QueueSubmit');
|
||||
end;
|
||||
|
||||
Writeln('QueueSubmit:',r);
|
||||
|
||||
r:=CmdBuffer.Wait(QWORD(-1));
|
||||
|
||||
Writeln('CmdBuffer:',r);
|
||||
writeln;
|
||||
|
||||
r:=RenderQueue.WaitIdle;
|
||||
Writeln('WaitIdle:',r);
|
||||
|
||||
CmdBuffer.ReleaseResource;
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ begin
|
|||
if (Result<>0) then Exit;
|
||||
|
||||
hMem:=0;
|
||||
Result:=md_memfd_create(hMem,size);
|
||||
Result:=md_memfd_create(hMem,size,VM_RW);
|
||||
if (Result<>0) then Exit;
|
||||
|
||||
Result:=md_file_mmap_ex(hMem,ring^.buff,0,size,MD_PROT_RW);
|
||||
|
|
|
@ -986,6 +986,18 @@ function NtCreateSection(
|
|||
FileHandle :THandle
|
||||
):DWORD; stdcall; external 'ntdll';
|
||||
|
||||
function NtCreateSectionEx(
|
||||
SectionHandle :PHandle;
|
||||
DesiredAccess :ACCESS_MASK;
|
||||
ObjectAttributes :POBJECT_ATTRIBUTES;
|
||||
MaximumSize :PLARGE_INTEGER;
|
||||
SectionPageProtection :ULONG;
|
||||
AllocationAttributes :ULONG;
|
||||
FileHandle :THandle;
|
||||
ExtendedParameters :Pointer; //MEM_EXTENDED_PARAMETER
|
||||
ExtendedParameterCount:ULONG
|
||||
):DWORD; stdcall; external 'ntdll';
|
||||
|
||||
function NtExtendSection(
|
||||
SectionHandle :THandle;
|
||||
NewSectionSize :PLARGE_INTEGER
|
||||
|
@ -1012,7 +1024,7 @@ function NtMapViewOfSectionEx(
|
|||
ViewSize :PULONG_PTR;
|
||||
AllocationType :ULONG;
|
||||
Protect :ULONG;
|
||||
ExtendedParameters :Pointer;
|
||||
ExtendedParameters :Pointer; //MEM_EXTENDED_PARAMETER
|
||||
ExtendedParameterCount:ULONG
|
||||
):DWORD; stdcall; external 'ntdll';
|
||||
|
||||
|
@ -1042,7 +1054,7 @@ function NtAllocateVirtualMemoryEx(
|
|||
RegionSize :PULONG_PTR;
|
||||
AllocationType :ULONG;
|
||||
Protect :ULONG;
|
||||
ExtendedParameters :Pointer;
|
||||
ExtendedParameters :Pointer; //MEM_EXTENDED_PARAMETER
|
||||
ExtendedParameterCount:ULONG
|
||||
):DWORD; stdcall; external 'ntdll';
|
||||
|
||||
|
|
|
@ -24,6 +24,7 @@ const
|
|||
MD_PROT_RWX =PAGE_EXECUTE_READWRITE;
|
||||
|
||||
const
|
||||
VM_RW =VM_PROT_READ or VM_PROT_WRITE;
|
||||
VM_RWX=VM_PROT_READ or VM_PROT_WRITE or VM_PROT_EXECUTE;
|
||||
|
||||
wprots:array[0..7] of Byte=(
|
||||
|
@ -48,6 +49,17 @@ const
|
|||
MD_PROT_RWX //XWR
|
||||
);
|
||||
|
||||
waccess:array[0..7] of Byte=(
|
||||
SECTION_QUERY, //___
|
||||
SECTION_QUERY or SECTION_MAP_READ, //__R
|
||||
SECTION_QUERY or SECTION_MAP_WRITE, //_W_
|
||||
SECTION_QUERY or SECTION_MAP_WRITE or SECTION_MAP_READ, //_WR
|
||||
SECTION_QUERY or SECTION_MAP_EXECUTE, //X__
|
||||
SECTION_QUERY or SECTION_MAP_EXECUTE or SECTION_MAP_READ, //X_R
|
||||
SECTION_QUERY or SECTION_MAP_EXECUTE or SECTION_MAP_WRITE, //XW_
|
||||
SECTION_QUERY or SECTION_MAP_EXECUTE or SECTION_MAP_WRITE or SECTION_MAP_READ //XWR
|
||||
);
|
||||
|
||||
function md_reserve_ex(hProcess:THandle;var base:Pointer;size:QWORD):Integer;
|
||||
function md_reserve_ex(var base:Pointer;size:QWORD):Integer;
|
||||
|
||||
|
@ -56,7 +68,7 @@ function md_unmap_ex(base:Pointer;size:QWORD):Integer;
|
|||
function md_split (base:Pointer;size:QWORD):Integer;
|
||||
function md_union (base:Pointer;size:QWORD):Integer;
|
||||
|
||||
function md_memfd_create(var hMem:THandle;size:QWORD):Integer;
|
||||
function md_memfd_create(var hMem:THandle;size:QWORD;maxprot:Byte):Integer;
|
||||
function md_memfd_open (var hMem:THandle;hFile:THandle;maxprot:Byte):Integer;
|
||||
function md_memfd_close (hMem:THandle):Integer;
|
||||
|
||||
|
@ -241,18 +253,25 @@ begin
|
|||
);
|
||||
end;
|
||||
|
||||
function md_memfd_create(var hMem:THandle;size:QWORD):Integer;
|
||||
function md_memfd_create(var hMem:THandle;size:QWORD;maxprot:Byte):Integer;
|
||||
var
|
||||
Access:DWORD;
|
||||
prot:DWORD;
|
||||
begin
|
||||
Access:=waccess [maxprot and VM_RWX];
|
||||
prot :=wprots_e[maxprot and VM_RWX];
|
||||
|
||||
hMem:=0;
|
||||
Result:=NtCreateSection(
|
||||
Result:=NtCreateSectionEx(
|
||||
@hMem,
|
||||
SECTION_ALL_ACCESS,
|
||||
//SECTION_MAP_WRITE or SECTION_MAP_READ or SECTION_MAP_EXECUTE,
|
||||
Access,
|
||||
nil,
|
||||
@size,
|
||||
PAGE_READWRITE,
|
||||
prot,
|
||||
SEC_COMMIT,
|
||||
THandle(0)
|
||||
THandle(0),
|
||||
nil,
|
||||
0
|
||||
);
|
||||
end;
|
||||
|
||||
|
@ -262,35 +281,21 @@ var
|
|||
prot:DWORD;
|
||||
size:QWORD;
|
||||
begin
|
||||
Access:=SECTION_QUERY;
|
||||
|
||||
if ((maxprot and VM_PROT_READ)<>0) then
|
||||
begin
|
||||
Access:=Access or SECTION_MAP_READ;
|
||||
end;
|
||||
|
||||
if ((maxprot and VM_PROT_WRITE)<>0) then
|
||||
begin
|
||||
Access:=Access or SECTION_MAP_WRITE;
|
||||
end;
|
||||
|
||||
if ((maxprot and VM_PROT_EXECUTE)<>0) then
|
||||
begin
|
||||
Access:=Access or SECTION_MAP_EXECUTE;
|
||||
end;
|
||||
|
||||
prot:=wprots_e[maxprot and VM_RWX];
|
||||
Access:=waccess [maxprot and VM_RWX];
|
||||
prot :=wprots_e[maxprot and VM_RWX];
|
||||
|
||||
size:=0;
|
||||
hMem:=0;
|
||||
Result:=NtCreateSection(
|
||||
Result:=NtCreateSectionEx(
|
||||
@hMem,
|
||||
Access,
|
||||
nil,
|
||||
@size,
|
||||
prot,
|
||||
SEC_COMMIT,
|
||||
hFile
|
||||
hFile,
|
||||
nil,
|
||||
0
|
||||
);
|
||||
end;
|
||||
|
||||
|
|
|
@ -144,14 +144,14 @@ var
|
|||
begin
|
||||
DEV_INFO.DEV_SIZE:=pages*PAGE_SIZE;
|
||||
|
||||
R:=md_memfd_create(DEV_INFO.DEV_FD.hfile,DEV_INFO.DEV_SIZE);
|
||||
R:=md_memfd_create(DEV_INFO.DEV_FD.hfile,DEV_INFO.DEV_SIZE,VM_RW);
|
||||
if (r<>0) then
|
||||
begin
|
||||
Writeln('failed md_memfd_create(',HexStr(DEV_INFO.DEV_SIZE,11),'):0x',HexStr(r,8));
|
||||
Assert(false,'dev_mem_init');
|
||||
end;
|
||||
|
||||
DEV_INFO.DEV_FD.maxp:=VM_PROT_READ or VM_PROT_WRITE;
|
||||
DEV_INFO.DEV_FD.maxp:=VM_RW;
|
||||
|
||||
DEV_INFO.DEV_PTR:=nil;
|
||||
r:=md_reserve_ex(DEV_INFO.DEV_PTR,DEV_INFO.DEV_SIZE);
|
||||
|
@ -312,10 +312,10 @@ begin
|
|||
|
||||
if (PRIV_FD[i].hfile=0) then
|
||||
begin
|
||||
R:=md_memfd_create(PRIV_FD[i].hfile,PMAPP_BLK_SIZE);
|
||||
R:=md_memfd_create(PRIV_FD[i].hfile,PMAPP_BLK_SIZE,VM_RW);
|
||||
|
||||
PRIV_FD[i].flags:=NT_FILE_FREE;
|
||||
PRIV_FD[i].maxp :=VM_PROT_READ or VM_PROT_WRITE;
|
||||
PRIV_FD[i].maxp :=VM_RW;
|
||||
|
||||
if (r<>0) then
|
||||
begin
|
||||
|
@ -367,9 +367,9 @@ begin
|
|||
|
||||
if (DMEM_FD[i].hfile=0) then
|
||||
begin
|
||||
R:=md_memfd_create(DMEM_FD[i].hfile,PMAPP_BLK_SIZE);
|
||||
R:=md_memfd_create(DMEM_FD[i].hfile,PMAPP_BLK_SIZE,VM_RW);
|
||||
|
||||
DMEM_FD[i].maxp:=VM_PROT_READ or VM_PROT_WRITE;
|
||||
DMEM_FD[i].maxp:=VM_RW;
|
||||
|
||||
if (r<>0) then
|
||||
begin
|
||||
|
@ -751,7 +751,7 @@ begin
|
|||
end;
|
||||
size:=size-offset;
|
||||
|
||||
max:=VM_PROT_READ or VM_PROT_WRITE;
|
||||
max:=VM_PROT_RW;
|
||||
r:=md_memfd_open(md,fd,max);
|
||||
|
||||
if (DWORD(r)=STATUS_ACCESS_DENIED) then
|
||||
|
|
|
@ -154,8 +154,7 @@ begin
|
|||
FCmdbuf:=pool.Alloc;
|
||||
if (FCmdbuf=VK_NULL_HANDLE) then Exit;
|
||||
|
||||
FFence:=TvFence.Create(true);
|
||||
FFence.Reset;
|
||||
FFence:=TvFence.Create(False);
|
||||
|
||||
FSignalSemaphore:=TvSemaphore.Create;
|
||||
|
||||
|
@ -165,8 +164,10 @@ end;
|
|||
Destructor TvCustomCmdBuffer.Destroy;
|
||||
begin
|
||||
ReleaseResource;
|
||||
|
||||
FreeAndNil(FFence);
|
||||
FreeAndNil(FSignalSemaphore);
|
||||
|
||||
if (FParent<>nil) and (FCmdbuf<>VK_NULL_HANDLE) then
|
||||
begin
|
||||
FParent.Free(FCmdbuf);
|
||||
|
|
|
@ -1228,7 +1228,8 @@ begin
|
|||
cinfo:=Default(TVkCommandPoolCreateInfo);
|
||||
cinfo.sType :=VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
|
||||
cinfo.queueFamilyIndex:=FFamily;
|
||||
cinfo.flags:=ord(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
|
||||
cinfo.flags:=ord(VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) or
|
||||
ord(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT);
|
||||
r:=vkCreateCommandPool(Device.FHandle,@cinfo,nil,@FHandle);
|
||||
if (r<>VK_SUCCESS) then
|
||||
begin
|
||||
|
@ -1263,6 +1264,11 @@ end;
|
|||
|
||||
procedure TvCmdPool.Free(cmd:TVkCommandBuffer);
|
||||
begin
|
||||
{
|
||||
It is recommended to use vkQueueWaitIdle,
|
||||
it seems that vkWaitForFences does not always ensure
|
||||
the safety of free the cmd buffer
|
||||
}
|
||||
vkFreeCommandBuffers(Device.FHandle,FHandle,1,@cmd);
|
||||
end;
|
||||
|
||||
|
|
Loading…
Reference in New Issue