This commit is contained in:
Pavel 2024-07-01 16:51:40 +03:00
parent d3ea872e00
commit c457625b5f
8 changed files with 148 additions and 74 deletions

View File

@ -96,10 +96,6 @@ var
implementation
uses
kern_proc,
vm_map;
procedure StartFrameCapture;
begin
if use_renderdoc_capture then
@ -429,7 +425,7 @@ begin
range {VK_WHOLE_SIZE});
//TODO: check write flag
vm_map_track_trigger(p_proc.p_vmspace,QWORD(addr),QWORD(addr)+size,nil);
CmdBuffer.AddPlannedTrigger(QWORD(addr),QWORD(addr)+size,nil)
end;
end;

View File

@ -1278,8 +1278,10 @@ begin
Assert(false,'TODO: destroy in code analize');
end;
function pick_on_trigger(handle:Pointer;start,__end:vm_offset_t):Integer;
function pick_on_trigger(handle:Pointer;mode:Integer):Integer;
begin
if (mode<>0) then Exit(DO_NOTHING);
Result:=DO_NOTHING;
Assert(false,'TODO: trigger in code analize');

View File

@ -1612,8 +1612,10 @@ begin
Result:=DO_DELETE;
end;
function on_trigger(handle:Pointer;start,__end:vm_offset_t):Integer;
function on_trigger(handle:Pointer;mode:Integer):Integer;
begin
if (mode<>0) then Exit(DO_NOTHING);
//TODO
Result:=DO_INCREMENT;
end;

View File

@ -280,7 +280,7 @@ 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;
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):Integer;
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
function vmspace_pmap(vm:p_vmspace):pmap_t; inline;
@ -3321,8 +3321,8 @@ begin
vm_map_lock(map);
start:=p_vm_track_object(tobj)^.main.start;
__end:=p_vm_track_object(tobj)^.main.__end;
start:=p_vm_track_object(tobj)^.align.start;
__end:=p_vm_track_object(tobj)^.align.__end;
VM_MAP_RANGE_CHECK(map, start, __end);
@ -3415,9 +3415,9 @@ 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):Integer;
function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
begin
Result:=vm_track_map_trigger(@map^.pmap^.tr_map,start,__end,exclude);
Result:=vm_track_map_trigger(@map^.pmap^.tr_map,start,__end,exclude,mode);
end;
procedure vminit;

View File

