This commit is contained in:
Pavel 2024-07-04 11:28:23 +03:00
parent 9c1e69540c
commit 975ea9b52b
13 changed files with 277 additions and 207 deletions

View File

@ -96,6 +96,21 @@ type
procedure remove_stream(stream:p_pm4_stream);
end;
PvCmdFreeNode=^TvCmdFreeNode;
TvCmdFreeNode=record
entry:STAILQ_ENTRY;
FCmd :TVkCommandBuffer;
end;
TvCmdCachedPool=class(TvCmdPool)
FMemCache:STAILQ_HEAD; //PvCmdFreeNode
FDeffered:STAILQ_HEAD; //PvCmdFreeNode
FTrimCount:Integer;
Constructor Create(FFamily:TVkUInt32);
procedure Free(cmd:TVkCommandBuffer); register; override;
procedure Trim; register; override;
end;
t_pool_line=array[0..3] of TvCustomCmdPool;
t_pool_cache=object
queue:TvQueue;
@ -109,6 +124,8 @@ type
entry :TAILQ_ENTRY; //stall
stream:p_pm4_stream;
//
function OnAlloc(size:Ptruint):Pointer; register; override;
Procedure OnFree (P:Pointer ); register; override;
end;
t_me_render_context=object
@ -130,6 +147,7 @@ type
procedure BeginCmdBuffer;
procedure FinishCmdBuffer;
function CmdStatus(i:t_pm4_stream_type):TVkResult;
procedure PingCmd;
function WaitConfirmOrSwitch:Boolean;
//
procedure switch_task;
@ -146,7 +164,8 @@ uses
vmparam,
kern_dmem,
kern_proc,
vm_map;
vm_map,
vm_tracking_map;
procedure StartFrameCapture;
begin
@ -350,22 +369,6 @@ end;
//
type
PvCmdFreeNode=^TvCmdFreeNode;
TvCmdFreeNode=record
entry:STAILQ_ENTRY;
FCmd :TVkCommandBuffer;
end;
TvCmdCachedPool=class(TvCmdPool)
FMemCache:STAILQ_HEAD; //PvCmdFreeNode
FDeffered:STAILQ_HEAD; //PvCmdFreeNode
FTrimCount:Integer;
Constructor Create(FFamily:TVkUInt32);
procedure Free(cmd:TVkCommandBuffer); register; override;
procedure Trim; register; override;
end;
Constructor TvCmdCachedPool.Create(FFamily:TVkUInt32);
begin
inherited;
@ -446,6 +449,20 @@ begin
Result:=last;
end;
//
function TvStreamCmdBuffer.OnAlloc(size:Ptruint):Pointer; register;
begin
Result:=stream^.allocator.Alloc(size);
FillChar(Result^,size,0);
end;
Procedure TvStreamCmdBuffer.OnFree(P:Pointer); register;
begin
//
end;
//
procedure t_me_render_context.Init;
@ -579,6 +596,16 @@ begin
Result:=VK_SUCCESS;
end;
procedure t_me_render_context.PingCmd;
var
i:t_pm4_stream_type;
begin
for i:=Low(t_pm4_stream_type) to High(t_pm4_stream_type) do
begin
CmdStatus(i);
end;
end;
function t_me_render_context.WaitConfirmOrSwitch:Boolean;
begin
FinishCmdBuffer;
@ -1500,7 +1527,7 @@ begin
Assert(false,'pm4_EventWriteEop');
end;
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.addr),QWORD(node^.addr)+data_size,nil,0);
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.addr),QWORD(node^.addr)+data_size,nil,M_DMEM_WRITE);
end;
if (node^.intSel=EVENTWRITEEOP_INT_SEL_SEND_INT) or
@ -1591,7 +1618,7 @@ begin
PDWORD(addr_dmem)^:=node^.data;
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.addr),QWORD(node^.addr)+4,nil,0);
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.addr),QWORD(node^.addr)+4,nil,M_DMEM_WRITE);
end;
end;
@ -1641,7 +1668,7 @@ begin
Move(src_dmem^,dst_dmem^,byteSize);
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.dst),QWORD(node^.dst)+byteSize,nil,0);
vm_map_track_trigger(p_proc.p_vmspace,QWORD(node^.dst),QWORD(node^.dst)+byteSize,nil,M_DMEM_WRITE);
end;
end;
else
@ -1792,6 +1819,8 @@ begin
Continue;
end;
ctx.PingCmd;
//stall is empty!
me^.reset_sheduler;

View File

