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); procedure remove_stream(stream:p_pm4_stream);
end; 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_line=array[0..3] of TvCustomCmdPool;
t_pool_cache=object t_pool_cache=object
queue:TvQueue; queue:TvQueue;
@ -109,6 +124,8 @@ type
entry :TAILQ_ENTRY; //stall entry :TAILQ_ENTRY; //stall
stream:p_pm4_stream; stream:p_pm4_stream;
// //
function OnAlloc(size:Ptruint):Pointer; register; override;
Procedure OnFree (P:Pointer ); register; override;
end; end;
t_me_render_context=object t_me_render_context=object
@ -130,6 +147,7 @@ type
procedure BeginCmdBuffer; procedure BeginCmdBuffer;
procedure FinishCmdBuffer; procedure FinishCmdBuffer;
function CmdStatus(i:t_pm4_stream_type):TVkResult; function CmdStatus(i:t_pm4_stream_type):TVkResult;
procedure PingCmd;
function WaitConfirmOrSwitch:Boolean; function WaitConfirmOrSwitch:Boolean;
// //
procedure switch_task; procedure switch_task;
@ -146,7 +164,8 @@ uses
vmparam, vmparam,
kern_dmem, kern_dmem,
kern_proc, kern_proc,
vm_map; vm_map,
vm_tracking_map;
procedure StartFrameCapture; procedure StartFrameCapture;
begin 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); Constructor TvCmdCachedPool.Create(FFamily:TVkUInt32);
begin begin
inherited; inherited;
@ -446,6 +449,20 @@ begin
Result:=last; Result:=last;
end; 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; procedure t_me_render_context.Init;
@ -579,6 +596,16 @@ begin
Result:=VK_SUCCESS; Result:=VK_SUCCESS;
end; 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; function t_me_render_context.WaitConfirmOrSwitch:Boolean;
begin begin
FinishCmdBuffer; FinishCmdBuffer;
@ -1500,7 +1527,7 @@ begin
Assert(false,'pm4_EventWriteEop'); Assert(false,'pm4_EventWriteEop');
end; 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; end;
if (node^.intSel=EVENTWRITEEOP_INT_SEL_SEND_INT) or if (node^.intSel=EVENTWRITEEOP_INT_SEL_SEND_INT) or
@ -1591,7 +1618,7 @@ begin
PDWORD(addr_dmem)^:=node^.data; 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;
end; end;
@ -1641,7 +1668,7 @@ begin
Move(src_dmem^,dst_dmem^,byteSize); 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;
end; end;
else else
@ -1792,6 +1819,8 @@ begin
Continue; Continue;
end; end;
ctx.PingCmd;
//stall is empty! //stall is empty!
me^.reset_sheduler; me^.reset_sheduler;

View File

@ -88,7 +88,8 @@ uses
sys_bootparam, sys_bootparam,
kern_dmem, kern_dmem,
kern_proc, kern_proc,
vm_map; vm_map,
vm_tracking_map;
function PM4_TYPE(token:DWORD):Byte; inline; function PM4_TYPE(token:DWORD):Byte; inline;
begin begin
@ -1074,14 +1075,14 @@ begin
Move(Pointer(adrSrc_dmem)^,Pointer(adrDst_dmem)^,byteCount); 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; end;
(kDmaDataSrcData or (kDmaDataDstMemory shl 4)), (kDmaDataSrcData or (kDmaDataDstMemory shl 4)),
(kDmaDataSrcData or (kDmaDataDstMemoryUsingL2 shl 4)): (kDmaDataSrcData or (kDmaDataDstMemoryUsingL2 shl 4)):
begin begin
FillDWORD(Pointer(adrDst_dmem)^,(byteCount div 4),DWORD(adrSrc)); 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; end;
else else
Assert(false,'DmaData: srcSel=0x'+HexStr(srcSel,1)+' dstSel=0x'+HexStr(dstSel,1)); 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)); 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; end;
else else
Assert(false,'WriteData: dstSel=0x'+HexStr(dstSel,1)); Assert(false,'WriteData: dstSel=0x'+HexStr(dstSel,1));

View File

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

View File

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

View File

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

View File