@ -33,7 +33,7 @@ const
type
t_on_destroy=function(handle:Pointer):Integer;
t_on_trigger=function(handle:Pointer;start,__end:vm_offset_t):Integer;
t_on_trigger=function(handle:Pointer;mode:Integer):Integer;
p_vm_track_object=^t_vm_track_object;
t_vm_track_object=record
@ -48,6 +48,7 @@ type
prot :Byte;
//
main :t_vm_track_interval;
align :t_vm_track_interval;
instances :TAILQ_HEAD; //p_vm_track_object_instance
//
on_destroy:t_on_destroy;
@ -136,7 +137,7 @@ 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):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_next_object (map:p_vm_track_map;start:vm_offset_t;obj:p_vm_track_object;htype:Byte):p_vm_track_object;
@ -156,12 +157,12 @@ begin
TAILQ_INIT(@Result^.instances);
start:=start and (not PMAPP_MASK);
__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
Result^.main.start:=start;
Result^.main.__end:=__end;
Result^.align.start:=start and (not PMAPP_MASK);
Result^.align.__end:=(__end+PMAPP_MASK) and (not PMAPP_MASK);
Result^.prot :=prot;
Result^.htype:=htype;
end;
@ -210,7 +211,7 @@ begin
end;
}
function vm_track_object_trigger(map:p_vm_track_map;obj:p_vm_track_object;start,__end:vm_offset_t):Integer;
function vm_track_object_trigger(map:p_vm_track_map;obj:p_vm_track_object;start,__end:vm_offset_t;mode:Integer):Integer;
begin
Result:=DO_NOTHING;
@ -218,12 +219,16 @@ begin
if (obj^.mark_del<>0) then Exit;
if (obj^.on_trigger<>nil) then
//cross with main
if (obj^.main.__end>start) and (obj^.main.start<__end) then
begin
Result:=obj^.on_trigger(obj^.handle,start,__end);
end else
begin
Result:=DO_INCREMENT;
if (obj^.on_trigger<>nil) then
begin
Result:=obj^.on_trigger(obj^.handle,mode);
end else
begin
Result:=DO_INCREMENT;
end;
end;
end;
@ -1097,23 +1102,6 @@ begin
Result:=(KERN_SUCCESS);
end;
//not used
function vm_track_map_insert_object(map:p_vm_track_map;obj:p_vm_track_object):Integer;
begin
if (map=nil) or (obj=nil) then
begin
Exit(KERN_INVALID_ARGUMENT);
end;
if (obj^.mark_del<>0) then Exit(KERN_SUCCESS);
vm_track_map_lock(map);
Result:=_vm_track_map_insert(map,obj^.main.start,obj^.main.__end,obj^.main.start,obj);
vm_track_map_unlock(map);
end;
procedure vm_track_map_entry_delete(map:p_vm_track_map;entry:p_vm_track_map_entry);
begin
vm_track_map_entry_unlink(map, entry);
@ -1186,7 +1174,7 @@ begin
obj:=node^.obj;
//cross with main
if (obj^.main.__end>start) and (obj^.main.start<__end) then
if (obj^.align.__end>start) and (obj^.align.start<__end) then
begin
//delete full object
_vm_track_map_delete_deferred(map,obj);
@ -1413,7 +1401,7 @@ begin
obj:=node^.obj;
//Don't try to add mirroring for mirroring
if (obj^.main.__end>e_start) and (obj^.main.start<e___end) then
if (obj^.align.__end>e_start) and (obj^.align.start<e___end) then
begin
_vm_track_map_insert_deferred(map,d_start,d___end,e_start,obj);
end;
@ -1429,7 +1417,7 @@ begin
Result:=(KERN_SUCCESS);
end;
function vm_track_map_trigger(map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer):Integer;
function vm_track_map_trigger(map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer;mode:Integer):Integer;
var
current,entry:p_vm_track_map_entry;
node:p_vm_track_object_instance;
@ -1489,7 +1477,7 @@ begin
//remap with source
if (node^.obj<>exclude) then
begin
ret:=vm_track_object_trigger(map,node^.obj,s_start,s___end);
ret:=vm_track_object_trigger(map,node^.obj,s_start,s___end,mode);
if ((ret and DO_DELETE)<>0) then
begin

View File

