diff --git a/chip/pm4_me.pas b/chip/pm4_me.pas index 08fd7e86..1abb8a2c 100644 --- a/chip/pm4_me.pas +++ b/chip/pm4_me.pas @@ -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; diff --git a/chip/pm4_ring.pas b/chip/pm4_ring.pas index c46b69ec..1b6440a0 100644 --- a/chip/pm4_ring.pas +++ b/chip/pm4_ring.pas @@ -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); diff --git a/rtl/ntapi.pas b/rtl/ntapi.pas index 986f7252..614413aa 100644 --- a/rtl/ntapi.pas +++ b/rtl/ntapi.pas @@ -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'; diff --git a/sys/md/md_map.pas b/sys/md/md_map.pas index 8e6a5db6..3cf8c1ac 100644 --- a/sys/md/md_map.pas +++ b/sys/md/md_map.pas @@ -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; diff --git a/sys/md/vm_pmap.pas b/sys/md/vm_pmap.pas index fc6548a3..1032edb2 100644 --- a/sys/md/vm_pmap.pas +++ b/sys/md/vm_pmap.pas @@ -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 diff --git a/vulkan/vCmdBuffer.pas b/vulkan/vCmdBuffer.pas index 1a4ba1cb..387c14ac 100644 --- a/vulkan/vCmdBuffer.pas +++ b/vulkan/vCmdBuffer.pas @@ -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); diff --git a/vulkan/vDevice.pas b/vulkan/vDevice.pas index 11db312f..ed79dee6 100644 --- a/vulkan/vDevice.pas +++ b/vulkan/vDevice.pas @@ -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;