@ -88,7 +88,8 @@ uses
sys_bootparam,
kern_dmem,
kern_proc,
vm_map;
vm_map,
vm_tracking_map;
function PM4_TYPE(token:DWORD):Byte; inline;
begin
@ -1074,14 +1075,14 @@ begin
Move(Pointer(adrSrc_dmem)^,Pointer(adrDst_dmem)^,byteCount);
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,0);
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,M_DMEM_WRITE);
end;
(kDmaDataSrcData or (kDmaDataDstMemory shl 4)),
(kDmaDataSrcData or (kDmaDataDstMemoryUsingL2 shl 4)):
begin
FillDWORD(Pointer(adrDst_dmem)^,(byteCount div 4),DWORD(adrSrc));
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,0);
vm_map_track_trigger(p_proc.p_vmspace,QWORD(adrDst),QWORD(adrDst)+byteCount,nil,M_DMEM_WRITE);
end;
else
Assert(false,'DmaData: srcSel=0x'+HexStr(srcSel,1)+' dstSel=0x'+HexStr(dstSel,1));
@ -1145,7 +1146,7 @@ begin
Move(src_dmem^,dst_dmem^,count*SizeOf(DWORD));
vm_map_track_trigger(p_proc.p_vmspace,QWORD(dst),QWORD(dst)+count*SizeOf(DWORD),nil,0);
vm_map_track_trigger(p_proc.p_vmspace,QWORD(dst),QWORD(dst)+count*SizeOf(DWORD),nil,M_DMEM_WRITE);
end;
else
Assert(false,'WriteData: dstSel=0x'+HexStr(dstSel,1));

View File

@ -1298,13 +1298,11 @@ Procedure t_pm4_allocator.Free;
var
node:PAllocNode;
begin
node:=pHead.slh_first;
if (node<>nil) then
begin
pHead.slh_first:=node^.link;
end;
node:=SLIST_FIRST(@pHead);
While (node<>nil) do
begin
SLIST_REMOVE(@pHead,node,@node^.link);
if (node^.size=cache_block_allocator.mem_size) then
begin
@ -1314,11 +1312,7 @@ begin
md_unmap(node,node^.size);
end;
node:=pHead.slh_first;
if (node<>nil) then
begin
pHead.slh_first:=node^.link;
end;
node:=SLIST_FIRST(@pHead);
end;
Self:=Default(t_pm4_allocator);
end;

View File

@ -1278,9 +1278,14 @@ begin
Assert(false,'TODO: destroy in code analize');
end;
function pick_on_trigger(handle:Pointer;mode:Integer):Integer;
function pick_on_trigger(handle:Pointer;mode:T_TRIGGER_MODE):Integer;
begin
if (mode=1) then Exit(DO_NOTHING);
case mode of
M_CPU_WRITE :;
M_DMEM_WRITE:;
else
Exit;
end;
Result:=DO_NOTHING;

View File

@ -1612,9 +1612,15 @@ begin
Result:=DO_DELETE;
end;
function on_trigger(handle:Pointer;mode:Integer):Integer;
function on_trigger(handle:Pointer;mode:T_TRIGGER_MODE):Integer;
begin
if (mode=1) then Exit(DO_NOTHING);
case mode of
M_CPU_WRITE :;
M_DMEM_WRITE:;
else
Exit;
end;
//TODO
Result:=DO_INCREMENT;
end;

View File

@ -140,8 +140,8 @@ procedure init_dmem_map;
var
vmap:vm_map_t;
begin
dmem_map_init(@dmem,0,{SCE_KERNEL_MAIN_DMEM_SIZE} (VM_MAX_GPU_ADDRESS-VM_MIN_GPU_ADDRESS) );
rmem_map_init(@rmap,0,{SCE_KERNEL_MAIN_DMEM_SIZE} (VM_MAX_GPU_ADDRESS-VM_MIN_GPU_ADDRESS) );
dmem_map_init(@dmem,0,SCE_KERNEL_MAIN_DMEM_SIZE);
rmem_map_init(@rmap,0,(VM_MAX_GPU_ADDRESS-VM_MIN_GPU_ADDRESS));
vmap:=p_proc.p_vmspace;
@ -523,6 +523,8 @@ var
start:QWORD;
relofs:Int64;
offset:QWORD;
d_start,d_start2:QWORD;
d_end,d_end2:QWORD;
d_mtype:DWORD;
@ -564,20 +566,42 @@ begin
if ((obj^.flags and OBJ_DMEM_EXT)<>0) then
begin
offset:=entry^.offset;
//transform by base addr
offset:=offset + (QWORD(obj^.un_pager.map_base) - VM_MIN_GPU_ADDRESS);
qinfo^.protection:=qinfo^.protection and (VM_PROT_GPU_ALL or VM_PROT_RW);
start :=entry^.start;
relofs:=entry^.offset - start;
relofs:=offset - start;
if (addr < start) then
begin
addr:=start;
end;
ret:=dmem_map_get_mtype(dmem_maps[default_pool_id].dmem,obj,addr + relofs,@d_start2,@d_end2,@d_mtype);
if (ret<>0) then
if (offset>=(VM_MIN_DEV_ADDRESS-VM_MIN_GPU_ADDRESS)) then
begin
Assert(false,'dmem_vmo_get_type error %d');
//dev
d_start2:=(VM_MIN_DEV_ADDRESS-VM_MIN_GPU_ADDRESS);
d_end2 :=(VM_MAX_DEV_ADDRESS-VM_MIN_GPU_ADDRESS);
d_mtype :=SCE_KERNEL_WB_ONION;
end else
begin
//dmem
ret:=dmem_map_get_mtype(dmem_maps[default_pool_id].dmem,
obj,
addr + (entry^.offset - start), //send not transformed offset
@d_start2,@d_end2,
@d_mtype);
if (ret<>0) then
begin
Assert(false,'dmem_vmo_get_type error %d');
end;
end;
qinfo^.bits.isDirectMemory:=1;