@ -7,9 +7,12 @@ interface
uses
Classes,
SysUtils,
//g23tree,
g_node_splay,
si_ci_vi_merged_enum,
kern_proc,
vm_map,
Vulkan,
vDependence,
vDevice,
@ -38,13 +41,20 @@ type
TvSemaphoreWaitSet=specialize TNodeSplay<TvSemaphoreWait>;
{
TvSemaphoreWaitCompare=object
function c(a,b:TvSemaphoreWait):Integer; static;
p_cmd_track_deferred=^t_cmd_track_deferred;
t_cmd_track_deferred=object
//
start :QWORD;
__end :QWORD;
exclude:Pointer;
//
pLeft :p_cmd_track_deferred;
pRight:p_cmd_track_deferred;
//
function c(a,b:p_cmd_track_deferred):Integer; static;
end;
TvSemaphoreWaitSet=specialize T23treeSet<TvSemaphoreWait,TvSemaphoreWaitCompare>;
}
t_cmd_track_deferred_set=specialize TNodeSplay<t_cmd_track_deferred>;
const
BP_GRAPHICS=VK_PIPELINE_BIND_POINT_GRAPHICS;
@ -76,6 +86,8 @@ type
FCBState:(cbInit,cbBegin,cbEnd,cbSubmit);
FPlannedTriggers:t_cmd_track_deferred_set;
Constructor Create(pool:TvCmdPool;Queue:TvQueue);
Destructor Destroy; override;
@ -93,6 +105,9 @@ type
Procedure AddWaitSemaphore(S:TvSemaphore;W:TVkPipelineStageFlags);
function GetSignaledSemaphore:TvSemaphore;
Procedure ReleaseAllPlannedTriggers;
Procedure AddPlannedTrigger(start,__end:QWORD;exclude:Pointer);
Procedure BindLayout(BindPoint:TVkPipelineBindPoint;F:TvPipelineLayout);
Procedure BindSet(BindPoint:TVkPipelineBindPoint;fset:TVkUInt32;FHandle:TVkDescriptorSet);
Procedure PushConstant(BindPoint:TVkPipelineBindPoint;stageFlags:TVkShaderStageFlags;offset,size:TVkUInt32;const pValues:PVkVoid);
@ -167,18 +182,26 @@ uses
vBuffer,
vHostBufferManager;
{
function TvSemaphoreWaitCompare.c(a,b:TvSemaphoreWait):Integer;
begin
Result:=Integer(Pointer(a.FSemaphore)>Pointer(b.FSemaphore))-Integer(Pointer(a.FSemaphore)<Pointer(b.FSemaphore));
end;
}
function TvSemaphoreWait.c(a,b:PvSemaphoreWait):Integer;
begin
Result:=Integer(Pointer(a^.FSemaphore)>Pointer(b^.FSemaphore))-Integer(Pointer(a^.FSemaphore)<Pointer(b^.FSemaphore));
end;
function t_cmd_track_deferred.c(a,b:p_cmd_track_deferred):Integer;
begin
//start
Result:=Integer(a^.start>b^.start)-Integer(a^.start<b^.start);
if (Result<>0) then Exit;
//__end
Result:=Integer(a^.__end>b^.__end)-Integer(a^.__end<b^.__end);
if (Result<>0) then Exit;
//exclude
Result:=Integer(a^.exclude>b^.exclude)-Integer(a^.exclude<b^.exclude);
if (Result<>0) then Exit;
end;
//
Constructor TvCustomCmdBuffer.Create(pool:TvCmdPool;Queue:TvQueue);
begin
FParent:=pool;
@ -477,6 +500,8 @@ begin
ReleaseAllDependencies(Self);
ReleaseAllPlannedTriggers;
FreeAllSemaphores;
cmd_count:=0;
@ -526,6 +551,51 @@ begin
Result:=FSignalSemaphore;
end;
Procedure TvCustomCmdBuffer.ReleaseAllPlannedTriggers;
var
node:p_cmd_track_deferred;
begin
node:=FPlannedTriggers.Min;
while (node<>nil) do
begin
//deffered trigger
vm_map_track_trigger(p_proc.p_vmspace,node^.start,node^.__end,node^.exclude,2);
FPlannedTriggers.delete(node);
OnFree(node);
node:=FPlannedTriggers.Min;
end;
end;
Procedure TvCustomCmdBuffer.AddPlannedTrigger(start,__end:QWORD;exclude:Pointer);
Var
tmp:t_cmd_track_deferred;
node:p_cmd_track_deferred;
begin
//planned trigger
vm_map_track_trigger(p_proc.p_vmspace,start,__end,exclude,1);
tmp:=Default(t_cmd_track_deferred);
tmp.start :=start;
tmp. __end :=__end;
tmp.exclude:=exclude;
node:=FPlannedTriggers.Find(@tmp);
if (node=nil) then
begin
node:=OnAlloc(SizeOf(t_cmd_track_deferred));
node^:=tmp;
//
FPlannedTriggers.Insert(node);
end;
end;
Procedure TvCustomCmdBuffer.BindLayout(BindPoint:TVkPipelineBindPoint;F:TvPipelineLayout);
begin
if (Self=nil) then Exit;

