mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
d3ea872e00
commit
c457625b5f
|
@ -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;
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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'];
|
||||
|
|
Loading…
Reference in New Issue