This commit is contained in:
Pavel 2024-04-29 17:01:49 +03:00
parent 70b09660c4
commit 1ccea6b026
7 changed files with 72 additions and 42 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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