View File

@ -44,7 +44,6 @@ procedure iov_uplift(iov:p_iovec);
type
p_pmap=^t_pmap;
t_pmap=packed object
vm_map:Pointer;
rmlock:rangelock;
rm_mtx:mtx;
nt_map:t_vm_nt_map;
@ -63,7 +62,7 @@ function dev_mem_alloc(pages:Integer):Pointer;
function pmap_reserve(wr:Boolean):DWORD;
procedure pmap_pinit(pmap:p_pmap;vm_map:Pointer);
procedure pmap_pinit(pmap:p_pmap);
procedure pmap_align_superpage(obj :vm_object_t;
offset:vm_ooffset_t;
@ -287,12 +286,10 @@ begin
end;
end;
procedure pmap_pinit(pmap:p_pmap;vm_map:Pointer);
procedure pmap_pinit(pmap:p_pmap);
var
i,r:Integer;
begin
pmap^.vm_map:=vm_map;
r:=pmap_reserve(True);
Assert(r=0,'pmap_pinit');
@ -707,8 +704,6 @@ begin
delta:=(info.__end-info.start);
if (delta=0) then Break;
vm_map_lock(pmap^.vm_map);
r:=vm_nt_map_insert(@pmap^.nt_map,
info.obj,
info.start and PMAPP_BLK_MASK, //block local offset
@ -717,24 +712,18 @@ begin
delta,
(prot and VM_RW));
vm_map_unlock(pmap^.vm_map,False);
if (r<>0) then
begin
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
Assert(false,'pmap_enter_object');
end;
vm_map_lock(pmap^.vm_map);
//fill zero if needed
vm_nt_map_madvise(@pmap^.nt_map,
info.start,
info.__end,
MADV_NORMAL);
vm_map_unlock(pmap^.vm_map,False);
info.start :=info.start+delta;
info.__end :=__end;
end;
@ -775,8 +764,6 @@ begin
Writeln('vm_nt_map_insert:',HexStr(info.start,11),':',HexStr(info.__end,11),':',HexStr(info.offset,11));
end;
vm_map_lock(pmap^.vm_map);
r:=vm_nt_map_insert(@pmap^.nt_map,
info.obj,
info.offset and PMAPP_BLK_MASK, //block local offset
@ -785,8 +772,6 @@ begin
delta,
(prot and VM_RW));
vm_map_unlock(pmap^.vm_map,False);
if (r<>0) then
begin
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
@ -873,8 +858,6 @@ begin
delta:=(info.__end-info.start);
if (delta=0) then Break;
vm_map_lock(pmap^.vm_map);
r:=vm_nt_map_insert(@pmap^.nt_map,
info.obj,
info.start and PMAPP_BLK_MASK, //block local offset
@ -883,24 +866,18 @@ begin
delta,
(prot and VM_RW));
vm_map_unlock(pmap^.vm_map,False);
if (r<>0) then
begin
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
Assert(false,'pmap_enter_object');
end;
vm_map_lock(pmap^.vm_map);
//restore
vm_nt_map_madvise(@pmap^.nt_map,
info.start,
info.__end,
MADV_WILLNEED);
vm_map_unlock(pmap^.vm_map,False);
//copy
pmap_copy(cow,
info.offset,
@ -925,8 +902,6 @@ begin
info.start :=start;
info.__end :=start+paddi;
vm_map_lock(pmap^.vm_map);
r:=vm_nt_map_insert(@pmap^.nt_map,
info.obj,
info.offset, //offset in file
@ -935,8 +910,6 @@ begin
size,
(prot and VM_RW));
vm_map_unlock(pmap^.vm_map,False);
if (r<>0) then
begin
Writeln('failed vm_nt_map_insert:0x',HexStr(r,8));
@ -994,8 +967,6 @@ begin
begin
_default:
vm_map_lock(pmap^.vm_map);
vm_nt_map_prot_fix(@pmap^.nt_map,
start,
__end,
@ -1006,8 +977,6 @@ begin
// __end,
// (prot and VM_RW));
vm_map_unlock(pmap^.vm_map,False);
end;
OBJT_DEVICE:
begin
@ -1051,14 +1020,10 @@ begin
start:=start and (not PMAPP_MASK);
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
vm_map_lock(pmap^.vm_map);
vm_nt_map_prot_fix(@pmap^.nt_map,
start,
__end,
mode);
vm_map_unlock(pmap^.vm_map,False);
end;
procedure _pmap_prot_int(pmap :pmap_t;
@ -1069,14 +1034,10 @@ begin
start:=start and (not PMAPP_MASK);
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
vm_map_lock(pmap^.vm_map);
vm_nt_map_protect(@pmap^.nt_map,
start,
__end,
(prot and VM_RW));
vm_map_unlock(pmap^.vm_map,False);
end;
procedure pmap_prot_track(pmap :pmap_t;
@ -1087,16 +1048,12 @@ begin
start:=start and (not PMAPP_MASK);
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
vm_map_lock(pmap^.vm_map);
ppmap_track(start,__end,prots);
vm_nt_map_prot_fix(@pmap^.nt_map,
start,
__end,
TRACK_PROT or REMAP_PROT);
vm_map_unlock(pmap^.vm_map,False);
end;
procedure pmap_madvise(pmap :pmap_t;
@ -1126,14 +1083,10 @@ begin
begin
_default:
vm_map_lock(pmap^.vm_map);
vm_nt_map_madvise(@pmap^.nt_map,
start,
__end,
advise);
vm_map_unlock(pmap^.vm_map,False);
end;
OBJT_DEVICE:
begin
@ -1195,24 +1148,17 @@ begin
OBJT_DEFAULT:
begin
vm_map_lock(pmap^.vm_map);
vm_nt_map_madvise(@pmap^.nt_map,
start,
__end,
MADV_FREE);
vm_map_unlock(pmap^.vm_map,False);
_default:
vm_map_lock(pmap^.vm_map);
r:=vm_nt_map_delete(@pmap^.nt_map,
start,
__end);
vm_map_unlock(pmap^.vm_map,False);
end;
OBJT_DEVICE:
begin
@ -1262,14 +1208,10 @@ var
begin
lock:=pmap_rlock(pmap,start,__end);
vm_map_lock(pmap^.vm_map);
Result:=vm_nt_map_mirror(@pmap^.nt_map,
start,
__end);
vm_map_unlock(pmap^.vm_map,False);
pmap_unlock(pmap,lock);
end;

View File

@ -736,7 +736,7 @@ function rmem_map_insert(map:p_rmem_map;
vaddr:QWORD;
start,__end:DWORD):Integer;
var
current,entry:p_rmem_map_entry;
entry:p_rmem_map_entry;
begin
if (start=__end) then
begin
@ -760,19 +760,18 @@ begin
entry:=rmem_map_insert_internal(map,entry,start,__end);
end;
current:=entry;
while (current<>@map^.header) and (current^.start<__end) do
while (entry<>@map^.header) and (entry^.start<__end) do
begin
rmem_map_clip_end(map, current, __end);
rmem_map_clip_end(map, entry, __end);
current:=rmem_map_insert_internal(map,current,current^.__end,__end);
entry:=rmem_map_insert_internal(map,entry,entry^.__end,__end);
if rmem_entry_add_vaddr(current,vaddr) then
if rmem_entry_add_vaddr(entry,vaddr) then
begin
rmem_entry_add_track(map^.tmap,entry,vaddr);
end;
current:=current^.next;
entry:=entry^.next;
end;
rmem_map_unlock(map);

View File

@ -15,7 +15,8 @@ uses
kern_mtx,
kern_thr,
sys_resource,
kern_resource;
kern_resource,
vm_tracking_map;
type
vm_flags_t =type Byte;
@ -278,9 +279,9 @@ procedure vm_map_set_name_locked(map:vm_map_t;start,__end:vm_offset_t;name:PChar
procedure vm_map_track_insert(map:vm_map_t;tobj:Pointer);
procedure vm_map_track_remove(map:vm_map_t;tobj:Pointer);
function vm_map_track_next (map:vm_map_t;start:vm_offset_t;tobj:Pointer;htype:Byte):Pointer;
function vm_map_track_next (map:vm_map_t;start:vm_offset_t;tobj:Pointer;htype:T_THANDLE_TYPE):Pointer;
procedure _vm_map_track_delete_deferred(map:vm_map_t;tobj:Pointer);
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:T_TRIGGER_MODE):Integer;
function vmspace_pmap(vm:p_vmspace):pmap_t; inline;
@ -294,7 +295,6 @@ uses
md_map,
kern_proc,
rmem_map,
vm_tracking_map,
kern_budget;
var
@ -385,7 +385,7 @@ var
begin
vm:=@g_vmspace;
pmap_pinit(vmspace_pmap(vm),@vm^.vm_map);
pmap_pinit(vmspace_pmap(vm));
vm_map_init(@vm^.vm_map,vmspace_pmap(vm),VM_MINUSER_ADDRESS,VM_MAXUSER_ADDRESS);
@ -3408,14 +3408,10 @@ procedure vm_map_track_remove(map:vm_map_t;tobj:Pointer);
begin
if (tobj=nil) then Exit;
vm_map_lock(map); //lock to prevent deadlock
vm_track_map_remove_object(@map^.pmap^.tr_map,tobj);
vm_map_unlock(map);
end;
function vm_map_track_next(map:vm_map_t;start:vm_offset_t;tobj:Pointer;htype:Byte):Pointer;
function vm_map_track_next(map:vm_map_t;start:vm_offset_t;tobj:Pointer;htype:T_THANDLE_TYPE):Pointer;
begin
Result:=vm_track_map_next_object(@map^.pmap^.tr_map,start,tobj,htype);
end;
@ -3425,7 +3421,7 @@ begin
_vm_track_map_delete_deferred(@map^.pmap^.tr_map,tobj);
end;
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:T_TRIGGER_MODE):Integer;
begin
Result:=vm_track_map_trigger(@map^.pmap^.tr_map,start,__end,exclude,mode);
end;

View File

@ -65,6 +65,7 @@ type
nentries :Integer; // Number of entries
root :p_vm_nt_entry; // Root of a binary search tree
danger_zone:t_danger_zone;
lock :mtx;
property min_offset:vm_offset_t read header.start write header.start;
property max_offset:vm_offset_t read header.__end write header.__end;
end;
@ -79,11 +80,6 @@ function vm_nt_map_min(map:p_vm_nt_map):vm_offset_t;
procedure vm_nt_map_init(map:p_vm_nt_map;min,max:vm_offset_t);
function vm_nt_map_lookup_entry(
map :p_vm_nt_map;
address:vm_offset_t;
entry :pp_vm_nt_entry):Boolean;
function vm_nt_map_insert(
map :p_vm_nt_map;
obj :p_vm_nt_file_obj;
@ -114,8 +110,6 @@ function vm_nt_map_mirror(map:p_vm_nt_map;
start:vm_offset_t;
__end:vm_offset_t):Pointer;
procedure vm_nt_entry_deallocate(entry:p_vm_nt_entry);
implementation
uses
@ -678,6 +672,17 @@ begin
map^.max_offset:=max;
map^.root:=nil;
map^.danger_zone.Init;
mtx_init(map^.lock,'vm_nt_map');
end;
procedure vm_nt_map_lock(map:p_vm_nt_map); inline;
begin
mtx_lock(map^.lock);
end;
procedure vm_nt_map_unlock(map:p_vm_nt_map); inline;
begin
mtx_unlock(map^.lock);
end;
procedure vm_nt_entry_dispose(map:p_vm_nt_map;entry:p_vm_nt_entry); inline;
@ -863,7 +868,7 @@ end;
function vm_nt_map_simplify_entry(map:p_vm_nt_map;entry:p_vm_nt_entry;var sb:t_range_stat):Boolean; forward;
function vm_nt_map_insert(
function _vm_nt_map_insert(
map :p_vm_nt_map;
obj :p_vm_nt_file_obj;
offset:vm_ooffset_t;
@ -914,6 +919,34 @@ begin
Result:=KERN_SUCCESS;
end;
function vm_nt_map_insert(
map :p_vm_nt_map;
obj :p_vm_nt_file_obj;
offset:vm_ooffset_t;
start :vm_offset_t;
__end :vm_offset_t;
size :vm_offset_t; //unaligned size
prot :Integer):Integer;
begin
if (start=__end) then
begin
Exit(KERN_SUCCESS);
end;
vm_nt_map_lock(map);
Result:=_vm_nt_map_insert(
map ,
obj ,
offset,
start ,
__end ,
size ,
prot );
vm_nt_map_unlock(map);
end;
function vm_nt_map_simplify_entry(map:p_vm_nt_map;entry:p_vm_nt_entry;var sb:t_range_stat):Boolean;
var
next,prev:p_vm_nt_entry;
@ -1124,6 +1157,8 @@ begin
Exit(KERN_SUCCESS);
end;
vm_nt_map_lock(map);
if (not vm_nt_map_lookup_entry(map, start, @first_entry)) then
begin
entry:=first_entry^.next;
@ -1148,6 +1183,9 @@ begin
entry:=next;
end;
vm_nt_map_unlock(map);
Result:=(KERN_SUCCESS);
end;
@ -1164,6 +1202,8 @@ var
begin
if (start=__end) then Exit;
vm_nt_map_lock(map);
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
begin
entry:=entry^.next;
@ -1209,6 +1249,8 @@ begin
entry:=entry^.next;
end;
vm_nt_map_unlock(map);
end;
procedure vm_nt_map_prot_fix(map:p_vm_nt_map;
@ -1222,6 +1264,8 @@ var
begin
if (start=__end) then Exit;
vm_nt_map_lock(map);
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
begin
entry:=entry^.next;
@ -1256,6 +1300,8 @@ begin
entry:=entry^.next;
end;
vm_nt_map_unlock(map);
end;
//rdi, rsi
@ -1292,6 +1338,8 @@ var
begin
if (start=__end) then Exit;
vm_nt_map_lock(map);
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
begin
entry:=entry^.next;
@ -1343,6 +1391,8 @@ begin
entry:=entry^.next;
end;
vm_nt_map_unlock(map);
end;
@ -1369,6 +1419,8 @@ begin
Exit;
end;
vm_nt_map_lock(map);
if (not vm_nt_map_lookup_entry(map, start, @entry)) then
begin
entry:=entry^.next;
@ -1436,6 +1488,8 @@ begin
entry:=entry^.next;
end;
vm_nt_map_unlock(map);
end;

View File

@ -26,27 +26,21 @@ const
DO_DELETE =1;
DO_INCREMENT=2;
H_ZERO =0;
H_JIT_CHUNK=1;
H_GPU_IMAGE=2;
H_GPU_BUF =3;
type
T_THANDLE_TYPE=(H_ZERO,H_JIT_CHUNK,H_GPU_IMAGE,H_GPU_BUF);
T_TRIGGER_MODE=(M_CPU_WRITE,M_DMEM_WRITE,M_GPU_PLANNED,M_GPU_APPLY);
type
t_on_destroy=function(handle:Pointer):Integer;
t_on_trigger=function(handle:Pointer;mode:Integer):Integer;
t_on_trigger=function(handle:Pointer;mode:T_TRIGGER_MODE):Integer;
p_vm_track_object=^t_vm_track_object;
t_vm_track_object=record
t_vm_track_object=packed record
del_link :TAILQ_ENTRY; //p_vm_track_map->delete_deferred
//iter_link :TAILQ_ENTRY;
//
handle :Pointer;
//
ref_count :DWORD;
htype :Byte;
mark_del :Byte;
prot :Byte;
//
main :t_vm_track_interval;
align :t_vm_track_interval;
instances :TAILQ_HEAD; //p_vm_track_object_instance
@ -54,6 +48,10 @@ type
on_destroy:t_on_destroy;
on_trigger:t_on_trigger;
//
ref_count :DWORD;
htype :T_THANDLE_TYPE;
mark_del :Byte;
prot :Byte;
end;
pp_vm_track_map_entry=^p_vm_track_map_entry;
@ -65,7 +63,6 @@ type
right :p_vm_track_map_entry; // right child in binary search tree
start :vm_offset_t; // start address
__end :vm_offset_t; // end address
source :vm_offset_t; // source of mirror
instances:Pointer; // p_vm_track_object_instance
instcount:QWORD;
//
@ -82,6 +79,7 @@ type
obj_link :TAILQ_ENTRY; //p_vm_track_object ->instances
entry :p_vm_track_map_entry;
obj :p_vm_track_object;
source :vm_offset_t; // source of mirror
end;
p_vm_track_deferred=^t_vm_track_deferred;
@ -117,7 +115,7 @@ procedure vm_track_map_init(map:p_vm_track_map;min,max:vm_offset_t);
//
function vm_track_object_allocate (handle:Pointer;start,__end:vm_offset_t;htype,prot:Byte):p_vm_track_object;
function vm_track_object_allocate (handle:Pointer;start,__end:vm_offset_t;htype:T_THANDLE_TYPE;prot:Byte):p_vm_track_object;
procedure vm_track_object_deallocate(obj:p_vm_track_object);
procedure vm_track_object_reference (obj:p_vm_track_object);
@ -137,9 +135,9 @@ function _vm_track_map_insert_mirror(map:p_vm_track_map;start,__end,dst:vm_offs
function vm_track_map_remove_object(map:p_vm_track_map;obj:p_vm_track_object):Integer;
function vm_track_map_remove_memory(map:p_vm_track_map;start,__end:vm_offset_t):Integer;
function vm_track_map_trigger (map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
function vm_track_map_trigger (map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer;mode:T_TRIGGER_MODE):Integer;
function vm_track_map_next_object (map:p_vm_track_map;start:vm_offset_t;obj:p_vm_track_object;htype:Byte):p_vm_track_object;
function vm_track_map_next_object (map:p_vm_track_map;start:vm_offset_t;obj:p_vm_track_object;htype:T_THANDLE_TYPE):p_vm_track_object;
implementation
@ -148,7 +146,7 @@ procedure pmap_prot_track(pmap :Pointer;
__end:vm_offset_t;
prots:Byte); external;
function vm_track_object_allocate(handle:Pointer;start,__end:vm_offset_t;htype,prot:Byte):p_vm_track_object;
function vm_track_object_allocate(handle:Pointer;start,__end:vm_offset_t;htype:T_THANDLE_TYPE;prot:Byte):p_vm_track_object;
begin
Result:=AllocMem(SizeOf(t_vm_track_object));
@ -211,7 +209,7 @@ begin
end;
}
function vm_track_object_trigger(map:p_vm_track_map;obj:p_vm_track_object;start,__end:vm_offset_t;mode:Integer):Integer;
function vm_track_object_trigger(obj:p_vm_track_object;start,__end:vm_offset_t;mode:T_TRIGGER_MODE):Integer;
begin
Result:=DO_NOTHING;
@ -430,15 +428,16 @@ begin
Exit(y);
end;
procedure _vm_track_entry_add_obj(pmap:Pointer;entry:p_vm_track_map_entry;obj:p_vm_track_object);
procedure _vm_track_entry_add_obj(pmap:Pointer;entry:p_vm_track_map_entry;obj:p_vm_track_object;source:vm_offset_t);
var
node:p_vm_track_object_instance;
prot:Byte;
begin
node:=AllocMem(SizeOf(t_vm_track_object_instance));
node^.entry:=entry;
node^.obj :=obj;
node^.entry :=entry;
node^.obj :=obj;
node^.source:=source;
vm_track_insert_instance(entry^.instances,node);
Inc(entry^.instcount);
@ -475,7 +474,7 @@ begin
//
end;
procedure vm_track_entry_add_obj(pmap:Pointer;entry:p_vm_track_map_entry;obj:p_vm_track_object);
procedure vm_track_entry_add_obj(pmap:Pointer;entry:p_vm_track_map_entry;obj:p_vm_track_object;source:vm_offset_t);
var
root:p_vm_track_object_instance;
begin
@ -488,7 +487,7 @@ begin
Exit;
end;
_vm_track_entry_add_obj(pmap,entry,obj);
_vm_track_entry_add_obj(pmap,entry,obj,source);
end;
function _vm_track_entry_del_node(pmap:Pointer;entry:p_vm_track_map_entry;node:p_vm_track_object_instance):Boolean;
@ -577,7 +576,7 @@ end;
//
function in_obj_list(b:p_vm_track_map_entry;obj:p_vm_track_object):Boolean;
function in_obj_list(b:p_vm_track_map_entry;obj:p_vm_track_object;source:vm_offset_t):Boolean;
var
root:p_vm_track_object_instance;
begin
@ -591,10 +590,10 @@ begin
Exit;
end;
Result:=(root^.obj=obj);
Result:=(root^.obj=obj) and (root^.source=source);
end;
function compare_obj_list(a,b:p_vm_track_map_entry):Boolean;
function compare_obj_list(a:p_vm_track_map_entry;offset:vm_offset_t;b:p_vm_track_map_entry):Boolean;
var
node:p_vm_track_object_instance;
begin
@ -608,7 +607,7 @@ begin
while (node<>nil) do
begin
if not in_obj_list(b,node^.obj) then
if not in_obj_list(b,node^.obj,node^.source+offset) then
begin
Exit(False);
end;
@ -619,7 +618,35 @@ begin
Result:=True;
end;
procedure copy_obj_list(src,dst:p_vm_track_map_entry);
procedure inc_obj_list(src:p_vm_track_map_entry;offset:vm_offset_t);
var
node:p_vm_track_object_instance;
begin
node:=vm_track_first_instance(src^.instances);
while (node<>nil) do
begin
node^.source:=node^.source+offset;
node:=vm_track_next_instance(src^.instances,node);
end;
end;
procedure dec_obj_list(src:p_vm_track_map_entry;offset:vm_offset_t);
var
node:p_vm_track_object_instance;
begin
node:=vm_track_first_instance(src^.instances);
while (node<>nil) do
begin
node^.source:=node^.source-offset;
node:=vm_track_next_instance(src^.instances,node);
end;
end;
procedure copy_obj_list(src,dst:p_vm_track_map_entry;offset:vm_offset_t);
var
node:p_vm_track_object_instance;
begin
@ -630,7 +657,7 @@ begin
while (node<>nil) do
begin
_vm_track_entry_add_obj(nil,dst,node^.obj);
_vm_track_entry_add_obj(nil,dst,node^.obj,node^.source+offset);
node:=vm_track_next_instance(src^.instances,node);
end;
@ -921,8 +948,7 @@ function vm_track_map_insert_internal(
map :p_vm_track_map;
after :p_vm_track_map_entry;
start :vm_offset_t;
__end :vm_offset_t;
source:vm_offset_t):p_vm_track_map_entry;
__end :vm_offset_t):p_vm_track_map_entry;
var
new_entry:p_vm_track_map_entry;
begin
@ -931,8 +957,6 @@ begin
if (after<>@map^.header) and
(start<after^.__end) then
begin
source:=source+(after^.__end-start);
start:=after^.__end;
end;
@ -953,7 +977,6 @@ begin
new_entry:=vm_track_entry_create(map);
new_entry^.start :=start;
new_entry^.__end :=__end;
new_entry^.source:=source;
{
* Insert the new after into the list
@ -975,12 +998,12 @@ begin
begin
prevsize:=prev^.__end - prev^.start;
if (prev^.__end=entry^.start) and
(prev^.source + prevsize=entry^.source) and
compare_obj_list(prev,entry) then
compare_obj_list(prev,prevsize,entry) then
begin
vm_track_map_entry_unlink(map, prev);
entry^.start :=prev^.start;
entry^.source:=prev^.source;
dec_obj_list(entry,prevsize);
vm_track_entry_dispose(map, nil, prev);
end;
@ -991,8 +1014,7 @@ begin
begin
esize:=entry^.__end - entry^.start;
if (entry^.__end=next^.start) and
(entry^.source + esize=next^.source) and
compare_obj_list(entry,next) then
compare_obj_list(entry,esize,next) then
begin
vm_track_map_entry_unlink(map, next);
entry^.__end:=next^.__end;
@ -1000,6 +1022,7 @@ begin
vm_track_entry_dispose(map, nil, next);
end;
end;
end;
procedure _vm_track_map_clip_start(map:p_vm_track_map;entry:p_vm_track_map_entry;start:vm_offset_t);
@ -1015,10 +1038,11 @@ begin
new_entry^.__end:=start;
entry^.source:=entry^.source + (start - entry^.start);
entry^.start :=start;
copy_obj_list(entry,new_entry,0);
copy_obj_list(entry,new_entry);
inc_obj_list(entry,(start - entry^.start));
entry^.start:=start;
vm_track_map_entry_link(map, entry^.prev, new_entry);
end;
@ -1044,9 +1068,7 @@ begin
entry^.__end:=__end;
new_entry^.source:=new_entry^.source + (__end - entry^.start);
copy_obj_list(entry,new_entry);
copy_obj_list(entry,new_entry,(__end - entry^.start));
vm_track_map_entry_link(map, entry, new_entry);
end;
@ -1061,7 +1083,7 @@ end;
function _vm_track_map_insert(map:p_vm_track_map;start,__end,source:vm_offset_t;obj:p_vm_track_object):Integer;
var
current,entry:p_vm_track_map_entry;
entry:p_vm_track_map_entry;
begin
if (start>=__end) then
begin
@ -1080,23 +1102,21 @@ begin
vm_track_map_clip_start(map, entry, start);
end else
begin
entry:=vm_track_map_insert_internal(map,entry,start,__end,source);
entry:=vm_track_map_insert_internal(map,entry,start,__end);
end;
current:=entry;
while (current<>@map^.header) and (current^.start<__end) do
while (entry<>@map^.header) and (entry^.start<__end) do
begin
vm_track_map_clip_end(map, current, __end);
vm_track_map_clip_end(map, entry, __end);
current:=vm_track_map_insert_internal(map,current,
current^.__end, //start
__end, //__end
source+(current^.__end-start)
entry:=vm_track_map_insert_internal(map,entry,
entry^.__end, //start
__end //__end
);
vm_track_entry_add_obj(map^.pmap,current,obj);
vm_track_entry_add_obj(map^.pmap,entry,obj,source+(entry^.start-start));
current:=current^.next;
entry:=entry^.next;
end;
Result:=(KERN_SUCCESS);
@ -1417,9 +1437,9 @@ begin
Result:=(KERN_SUCCESS);
end;
function vm_track_map_trigger(map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
function vm_track_map_trigger(map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer;mode:T_TRIGGER_MODE):Integer;
var
current,entry:p_vm_track_map_entry;
entry:p_vm_track_map_entry;
node:p_vm_track_object_instance;
diff:vm_offset_t;
@ -1456,20 +1476,10 @@ begin
entry:=entry^.next;
end;
current:=entry;
while (current<>@map^.header) and (current^.start<__end) do
while (entry<>@map^.header) and (entry^.start<__end) do
begin
node:=vm_track_first_instance(entry^.instances);
//remap with source
//diff:=entry^.start-start;
//
//s_start:=entry^.source-diff;
//s___end:=s_start+size;
s_start:=start;
s___end:=__end;
while (node<>nil) do
begin
//vm_track_list_add_obj(list,node^.obj); //deferred
@ -1477,7 +1487,14 @@ begin
//remap with source
if (node^.obj<>exclude) then
begin
ret:=vm_track_object_trigger(map,node^.obj,s_start,s___end,mode);
//remap with source
diff:=entry^.start-start;
//
s_start:=node^.source-diff;
s___end:=s_start+size;
ret:=vm_track_object_trigger(node^.obj,s_start,s___end,mode);
if ((ret and DO_DELETE)<>0) then
begin
@ -1494,7 +1511,7 @@ begin
node:=vm_track_next_instance(entry^.instances,node);
end;
current:=current^.next;
entry:=entry^.next;
end;
//iterate
@ -1532,7 +1549,7 @@ begin
vm_track_map_unlock(map);
end;
function vm_track_map_next_object(map:p_vm_track_map;start:vm_offset_t;obj:p_vm_track_object;htype:Byte):p_vm_track_object;
function vm_track_map_next_object(map:p_vm_track_map;start:vm_offset_t;obj:p_vm_track_object;htype:T_THANDLE_TYPE):p_vm_track_object;
var
entry:p_vm_track_map_entry;
node:p_vm_track_object_instance;

View File

@ -12,6 +12,7 @@ uses
kern_proc,
vm_map,
vm_tracking_map,
Vulkan,
vDependence,
@ -690,7 +691,7 @@ begin
begin
//deffered trigger
vm_map_track_trigger(p_proc.p_vmspace,node^.start,node^.__end,node^.exclude,2);
vm_map_track_trigger(p_proc.p_vmspace,node^.start,node^.__end,node^.exclude,M_GPU_APPLY);
FPlannedTriggers.delete(node);
OnFree(node);
@ -706,7 +707,7 @@ Var
node:p_cmd_track_deferred;
begin
//planned trigger
vm_map_track_trigger(p_proc.p_vmspace,start,__end,exclude,1);
vm_map_track_trigger(p_proc.p_vmspace,start,__end,exclude,M_GPU_PLANNED);
tmp:=Default(t_cmd_track_deferred);
tmp.start :=start;

View File

@ -211,7 +211,7 @@ begin
Result:=DO_DELETE;
end;
function on_trigger(handle:Pointer;mode:Integer):Integer; SysV_ABI_CDecl;
function on_trigger(handle:Pointer;mode:T_TRIGGER_MODE):Integer; SysV_ABI_CDecl;
var
image:TvCustomImage2;
i:Integer;
@ -223,15 +223,17 @@ begin
//Writeln('on_trigger image');
case mode of
0://direct
M_CPU_WRITE,
M_DMEM_WRITE:
//direct
begin
System.InterlockedIncrement(image.change_rate.trigger);
end;
1://planned
M_GPU_PLANNED://planned
begin
System.InterlockedIncrement(image.change_rate.planned);
end;
2://differed
M_GPU_APPLY://differed
begin
i:=System.InterlockedExchangeAdd(image.change_rate.planned,0);