mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
9adee23bb0
commit
6608360b98
|
@ -47,16 +47,24 @@ uses
|
|||
type
|
||||
t_on_submit_flip_eop=function(submit_id:QWORD):Integer;
|
||||
|
||||
p_pm4_stall=^t_pm4_stall;
|
||||
t_pm4_stall=record
|
||||
next:p_pm4_stall;
|
||||
//
|
||||
list:TAILQ_HEAD; //p_pm4_stream
|
||||
end;
|
||||
|
||||
p_pm4_me=^t_pm4_me;
|
||||
t_pm4_me=object
|
||||
//
|
||||
queue:TIntrusiveMPSCQueue; //p_pm4_stream
|
||||
//
|
||||
stall:array[t_pm4_stream_type] of TAILQ_HEAD; //p_pm4_stream
|
||||
stall:array[t_pm4_stream_type] of t_pm4_stall;
|
||||
//
|
||||
sheduler:record
|
||||
start :t_pm4_stream_type;
|
||||
start :p_pm4_stall;
|
||||
switch:Boolean;
|
||||
count :Byte;
|
||||
end;
|
||||
//
|
||||
event:PRTLEvent;
|
||||
|
@ -76,6 +84,7 @@ type
|
|||
procedure knote_eventid(event_id,me_id:Byte;timestamp:QWORD;lockflags:Integer);
|
||||
procedure Push(var stream:t_pm4_stream);
|
||||
procedure reset_sheduler;
|
||||
procedure next_task;
|
||||
procedure switch_task;
|
||||
procedure add_stream (stream:p_pm4_stream);
|
||||
function get_next :p_pm4_stream;
|
||||
|
@ -121,7 +130,15 @@ begin
|
|||
|
||||
for i:=Low(t_pm4_stream_type) to High(t_pm4_stream_type) do
|
||||
begin
|
||||
TAILQ_INIT(@stall[i]);
|
||||
if (i=High(t_pm4_stream_type)) then
|
||||
begin
|
||||
stall[i].next:=@stall[Low(t_pm4_stream_type)];
|
||||
end else
|
||||
begin
|
||||
stall[i].next:=@stall[Succ(i)];
|
||||
end;
|
||||
//
|
||||
TAILQ_INIT(@stall[i].list);
|
||||
end;
|
||||
|
||||
gc_knlist:=knlist;
|
||||
|
@ -177,25 +194,32 @@ end;
|
|||
procedure t_pm4_me.reset_sheduler;
|
||||
begin
|
||||
//reset stall iterator
|
||||
sheduler.start :=Low(t_pm4_stream_type);
|
||||
sheduler.start :=@stall[Low(t_pm4_stream_type)];
|
||||
sheduler.switch:=False;
|
||||
sheduler.count :=0;
|
||||
end;
|
||||
|
||||
procedure t_pm4_me.next_task;
|
||||
begin
|
||||
//next
|
||||
sheduler.start:=sheduler.start^.next;
|
||||
end;
|
||||
|
||||
procedure t_pm4_me.switch_task;
|
||||
begin
|
||||
sheduler.switch:=True;
|
||||
//
|
||||
if (sheduler.start=High(t_pm4_stream_type)) then
|
||||
Inc(sheduler.count);
|
||||
//
|
||||
if (sheduler.count=Length(stall)) then
|
||||
begin
|
||||
//wait
|
||||
msleep_td(hz div 1000);
|
||||
//reset stall iterator
|
||||
sheduler.start:=Low(t_pm4_stream_type);
|
||||
end else
|
||||
begin
|
||||
//next
|
||||
sheduler.start:=Succ(sheduler.start);
|
||||
//
|
||||
sheduler.count:=0;
|
||||
end;
|
||||
//next
|
||||
next_task;
|
||||
end;
|
||||
|
||||
procedure t_pm4_me.add_stream(stream:p_pm4_stream);
|
||||
|
@ -203,24 +227,19 @@ var
|
|||
i:t_pm4_stream_type;
|
||||
begin
|
||||
i:=stream^.buft;
|
||||
TAILQ_INSERT_TAIL(@stall[i],stream,@stream^.next_);
|
||||
|
||||
//if first
|
||||
if (stream=TAILQ_FIRST(@stall[i])) then
|
||||
if (sheduler.start>i) then
|
||||
begin
|
||||
sheduler.start:=i;
|
||||
end;
|
||||
TAILQ_INSERT_TAIL(@stall[i].list,stream,@stream^.next_);
|
||||
end;
|
||||
|
||||
function t_pm4_me.get_next:p_pm4_stream;
|
||||
var
|
||||
i:t_pm4_stream_type;
|
||||
begin
|
||||
for i:=sheduler.start to t_pm4_stream_type(ord(sheduler.start)+ord(High(t_pm4_stream_type))) do
|
||||
for i:=Low(t_pm4_stream_type) to High(t_pm4_stream_type) do
|
||||
begin
|
||||
Result:=TAILQ_FIRST(@stall[t_pm4_stream_type(ord(i) mod Succ(ord(High(t_pm4_stream_type))))]);
|
||||
Result:=TAILQ_FIRST(@sheduler.start^.list);
|
||||
if (Result<>nil) then Break;
|
||||
//next
|
||||
next_task;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -231,7 +250,7 @@ var
|
|||
begin
|
||||
//pop
|
||||
i:=stream^.buft;
|
||||
TAILQ_REMOVE(@stall[i],stream,@stream^.next_);
|
||||
TAILQ_REMOVE(@stall[i].list,stream,@stream^.next_);
|
||||
//
|
||||
tmp:=stream^;
|
||||
tmp.Free;
|
||||
|
@ -319,7 +338,7 @@ begin
|
|||
With FUniformBuilder.FImages[i] do
|
||||
begin
|
||||
|
||||
resource_instance:=node^.scope.find_curr_image_resource(FImage);
|
||||
resource_instance:=node^.scope.find_image_resource_instance(FImage);
|
||||
|
||||
if (resource_instance<>nil) then
|
||||
begin
|
||||
|
@ -371,7 +390,7 @@ begin
|
|||
With FUniformBuilder.FBuffers[i] do
|
||||
begin
|
||||
|
||||
resource_instance:=node^.scope.find_curr_buffer_resource(addr,size);
|
||||
resource_instance:=node^.scope.find_buffer_resource_instance(addr,size);
|
||||
|
||||
if (resource_instance<>nil) then
|
||||
begin
|
||||
|
@ -676,7 +695,7 @@ begin
|
|||
For i:=0 to RenderCmd.RT_COUNT-1 do
|
||||
begin
|
||||
|
||||
resource_instance:=node^.scope.find_curr_image_resource(RenderCmd.RT_INFO[i].FImageInfo);
|
||||
resource_instance:=node^.scope.find_image_resource_instance(RenderCmd.RT_INFO[i].FImageInfo);
|
||||
|
||||
if (resource_instance<>nil) then
|
||||
begin
|
||||
|
@ -726,7 +745,7 @@ begin
|
|||
if rt_info.DB_ENABLE then
|
||||
begin
|
||||
|
||||
resource_instance:=node^.scope.find_curr_image_resource(GetDepthOnly(RenderCmd.DB_INFO.FImageInfo));
|
||||
resource_instance:=node^.scope.find_image_resource_instance(GetDepthOnly(RenderCmd.DB_INFO.FImageInfo));
|
||||
|
||||
if (resource_instance<>nil) then
|
||||
begin
|
||||
|
@ -736,7 +755,7 @@ begin
|
|||
);
|
||||
end;
|
||||
|
||||
resource_instance:=node^.scope.find_curr_image_resource(GetStencilOnly(RenderCmd.DB_INFO.FImageInfo));
|
||||
resource_instance:=node^.scope.find_image_resource_instance(GetStencilOnly(RenderCmd.DB_INFO.FImageInfo));
|
||||
|
||||
if (resource_instance<>nil) then
|
||||
begin
|
||||
|
@ -1295,7 +1314,7 @@ begin
|
|||
Continue;
|
||||
end else
|
||||
begin
|
||||
me^.reset_sheduler;
|
||||
me^.next_task;
|
||||
end;
|
||||
|
||||
me^.free_stream(stream);
|
||||
|
|
|
@ -1019,6 +1019,8 @@ procedure onEventWriteEos(pctx:p_pfp_ctx;Body:PPM4CMDEVENTWRITEEOS);
|
|||
var
|
||||
addr:Pointer;
|
||||
begin
|
||||
Assert(Body^.header.shaderType=1,'shaderType<>CS');
|
||||
|
||||
Case Body^.eventType of
|
||||
CS_DONE:Writeln(' CS_DONE');
|
||||
PS_DONE:Writeln(' PS_DONE');
|
||||
|
@ -1041,7 +1043,6 @@ begin
|
|||
end;
|
||||
|
||||
pctx^.stream[stGfxDcb].EventWriteEos(addr,Body^.data,Body^.eventType,Body^.command);
|
||||
|
||||
end;
|
||||
|
||||
procedure onDmaData(pctx:p_pfp_ctx;Body:PPM4DMADATA);
|
||||
|
@ -1426,6 +1427,12 @@ end;
|
|||
|
||||
procedure onDispatchDirect(pctx:p_pfp_ctx;Body:PPM4CMDDISPATCHDIRECT);
|
||||
begin
|
||||
Assert(Body^.header.shaderType=1,'shaderType<>CS');
|
||||
|
||||
if (DWORD(Body^.dispatchInitiator)<>1) then
|
||||
begin
|
||||
Writeln(stderr,' dispatchInitiator=b',revbinstr(DWORD(Body^.dispatchInitiator),32));
|
||||
end;
|
||||
|
||||
pctx^.SH_REG.COMPUTE_DIM_X:=Body^.dimX;
|
||||
pctx^.SH_REG.COMPUTE_DIM_Y:=Body^.dimY;
|
||||
|
|
|
@ -12,35 +12,23 @@ uses
|
|||
md_map,
|
||||
bittype,
|
||||
pm4defs,
|
||||
si_ci_vi_merged_offset,
|
||||
si_ci_vi_merged_enum,
|
||||
si_ci_vi_merged_registers,
|
||||
si_ci_vi_merged_groups,
|
||||
|
||||
Vulkan,
|
||||
vDevice,
|
||||
vBuffer,
|
||||
vHostBufferManager,
|
||||
|
||||
vImage,
|
||||
vImageManager,
|
||||
vRender,
|
||||
vRenderPassManager,
|
||||
vPipelineManager,
|
||||
vFramebufferManager,
|
||||
|
||||
vShader,
|
||||
vShaderExt,
|
||||
vShaderManager,
|
||||
|
||||
vRegs2Vulkan,
|
||||
vCmdBuffer,
|
||||
vPipeline,
|
||||
vSetsPoolManager,
|
||||
vSampler,
|
||||
vSamplerManager,
|
||||
|
||||
vImageTiling,
|
||||
g_node_splay,
|
||||
g_node_splay
|
||||
|
||||
shader_dump
|
||||
;
|
||||
|
||||
type
|
||||
|
@ -140,24 +128,21 @@ const
|
|||
R_BUF=1;
|
||||
|
||||
type
|
||||
p_pm4_resource_instance=^t_pm4_resource_instance;
|
||||
p_pm4_resource_instance =^t_pm4_resource_instance;
|
||||
p_pm4_resource_curr_scope =^t_pm4_resource_curr_scope;
|
||||
p_pm4_resource_stream_scope=^t_pm4_resource_stream_scope;
|
||||
|
||||
p_pm4_resource_scope=^t_pm4_resource_scope;
|
||||
t_pm4_resource_scope=object
|
||||
list:TAILQ_HEAD; //p_pm4_resource
|
||||
function empty:Boolean;
|
||||
p_pm4_resource_init_scope=^t_pm4_resource_init_scope;
|
||||
t_pm4_resource_init_scope=object
|
||||
list:TAILQ_HEAD; //p_pm4_resource_instance
|
||||
function first:p_pm4_resource_instance;
|
||||
function last:p_pm4_resource_instance;
|
||||
procedure insert_init(i:p_pm4_resource_instance);
|
||||
procedure insert_curr(i:p_pm4_resource_instance);
|
||||
function find_curr_image_resource (const rkey:TvImageKey):p_pm4_resource_instance;
|
||||
function find_curr_buffer_resource(addr:Pointer;size:DWORD):p_pm4_resource_instance;
|
||||
procedure insert(i:p_pm4_resource_instance);
|
||||
end;
|
||||
|
||||
p_pm4_resource=^t_pm4_resource;
|
||||
t_pm4_resource=object
|
||||
pLeft :p_pm4_resource;
|
||||
pRight:p_pm4_resource;
|
||||
pLeft :p_pm4_resource; //t_pm4_resource_set
|
||||
pRight:p_pm4_resource; //t_pm4_resource_set
|
||||
//
|
||||
rwrite:p_pm4_resource_instance;
|
||||
//
|
||||
|
@ -170,12 +155,14 @@ type
|
|||
|
||||
t_pm4_resource_set=specialize TNodeSplay<t_pm4_resource>;
|
||||
|
||||
t_pm4_resource_instance=record
|
||||
init_entry:TAILQ_ENTRY;
|
||||
curr_entry:TAILQ_ENTRY;
|
||||
t_pm4_resource_instance=object
|
||||
init_entry:TAILQ_ENTRY; //p_pm4_resource_init_scope
|
||||
//
|
||||
init_scope:p_pm4_resource_scope;
|
||||
curr_scope:p_pm4_resource_scope;
|
||||
pLeft :p_pm4_resource_instance; //t_pm4_resource_instance_set
|
||||
pRight:p_pm4_resource_instance; //t_pm4_resource_instance_set
|
||||
//
|
||||
init_scope:p_pm4_resource_init_scope;
|
||||
curr_scope:p_pm4_resource_curr_scope;
|
||||
//
|
||||
resource:p_pm4_resource;
|
||||
//
|
||||
|
@ -186,13 +173,44 @@ type
|
|||
curr_img_usage:s_image_usage;
|
||||
prev_img_usage:s_image_usage;
|
||||
next_img_usage:s_image_usage;
|
||||
//
|
||||
function c(n1,n2:p_pm4_resource_instance):Integer; static;
|
||||
end;
|
||||
|
||||
t_pm4_resource_instance_set=specialize TNodeSplay<t_pm4_resource_instance>;
|
||||
|
||||
t_pm4_resource_curr_scope=object
|
||||
resource_instance_set:t_pm4_resource_instance_set;
|
||||
procedure insert(i:p_pm4_resource_instance);
|
||||
function find_resource_instance(r:p_pm4_resource):p_pm4_resource_instance;
|
||||
function find_image_resource_instance (const rkey:TvImageKey):p_pm4_resource_instance;
|
||||
function find_buffer_resource_instance(addr:Pointer;size:DWORD):p_pm4_resource_instance;
|
||||
end;
|
||||
|
||||
t_pm4_resource_stream_scope=object
|
||||
next_:TAILQ_HEAD; //Must be the first element in memory
|
||||
//
|
||||
allocator:t_pm4_allocator;
|
||||
//
|
||||
resource_set:t_pm4_resource_set;
|
||||
init_scope:t_pm4_resource_init_scope;
|
||||
//
|
||||
function find_image_resource (const rkey:TvImageKey):p_pm4_resource;
|
||||
function fetch_image_resource (const rkey:TvImageKey):p_pm4_resource;
|
||||
function find_buffer_resource (addr:Pointer;size:DWORD):p_pm4_resource;
|
||||
function fetch_buffer_resource (addr:Pointer;size:DWORD):p_pm4_resource;
|
||||
function fetch_resource_instance (scope:p_pm4_resource_curr_scope;r:p_pm4_resource;mem_usage:Integer;img_usage:s_image_usage):p_pm4_resource_instance;
|
||||
function insert_image_resource (scope:p_pm4_resource_curr_scope;const rkey:TvImageKey;mem_usage:Integer;img_usage:s_image_usage):p_pm4_resource_instance;
|
||||
function insert_buffer_resource (scope:p_pm4_resource_curr_scope;addr:Pointer;size:DWORD;mem_usage:Integer):p_pm4_resource_instance;
|
||||
procedure connect_resource_instance (i:p_pm4_resource_instance);
|
||||
procedure connect_resource_scope (scope:p_pm4_resource_curr_scope);
|
||||
end;
|
||||
|
||||
p_pm4_node=^t_pm4_node;
|
||||
t_pm4_node=object
|
||||
entry:TAILQ_ENTRY;
|
||||
//
|
||||
scope:t_pm4_resource_scope;
|
||||
scope:t_pm4_resource_curr_scope;
|
||||
//
|
||||
ntype:t_pm4_node_type;
|
||||
end;
|
||||
|
@ -296,16 +314,10 @@ type
|
|||
end;
|
||||
|
||||
p_pm4_stream=^t_pm4_stream;
|
||||
t_pm4_stream=object
|
||||
next_:TAILQ_HEAD;
|
||||
//
|
||||
allocator:t_pm4_allocator;
|
||||
t_pm4_stream=object(t_pm4_resource_stream_scope)
|
||||
//
|
||||
list:TAILQ_HEAD; //t_pm4_node
|
||||
//
|
||||
resource_set:t_pm4_resource_set;
|
||||
init_scope:t_pm4_resource_scope;
|
||||
//
|
||||
buft:t_pm4_stream_type;
|
||||
//
|
||||
curr:p_pm4_node;
|
||||
|
@ -315,12 +327,6 @@ type
|
|||
function First:p_pm4_node;
|
||||
function Next(node:p_pm4_node):p_pm4_node; static;
|
||||
//
|
||||
function fetch_image_resource (const rkey:TvImageKey):p_pm4_resource;
|
||||
function fetch_buffer_resource (addr:Pointer;size:DWORD):p_pm4_resource;
|
||||
function fetch_resource_instance(r:p_pm4_resource;mem_usage:Integer;img_usage:s_image_usage):p_pm4_resource_instance;
|
||||
function insert_image_resource (node:p_pm4_node;const rkey:TvImageKey;mem_usage:Integer;img_usage:s_image_usage):p_pm4_resource_instance;
|
||||
function insert_buffer_resource (node:p_pm4_node;addr:Pointer;size:DWORD;mem_usage:Integer):p_pm4_resource_instance;
|
||||
//
|
||||
procedure LoadConstRam (addr:Pointer;num_dw,offset:Word);
|
||||
procedure EventWrite (eventType:Byte);
|
||||
procedure EventWriteEop(addr:Pointer;data:QWORD;eventType,dataSel,intSel:Byte);
|
||||
|
@ -365,36 +371,45 @@ begin
|
|||
//1 Addr
|
||||
Result:=Integer(n1^.rkey.Addr>n2^.rkey.Addr)-Integer(n1^.rkey.Addr<n2^.rkey.Addr);
|
||||
if (Result<>0) then Exit;
|
||||
//1 Stencil
|
||||
Result:=Integer(n1^.rkey.Addr2>n2^.rkey.Addr2)-Integer(n1^.rkey.Addr2<n2^.rkey.Addr2);
|
||||
if (Result<>0) then Exit;
|
||||
//2 cformat
|
||||
Result:=Integer(n1^.rkey.cformat>n2^.rkey.cformat)-Integer(n1^.rkey.cformat<n2^.rkey.cformat);
|
||||
if (Result<>0) then Exit;
|
||||
//3 params
|
||||
Result:=CompareByte(n1^.rkey.params,n2^.rkey.params,SizeOf(TvImageKey.params));
|
||||
|
||||
case n1^.rtype of
|
||||
R_IMG:
|
||||
begin
|
||||
//2 cformat
|
||||
Result:=Integer(n1^.rkey.cformat>n2^.rkey.cformat)-Integer(n1^.rkey.cformat<n2^.rkey.cformat);
|
||||
if (Result<>0) then Exit;
|
||||
//3 params
|
||||
Result:=CompareByte(n1^.rkey.params,n2^.rkey.params,SizeOf(TvImageKey.params));
|
||||
end;
|
||||
R_BUF:
|
||||
begin
|
||||
//2 rsize
|
||||
Result:=Integer(n1^.rsize>n2^.rsize)-Integer(n1^.rsize<n2^.rsize);
|
||||
end;
|
||||
else;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
function t_pm4_resource_instance.c(n1,n2:p_pm4_resource_instance):Integer;
|
||||
begin
|
||||
Result:=t_pm4_resource.c(n1^.resource,n2^.resource);
|
||||
end;
|
||||
|
||||
//
|
||||
|
||||
function t_pm4_resource_scope.empty:Boolean;
|
||||
begin
|
||||
Result:=(TAILQ_FIRST(@list)=nil);
|
||||
end;
|
||||
|
||||
function t_pm4_resource_scope.first:p_pm4_resource_instance;
|
||||
function t_pm4_resource_init_scope.first:p_pm4_resource_instance;
|
||||
begin
|
||||
Result:=TAILQ_FIRST(@list);
|
||||
end;
|
||||
|
||||
function t_pm4_resource_scope.last:p_pm4_resource_instance;
|
||||
begin
|
||||
if (list.tqh_last=nil) then Exit(nil);
|
||||
Result:=TAILQ_LAST(@list);
|
||||
end;
|
||||
|
||||
procedure t_pm4_resource_scope.insert_init(i:p_pm4_resource_instance);
|
||||
procedure t_pm4_resource_init_scope.insert(i:p_pm4_resource_instance);
|
||||
begin
|
||||
if (i^.init_entry.tqe_next<>nil) or
|
||||
(i^.init_entry.tqe_prev<>nil) then Exit;
|
||||
|
||||
if (list.tqh_first=nil) and
|
||||
(list.tqh_last =nil) then
|
||||
begin
|
||||
|
@ -406,98 +421,81 @@ begin
|
|||
i^.init_scope:=@self;
|
||||
end;
|
||||
|
||||
procedure t_pm4_resource_scope.insert_curr(i:p_pm4_resource_instance);
|
||||
begin
|
||||
if (list.tqh_first=nil) and
|
||||
(list.tqh_last =nil) then
|
||||
begin
|
||||
TAILQ_INIT(@list);
|
||||
end;
|
||||
|
||||
TAILQ_INSERT_TAIL(@list,i,@i^.curr_entry);
|
||||
|
||||
i^.curr_scope:=@self;
|
||||
end;
|
||||
|
||||
function t_pm4_resource_scope.find_curr_image_resource(const rkey:TvImageKey):p_pm4_resource_instance;
|
||||
var
|
||||
node:p_pm4_resource_instance;
|
||||
begin
|
||||
Result:=nil;
|
||||
|
||||
if (rkey.cformat=VK_FORMAT_UNDEFINED) then Exit;
|
||||
|
||||
node:=TAILQ_FIRST(@list);
|
||||
|
||||
while (node<>nil) do
|
||||
begin
|
||||
|
||||
if (node^.resource^.rtype=R_IMG) and
|
||||
(CompareByte(node^.resource^.rkey,rkey,sizeOf(TvImageKey))=0) then
|
||||
begin
|
||||
Exit(node);
|
||||
end;
|
||||
|
||||
node:=TAILQ_NEXT(node,@node^.curr_entry);
|
||||
end;
|
||||
end;
|
||||
|
||||
function t_pm4_resource_scope.find_curr_buffer_resource(addr:Pointer;size:DWORD):p_pm4_resource_instance;
|
||||
var
|
||||
node:p_pm4_resource_instance;
|
||||
begin
|
||||
Result:=nil;
|
||||
|
||||
node:=TAILQ_FIRST(@list);
|
||||
|
||||
while (node<>nil) do
|
||||
begin
|
||||
|
||||
if (node^.resource^.rtype=R_BUF) and
|
||||
(node^.resource^.rkey.Addr=addr) and
|
||||
(node^.resource^.rsize=size) then
|
||||
begin
|
||||
Exit(node);
|
||||
end;
|
||||
|
||||
node:=TAILQ_NEXT(node,@node^.curr_entry);
|
||||
end;
|
||||
end;
|
||||
|
||||
//
|
||||
|
||||
procedure t_pm4_stream.Free;
|
||||
procedure t_pm4_resource_curr_scope.insert(i:p_pm4_resource_instance);
|
||||
var
|
||||
f:p_pm4_resource_instance;
|
||||
begin
|
||||
list:=Default(TAILQ_HEAD);
|
||||
allocator.Free;
|
||||
end;
|
||||
f:=resource_instance_set.Find(i);
|
||||
|
||||
Procedure t_pm4_stream.add_node(node:p_pm4_node);
|
||||
begin
|
||||
if (list.tqh_first=nil) and
|
||||
(list.tqh_last =nil) then
|
||||
if (f<>nil) then
|
||||
begin
|
||||
TAILQ_INIT(@list);
|
||||
//union
|
||||
|
||||
f^.curr_mem_usage:=f^.curr_mem_usage or i^.curr_mem_usage;
|
||||
f^.prev_mem_usage:=f^.prev_mem_usage or i^.prev_mem_usage;
|
||||
f^.next_mem_usage:=f^.next_mem_usage or i^.next_mem_usage;
|
||||
|
||||
f^.curr_img_usage:=f^.curr_img_usage + i^.curr_img_usage;
|
||||
f^.prev_img_usage:=f^.prev_img_usage + i^.prev_img_usage;
|
||||
f^.next_img_usage:=f^.next_img_usage + i^.next_img_usage;
|
||||
end else
|
||||
begin
|
||||
resource_instance_set.Insert(i);
|
||||
end;
|
||||
|
||||
TAILQ_INSERT_TAIL(@list,node,@node^.entry);
|
||||
//
|
||||
end;
|
||||
|
||||
function t_pm4_stream.First:p_pm4_node;
|
||||
function t_pm4_resource_curr_scope.find_resource_instance(r:p_pm4_resource):p_pm4_resource_instance;
|
||||
var
|
||||
tmp:t_pm4_resource_instance;
|
||||
begin
|
||||
Result:=TAILQ_FIRST(@list);
|
||||
if (r=nil) then Exit(nil);
|
||||
|
||||
tmp:=Default(t_pm4_resource_instance);
|
||||
tmp.resource:=r;
|
||||
|
||||
Result:=resource_instance_set.Find(@tmp);
|
||||
end;
|
||||
|
||||
function t_pm4_stream.Next(node:p_pm4_node):p_pm4_node;
|
||||
function t_pm4_resource_curr_scope.find_image_resource_instance(const rkey:TvImageKey):p_pm4_resource_instance;
|
||||
var
|
||||
tmp:t_pm4_resource;
|
||||
begin
|
||||
Result:=TAILQ_NEXT(node,@node^.entry);
|
||||
if (rkey.cformat=VK_FORMAT_UNDEFINED) then Exit(nil);
|
||||
|
||||
tmp:=Default(t_pm4_resource);
|
||||
tmp.rtype:=R_IMG;
|
||||
tmp.rkey :=rkey;
|
||||
|
||||
Result:=find_resource_instance(@tmp);
|
||||
end;
|
||||
|
||||
//
|
||||
function t_pm4_resource_curr_scope.find_buffer_resource_instance(addr:Pointer;size:DWORD):p_pm4_resource_instance;
|
||||
var
|
||||
tmp:t_pm4_resource;
|
||||
begin
|
||||
tmp:=Default(t_pm4_resource);
|
||||
tmp.rtype:=R_BUF;
|
||||
tmp.rkey.Addr:=addr;
|
||||
|
||||
// resource_set:t_pm4_resource_set;
|
||||
Result:=find_resource_instance(@tmp);
|
||||
end;
|
||||
|
||||
function t_pm4_stream.fetch_image_resource(const rkey:TvImageKey):p_pm4_resource;
|
||||
function t_pm4_resource_stream_scope.find_image_resource(const rkey:TvImageKey):p_pm4_resource;
|
||||
var
|
||||
tmp:t_pm4_resource;
|
||||
begin
|
||||
tmp:=Default(t_pm4_resource);
|
||||
tmp.rtype:=R_IMG;
|
||||
tmp.rkey :=rkey;
|
||||
|
||||
Result:=resource_set.Find(@tmp);
|
||||
end;
|
||||
|
||||
function t_pm4_resource_stream_scope.fetch_image_resource(const rkey:TvImageKey):p_pm4_resource;
|
||||
var
|
||||
tmp:t_pm4_resource;
|
||||
begin
|
||||
|
@ -518,20 +516,31 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function t_pm4_stream.fetch_buffer_resource(addr:Pointer;size:DWORD):p_pm4_resource;
|
||||
function t_pm4_resource_stream_scope.find_buffer_resource(addr:Pointer;size:DWORD):p_pm4_resource;
|
||||
var
|
||||
tmp:t_pm4_resource;
|
||||
begin
|
||||
tmp:=Default(t_pm4_resource);
|
||||
tmp.rtype:=R_BUF;
|
||||
tmp.rkey.Addr:=addr;
|
||||
tmp.rsize:=size;
|
||||
|
||||
Result:=resource_set.Find(@tmp);
|
||||
end;
|
||||
|
||||
function t_pm4_resource_stream_scope.fetch_buffer_resource(addr:Pointer;size:DWORD):p_pm4_resource;
|
||||
var
|
||||
tmp:t_pm4_resource;
|
||||
begin
|
||||
tmp:=Default(t_pm4_resource);
|
||||
tmp.rtype:=R_BUF;
|
||||
tmp.rkey.Addr:=addr;
|
||||
tmp.rsize:=size;
|
||||
|
||||
Result:=resource_set.Find(@tmp);
|
||||
|
||||
if (Result=nil) then
|
||||
begin
|
||||
tmp.rsize:=size;
|
||||
|
||||
Result:=allocator.Alloc(SizeOf(t_pm4_resource));
|
||||
Result^:=tmp;
|
||||
|
||||
|
@ -539,7 +548,69 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function t_pm4_stream.fetch_resource_instance(r:p_pm4_resource;mem_usage:Integer;img_usage:s_image_usage):p_pm4_resource_instance;
|
||||
function t_pm4_resource_stream_scope.fetch_resource_instance(scope:p_pm4_resource_curr_scope;r:p_pm4_resource;mem_usage:Integer;img_usage:s_image_usage):p_pm4_resource_instance;
|
||||
begin
|
||||
Result:=scope^.find_resource_instance(r);
|
||||
|
||||
if (Result=nil) then
|
||||
begin
|
||||
Result:=allocator.Alloc(SizeOf(t_pm4_resource_instance));
|
||||
Result^:=Default(t_pm4_resource_instance);
|
||||
//
|
||||
Result^.resource:=r;
|
||||
Result^.curr_mem_usage:=mem_usage;
|
||||
Result^.curr_img_usage:=img_usage;
|
||||
end else
|
||||
begin
|
||||
Result^.curr_mem_usage:=Result^.curr_mem_usage or mem_usage;
|
||||
Result^.curr_img_usage:=Result^.curr_img_usage + img_usage;
|
||||
end;
|
||||
|
||||
end;
|
||||
|
||||
function t_pm4_resource_stream_scope.insert_image_resource(scope:p_pm4_resource_curr_scope;const rkey:TvImageKey;mem_usage:Integer;img_usage:s_image_usage):p_pm4_resource_instance;
|
||||
var
|
||||
r:p_pm4_resource;
|
||||
i:p_pm4_resource_instance;
|
||||
begin
|
||||
if (rkey.cformat=VK_FORMAT_UNDEFINED) then Exit;
|
||||
|
||||
r:=fetch_image_resource(rkey);
|
||||
i:=fetch_resource_instance(scope,r,mem_usage,img_usage);
|
||||
|
||||
if ((mem_usage and TM_READ)<>0) then
|
||||
if (i^.prev_mem_usage=0) then //no prev usage
|
||||
begin
|
||||
//init
|
||||
init_scope.insert(i);
|
||||
end;
|
||||
|
||||
scope^.insert(i);
|
||||
|
||||
Result:=i;
|
||||
end;
|
||||
|
||||
function t_pm4_resource_stream_scope.insert_buffer_resource(scope:p_pm4_resource_curr_scope;addr:Pointer;size:DWORD;mem_usage:Integer):p_pm4_resource_instance;
|
||||
var
|
||||
r:p_pm4_resource;
|
||||
i:p_pm4_resource_instance;
|
||||
begin
|
||||
r:=fetch_buffer_resource(addr,size);
|
||||
i:=fetch_resource_instance(scope,r,mem_usage,[iu_buffer]);
|
||||
|
||||
if ((mem_usage and TM_READ)<>0) then
|
||||
if (i^.prev_mem_usage=0) then //no prev usage
|
||||
begin
|
||||
//init
|
||||
init_scope.insert(i);
|
||||
end;
|
||||
|
||||
scope^.insert(i);
|
||||
|
||||
Result:=i;
|
||||
end;
|
||||
|
||||
procedure t_pm4_resource_stream_scope.connect_resource_instance(i:p_pm4_resource_instance);
|
||||
var
|
||||
start:Pointer;
|
||||
__end:Pointer;
|
||||
|
@ -547,16 +618,10 @@ var
|
|||
prev:p_pm4_resource_instance;
|
||||
tmp:t_pm4_resource;
|
||||
begin
|
||||
Result:=allocator.Alloc(SizeOf(t_pm4_resource_instance));
|
||||
|
||||
Result^:=Default(t_pm4_resource_instance);
|
||||
|
||||
Result^.resource :=r;
|
||||
Result^.curr_mem_usage:=mem_usage;
|
||||
Result^.curr_img_usage:=img_usage;
|
||||
//find cross
|
||||
|
||||
tmp:=Default(t_pm4_resource);
|
||||
tmp:=r^;
|
||||
tmp:=i^.resource^;
|
||||
|
||||
start:=tmp.rkey.Addr;
|
||||
__end:=start+tmp.rsize;
|
||||
|
@ -576,19 +641,19 @@ begin
|
|||
if (__end>(node^.rkey.Addr)) and (start<(node^.rkey.Addr+node^.rsize)) then
|
||||
begin
|
||||
prev:=node^.rwrite;
|
||||
if (prev<>nil) then
|
||||
if (prev<>nil) and (prev<>i) then
|
||||
begin
|
||||
//sum prev of curr
|
||||
Result^.prev_mem_usage:=Result^.prev_mem_usage or prev^.curr_mem_usage;
|
||||
Result^.prev_img_usage:=Result^.prev_img_usage + prev^.curr_img_usage;
|
||||
i^.prev_mem_usage:=i^.prev_mem_usage or prev^.curr_mem_usage;
|
||||
i^.prev_img_usage:=i^.prev_img_usage + prev^.curr_img_usage;
|
||||
//sum next of prev
|
||||
prev^.next_mem_usage:=prev^.next_mem_usage or mem_usage;
|
||||
prev^.next_img_usage:=prev^.next_img_usage + img_usage;
|
||||
prev^.next_mem_usage:=prev^.next_mem_usage or i^.curr_mem_usage;
|
||||
prev^.next_img_usage:=prev^.next_img_usage + i^.curr_img_usage;
|
||||
end;
|
||||
//
|
||||
if ((mem_usage and (TM_WRITE or TM_CLEAR))<>0) then
|
||||
if ((i^.curr_mem_usage and (TM_WRITE or TM_CLEAR))<>0) then
|
||||
begin
|
||||
node^.rwrite:=Result;
|
||||
node^.rwrite:=i;
|
||||
end;
|
||||
end;
|
||||
|
||||
|
@ -596,46 +661,51 @@ begin
|
|||
end;
|
||||
end;
|
||||
|
||||
function t_pm4_stream.insert_image_resource(node:p_pm4_node;const rkey:TvImageKey;mem_usage:Integer;img_usage:s_image_usage):p_pm4_resource_instance;
|
||||
procedure t_pm4_resource_stream_scope.connect_resource_scope(scope:p_pm4_resource_curr_scope);
|
||||
var
|
||||
r:p_pm4_resource;
|
||||
i:p_pm4_resource_instance;
|
||||
node:p_pm4_resource_instance;
|
||||
begin
|
||||
if (rkey.cformat=VK_FORMAT_UNDEFINED) then Exit;
|
||||
node:=scope^.resource_instance_set.Min;
|
||||
|
||||
r:=fetch_image_resource(rkey);
|
||||
i:=fetch_resource_instance(r,mem_usage,img_usage);
|
||||
|
||||
if ((mem_usage and TM_READ)<>0) then
|
||||
if (i^.prev_mem_usage=0) then //no prev usage
|
||||
while (node<>nil) do
|
||||
begin
|
||||
//init
|
||||
init_scope.insert_init(i);
|
||||
|
||||
connect_resource_instance(node);
|
||||
|
||||
node:=scope^.resource_instance_set.Next(node);
|
||||
end;
|
||||
|
||||
node^.scope.insert_curr(i);
|
||||
|
||||
Result:=i;
|
||||
end;
|
||||
|
||||
function t_pm4_stream.insert_buffer_resource(node:p_pm4_node;addr:Pointer;size:DWORD;mem_usage:Integer):p_pm4_resource_instance;
|
||||
var
|
||||
r:p_pm4_resource;
|
||||
i:p_pm4_resource_instance;
|
||||
begin
|
||||
r:=fetch_buffer_resource(addr,size);
|
||||
i:=fetch_resource_instance(r,mem_usage,[iu_buffer]);
|
||||
//
|
||||
|
||||
if ((mem_usage and TM_READ)<>0) then
|
||||
if (i^.prev_mem_usage=0) then //no prev usage
|
||||
procedure t_pm4_stream.Free;
|
||||
begin
|
||||
list:=Default(TAILQ_HEAD);
|
||||
allocator.Free;
|
||||
end;
|
||||
|
||||
Procedure t_pm4_stream.add_node(node:p_pm4_node);
|
||||
begin
|
||||
if (list.tqh_first=nil) and
|
||||
(list.tqh_last =nil) then
|
||||
begin
|
||||
//init
|
||||
init_scope.insert_init(i);
|
||||
TAILQ_INIT(@list);
|
||||
end;
|
||||
|
||||
node^.scope.insert_curr(i);
|
||||
TAILQ_INSERT_TAIL(@list,node,@node^.entry);
|
||||
|
||||
Result:=i;
|
||||
connect_resource_scope(@node^.scope);
|
||||
end;
|
||||
|
||||
function t_pm4_stream.First:p_pm4_node;
|
||||
begin
|
||||
Result:=TAILQ_FIRST(@list);
|
||||
end;
|
||||
|
||||
function t_pm4_stream.Next(node:p_pm4_node):p_pm4_node;
|
||||
begin
|
||||
Result:=TAILQ_NEXT(node,@node^.entry);
|
||||
end;
|
||||
|
||||
//
|
||||
|
@ -647,7 +717,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_LoadConstRam));
|
||||
|
||||
node^.ntype :=ntLoadConstRam;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
node^.addr :=addr;
|
||||
node^.num_dw:=num_dw;
|
||||
node^.offset:=offset;
|
||||
|
@ -662,7 +732,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_EventWrite));
|
||||
|
||||
node^.ntype :=ntEventWrite;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
node^.eventType:=eventType;
|
||||
|
||||
add_node(node);
|
||||
|
@ -675,7 +745,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_EventWriteEop));
|
||||
|
||||
node^.ntype :=ntEventWriteEop;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
node^.addr :=addr;
|
||||
node^.data :=data;
|
||||
node^.eventType:=eventType;
|
||||
|
@ -692,7 +762,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_EventWriteEos));
|
||||
|
||||
node^.ntype :=ntEventWriteEos;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
node^.addr :=addr;
|
||||
node^.data :=data;
|
||||
node^.eventType:=eventType;
|
||||
|
@ -708,7 +778,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_SubmitFlipEop));
|
||||
|
||||
node^.ntype :=ntSubmitFlipEop;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
node^.eop_value:=eop_value;
|
||||
node^.intSel :=intSel;
|
||||
|
||||
|
@ -722,7 +792,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_DmaData));
|
||||
|
||||
node^.ntype :=ntDmaData;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
node^.dst :=dst;
|
||||
node^.src :=srcOrData;
|
||||
node^.numBytes:=numBytes;
|
||||
|
@ -740,7 +810,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_WriteData)+num_dw*SizeOf(DWORD));
|
||||
|
||||
node^.ntype :=ntWriteData;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
node^.dst :=dst;
|
||||
node^.src :=Pointer(node+1);
|
||||
node^.num_dw:=num_dw;
|
||||
|
@ -758,7 +828,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_WaitRegMem));
|
||||
|
||||
node^.ntype :=ntWaitRegMem;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
node^.pollAddr :=pollAddr;
|
||||
node^.refValue :=refValue;
|
||||
node^.mask :=mask;
|
||||
|
@ -774,7 +844,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_FastClear));
|
||||
|
||||
node^.ntype :=ntFastClear;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
node^.CX_REG:=CX_REG;
|
||||
|
||||
add_node(node);
|
||||
|
@ -787,7 +857,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_Resolve));
|
||||
|
||||
node^.ntype :=ntResolve;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
node^.CX_REG:=CX_REG;
|
||||
|
||||
add_node(node);
|
||||
|
@ -834,7 +904,7 @@ begin
|
|||
With FUniformBuilder.FImages[i] do
|
||||
begin
|
||||
|
||||
insert_image_resource(node,FImage,TM_READ,[iu_sampled]);
|
||||
insert_image_resource(@node^.scope,FImage,TM_READ,[iu_sampled]);
|
||||
|
||||
end;
|
||||
end;
|
||||
|
@ -848,7 +918,7 @@ begin
|
|||
begin
|
||||
|
||||
//TODO: check write flag
|
||||
insert_buffer_resource(node,addr,size,TM_READ or TM_WRITE);
|
||||
insert_buffer_resource(@node^.scope,addr,size,TM_READ or TM_WRITE);
|
||||
|
||||
end;
|
||||
end;
|
||||
|
@ -889,7 +959,7 @@ begin
|
|||
|
||||
//
|
||||
|
||||
insert_image_resource(node,RT.FImageInfo,RT.IMAGE_USAGE,[iu_attachment]);
|
||||
insert_image_resource(@node^.scope,RT.FImageInfo,RT.IMAGE_USAGE,[iu_attachment]);
|
||||
|
||||
//
|
||||
|
||||
|
@ -906,8 +976,8 @@ begin
|
|||
|
||||
//
|
||||
|
||||
insert_image_resource(node,GetDepthOnly (rt_info.DB_INFO.FImageInfo),rt_info.DB_INFO.DEPTH_USAGE ,[iu_depthstenc]);
|
||||
insert_image_resource(node,GetStencilOnly(rt_info.DB_INFO.FImageInfo),rt_info.DB_INFO.STENCIL_USAGE,[iu_depthstenc]);
|
||||
insert_image_resource(@node^.scope,GetDepthOnly (rt_info.DB_INFO.FImageInfo),rt_info.DB_INFO.DEPTH_USAGE ,[iu_depthstenc]);
|
||||
insert_image_resource(@node^.scope,GetStencilOnly(rt_info.DB_INFO.FImageInfo),rt_info.DB_INFO.STENCIL_USAGE,[iu_depthstenc]);
|
||||
end;
|
||||
|
||||
rt_info.BLEND_INFO:=GPU_REGS.GET_BLEND_INFO;
|
||||
|
@ -979,7 +1049,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_draw));
|
||||
|
||||
node^.ntype :=ntype;
|
||||
node^.scope :=Default(t_pm4_resource_scope);
|
||||
node^.scope :=Default(t_pm4_resource_curr_scope);
|
||||
|
||||
Build_rt_info(node,node^.rt_info,GPU_REGS);
|
||||
|
||||
|
@ -1066,7 +1136,7 @@ begin
|
|||
node:=allocator.Alloc(SizeOf(t_pm4_node_DispatchDirect));
|
||||
|
||||
node^.ntype:=ntDispatchDirect;
|
||||
node^.scope:=Default(t_pm4_resource_scope);
|
||||
node^.scope:=Default(t_pm4_resource_curr_scope);
|
||||
|
||||
Build_cs_info(node,GPU_REGS);
|
||||
|
||||
|
|
|
@ -235,13 +235,13 @@ begin
|
|||
|
||||
end;
|
||||
|
||||
gc_ring_pm4_drain(@ring_gfx,size);
|
||||
|
||||
//
|
||||
for buft:=Low(t_pm4_stream_type) to High(t_pm4_stream_type) do
|
||||
begin
|
||||
pfp_ctx.Flush_stream(buft);;
|
||||
end;
|
||||
|
||||
gc_ring_pm4_drain(@ring_gfx,size);
|
||||
//
|
||||
Continue;
|
||||
end;
|
||||
|
|
|
@ -7,9 +7,7 @@ interface
|
|||
uses
|
||||
Classes,
|
||||
SysUtils,
|
||||
//ps4_types,
|
||||
g23tree,
|
||||
//ps4_libSceVideoOut,
|
||||
si_ci_vi_merged_enum,
|
||||
Vulkan,
|
||||
vDependence,
|
||||
|
@ -20,7 +18,6 @@ uses
|
|||
vImage,
|
||||
vPipeline,
|
||||
vPipelineManager,
|
||||
//vSetsPools,
|
||||
vRender;
|
||||
|
||||
type
|
||||
|
@ -366,7 +363,7 @@ begin
|
|||
|
||||
info.waitSemaphoreCount:=i;
|
||||
info.pWaitSemaphores :=@FHandles[0];
|
||||
info.pWaitDstStageMask :=@FStages[0];
|
||||
info.pWaitDstStageMask :=@FStages[0];
|
||||
|
||||
end;
|
||||
|
||||
|
|
|
@ -75,11 +75,15 @@ type
|
|||
end;
|
||||
|
||||
const
|
||||
//useage image
|
||||
//usage image
|
||||
TM_READ =1;
|
||||
TM_WRITE=2;
|
||||
TM_CLEAR=4;
|
||||
|
||||
type
|
||||
t_image_usage=(iu_attachment,iu_depthstenc,iu_sampled,iu_storage,iu_buffer);
|
||||
s_image_usage=set of t_image_usage;
|
||||
|
||||
type
|
||||
TvExtent3D=packed record
|
||||
width :Word; //(0..16383)
|
||||
|
|
|
@ -32,9 +32,6 @@ uses
|
|||
}
|
||||
|
||||
type
|
||||
t_image_usage=(iu_attachment,iu_depthstenc,iu_sampled,iu_storage,iu_buffer);
|
||||
s_image_usage=set of t_image_usage;
|
||||
|
||||
TvImageView2Compare=object
|
||||
function c(a,b:PvImageViewKey):Integer; static;
|
||||
end;
|
||||
|
@ -134,6 +131,7 @@ type
|
|||
end;
|
||||
|
||||
TvDepthStencilImage2=class(TvImage2)
|
||||
procedure FreeHandle; override;
|
||||
function Compile(ext:Pointer):Boolean; override;
|
||||
procedure assign_vm_track; override;
|
||||
Destructor Destroy; override;
|
||||
|
@ -299,7 +297,7 @@ end;
|
|||
|
||||
procedure TvChildImage2.FreeHandle;
|
||||
begin
|
||||
//nothing
|
||||
FHandle:=VK_NULL_HANDLE;
|
||||
end;
|
||||
|
||||
function TvChildImage2._FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:TVkFlags):TvImageView2;
|
||||
|
@ -635,6 +633,21 @@ end;
|
|||
|
||||
//
|
||||
|
||||
procedure TvDepthStencilImage2.FreeHandle;
|
||||
begin
|
||||
if (DepthOnly<>nil) then
|
||||
begin
|
||||
DepthOnly.FHandle:=VK_NULL_HANDLE;
|
||||
end;
|
||||
|
||||
if (StencilOnly<>nil) then
|
||||
begin
|
||||
StencilOnly.FHandle:=VK_NULL_HANDLE;
|
||||
end;
|
||||
|
||||
inherited;
|
||||
end;
|
||||
|
||||
function TvDepthStencilImage2.Compile(ext:Pointer):Boolean;
|
||||
begin
|
||||
Result:=inherited Compile(ext);
|
||||
|
|
Loading…
Reference in New Issue