@ -140,8 +140,8 @@ procedure init_dmem_map;
var var
vmap:vm_map_t; vmap:vm_map_t;
begin begin
dmem_map_init(@dmem,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,{SCE_KERNEL_MAIN_DMEM_SIZE} (VM_MAX_GPU_ADDRESS-VM_MIN_GPU_ADDRESS) ); rmem_map_init(@rmap,0,(VM_MAX_GPU_ADDRESS-VM_MIN_GPU_ADDRESS));
vmap:=p_proc.p_vmspace; vmap:=p_proc.p_vmspace;
@ -523,6 +523,8 @@ var
start:QWORD; start:QWORD;
relofs:Int64; relofs:Int64;
offset:QWORD;
d_start,d_start2:QWORD; d_start,d_start2:QWORD;
d_end,d_end2:QWORD; d_end,d_end2:QWORD;
d_mtype:DWORD; d_mtype:DWORD;
@ -564,20 +566,42 @@ begin
if ((obj^.flags and OBJ_DMEM_EXT)<>0) then if ((obj^.flags and OBJ_DMEM_EXT)<>0) then
begin 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); qinfo^.protection:=qinfo^.protection and (VM_PROT_GPU_ALL or VM_PROT_RW);
start :=entry^.start; start :=entry^.start;
relofs:=entry^.offset - start; relofs:=offset - start;
if (addr < start) then if (addr < start) then
begin begin
addr:=start; addr:=start;
end; end;
ret:=dmem_map_get_mtype(dmem_maps[default_pool_id].dmem,obj,addr + relofs,@d_start2,@d_end2,@d_mtype); if (offset>=(VM_MIN_DEV_ADDRESS-VM_MIN_GPU_ADDRESS)) then
if (ret<>0) then
begin 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; end;
qinfo^.bits.isDirectMemory:=1; qinfo^.bits.isDirectMemory:=1;

View File

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

View File

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

View File

@ -15,7 +15,8 @@ uses
kern_mtx, kern_mtx,
kern_thr, kern_thr,
sys_resource, sys_resource,
kern_resource; kern_resource,
vm_tracking_map;
type type
vm_flags_t =type Byte; 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_insert(map:vm_map_t;tobj:Pointer);
procedure vm_map_track_remove(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); 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; function vmspace_pmap(vm:p_vmspace):pmap_t; inline;
@ -294,7 +295,6 @@ uses
md_map, md_map,
kern_proc, kern_proc,
rmem_map, rmem_map,
vm_tracking_map,
kern_budget; kern_budget;
var var
@ -385,7 +385,7 @@ var
begin begin
vm:=@g_vmspace; 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); 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 begin
if (tobj=nil) then Exit; if (tobj=nil) then Exit;
vm_map_lock(map); //lock to prevent deadlock
vm_track_map_remove_object(@map^.pmap^.tr_map,tobj); vm_track_map_remove_object(@map^.pmap^.tr_map,tobj);
vm_map_unlock(map);
end; 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 begin
Result:=vm_track_map_next_object(@map^.pmap^.tr_map,start,tobj,htype); Result:=vm_track_map_next_object(@map^.pmap^.tr_map,start,tobj,htype);
end; end;
@ -3425,7 +3421,7 @@ begin
_vm_track_map_delete_deferred(@map^.pmap^.tr_map,tobj); _vm_track_map_delete_deferred(@map^.pmap^.tr_map,tobj);
end; 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 begin
Result:=vm_track_map_trigger(@map^.pmap^.tr_map,start,__end,exclude,mode); Result:=vm_track_map_trigger(@map^.pmap^.tr_map,start,__end,exclude,mode);
end; end;

View File

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

View File

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

View File

@ -12,6 +12,7 @@ uses
kern_proc, kern_proc,
vm_map, vm_map,
vm_tracking_map,
Vulkan, Vulkan,
vDependence, vDependence,
@ -690,7 +691,7 @@ begin
begin begin
//deffered trigger //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); FPlannedTriggers.delete(node);
OnFree(node); OnFree(node);
@ -706,7 +707,7 @@ Var
node:p_cmd_track_deferred; node:p_cmd_track_deferred;
begin begin
//planned trigger //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:=Default(t_cmd_track_deferred);
tmp.start :=start; tmp.start :=start;

View File

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