diff --git a/chip/pm4_me.pas b/chip/pm4_me.pas index b521b434..8132ef40 100644 --- a/chip/pm4_me.pas +++ b/chip/pm4_me.pas @@ -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; diff --git a/sys/jit/kern_jit.pas b/sys/jit/kern_jit.pas index e396b20d..a6982fa0 100644 --- a/sys/jit/kern_jit.pas +++ b/sys/jit/kern_jit.pas @@ -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'); diff --git a/sys/jit/kern_jit_dynamic.pas b/sys/jit/kern_jit_dynamic.pas index cfc3019a..090f0541 100644 --- a/sys/jit/kern_jit_dynamic.pas +++ b/sys/jit/kern_jit_dynamic.pas @@ -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; diff --git a/sys/vm/vm_map.pas b/sys/vm/vm_map.pas index 982b157c..d856ab60 100644 --- a/sys/vm/vm_map.pas +++ b/sys/vm/vm_map.pas @@ -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; diff --git a/sys/vm/vm_tracking_map.pas b/sys/vm/vm_tracking_map.pas index ca54dbc7..2c61abbb 100644 --- a/sys/vm/vm_tracking_map.pas +++ b/sys/vm/vm_tracking_map.pas @@ -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.starte_start) and (obj^.align.startexclude) 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 diff --git a/vulkan/vCmdBuffer.pas b/vulkan/vCmdBuffer.pas index 558d5151..17250772 100644 --- a/vulkan/vCmdBuffer.pas +++ b/vulkan/vCmdBuffer.pas @@ -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; - { - 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; - } + t_cmd_track_deferred_set=specialize TNodeSplay; 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))-Integer(Pointer(a^.FSemaphore)b^.start)-Integer(a^.start0) then Exit; + //__end + Result:=Integer(a^.__end>b^.__end)-Integer(a^.__end0) then Exit; + //exclude + Result:=Integer(a^.exclude>b^.exclude)-Integer(a^.exclude0) 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; diff --git a/vulkan/vImageManager.pas b/vulkan/vImageManager.pas index 1ad071a7..cb9908d8 100644 --- a/vulkan/vImageManager.pas +++ b/vulkan/vImageManager.pas @@ -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; diff --git a/vulkan/vImageTiling.pas b/vulkan/vImageTiling.pas index 33eb6207..f680fb4f 100644 --- a/vulkan/vImageTiling.pas +++ b/vulkan/vImageTiling.pas @@ -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'];