View File

@ -61,8 +61,8 @@ type
size:Ptruint;
tobj:p_vm_track_object;
//
ref_trig:Ptruint;
ref_load:Ptruint;
ref_trigger:Ptruint;
ref_planned:Ptruint;
//
Parent :TvCustomImage2;
DepthOnly :TvCustomImage2;
@ -212,23 +212,37 @@ begin
Result:=DO_DELETE;
end;
function on_trigger(handle:Pointer;start,__end:QWORD):Integer; SysV_ABI_CDecl;
function on_trigger(handle:Pointer;mode:Integer):Integer; SysV_ABI_CDecl;
var
image:TvCustomImage2;
i:Ptruint;
begin
Result:=DO_NOTHING;
image:=TvCustomImage2(handle);
if (__end>QWORD(image.key.Addr)) and (start<(QWORD(image.key.Addr)+image.size)) then
begin
//Writeln('on_trigger image');
//Writeln('on_trigger image');
System.InterlockedIncrement64(image.ref_trig);
case mode of
0://direct
begin
System.InterlockedIncrement64(image.ref_trigger);
end;
1://planned
begin
System.InterlockedIncrement64(image.ref_planned);
end;
2://differed
begin
i:=System.InterlockedExchangeAdd64(image.ref_planned,0);
Result:=DO_INCREMENT;
System.InterlockedExchangeAdd64(image.ref_trigger,+i);
System.InterlockedExchangeAdd64(image.ref_planned,-i);
end;
else;
end;
Result:=DO_INCREMENT;
end;
//
@ -236,7 +250,7 @@ end;
Constructor TvCustomImage2.Create;
begin
inherited;
ref_trig:=1;
ref_trigger:=1;
end;
Destructor TvCustomImage2.Destroy;
@ -387,7 +401,6 @@ Constructor TvImage2.Create;
begin
inherited;
Barrier.Init;
ref_trig:=1;
end;
Destructor TvImage2.Destroy;

View File

@ -22,10 +22,6 @@ Function get_image_size(const key:TvImageKey):Ptruint;
implementation
uses
kern_proc,
vm_map;
Function GetLinearAlignWidth(bpp,width:Ptruint):Ptruint; inline;
var
align_m:Ptruint;
@ -768,12 +764,18 @@ end;
procedure pm4_load_from(cmd:TvCustomCmdBuffer;image:TvCustomImage2;IMAGE_USAGE:Byte);
var
cb:t_load_from_cb;
ref_trigger:Ptruint;
ref_planned:Ptruint;
begin
if (cmd=nil) or (image=nil) then Exit;
if (IMAGE_USAGE and TM_READ)=0 then Exit;
if (image.ref_load=image.ref_trig) then Exit;
ref_trigger:=System.InterlockedExchangeAdd64(image.ref_trigger,0);
ref_planned:=System.InterlockedExchangeAdd64(image.ref_planned,0);
if (ref_trigger=0) and
(ref_planned=0) then Exit;
cb:=a_tiling_cbs[Byte(image.key.params.tiling)].load_from;
@ -785,7 +787,8 @@ begin
cb(cmd,image);
image.ref_load:=image.ref_trig;
System.InterlockedExchangeAdd64(image.ref_trigger,-ref_trigger);
System.InterlockedExchangeAdd64(image.ref_planned,-ref_planned);
image.assign_vm_track;
end;
@ -808,7 +811,7 @@ begin
image.assign_vm_track;
vm_map_track_trigger(p_proc.p_vmspace,QWORD(image.key.Addr),QWORD(image.key.Addr)+image.size,image.tobj);
cmd.AddPlannedTrigger(QWORD(image.key.Addr),QWORD(image.key.Addr)+image.size,image.tobj);
end;
Function get_image_size(const key:TvImageKey):Ptruint; [public, alias:'tiling_get_image_size'];