diff --git a/chip/pm4_me.pas b/chip/pm4_me.pas index 25ba9f1c..5951e3d5 100644 --- a/chip/pm4_me.pas +++ b/chip/pm4_me.pas @@ -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); diff --git a/chip/pm4_pfp.pas b/chip/pm4_pfp.pas index 6a0b30c0..e59a24da 100644 --- a/chip/pm4_pfp.pas +++ b/chip/pm4_pfp.pas @@ -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; diff --git a/chip/pm4_stream.pas b/chip/pm4_stream.pas index 1239d75f..d61f773f 100644 --- a/chip/pm4_stream.pas +++ b/chip/pm4_stream.pas @@ -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_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_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.Addr0) then Exit; - //1 Stencil - Result:=Integer(n1^.rkey.Addr2>n2^.rkey.Addr2)-Integer(n1^.rkey.Addr20) then Exit; - //2 cformat - Result:=Integer(n1^.rkey.cformat>n2^.rkey.cformat)-Integer(n1^.rkey.cformat0) 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.cformat0) 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^.rsizenil) 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); diff --git a/sys/dev/dev_gc.pas b/sys/dev/dev_gc.pas index a71d9218..0f81c122 100644 --- a/sys/dev/dev_gc.pas +++ b/sys/dev/dev_gc.pas @@ -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; diff --git a/vulkan/vCmdBuffer.pas b/vulkan/vCmdBuffer.pas index 4c337c09..579fc285 100644 --- a/vulkan/vCmdBuffer.pas +++ b/vulkan/vCmdBuffer.pas @@ -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; diff --git a/vulkan/vImage.pas b/vulkan/vImage.pas index 0d8d3ea5..cc648050 100644 --- a/vulkan/vImage.pas +++ b/vulkan/vImage.pas @@ -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) diff --git a/vulkan/vImageManager.pas b/vulkan/vImageManager.pas index ea51d812..1ad071a7 100644 --- a/vulkan/vImageManager.pas +++ b/vulkan/vImageManager.pas @@ -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);