From 6d56cf0fdaf15ea29d6e01ccf19c576030921832 Mon Sep 17 00:00:00 2001 From: Pavel <68122101+red-prig@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:58:26 +0300 Subject: [PATCH] + --- chip/pm4_me.pas | 131 ++++++-- chip/pm4_pfp.pas | 14 + chip/pm4_ring.pas | 2 +- chip/pm4_stream.pas | 454 ++++++++++++++++++++++++++-- chip/pm4defs.pas | 4 + rtl/g23tree.pas | 46 +++ rtl/g_node_splay.pas | 8 +- sys/dev/dev_gc.pas | 13 +- sys/vm/vm_map.pas | 6 +- sys/vm/vm_tracking_map.pas | 25 +- vulkan/vDevice.pas | 4 +- vulkan/vHostBufferManager.pas | 17 +- vulkan/vImage.pas | 107 +++++-- vulkan/vImageManager.pas | 552 +++++++++++++++++++--------------- vulkan/vImageTiling.pas | 121 +++----- vulkan/vMemory.pas | 41 +++ vulkan/vRegs2Vulkan.pas | 37 +-- vulkan/vRenderPassManager.pas | 20 +- 18 files changed, 1162 insertions(+), 440 deletions(-) diff --git a/chip/pm4_me.pas b/chip/pm4_me.pas index 77738e0d..ee799b3f 100644 --- a/chip/pm4_me.pas +++ b/chip/pm4_me.pas @@ -209,7 +209,8 @@ end; var FCmdPool:TvCmdPool; -procedure Prepare_Uniforms(var FUniformBuilder:TvUniformBuilder; +procedure Prepare_Uniforms(node:p_pm4_node; + var FUniformBuilder:TvUniformBuilder; CmdBuffer:TvCmdBuffer); var i:Integer; @@ -248,7 +249,8 @@ begin Result:=addr-(addr mod alignment); end; -procedure Bind_Uniforms(var FUniformBuilder:TvUniformBuilder; +procedure Bind_Uniforms(node:p_pm4_node; + var FUniformBuilder:TvUniformBuilder; var FDescriptorGroup:TvDescriptorGroup; ShaderGroup:TvShaderGroup; CmdBuffer:TvCmdBuffer); @@ -273,6 +275,8 @@ var diff :TVkDeviceSize; align:TVkDeviceSize; range:TVkDeviceSize; + + resource_instance:p_pm4_resource_instance; begin //images @@ -282,6 +286,16 @@ begin With FUniformBuilder.FImages[i] do begin + resource_instance:=node^.scope.find_curr_image_resource(FImage); + + if (resource_instance<>nil) then + begin + Writeln('ri:curr:',HexStr(resource_instance^.curr_mem_usage,1), + ' prev:',HexStr(resource_instance^.prev_mem_usage,1), + ' next:',HexStr(resource_instance^.next_mem_usage,1) + ); + end; + ri:=FetchImage(CmdBuffer, FImage, iu_sampled @@ -324,6 +338,21 @@ begin With FUniformBuilder.FBuffers[i] do begin + resource_instance:=node^.scope.find_curr_buffer_resource(addr,size); + + if (resource_instance<>nil) then + begin + if (resource_instance^.prev_mem_usage<>0) then + begin + writeln; + end; + + Writeln('rb:curr:',HexStr(resource_instance^.curr_mem_usage,1), + ' prev:',HexStr(resource_instance^.prev_mem_usage,1), + ' next:',HexStr(resource_instance^.next_mem_usage,1) + ); + end; + buf:=FetchHostBuffer(CmdBuffer,QWORD(addr),size,ord(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)); diff:=QWORD(addr)-buf.FAddr; @@ -348,7 +377,7 @@ begin range {VK_WHOLE_SIZE}); //TODO: check write flag - vm_map_track_trigger(p_proc.p_vmspace,QWORD(addr),QWORD(addr)+size); + vm_map_track_trigger(p_proc.p_vmspace,QWORD(addr),QWORD(addr)+size,nil); end; end; @@ -360,33 +389,48 @@ procedure pm4_ClearDepth(var rt_info:t_pm4_rt_info; CmdBuffer:TvCmdBuffer); var ri:TvImage2; + cclear:array[0..1] of Boolean; + range :TVkImageSubresourceRange; begin //ClearDepthTarget ri:=FetchImage(CmdBuffer, rt_info.DB_INFO.FImageInfo, - iu_depth + iu_depthstenc //rt_info.DB_INFO.DEPTH_USAGE ); - + { ri.PushBarrier(CmdBuffer, ord(VK_ACCESS_TRANSFER_READ_BIT), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, ord(VK_PIPELINE_STAGE_TRANSFER_BIT)); + } ri.PushBarrier(CmdBuffer, ord(VK_ACCESS_TRANSFER_WRITE_BIT), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, ord(VK_PIPELINE_STAGE_TRANSFER_BIT)); + cclear[0]:=((rt_info.DB_INFO.DEPTH_USAGE and TM_CLEAR)<>0) and + (GetDepthOnlyFormat (ri.key.cformat)<>VK_FORMAT_UNDEFINED); + + cclear[1]:=((rt_info.DB_INFO.STENCIL_USAGE and TM_CLEAR)<>0) and + (GetStencilOnlyFormat(ri.key.cformat)<>VK_FORMAT_UNDEFINED); + + range:=ri.GetSubresRange; + + range.aspectMask:=(ord(VK_IMAGE_ASPECT_DEPTH_BIT )*ord(cclear[0])) or + (ord(VK_IMAGE_ASPECT_STENCIL_BIT)*ord(cclear[1])); + CmdBuffer.ClearDepthStencilImage(ri.FHandle, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, @rt_info.DB_INFO.CLEAR_VALUE.depthStencil, - ri.GetSubresRange); + range); end; -procedure pm4_DrawPrepare(var rt_info:t_pm4_rt_info; +procedure pm4_DrawPrepare(node:p_pm4_node; + var rt_info:t_pm4_rt_info; CmdBuffer:TvCmdBuffer; RenderCmd:TvRenderTargets); var @@ -410,6 +454,8 @@ var iv:TvImageView2; FDescriptorGroup:TvDescriptorGroup; + + resource_instance:p_pm4_resource_instance; begin RP_KEY.Clear; @@ -530,6 +576,16 @@ begin For i:=0 to RenderCmd.RT_COUNT-1 do begin + resource_instance:=node^.scope.find_curr_image_resource(RenderCmd.RT_INFO[i].FImageInfo); + + if (resource_instance<>nil) then + begin + Writeln('ra:curr:',HexStr(resource_instance^.curr_mem_usage,1), + ' prev:',HexStr(resource_instance^.prev_mem_usage,1), + ' next:',HexStr(resource_instance^.next_mem_usage,1) + ); + end; + RenderCmd.AddClearColor(RenderCmd.RT_INFO[i].CLEAR_COLOR); ri:=FetchImage(CmdBuffer, @@ -542,10 +598,12 @@ begin iv:=ri.FetchView(CmdBuffer,RenderCmd.RT_INFO[i].FImageView,iu_attachment); + { ri.PushBarrier(CmdBuffer, ord(VK_ACCESS_TRANSFER_READ_BIT), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, ord(VK_PIPELINE_STAGE_TRANSFER_BIT)); + } ri.PushBarrier(CmdBuffer, GetColorAccessMask(RenderCmd.RT_INFO[i].IMAGE_USAGE), @@ -567,28 +625,55 @@ begin if rt_info.DB_ENABLE then begin + + resource_instance:=node^.scope.find_curr_image_resource(GetDepthOnly(RenderCmd.DB_INFO.FImageInfo)); + + if (resource_instance<>nil) then + begin + Writeln('rd:curr:',HexStr(resource_instance^.curr_mem_usage,1), + ' prev:',HexStr(resource_instance^.prev_mem_usage,1), + ' next:',HexStr(resource_instance^.next_mem_usage,1) + ); + end; + + resource_instance:=node^.scope.find_curr_image_resource(GetStencilOnly(RenderCmd.DB_INFO.FImageInfo)); + + if (resource_instance<>nil) then + begin + Writeln('rs:curr:',HexStr(resource_instance^.curr_mem_usage,1), + ' prev:',HexStr(resource_instance^.prev_mem_usage,1), + ' next:',HexStr(resource_instance^.next_mem_usage,1) + ); + end; + + // + RenderCmd.AddClearColor(RenderCmd.DB_INFO.CLEAR_VALUE); ri:=FetchImage(CmdBuffer, RenderCmd.DB_INFO.FImageInfo, - iu_depth + iu_depthstenc //RenderCmd.DB_INFO.DEPTH_USAGE ); - pm4_load_from(CmdBuffer,ri,RenderCmd.DB_INFO.DEPTH_USAGE); + pm4_load_from(CmdBuffer,ri.DepthOnly ,RenderCmd.DB_INFO.DEPTH_USAGE); + pm4_load_from(CmdBuffer,ri.StencilOnly,RenderCmd.DB_INFO.STENCIL_USAGE); - iv:=ri.FetchView(CmdBuffer,iu_depth); + iv:=ri.FetchView(CmdBuffer,iu_depthstenc); + { ri.PushBarrier(CmdBuffer, ord(VK_ACCESS_TRANSFER_READ_BIT), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, ord(VK_PIPELINE_STAGE_TRANSFER_BIT)); + } ri.PushBarrier(CmdBuffer, - GetColorAccessMask(RenderCmd.DB_INFO.DEPTH_USAGE), - VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, + GetDepthStencilAccessMask(RenderCmd.DB_INFO.DEPTH_USAGE,RenderCmd.DB_INFO.STENCIL_USAGE), + GetDepthStencilSendLayout(RenderCmd.DB_INFO.DEPTH_USAGE,RenderCmd.DB_INFO.STENCIL_USAGE), ord(VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) or - ord(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) ); + RenderCmd.DB_INFO.zorder_stage + ); // if limits.VK_KHR_imageless_framebuffer then @@ -612,13 +697,13 @@ begin FUniformBuilder:=Default(TvUniformBuilder); rt_info.ShaderGroup.ExportUnifBuilder(FUniformBuilder,@rt_info.USERDATA); - Prepare_Uniforms(FUniformBuilder,CmdBuffer); + Prepare_Uniforms(node,FUniformBuilder,CmdBuffer); //////// if not CmdBuffer.BeginRenderPass(RenderCmd) then begin Writeln(stderr,'BeginRenderPass(FRenderCmd)'); - Assert(false,'BeginRenderPass(FRenderCmd)'); + Assert (false ,'BeginRenderPass(FRenderCmd)'); end; CmdBuffer.SetVertexInput (FAttrBuilder); @@ -626,7 +711,8 @@ begin FDescriptorGroup:=nil; - Bind_Uniforms(FUniformBuilder, + Bind_Uniforms(node, + FUniformBuilder, FDescriptorGroup, rt_info.ShaderGroup, CmdBuffer); @@ -666,11 +752,12 @@ begin ri:=FetchImage(CmdBuffer, rt_info.DB_INFO.FImageInfo, - iu_depth + iu_depthstenc //RenderCmd.DB_INFO.DEPTH_USAGE ); - pm4_write_back(CmdBuffer,ri); + pm4_write_back(CmdBuffer,ri.DepthOnly ); + pm4_write_back(CmdBuffer,ri.StencilOnly); // end; @@ -704,7 +791,8 @@ begin begin RenderCmd:=TvRenderTargets.Create; - pm4_DrawPrepare(node^.rt_info, + pm4_DrawPrepare(node, + node^.rt_info, CmdBuffer, RenderCmd); @@ -780,7 +868,7 @@ begin FUniformBuilder:=Default(TvUniformBuilder); CP_KEY.FShaderGroup.ExportUnifBuilder(FUniformBuilder,dst); - Prepare_Uniforms(FUniformBuilder,CmdBuffer); + Prepare_Uniforms(node,FUniformBuilder,CmdBuffer); //////// if not CmdBuffer.BindCompute(CP) then @@ -791,7 +879,8 @@ begin FDescriptorGroup:=nil; - Bind_Uniforms(FUniformBuilder, + Bind_Uniforms(node, + FUniformBuilder, FDescriptorGroup, CP_KEY.FShaderGroup, CmdBuffer); diff --git a/chip/pm4_pfp.pas b/chip/pm4_pfp.pas index 096c9dfc..6a0b30c0 100644 --- a/chip/pm4_pfp.pas +++ b/chip/pm4_pfp.pas @@ -32,12 +32,16 @@ type buft:t_pm4_stream_type; end; + t_flush_stream=procedure(var stream:t_pm4_stream) of object; + t_pfp_ctx=object freen:TAILQ_HEAD; stall:array[t_pm4_stream_type] of TAILQ_HEAD; // stream:array[t_pm4_stream_type] of t_pm4_stream; // + on_flush_stream:t_flush_stream; + // SH_REG:TSH_REG_GROUP; // 0x2C00 CX_REG:TCONTEXT_REG_GROUP; // 0xA000 UC_REG:TUSERCONFIG_REG_SHORT; // 0xC000 @@ -50,6 +54,8 @@ type procedure add_stall(ibuf:p_pm4_ibuffer); procedure free; // + Procedure Flush_stream(t:t_pm4_stream_type); + // procedure set_esgs_gsvs_ring_size(esgsRingSize,gsvsRingSize:DWORD); // procedure set_reg(i:word;data:DWORD); @@ -262,6 +268,13 @@ begin end; end; +Procedure t_pfp_ctx.Flush_stream(t:t_pm4_stream_type); +begin + Assert(on_flush_stream<>nil,'on_flush_stream'); + + on_flush_stream(stream[t]); +end; + procedure t_pfp_ctx.set_esgs_gsvs_ring_size(esgsRingSize,gsvsRingSize:DWORD); begin UC_REG.VGT_ESGS_RING_SIZE:=esgsRingSize; @@ -999,6 +1012,7 @@ begin pctx^.stream[stGfxDcb].EventWriteEop(addr,Body^.DATA,Body^.eventType,Body^.dataSel,Body^.intSel); + pctx^.Flush_stream(stGfxDcb); end; procedure onEventWriteEos(pctx:p_pfp_ctx;Body:PPM4CMDEVENTWRITEEOS); diff --git a/chip/pm4_ring.pas b/chip/pm4_ring.pas index 035e74dc..6f7ffac9 100644 --- a/chip/pm4_ring.pas +++ b/chip/pm4_ring.pas @@ -302,7 +302,7 @@ begin buf^.eventIndex :=5; buf^.invalidateL2:=1; buf^.address :=QWORD(addr); - buf^.intSel :=ord(intSel<>0)*2; + buf^.intSel :=ord(intSel<>0)*EVENTWRITEEOP_INT_SEL_SEND_INT_ON_CONFIRM; buf^.dataSel :=EVENTWRITEEOP_DATA_SEL_SEND_DATA64; buf^.DATA :=data; diff --git a/chip/pm4_stream.pas b/chip/pm4_stream.pas index 8af2df63..9c995c2a 100644 --- a/chip/pm4_stream.pas +++ b/chip/pm4_stream.pas @@ -37,6 +37,9 @@ uses vSampler, vSamplerManager, + vImageTiling, + g_node_splay, + shader_dump ; @@ -132,9 +135,64 @@ type ntDispatchDirect ); +const + R_IMG=0; + R_BUF=1; + +type + p_pm4_resource_instance=^t_pm4_resource_instance; + + p_pm4_resource_scope=^t_pm4_resource_scope; + t_pm4_resource_scope=object + list:TAILQ_HEAD; //p_pm4_resource + function empty:Boolean; + 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; + end; + + p_pm4_resource=^t_pm4_resource; + t_pm4_resource=object + pLeft :p_pm4_resource; + pRight:p_pm4_resource; + // + rwrite:p_pm4_resource_instance; + // + rtype :Integer; + rsize :DWORD; + rkey :TvImageKey; + // + function c(n1,n2:p_pm4_resource):Integer; static; + end; + + t_pm4_resource_set=specialize TNodeSplay; + + t_pm4_resource_instance=record + init_entry:TAILQ_ENTRY; + curr_entry:TAILQ_ENTRY; + // + init_scope:p_pm4_resource_scope; + curr_scope:p_pm4_resource_scope; + // + resource:p_pm4_resource; + // + curr_mem_usage:Integer; + prev_mem_usage:Integer; + next_mem_usage:Integer; + // + curr_img_usage:s_image_usage; + prev_img_usage:s_image_usage; + next_img_usage:s_image_usage; + end; + p_pm4_node=^t_pm4_node; t_pm4_node=object entry:TAILQ_ENTRY; + // + scope:t_pm4_resource_scope; + // ntype:t_pm4_node_type; end; @@ -244,6 +302,9 @@ type // list:TAILQ_HEAD; //t_pm4_node // + resource_set:t_pm4_resource_set; + init_scope:t_pm4_resource_scope; + // buft:t_pm4_stream_type; // procedure Free; @@ -251,6 +312,12 @@ 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); @@ -262,7 +329,10 @@ type procedure FastClear (var CX_REG:TCONTEXT_REG_GROUP); procedure Resolve (var CX_REG:TCONTEXT_REG_GROUP); function ColorControl (var CX_REG:TCONTEXT_REG_GROUP):Boolean; - procedure Build_rt_info(var rt_info:t_pm4_rt_info;var GPU_REGS:TGPU_REGS); + procedure Init_Uniforms(node:p_pm4_node;var FUniformBuilder:TvUniformBuilder); + procedure Build_rt_info(node:p_pm4_node; + var rt_info:t_pm4_rt_info; + var GPU_REGS:TGPU_REGS); procedure BuildDraw (ntype:t_pm4_node_type; var SH_REG:TSH_REG_GROUP; var CX_REG:TCONTEXT_REG_GROUP; @@ -282,6 +352,112 @@ implementation var cache_block_allocator:t_cache_block_allocator; +// + +function t_pm4_resource.c(n1,n2:p_pm4_resource):Integer; +begin + //0 rtype + Result:=Integer(n1^.rtype>n2^.rtype)-Integer(n1^.rtype0) then Exit; + //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)); +end; + +// + +function t_pm4_resource_scope.empty:Boolean; +begin + Result:=(TAILQ_FIRST(@list)=nil); +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); +begin + if (list.tqh_first=nil) and + (list.tqh_last =nil) then + begin + TAILQ_INIT(@list); + end; + + TAILQ_INSERT_TAIL(@list,i,@i^.init_entry); + + 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; begin list:=Default(TAILQ_HEAD); @@ -309,6 +485,153 @@ begin Result:=TAILQ_NEXT(node,@node^.entry); end; +// + +// resource_set:t_pm4_resource_set; + +function t_pm4_stream.fetch_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); + + if (Result=nil) then + begin + tmp.rsize:=get_image_size(rkey); + + Result:=allocator.Alloc(SizeOf(t_pm4_resource)); + Result^:=tmp; + + resource_set.Insert(Result); + end; +end; + +function t_pm4_stream.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; + + Result:=resource_set.Find(@tmp); + + if (Result=nil) then + begin + tmp.rsize:=size; + + Result:=allocator.Alloc(SizeOf(t_pm4_resource)); + Result^:=tmp; + + resource_set.Insert(Result); + 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; +var + start:Pointer; + __end:Pointer; + node:p_pm4_resource; + 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; + + tmp:=Default(t_pm4_resource); + tmp:=r^; + + start:=tmp.rkey.Addr; + __end:=start+tmp.rsize; + + tmp.rtype:=High(Integer); + tmp.rkey.Addr:=start; + + //[s|new|e] -> + // [s|old|e] + + node:=resource_set.Find_ls(@tmp); + + while (node<>nil) do + begin + // + + if (__end>(node^.rkey.Addr)) and (start<(node^.rkey.Addr+node^.rsize)) then + begin + prev:=node^.rwrite; + if (prev<>nil) 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; + //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; + end; + // + if ((mem_usage and (TM_WRITE or TM_CLEAR))<>0) then + begin + node^.rwrite:=Result; + end; + end; + + node:=resource_set.Prev(node); + 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; +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(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_init(i); + 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 + begin + //init + init_scope.insert_init(i); + end; + + node^.scope.insert_curr(i); + + Result:=i; +end; + +// + procedure t_pm4_stream.LoadConstRam(addr:Pointer;num_dw,offset:Word); var node:p_pm4_node_LoadConstRam; @@ -316,6 +639,7 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_LoadConstRam)); node^.ntype :=ntLoadConstRam; + node^.scope :=Default(t_pm4_resource_scope); node^.addr :=addr; node^.num_dw:=num_dw; node^.offset:=offset; @@ -330,6 +654,7 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_EventWrite)); node^.ntype :=ntEventWrite; + node^.scope :=Default(t_pm4_resource_scope); node^.eventType:=eventType; add_node(node); @@ -342,6 +667,7 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_EventWriteEop)); node^.ntype :=ntEventWriteEop; + node^.scope :=Default(t_pm4_resource_scope); node^.addr :=addr; node^.data :=data; node^.eventType:=eventType; @@ -358,6 +684,7 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_EventWriteEos)); node^.ntype :=ntEventWriteEos; + node^.scope :=Default(t_pm4_resource_scope); node^.addr :=addr; node^.data :=data; node^.eventType:=eventType; @@ -373,6 +700,7 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_SubmitFlipEop)); node^.ntype :=ntSubmitFlipEop; + node^.scope :=Default(t_pm4_resource_scope); node^.eop_value:=eop_value; node^.intSel :=intSel; @@ -386,6 +714,7 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_DmaData)); node^.ntype :=ntDmaData; + node^.scope :=Default(t_pm4_resource_scope); node^.dst :=dst; node^.src :=srcOrData; node^.numBytes:=numBytes; @@ -403,6 +732,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^.dst :=dst; node^.src :=Pointer(node+1); node^.num_dw:=num_dw; @@ -420,6 +750,7 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_WaitRegMem)); node^.ntype :=ntWaitRegMem; + node^.scope :=Default(t_pm4_resource_scope); node^.pollAddr :=pollAddr; node^.refValue :=refValue; node^.mask :=mask; @@ -435,6 +766,7 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_FastClear)); node^.ntype :=ntFastClear; + node^.scope :=Default(t_pm4_resource_scope); node^.CX_REG:=CX_REG; add_node(node); @@ -447,6 +779,7 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_Resolve)); node^.ntype :=ntResolve; + node^.scope :=Default(t_pm4_resource_scope); node^.CX_REG:=CX_REG; add_node(node); @@ -480,10 +813,49 @@ begin end; -procedure t_pm4_stream.Build_rt_info(var rt_info:t_pm4_rt_info;var GPU_REGS:TGPU_REGS); +procedure t_pm4_stream.Init_Uniforms(node:p_pm4_node;var FUniformBuilder:TvUniformBuilder); + var i:Integer; begin + + //images + if (Length(FUniformBuilder.FImages)<>0) then + begin + For i:=0 to High(FUniformBuilder.FImages) do + With FUniformBuilder.FImages[i] do + begin + + insert_image_resource(node,FImage,TM_READ,[iu_sampled]); + + end; + end; + //images + + //buffers + if (Length(FUniformBuilder.FBuffers)<>0) then + begin + For i:=0 to High(FUniformBuilder.FBuffers) do + With FUniformBuilder.FBuffers[i] do + begin + + //TODO: check write flag + insert_buffer_resource(node,addr,size,TM_READ or TM_WRITE); + + end; + end; + //buffers + +end; + +procedure t_pm4_stream.Build_rt_info(node:p_pm4_node; + var rt_info:t_pm4_rt_info; + var GPU_REGS:TGPU_REGS); +var + i:Integer; + RT:TRT_INFO; + FUniformBuilder:TvUniformBuilder; +begin for i:=0 to 31 do begin if (GPU_REGS.CX_REG^.SPI_PS_INPUT_CNTL[i].OFFSET<>0) and (GPU_REGS.CX_REG^.SPI_PS_INPUT_CNTL[i].OFFSET<>i) then @@ -505,7 +877,15 @@ begin if GPU_REGS.COMP_ENABLE then For i:=0 to GPU_REGS.GET_HI_RT do begin - rt_info.RT_INFO[rt_info.RT_COUNT]:=GPU_REGS.GET_RT_INFO(i); + RT:=GPU_REGS.GET_RT_INFO(i); + + // + + insert_image_resource(node,RT.FImageInfo,RT.IMAGE_USAGE,[iu_attachment]); + + // + + rt_info.RT_INFO[rt_info.RT_COUNT]:=RT; Inc(rt_info.RT_COUNT); end; @@ -515,6 +895,11 @@ begin if rt_info.DB_ENABLE then begin rt_info.DB_INFO:=GPU_REGS.GET_DB_INFO; + + // + + 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]); end; rt_info.BLEND_INFO:=GPU_REGS.GET_BLEND_INFO; @@ -527,8 +912,8 @@ begin For i:=0 to 15 do if GPU_REGS.VP_ENABLE(i) then begin - rt_info.VPORT [rt_info.VP_COUNT]:=GPU_REGS.GET_VPORT(i); - rt_info.SCISSOR[rt_info.VP_COUNT]:=GPU_REGS.GET_SCISSOR(i) ; + rt_info.VPORT [rt_info.VP_COUNT]:=GPU_REGS.GET_VPORT (i); + rt_info.SCISSOR[rt_info.VP_COUNT]:=GPU_REGS.GET_SCISSOR(i); Inc(rt_info.VP_COUNT); end; @@ -541,6 +926,31 @@ begin rt_info.SCREEN_RECT:=GPU_REGS.GET_SCREEN; rt_info.SCREEN_SIZE:=GPU_REGS.GET_SCREEN_SIZE; + // + + FUniformBuilder:=Default(TvUniformBuilder); + rt_info.ShaderGroup.ExportUnifBuilder(FUniformBuilder,@rt_info.USERDATA); + + Init_Uniforms(node,FUniformBuilder); +end; + +function IsClearDepthShaders(const FShaders:AvShaderStage):Boolean; inline; +begin + Result:=False; + + if (FShaders[vShaderStageLs]=nil) and + (FShaders[vShaderStageHs]=nil) and + (FShaders[vShaderStageEs]=nil) and + (FShaders[vShaderStageGs]=nil) and + (FShaders[vShaderStageVs]<>nil) and + (FShaders[vShaderStagePs]<>nil) and + (FShaders[vShaderStageCs]=nil) then + + if (FShaders[vShaderStageVs].FHash=QWORD($00DF6E6331449451)) and + (FShaders[vShaderStagePs].FHash=QWORD($E9FF5D4699E5B9AD)) then + begin + Result:=True; + end; end; procedure t_pm4_stream.BuildDraw(ntype:t_pm4_node_type; @@ -561,8 +971,9 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_draw)); node^.ntype :=ntype; + node^.scope :=Default(t_pm4_resource_scope); - Build_rt_info(node^.rt_info,GPU_REGS); + Build_rt_info(node,node^.rt_info,GPU_REGS); node^.indexBase :=CX_REG.VGT_DMA_BASE or (QWORD(CX_REG.VGT_DMA_BASE_HI.BASE_ADDR) shl 32); node^.indexOffset :=CX_REG.VGT_INDX_OFFSET; @@ -574,19 +985,15 @@ begin //heuristic if (ntype=ntDrawIndexAuto) and + (node^.numInstances<=1) and (node^.rt_info.RT_COUNT=0) and - (node^.rt_info.DB_ENABLE) then + (node^.rt_info.DB_ENABLE) and + ( + ((node^.rt_info.DB_INFO.DEPTH_USAGE and TM_CLEAR)<>0) or + ((node^.rt_info.DB_INFO.STENCIL_USAGE and TM_CLEAR)<>0) + ) then - if (node^.rt_info.ShaderGroup.FKey.FShaders[vShaderStageLs]=nil) and - (node^.rt_info.ShaderGroup.FKey.FShaders[vShaderStageHs]=nil) and - (node^.rt_info.ShaderGroup.FKey.FShaders[vShaderStageEs]=nil) and - (node^.rt_info.ShaderGroup.FKey.FShaders[vShaderStageGs]=nil) and - (node^.rt_info.ShaderGroup.FKey.FShaders[vShaderStageVs]<>nil) and - (node^.rt_info.ShaderGroup.FKey.FShaders[vShaderStagePs]<>nil) and - (node^.rt_info.ShaderGroup.FKey.FShaders[vShaderStageCs]=nil) then - - if (node^.rt_info.ShaderGroup.FKey.FShaders[vShaderStageVs].FHash=QWORD($00DF6E6331449451)) and - (node^.rt_info.ShaderGroup.FKey.FShaders[vShaderStagePs].FHash=QWORD($E9FF5D4699E5B9AD)) then + if IsClearDepthShaders(node^.rt_info.ShaderGroup.FKey.FShaders) then begin //ClearDepthTarget @@ -617,6 +1024,7 @@ end; procedure t_pm4_stream.Build_cs_info(node:p_pm4_node_DispatchDirect;var GPU_REGS:TGPU_REGS); var dst:PGPU_USERDATA; + FUniformBuilder:TvUniformBuilder; begin //hack dst:=Pointer(@node^.USER_DATA_CS)-Ptruint(@TGPU_USERDATA(nil^).A[vShaderStageCs]); @@ -629,6 +1037,13 @@ begin node^.DIM_X:=GPU_REGS.SH_REG^.COMPUTE_DIM_X; node^.DIM_Y:=GPU_REGS.SH_REG^.COMPUTE_DIM_Y; node^.DIM_Z:=GPU_REGS.SH_REG^.COMPUTE_DIM_Z; + + // + + FUniformBuilder:=Default(TvUniformBuilder); + node^.ShaderGroup.ExportUnifBuilder(FUniformBuilder,dst); + + Init_Uniforms(node,FUniformBuilder); end; procedure t_pm4_stream.DispatchDirect(var SH_REG:TSH_REG_GROUP); @@ -642,9 +1057,10 @@ begin node:=allocator.Alloc(SizeOf(t_pm4_node_DispatchDirect)); - Build_cs_info(node,GPU_REGS); + node^.ntype:=ntDispatchDirect; + node^.scope:=Default(t_pm4_resource_scope); - node^.ntype :=ntDispatchDirect; + Build_cs_info(node,GPU_REGS); add_node(node); end; diff --git a/chip/pm4defs.pas b/chip/pm4defs.pas index b6e27f66..f6a32fa8 100644 --- a/chip/pm4defs.pas +++ b/chip/pm4defs.pas @@ -402,6 +402,10 @@ const kEopCbDbReadsDone = $00000028; //end read CB/DB, label .....EOP kEopCsDone = $00000028; //wait cs shader, label .....EOP + //CACHE_FLUSH_TS =$00000004; + //CACHE_FLUSH_AND_INV_TS_EVENT =$00000014; + //BOTTOM_OF_PIPE_TS =$00000028; + type PPM4CMDEVENTWRITEEOP=^PM4CMDEVENTWRITEEOP; PM4CMDEVENTWRITEEOP=bitpacked record diff --git a/rtl/g23tree.pas b/rtl/g23tree.pas index dd4a3d49..caa999da 100644 --- a/rtl/g23tree.pas +++ b/rtl/g23tree.pas @@ -87,7 +87,9 @@ type Function erase(Const it:Iterator):Boolean; Function find(Const R:TKey):Iterator; Function find_be(Const R:TKey):Iterator; + Function find_bg(Const R:TKey):Iterator; Function find_le(Const R:TKey):Iterator; + Function find_ls(Const R:TKey):Iterator; function cbegin:Iterator; function cend:Iterator; end; @@ -613,6 +615,31 @@ begin end; end; +Function T23treeSet.find_bg(Const R:TKey):Iterator; +begin + Result:=Iterator(TStuff._find_node(pRoot,R)); + Case Result.P of + 0:begin + Result.P:=0; + if not Result.Next then Result:=Default(Iterator); + end; + 1:begin + Result.P:=1; + if not Result.Next then Result:=Default(Iterator); + end; + -1:Result.P:=0; + -2:begin + Result.P:=0; + if not Result.Next then Result:=Default(Iterator); + end; + -3:Result.P:=1; + -4:begin + Result.P:=1; + if not Result.Next then Result:=Default(Iterator); + end; + end; +end; + Function T23treeSet.find_le(Const R:TKey):Iterator; begin Result:=Iterator(TStuff._find_node(pRoot,R)); @@ -627,6 +654,25 @@ begin end; end; +Function T23treeSet.find_ls(Const R:TKey):Iterator; +begin + Result:=Iterator(TStuff._find_node(pRoot,R)); + Case Result.P of + 0:begin + Result.P:=0; + if not Result.Prev then Result:=Default(Iterator); + end; + 1:Result.P:=0; + -1:begin + Result.P:=0; + if not Result.Prev then Result:=Default(Iterator); + end; + -2:Result.P:=0; + -3:Result.P:=0; + -4:Result.P:=1; + end; +end; + function T23treeSet.TStuff._remove4parent(var PN:P23Node;SI:PSplitInfo):Boolean; inline; Var PR:P23Node; diff --git a/rtl/g_node_splay.pas b/rtl/g_node_splay.pas index f46afad7..6b083e83 100644 --- a/rtl/g_node_splay.pas +++ b/rtl/g_node_splay.pas @@ -16,9 +16,9 @@ type function Next(node:PNode):PNode; function Prev(node:PNode):PNode; function Find(node:PNode):PNode; - function Find_b(node:PNode):PNode; + function Find_bg(node:PNode):PNode; function Find_be(node:PNode):PNode; - function Find_l(node:PNode):PNode; + function Find_ls(node:PNode):PNode; function Find_le(node:PNode):PNode; function Insert(node:PNode):Boolean; function Delete(node:PNode):Boolean; @@ -225,7 +225,7 @@ begin if (_Splay(node)=0) then Result:=pRoot; end; -function TNodeSplay.Find_b(node:PNode):PNode; +function TNodeSplay.Find_bg(node:PNode):PNode; var c:Integer; begin @@ -271,7 +271,7 @@ begin end; end; -function TNodeSplay.Find_l(node:PNode):PNode; +function TNodeSplay.Find_ls(node:PNode):PNode; var c:Integer; begin diff --git a/sys/dev/dev_gc.pas b/sys/dev/dev_gc.pas index 54c51de6..a71d9218 100644 --- a/sys/dev/dev_gc.pas +++ b/sys/dev/dev_gc.pas @@ -165,7 +165,7 @@ begin pctx^.add_stall(@ibuf); end; - pm4_me_gfx.Push(pfp_ctx.stream[stGfxCcb]); + //pm4_me_gfx.Push(pfp_ctx.stream[stGfxCcb]); end; end; $c0023f00: @@ -182,7 +182,7 @@ begin pctx^.add_stall(@ibuf); end; - pm4_me_gfx.Push(pfp_ctx.stream[stGfxDcb]); + //pm4_me_gfx.Push(pfp_ctx.stream[stGfxDcb]); end; end; $c0008b00: @@ -238,12 +238,9 @@ begin for buft:=Low(t_pm4_stream_type) to High(t_pm4_stream_type) do begin - pm4_me_gfx.Push(pfp_ctx.stream[buft]); + pfp_ctx.Flush_stream(buft);; end; - //pm4_me_gfx.Push(pfp_ctx.stream_ccb,stGfxDcb); - //pm4_me_gfx.Push(pfp_ctx.stream_dcb,stGfxCcb); - gc_ring_pm4_drain(@ring_gfx,size); // Continue; @@ -260,6 +257,8 @@ begin if (System.InterlockedExchange(parse_gfx_started,Pointer(1))=nil) then begin pfp_ctx.init; + pfp_ctx.on_flush_stream:=@pm4_me_gfx.Push; + pfp_ctx.print_hint:=true; pfp_ctx.print_ops :=true; @@ -409,6 +408,8 @@ begin $C0048114: //sceGnmFlushGarlic begin Writeln('sceGnmFlushGarlic'); + + MemManager.Flush; end; $C0108102: //submit diff --git a/sys/vm/vm_map.pas b/sys/vm/vm_map.pas index 35bfc274..982b157c 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):Integer; +function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer):Integer; function vmspace_pmap(vm:p_vmspace):pmap_t; inline; @@ -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):Integer; +function vm_map_track_trigger(map:vm_map_t;start,__end:vm_offset_t;exclude:Pointer):Integer; begin - Result:=vm_track_map_trigger(@map^.pmap^.tr_map,start,__end); + Result:=vm_track_map_trigger(@map^.pmap^.tr_map,start,__end,exclude); end; procedure vminit; diff --git a/sys/vm/vm_tracking_map.pas b/sys/vm/vm_tracking_map.pas index e95d2575..ca54dbc7 100644 --- a/sys/vm/vm_tracking_map.pas +++ b/sys/vm/vm_tracking_map.pas @@ -136,7 +136,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):Integer; +function vm_track_map_trigger (map:p_vm_track_map;start,__end:vm_offset_t;exclude:Pointer):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; @@ -1429,7 +1429,7 @@ begin Result:=(KERN_SUCCESS); end; -function vm_track_map_trigger(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; var current,entry:p_vm_track_map_entry; node:p_vm_track_object_instance; @@ -1487,17 +1487,20 @@ begin //vm_track_list_add_obj(list,node^.obj); //deferred //remap with source - ret:=vm_track_object_trigger(map,node^.obj,s_start,s___end); - - if ((ret and DO_DELETE)<>0) then + if (node^.obj<>exclude) then begin - //delete full object - _vm_track_map_delete_deferred(map,node^.obj); - end; + ret:=vm_track_object_trigger(map,node^.obj,s_start,s___end); - if ((ret and DO_INCREMENT)<>0) then - begin - Inc(Result); + if ((ret and DO_DELETE)<>0) then + begin + //delete full object + _vm_track_map_delete_deferred(map,node^.obj); + end; + + if ((ret and DO_INCREMENT)<>0) then + begin + Inc(Result); + end; end; node:=vm_track_next_instance(entry^.instances,node); diff --git a/vulkan/vDevice.pas b/vulkan/vDevice.pas index 0190030c..3653e94b 100644 --- a/vulkan/vDevice.pas +++ b/vulkan/vDevice.pas @@ -1227,8 +1227,8 @@ begin cinfo:=Default(TVkCommandPoolCreateInfo); cinfo.sType :=VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO; cinfo.queueFamilyIndex:=FFamily; - cinfo.flags:=ord(VK_COMMAND_POOL_CREATE_TRANSIENT_BIT) or - ord(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT); + cinfo.flags:=ord(VK_COMMAND_POOL_CREATE_TRANSIENT_BIT){ or + ord(VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT)}; r:=vkCreateCommandPool(Device.FHandle,@cinfo,nil,@FHandle); if (r<>VK_SUCCESS) then begin diff --git a/vulkan/vHostBufferManager.pas b/vulkan/vHostBufferManager.pas index 1b6bbf55..a3281b6d 100644 --- a/vulkan/vHostBufferManager.pas +++ b/vulkan/vHostBufferManager.pas @@ -88,27 +88,28 @@ label _repeat; var It:TvHostBufferSet.Iterator; - key:TvHostBufferKey; + tmp:TvHostBufferKey; buf:TvHostBuffer; __end:QWORD; begin Result:=nil; __end:=Addr+Size; - key:=Default(TvHostBufferKey); - key.FAddr :=Addr; - key.FUsage:=0; + tmp:=Default(TvHostBufferKey); + tmp.FAddr :=__end; + tmp.FUsage:=High(TVkFlags); + + //[s|new|e] -> + // [s|old|e] _repeat: - It:=FHostBufferSet.find_be(key); + It:=FHostBufferSet.find_ls(tmp); while (It.Item<>nil) do begin buf:=It.Item^.FBuffer; - if (buf.FAddr>=__end) then Exit; - if buf.Acquire(nil) then begin @@ -129,7 +130,7 @@ begin goto _repeat; end; - It.Next; + if not It.Prev then Break; end; end; diff --git a/vulkan/vImage.pas b/vulkan/vImage.pas index 3e53aaa7..0d8d3ea5 100644 --- a/vulkan/vImage.pas +++ b/vulkan/vImage.pas @@ -58,11 +58,12 @@ type TvCustomImage=class(TvRefsObject) FHandle:TVkImage; FBind :TvPointer; + procedure FreeHandle; virtual; Destructor Destroy; override; function GetImageInfo:TVkImageCreateInfo; virtual; abstract; function GetRequirements:TVkMemoryRequirements; function GetDedicatedAllocation:Boolean; - function Compile(ext:Pointer):Boolean; + function Compile(ext:Pointer):Boolean; virtual; function BindMem(P:TvPointer):TVkResult; procedure UnBindMem(do_free:Boolean); procedure OnReleaseMem(Sender:TObject); virtual; @@ -103,7 +104,7 @@ type PvImageKey=^TvImageKey; TvImageKey=packed object Addr :Pointer; - Stencil:Pointer; + Addr2 :Pointer; cformat:TVkFormat; params :packed record itype :Byte; //TVkImageType 0..2 (2) @@ -230,16 +231,20 @@ type Function GetAspectMaskByFormat(cformat:TVkFormat):DWORD; -Function GetDepthStencilLayout(DEPTH_USAGE,STENCIL_USAGE:Byte):TVkImageLayout; +Function GetDepthStencilInitLayout(DEPTH_USAGE,STENCIL_USAGE:Byte):TVkImageLayout; +Function GetDepthStencilSendLayout(DEPTH_USAGE,STENCIL_USAGE:Byte):TVkImageLayout; Function GetDepthStencilAccessMask(DEPTH_USAGE,STENCIL_USAGE:Byte):TVkAccessFlags; Function GetColorAccessMask(IMAGE_USAGE:Byte):TVkAccessFlags; Function getFormatSize(cformat:TVkFormat):Byte; //in bytes function IsTexelFormat(cformat:TVkFormat):Boolean; function IsDepthOrStencilFormat(cformat:TVkFormat):Boolean; -function GetDepthOrImageFormat (cformat:TVkFormat):TVkFormat; +function GetDepthOnlyFormat (cformat:TVkFormat):TVkFormat; function GetStencilOnlyFormat (cformat:TVkFormat):TVkFormat; +function GetDepthOnly (const key:TvImageKey):TvImageKey; +function GetStencilOnly(const key:TvImageKey):TvImageKey; + function vkGetFormatSupport(format:TVkFormat;tiling:TVkImageTiling;usage:TVkImageUsageFlags):Boolean; function vkFixFormatSupport(format:TVkFormat;tiling:TVkImageTiling;usage:TVkImageUsageFlags):TVkFormat; @@ -328,9 +333,9 @@ begin VK_FORMAT_X8_D24_UNORM_PACK32 :Result:=4; VK_FORMAT_D32_SFLOAT :Result:=4; //depth stencil - VK_FORMAT_D16_UNORM_S8_UINT :Result:=3; - VK_FORMAT_D24_UNORM_S8_UINT :Result:=4; - VK_FORMAT_D32_SFLOAT_S8_UINT :Result:=5; + VK_FORMAT_D16_UNORM_S8_UINT :Assert(false,'getFormatSize:VK_FORMAT_D16_UNORM_S8_UINT'); + VK_FORMAT_D24_UNORM_S8_UINT :Assert(false,'getFormatSize:VK_FORMAT_D24_UNORM_S8_UINT'); + VK_FORMAT_D32_SFLOAT_S8_UINT :Assert(false,'getFormatSize:VK_FORMAT_D32_SFLOAT_S8_UINT'); //texel size VK_FORMAT_BC1_RGB_UNORM_BLOCK.. @@ -378,12 +383,9 @@ begin end; end; -function GetDepthOrImageFormat(cformat:TVkFormat):TVkFormat; +function GetDepthOnlyFormat(cformat:TVkFormat):TVkFormat; begin Case cformat of - //stencil - VK_FORMAT_S8_UINT: - Result:=VK_FORMAT_UNDEFINED; //depth VK_FORMAT_D16_UNORM, VK_FORMAT_X8_D24_UNORM_PACK32, @@ -394,7 +396,7 @@ begin VK_FORMAT_D24_UNORM_S8_UINT :Result:=VK_FORMAT_X8_D24_UNORM_PACK32; VK_FORMAT_D32_SFLOAT_S8_UINT:Result:=VK_FORMAT_D32_SFLOAT; else - Result:=cformat; + Result:=VK_FORMAT_UNDEFINED; end; end; @@ -415,6 +417,24 @@ end; // +function GetDepthOnly(const key:TvImageKey):TvImageKey; +begin + Result.Addr :=key.Addr; + Result.Addr2 :=nil; + Result.cformat:=GetDepthOnlyFormat(key.cformat); + Result.params :=key.params; +end; + +function GetStencilOnly(const key:TvImageKey):TvImageKey; +begin + Result.Addr :=key.Addr2; + Result.Addr2 :=nil; + Result.cformat:=GetStencilOnlyFormat(key.cformat); + Result.params :=key.params; +end; + +// + function TvFramebuffer.IsImageless:Boolean; begin Result:=False; @@ -1285,12 +1305,18 @@ begin end; end; -Destructor TvCustomImage.Destroy; +procedure TvCustomImage.FreeHandle; begin if (FHandle<>VK_NULL_HANDLE) then begin vkDestroyImage(Device.FHandle,FHandle,nil); + FHandle:=VK_NULL_HANDLE; end; +end; + +Destructor TvCustomImage.Destroy; +begin + FreeHandle; // UnBindMem(True); // @@ -1392,11 +1418,7 @@ end; procedure TvCustomImage.OnReleaseMem(Sender:TObject); begin - if (FHandle<>VK_NULL_HANDLE) then - begin - vkDestroyImage(Device.FHandle,FHandle,nil); - FHandle:=VK_NULL_HANDLE; - end; + FreeHandle; // UnBindMem(False); end; @@ -1717,9 +1739,46 @@ begin end; end; -Function GetDepthStencilLayout(DEPTH_USAGE,STENCIL_USAGE:Byte):TVkImageLayout; +{ +WW VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL +RR VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL + +RW VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_STENCIL_ATTACHMENT_OPTIMAL +WR VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_STENCIL_READ_ONLY_OPTIMAL + +W_ VK_IMAGE_LAYOUT_DEPTH_ATTACHMENT_OPTIMAL +R_ VK_IMAGE_LAYOUT_DEPTH_READ_ONLY_OPTIMAL + +_W VK_IMAGE_LAYOUT_STENCIL_ATTACHMENT_OPTIMAL +_R VK_IMAGE_LAYOUT_STENCIL_READ_ONLY_OPTIMAL +} + +Function GetDepthStencilInitLayout(DEPTH_USAGE,STENCIL_USAGE:Byte):TVkImageLayout; +var + IMAGE_USAGE:Byte; begin - if (((DEPTH_USAGE or STENCIL_USAGE) and (TM_WRITE or TM_CLEAR))<>0) then + IMAGE_USAGE:=(DEPTH_USAGE or STENCIL_USAGE); + // + if ((IMAGE_USAGE and TM_READ)=0) then + begin + Result:=VK_IMAGE_LAYOUT_UNDEFINED; + end else + if ((IMAGE_USAGE and (TM_WRITE or TM_CLEAR))<>0) then + begin + Result:=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; + end else + begin + Result:=VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL; + end; +end; + +Function GetDepthStencilSendLayout(DEPTH_USAGE,STENCIL_USAGE:Byte):TVkImageLayout; +var + IMAGE_USAGE:Byte; +begin + IMAGE_USAGE:=(DEPTH_USAGE or STENCIL_USAGE); + // + if ((IMAGE_USAGE and (TM_WRITE or TM_CLEAR))<>0) then begin Result:=VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL; end else @@ -1729,9 +1788,13 @@ begin end; Function GetDepthStencilAccessMask(DEPTH_USAGE,STENCIL_USAGE:Byte):TVkAccessFlags; +var + IMAGE_USAGE:Byte; begin - Result:=(ord(VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) *ord(((DEPTH_USAGE or STENCIL_USAGE) and TM_READ )<>0) ) or - (ord(VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)*ord(((DEPTH_USAGE or STENCIL_USAGE) and (TM_WRITE or TM_CLEAR))<>0) ); + IMAGE_USAGE:=(DEPTH_USAGE or STENCIL_USAGE); + // + Result:=(ord(VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT) *ord((IMAGE_USAGE and TM_READ )<>0) ) or + (ord(VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT)*ord((IMAGE_USAGE and (TM_WRITE or TM_CLEAR))<>0) ); end; Function GetColorAccessMask(IMAGE_USAGE:Byte):TVkAccessFlags; diff --git a/vulkan/vImageManager.pas b/vulkan/vImageManager.pas index 04485481..4328c99f 100644 --- a/vulkan/vImageManager.pas +++ b/vulkan/vImageManager.pas @@ -32,7 +32,7 @@ uses } type - t_image_usage=(iu_attachment,iu_depth,iu_sampled,iu_storage); + t_image_usage=(iu_attachment,iu_depthstenc,iu_sampled,iu_storage,iu_buffer); s_image_usage=set of t_image_usage; TvImageView2Compare=object @@ -47,45 +47,67 @@ type // Barrier:TvImageBarrier; // - //Constructor Create; procedure PushBarrier(cmd:TvCustomCmdBuffer; dstAccessMask:TVkAccessFlags; newImageLayout:TVkImageLayout; dstStageMask:TVkPipelineStageFlags); - Function GetSubresRange:TVkImageSubresourceRange; + Function GetSubresRange(cformat:TVkFormat=VK_FORMAT_UNDEFINED):TVkImageSubresourceRange; Function GetSubresLayer(cformat:TVkFormat=VK_FORMAT_UNDEFINED):TVkImageSubresourceLayers; end; TvImageView2Set=specialize T23treeSet; - { - TvHostImage2=class(TvCustomImage) - Parent:TvImage2; - + TvCustomImage2=class(TvCustomImage) // - Barrier:TvImageBarrier; - // - Constructor Create; - function GetImageInfo:TVkImageCreateInfo; override; - procedure PushBarrier(cmd:TvCustomCmdBuffer; - dstAccessMask:TVkAccessFlags; - newImageLayout:TVkImageLayout; - dstStageMask:TVkPipelineStageFlags); - end; - } - - TvImage2=class(TvCustomImage) key :TvImageKey; - size:Ptruint; // + size:Ptruint; tobj:p_vm_track_object; // ref_trig:Ptruint; ref_load:Ptruint; // - FUsage:s_image_usage; + Parent :TvCustomImage2; + DepthOnly :TvCustomImage2; + StencilOnly:TvCustomImage2; // lock:Pointer; + // + Constructor Create; + Destructor Destroy; override; + procedure assign_vm_track; virtual; + Function GetSubresRange:TVkImageSubresourceRange; virtual; + Function GetSubresLayer:TVkImageSubresourceLayers; virtual; + function _FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:TVkFlags):TvImageView2; virtual; abstract; + function FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:t_image_usage):TvImageView2; + function FetchView(cmd:TvCustomCmdBuffer;usage:t_image_usage):TvImageView2; + procedure PushBarrier(cmd:TvCustomCmdBuffer; + dstAccessMask:TVkAccessFlags; + newImageLayout:TVkImageLayout; + dstStageMask:TVkPipelineStageFlags); virtual; abstract; + procedure ForceBarrier(dstAccessMask:TVkAccessFlags; + newImageLayout:TVkImageLayout; + dstStageMask:TVkPipelineStageFlags); virtual; abstract; + end; + + TvChildImage2=class(TvCustomImage2) + procedure FreeHandle; override; + function _FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:TVkFlags):TvImageView2; override; + procedure PushBarrier(cmd:TvCustomCmdBuffer; + dstAccessMask:TVkAccessFlags; + newImageLayout:TVkImageLayout; + dstStageMask:TVkPipelineStageFlags); override; + procedure ForceBarrier(dstAccessMask:TVkAccessFlags; + newImageLayout:TVkImageLayout; + dstStageMask:TVkPipelineStageFlags); override; + function Acquire(Sender:TObject):Boolean; override; + procedure Release(Sender:TObject); override; + end; + + TvImage2=class(TvCustomImage2) + // + FUsage:s_image_usage; + // FViews:TvImageView2Set; // Barrier:TvImageBarrier; @@ -96,29 +118,31 @@ type submit_id:ptruint; hash:qword; // - data_usage:Byte; Constructor Create; Destructor Destroy; override; - procedure assign_vm_track(_size:Ptruint); function GetImageInfo:TVkImageCreateInfo; override; - Function GetSubresRange:TVkImageSubresourceRange; - Function GetSubresLayer(cformat:TVkFormat=VK_FORMAT_UNDEFINED):TVkImageSubresourceLayers; - function FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:TVkFlags):TvImageView2; - function FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:t_image_usage):TvImageView2; - function FetchView(cmd:TvCustomCmdBuffer;usage:t_image_usage):TvImageView2; - //function FetchHostImage(cmd:TvCustomCmdBuffer;usage:TVkFlags):TvHostImage2; + function _FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:TVkFlags):TvImageView2; override; procedure PushBarrier(cmd:TvCustomCmdBuffer; dstAccessMask:TVkAccessFlags; newImageLayout:TVkImageLayout; - dstStageMask:TVkPipelineStageFlags); + dstStageMask:TVkPipelineStageFlags); override; + procedure ForceBarrier(dstAccessMask:TVkAccessFlags; + newImageLayout:TVkImageLayout; + dstStageMask:TVkPipelineStageFlags); override; function Acquire(Sender:TObject):Boolean; override; procedure Release(Sender:TObject); override; end; + TvDepthStencilImage2=class(TvImage2) + function Compile(ext:Pointer):Boolean; override; + procedure assign_vm_track; override; + Destructor Destroy; override; + end; + function FetchImage(cmd:TvCustomCmdBuffer;const F:TvImageKey;usage:t_image_usage):TvImage2; function FindImage(cmd:TvCustomCmdBuffer;Addr:Pointer;cformat:TVkFormat):TvImage2; -//Function get_image_size(const key:TvImageKey):Ptruint; external name 'tiling_get_image_size'; +Function get_image_size(const key:TvImageKey):Ptruint; external name 'tiling_get_image_size'; const img_ext:TVkExternalMemoryImageCreateInfo=( @@ -127,10 +151,6 @@ const handleTypes:ord(VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT); ); -var - IMAGE_TEST_HACK:Boolean=False; - IMAGE_LOAD_HACK:Boolean=False; - implementation uses @@ -167,7 +187,7 @@ begin Result:=Integer(a^.Addr>b^.Addr)-Integer(a^.Addr0) then Exit; //1 Stencil - Result:=Integer(a^.Stencil>b^.Stencil)-Integer(a^.Stencilb^.Addr2)-Integer(a^.Addr20) then Exit; //2 cformat Result:=Integer(a^.cformat>b^.cformat)-Integer(a^.cformatQWORD(image.key.Addr)) and (start<(QWORD(image.key.Addr)+image.size)) then + begin + //Writeln('on_trigger image'); + + System.InterlockedIncrement64(image.ref_trig); + + Result:=DO_INCREMENT; + end; + +end; + +// + +Constructor TvCustomImage2.Create; begin inherited; - Barrier.Init; + ref_trig:=1; end; -} + +Destructor TvCustomImage2.Destroy; +begin + if (tobj<>nil) then + begin + vm_map_track_remove(p_proc.p_vmspace,tobj); + end; + + inherited; +end; + +procedure TvCustomImage2.assign_vm_track; +var + start,__end:QWORD; +begin + if (tobj<>nil) then Exit; + + rw_wlock(lock); + + if (tobj=nil) then + begin + size:=get_image_size(key); + + start:=QWORD(key.Addr); + __end:=start+size; + + tobj:=vm_track_object_allocate(Pointer(self),start,__end,H_GPU_IMAGE,PAGE_TRACK_W); + tobj^.on_destroy:=@on_destroy; + tobj^.on_trigger:=@on_trigger; + + vm_map_track_insert(p_proc.p_vmspace,tobj); + + vm_track_object_deallocate(tobj); + end; + + rw_wunlock(lock) +end; + +Function TvCustomImage2.GetSubresRange:TVkImageSubresourceRange; +begin + Result:=Default(TVkImageSubresourceRange); + Result.aspectMask:=GetAspectMaskByFormat(key.cformat); + Result.levelCount:=key.params.mipLevels; + Result.layerCount:=key.params.arrayLayers; +end; + +Function TvCustomImage2.GetSubresLayer:TVkImageSubresourceLayers; +begin + Result:=Default(TVkImageSubresourceLayers); + Result.aspectMask :=GetAspectMaskByFormat(key.cformat); + Result.mipLevel :=0; + Result.baseArrayLayer:=0; + Result.layerCount :=key.params.arrayLayers; +end; + +// + +procedure TvChildImage2.FreeHandle; +begin + //nothing +end; + +function TvChildImage2._FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:TVkFlags):TvImageView2; +begin + Result:=Parent._FetchView(cmd,F,usage); +end; + +procedure TvChildImage2.PushBarrier(cmd:TvCustomCmdBuffer; + dstAccessMask:TVkAccessFlags; + newImageLayout:TVkImageLayout; + dstStageMask:TVkPipelineStageFlags); +begin + Parent.PushBarrier(cmd, + dstAccessMask, + newImageLayout, + dstStageMask); +end; + +procedure TvChildImage2.ForceBarrier(dstAccessMask:TVkAccessFlags; + newImageLayout:TVkImageLayout; + dstStageMask:TVkPipelineStageFlags); +begin + Parent.ForceBarrier(dstAccessMask, + newImageLayout, + dstStageMask); +end; + +function TvChildImage2.Acquire(Sender:TObject):Boolean; +begin + Result:=Parent.Acquire(Sender); +end; + +procedure TvChildImage2.Release(Sender:TObject); +begin + Parent.Release(Sender); +end; + +// procedure TvImageView2.PushBarrier(cmd:TvCustomCmdBuffer; dstAccessMask:TVkAccessFlags; @@ -212,10 +362,12 @@ begin end; -Function TvImageView2.GetSubresRange:TVkImageSubresourceRange; +Function TvImageView2.GetSubresRange(cformat:TVkFormat=VK_FORMAT_UNDEFINED):TVkImageSubresourceRange; begin + if (cformat=VK_FORMAT_UNDEFINED) then cformat:=key.cformat; + Result:=Default(TVkImageSubresourceRange); - Result.aspectMask :=GetAspectMaskByFormat(key.cformat); + Result.aspectMask :=GetAspectMaskByFormat(cformat); Result.baseMipLevel :=key.base_level; Result.levelCount :=key.last_level-key.base_level+1; Result.baseArrayLayer:=key.base_array; @@ -237,6 +389,7 @@ Constructor TvImage2.Create; begin inherited; Barrier.Init; + ref_trig:=1; end; Destructor TvImage2.Destroy; @@ -254,65 +407,9 @@ begin end; FViews.Free; - if (tobj<>nil) then - begin - vm_map_track_remove(p_proc.p_vmspace,tobj); - end; - inherited; end; -function on_destroy(handle:Pointer):Integer; SysV_ABI_CDecl; -begin - TvImage2(handle).tobj:=nil; - // - Result:=DO_DELETE; -end; - -function on_trigger(handle:Pointer;start,__end:QWORD):Integer; SysV_ABI_CDecl; -var - image:TvImage2; -begin - Result:=DO_NOTHING; - - image:=TvImage2(handle); - - if (__end>QWORD(image.key.Addr)) and (start<(QWORD(image.key.Addr)+image.size)) then - begin - //Writeln('on_trigger image'); - - System.InterlockedIncrement64(image.ref_trig); - - Result:=DO_INCREMENT; - end; - -end; - -procedure TvImage2.assign_vm_track(_size:Ptruint); -var - start,__end:QWORD; -begin - rw_wlock(lock); - - if (tobj=nil) then - begin - size:=_size; - - start:=QWORD(key.Addr); - __end:=start+size; - - tobj:=vm_track_object_allocate(Pointer(self),start,__end,H_GPU_IMAGE,PAGE_TRACK_W); - tobj^.on_destroy:=@on_destroy; - tobj^.on_trigger:=@on_trigger; - - vm_map_track_insert(p_proc.p_vmspace,tobj); - - vm_track_object_deallocate(tobj); - end; - - rw_wunlock(lock) -end; - function TvImage2.GetImageInfo:TVkImageCreateInfo; begin Result:=Default(TVkImageCreateInfo); @@ -329,61 +426,7 @@ begin Result.initialLayout:=VK_IMAGE_LAYOUT_UNDEFINED; end; -{ -Constructor TvHostImage2.Create; -begin - inherited; - Barrier.Init; -end; - -function TvHostImage2.GetImageInfo:TVkImageCreateInfo; -var - bpp,size:qword; -begin - Result:=Parent.GetImageInfo; - Result.tiling:=VK_IMAGE_TILING_LINEAR; - Result.usage :=FUsage; - Result.flags :=ord(VK_IMAGE_CREATE_ALIAS_BIT); - if (Parent.key.params.tiling_idx=8) then - begin - size:=Result.extent.width; - bpp:=getFormatSize(Result.format); - if IsTexelFormat(Result.format) then - begin - size:=(size+3) div 4; - end; - size:=size*bpp; - size:=AlignUp(size,128); - size:=size div bpp; - if IsTexelFormat(Result.format) then - begin - size:=size*4; - end; - Result.extent.width:=size; - end; -end; -} - -Function TvImage2.GetSubresRange:TVkImageSubresourceRange; -begin - Result:=Default(TVkImageSubresourceRange); - Result.aspectMask:=GetAspectMaskByFormat(key.cformat); - Result.levelCount:=key.params.mipLevels; - Result.layerCount:=key.params.arrayLayers; -end; - -Function TvImage2.GetSubresLayer(cformat:TVkFormat=VK_FORMAT_UNDEFINED):TVkImageSubresourceLayers; -begin - if (cformat=VK_FORMAT_UNDEFINED) then cformat:=key.cformat; - - Result:=Default(TVkImageSubresourceLayers); - Result.aspectMask :=GetAspectMaskByFormat(cformat); - Result.mipLevel :=0; - Result.baseArrayLayer:=0; - Result.layerCount :=key.params.arrayLayers; -end; - -function TvImage2.FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:TVkFlags):TvImageView2; +function TvImage2._FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:TVkFlags):TvImageView2; var key2:TvImageViewKey; @@ -466,7 +509,7 @@ begin Result:=t; end; -function TvImage2.FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:t_image_usage):TvImageView2; +function TvCustomImage2.FetchView(cmd:TvCustomCmdBuffer;const F:TvImageViewKey;usage:t_image_usage):TvImageView2; var tmp:TvImageViewKey; begin @@ -475,14 +518,14 @@ begin begin tmp:=F; tmp.cformat:=GET_VK_FORMAT_STORAGE(F.cformat); - Result:=FetchView(cmd,tmp,ord(VK_IMAGE_USAGE_STORAGE_BIT)); + Result:=_FetchView(cmd,tmp,ord(VK_IMAGE_USAGE_STORAGE_BIT)); end; else - Result:=FetchView(cmd,F,0); + Result:=_FetchView(cmd,F,0); end; end; -function TvImage2.FetchView(cmd:TvCustomCmdBuffer;usage:t_image_usage):TvImageView2; +function TvCustomImage2.FetchView(cmd:TvCustomCmdBuffer;usage:t_image_usage):TvImageView2; var F:TvImageViewKey; begin @@ -518,69 +561,14 @@ begin iu_storage: begin F.cformat:=GET_VK_FORMAT_STORAGE(F.cformat); - Result:=FetchView(cmd,F,ord(VK_IMAGE_USAGE_STORAGE_BIT)); + Result:=_FetchView(cmd,F,ord(VK_IMAGE_USAGE_STORAGE_BIT)); end; else - Result:=FetchView(cmd,F,0); + Result:=_FetchView(cmd,F,0); end; end; -{ -function TvImage2.FetchHostImage(cmd:TvCustomCmdBuffer;usage:TVkFlags):TvHostImage2; -var - t:TvHostImage2; - Fhost:TvPointer; -begin - Result:=nil; - t:=FHostImage; - - if (t<>nil) then - begin - if ((t.FUsage and usage)<>usage) then - begin - Assert(false,'TODO'); - end; - Exit(t); - end; - - t:=TvHostImage2.Create; - t.Parent:=Self; - t.FUsage:=usage; - - if not t.Compile(@img_ext) then - begin - t.Free; - Exit; - end; - - if TryGetHostPointerByAddr(key.Addr,Fhost) then - begin - if (t.BindMem(Fhost)<>VK_SUCCESS) then - begin - t.Free; - Exit; - end; - end else - begin - t.Free; - Exit; - end; - - FHostImage:=t; - Result:=t; - - if (cmd<>nil) and (Self<>nil) then - begin - if cmd.AddDependence(@Self.Release) then - begin - Self.Acquire(cmd); - end; - end; - -end; -} - procedure TvImage2.PushBarrier(cmd:TvCustomCmdBuffer; dstAccessMask:TVkAccessFlags; newImageLayout:TVkImageLayout; @@ -604,26 +592,18 @@ begin rw_wunlock(lock); end; -{ -procedure TvHostImage2.PushBarrier(cmd:TvCustomCmdBuffer; - dstAccessMask:TVkAccessFlags; - newImageLayout:TVkImageLayout; - dstStageMask:TVkPipelineStageFlags); +procedure TvImage2.ForceBarrier(dstAccessMask:TVkAccessFlags; + newImageLayout:TVkImageLayout; + dstStageMask:TVkPipelineStageFlags); begin - if (cmd=nil) then Exit; - if (not cmd.BeginCmdBuffer) then Exit; + rw_wlock(lock); - if Barrier.Push(cmd.cmdbuf, - FHandle, - Parent.GetSubresRange, - dstAccessMask, - newImageLayout, - dstStageMask) then - begin - Inc(cmd.cmd_count); - end; + Barrier.AccessMask:=dstAccessMask; + Barrier.ImgLayout :=newImageLayout; + Barrier.StageMask :=dstStageMask; + + rw_wunlock(lock); end; -} function TvImage2.Acquire(Sender:TObject):Boolean; begin @@ -653,6 +633,58 @@ begin inherited Release(Sender); end; +// + +function TvDepthStencilImage2.Compile(ext:Pointer):Boolean; +begin + Result:=inherited Compile(ext); + // + if Result then + begin + if (DepthOnly<>nil) then + begin + DepthOnly.FHandle:=FHandle; + end; + + if (StencilOnly<>nil) then + begin + StencilOnly.FHandle:=FHandle; + end; + end; +end; + +procedure TvDepthStencilImage2.assign_vm_track; +begin + if (DepthOnly<>nil) then + begin + DepthOnly.assign_vm_track; + end; + + if (StencilOnly<>nil) then + begin + StencilOnly.assign_vm_track; + end; +end; + +Destructor TvDepthStencilImage2.Destroy; +begin + if (DepthOnly<>nil) and + (DepthOnly<>Self) then + begin + FreeAndNil(DepthOnly); + end; + + if (StencilOnly<>nil) and + (StencilOnly<>Self) then + begin + FreeAndNil(StencilOnly); + end; + + inherited; +end; + +// + function _Find(const F:TvImageKey):TvImage2; var i:TvImage2Set.Iterator; @@ -677,6 +709,59 @@ begin if (usage and ord(VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT ))<>0 then Write(' INPUT_ATTACHMENT'); end; +function _NewImage(const F:TvImageKey;usage:t_image_usage):TvImage2; +begin + Case F.cformat of + //stencil + VK_FORMAT_S8_UINT: + begin + Result:=TvDepthStencilImage2.Create; + Result.key :=F; + Result.FUsage:=[usage]; + + Result.StencilOnly:=TvChildImage2.Create; + Result.StencilOnly.key :=GetStencilOnly(F); + Result.StencilOnly.Parent:=Result; + end; + //depth + VK_FORMAT_D16_UNORM, + VK_FORMAT_X8_D24_UNORM_PACK32, + VK_FORMAT_D32_SFLOAT: + begin + Result:=TvImage2.Create; + Result.key :=F; + Result.FUsage:=[usage]; + // + Result.Parent :=Result; + Result.DepthOnly:=Result; + end; + //depth stencil + VK_FORMAT_D16_UNORM_S8_UINT, + VK_FORMAT_D24_UNORM_S8_UINT, + VK_FORMAT_D32_SFLOAT_S8_UINT: + begin + Result:=TvDepthStencilImage2.Create; + Result.key :=F; + Result.FUsage:=[usage]; + + Result.DepthOnly:=TvChildImage2.Create; + Result.DepthOnly.key :=GetDepthOnly(F); + Result.DepthOnly.Parent:=Result; + + Result.StencilOnly:=TvChildImage2.Create; + Result.StencilOnly.key :=GetStencilOnly(F); + Result.StencilOnly.Parent:=Result; + end; + else + begin + Result:=TvImage2.Create; + Result.key :=F; + Result.FUsage:=[usage]; + end; + end; + +end; + function _FetchImage(const F:TvImageKey;usage:t_image_usage):TvImage2; label _repeat; @@ -705,10 +790,7 @@ begin end; end else begin - t:=TvImage2.Create; - t.key :=F; - //t.size :=get_image_size(F); - t.FUsage:=[usage]; + t:=_NewImage(F,usage); if not t.Compile(nil) then begin diff --git a/vulkan/vImageTiling.pas b/vulkan/vImageTiling.pas index 06f0778c..73cd7aa1 100644 --- a/vulkan/vImageTiling.pas +++ b/vulkan/vImageTiling.pas @@ -16,11 +16,8 @@ uses vHostBufferManager, vCmdBuffer; -Function GetLinearAlignWidth(bpp,width:Ptruint):Ptruint; -Function GetLinearSize(const key:TvImageKey;align:Boolean):Ptruint; - -procedure pm4_load_from (cmd:TvCustomCmdBuffer;image:TvImage2;IMAGE_USAGE:Byte); -procedure pm4_write_back(cmd:TvCustomCmdBuffer;image:TvImage2); +procedure pm4_load_from (cmd:TvCustomCmdBuffer;image:TvCustomImage2;IMAGE_USAGE:Byte); +procedure pm4_write_back(cmd:TvCustomCmdBuffer;image:TvCustomImage2); Function get_image_size(const key:TvImageKey):Ptruint; implementation @@ -170,7 +167,7 @@ begin Free; end; -procedure load_clear(cmd:TvCustomCmdBuffer;image:TvImage2); +procedure load_clear(cmd:TvCustomCmdBuffer;image:TvCustomImage2); var Color:TVkClearColorValue; DepthStencil:TVkClearDepthStencilValue; @@ -286,7 +283,7 @@ begin end; end; -Procedure _Copy_Linear(cmd:TvCustomCmdBuffer;buf:TvTempBuffer;image:TvImage2;cformat:TVkFormat); +Procedure _Copy_Linear(cmd:TvCustomCmdBuffer;buf:TvTempBuffer;image:TvCustomImage2); var BufferImageCopy:TVkBufferImageCopy; size:Ptruint; @@ -304,7 +301,7 @@ begin cmd.AddDependence(@buf.ReleaseTmp); - m_bytePerElement:=getFormatSize(cformat); + m_bytePerElement:=getFormatSize(image.key.cformat); size:=GetLinearSize(image.key,false); @@ -323,7 +320,7 @@ begin ); BufferImageCopy:=Default(TVkBufferImageCopy); - BufferImageCopy.imageSubresource:=image.GetSubresLayer(cformat); + BufferImageCopy.imageSubresource:=image.GetSubresLayer; BufferImageCopy.imageSubresource.layerCount:=1; BufferImageCopy.imageExtent.depth:=1; @@ -356,7 +353,7 @@ begin BufferImageCopyA[b]:=BufferImageCopy; Inc(b); - if IsTexelFormat(cformat) then + if IsTexelFormat(image.key.cformat) then begin m_padwidth :=(m_width +3) shr 2; m_padheight:=(m_height+3) shr 2; @@ -387,7 +384,7 @@ begin end; -Procedure load_1dThin(cmd:TvCustomCmdBuffer;image:TvImage2;addr:Pointer;cformat:TVkFormat); +Procedure load_1dThin(cmd:TvCustomCmdBuffer;image:TvCustomImage2); var buf:TvTempBuffer; vmem:TvPointer; @@ -434,10 +431,10 @@ begin dst:=m_base; - m_bytePerElement:=getFormatSize(cformat); + m_bytePerElement:=getFormatSize(image.key.cformat); tiler.init_surface(m_bytePerElement, - ord(IsTexelFormat(cformat)), + ord(IsTexelFormat(image.key.cformat)), image.key.params.tiling.idx, image.key.params.tiling.alt); @@ -447,7 +444,7 @@ begin m_width :=image.key.params.width; m_height:=image.key.params.height; - src:=addr; + src:=image.key.addr; while (m_level>0) do begin @@ -485,10 +482,10 @@ begin vkUnmapMemory(Device.FHandle,buf.FBind.FMemory.FHandle); //FreeMem(m_base); - _Copy_Linear(cmd,buf,image,cformat); + _Copy_Linear(cmd,buf,image); end; -Procedure Load_Linear(cmd:TvCustomCmdBuffer;image:TvImage2;addr:Pointer;cformat:TVkFormat); +Procedure Load_Linear(cmd:TvCustomCmdBuffer;image:TvCustomImage2); var buf:TvHostBuffer; BufferImageCopy:TVkBufferImageCopy; @@ -505,16 +502,16 @@ var a,d,b:Ptruint; begin - m_bytePerElement:=getFormatSize(cformat); + m_bytePerElement:=getFormatSize(image.key.cformat); size:=GetLinearSize(image.key,(image.key.params.tiling.idx<>kTileModeDisplay_LinearGeneral)); buf:=FetchHostBuffer(cmd, - QWORD(addr), + QWORD(image.key.addr), size, ord(VK_BUFFER_USAGE_TRANSFER_SRC_BIT)); - m_offset:=buf.FAddr-QWORD(addr); + m_offset:=buf.FAddr-QWORD(image.key.addr); image.PushBarrier(cmd, ord(VK_ACCESS_TRANSFER_WRITE_BIT), @@ -532,7 +529,7 @@ begin ); BufferImageCopy:=Default(TVkBufferImageCopy); - BufferImageCopy.imageSubresource:=image.GetSubresLayer(cformat); + BufferImageCopy.imageSubresource:=image.GetSubresLayer; BufferImageCopy.imageSubresource.layerCount:=1; BufferImageCopy.imageExtent.depth:=1; @@ -568,7 +565,7 @@ begin BufferImageCopyA[b]:=BufferImageCopy; Inc(b); - if IsTexelFormat(cformat) then + if IsTexelFormat(image.key.cformat) then begin m_padwidth :=(m_width +3) shr 2; m_padheight:=(m_height+3) shr 2; @@ -599,7 +596,7 @@ begin end; -Procedure Writeback_Linear(cmd:TvCustomCmdBuffer;image:TvImage2;addr:Pointer;cformat:TVkFormat); +Procedure Writeback_Linear(cmd:TvCustomCmdBuffer;image:TvCustomImage2); var buf:TvHostBuffer; BufferImageCopy:TVkBufferImageCopy; @@ -616,16 +613,16 @@ var a,d,b:Ptruint; begin - m_bytePerElement:=getFormatSize(cformat); + m_bytePerElement:=getFormatSize(image.key.cformat); size:=GetLinearSize(image.key,(image.key.params.tiling.idx<>kTileModeDisplay_LinearGeneral)); buf:=FetchHostBuffer(cmd, - QWORD(addr), + QWORD(image.key.addr), size, ord(VK_BUFFER_USAGE_TRANSFER_DST_BIT)); - m_offset:=buf.FAddr-QWORD(addr); + m_offset:=buf.FAddr-QWORD(image.key.addr); image.PushBarrier(cmd, ord(VK_ACCESS_TRANSFER_READ_BIT), @@ -643,7 +640,7 @@ begin ); BufferImageCopy:=Default(TVkBufferImageCopy); - BufferImageCopy.imageSubresource:=image.GetSubresLayer(cformat); + BufferImageCopy.imageSubresource:=image.GetSubresLayer; BufferImageCopy.imageSubresource.layerCount:=1; BufferImageCopy.imageExtent.depth:=1; @@ -679,7 +676,7 @@ begin BufferImageCopyA[b]:=BufferImageCopy; Inc(b); - if IsTexelFormat(cformat) then + if IsTexelFormat(image.key.cformat) then begin m_padwidth :=(m_width +3) shr 2; m_padheight:=(m_height+3) shr 2; @@ -711,7 +708,7 @@ begin end; type - t_load_from_cb =procedure(cmd:TvCustomCmdBuffer;image:TvImage2;addr:Pointer;cformat:TVkFormat); + t_load_from_cb =procedure(cmd:TvCustomCmdBuffer;image:TvCustomImage2); t_write_back_cb=t_load_from_cb; t_get_size_cb =function(const key:TvImageKey):Ptruint; @@ -770,19 +767,15 @@ begin set_tiling_cbs(kTileModeDisplay_LinearAligned,1,@Load_Linear,@Writeback_Linear,@GetLinearAlignSize); end; -procedure pm4_load_from(cmd:TvCustomCmdBuffer;image:TvImage2;IMAGE_USAGE:Byte); +procedure pm4_load_from(cmd:TvCustomCmdBuffer;image:TvCustomImage2;IMAGE_USAGE:Byte); var cb:t_load_from_cb; - cformat:array[0..1] of TVkFormat; begin + if (cmd=nil) or (image=nil) then Exit; + if (IMAGE_USAGE and TM_READ)=0 then Exit; - if (image.tobj<>nil) and (image.ref_load=image.ref_trig) then Exit; - - //if (ri.data_usage and TM_READ)<>0 then Exit; - //ri.data_usage:=ri.data_usage or TM_READ; - - //IMAGE_USAGE:=IMAGE_USAGE and (not TM_READ); + if (image.ref_load=image.ref_trig) then Exit; cb:=a_tiling_cbs[Byte(image.key.params.tiling)].load_from; @@ -792,32 +785,18 @@ begin Assert (false ,'tiling:'+IntToStr(image.key.params.tiling.idx)+' alt:'+IntToStr(image.key.params.tiling.alt)); end; - cformat[0]:=GetDepthOrImageFormat(image.key.cformat); - cformat[1]:=GetStencilOnlyFormat (image.key.cformat); - - if (cformat[0]<>VK_FORMAT_UNDEFINED) then - begin - cb(cmd,image,image.key.Addr,cformat[0]); - end; - - if (cformat[1]<>VK_FORMAT_UNDEFINED) then - begin - cb(cmd,image,image.key.Stencil,cformat[1]); - end; + cb(cmd,image); image.ref_load:=image.ref_trig; - if (image.tobj=nil) then - begin - image.assign_vm_track(get_image_size(image.key)); - end; + image.assign_vm_track; end; -procedure pm4_write_back(cmd:TvCustomCmdBuffer;image:TvImage2); +procedure pm4_write_back(cmd:TvCustomCmdBuffer;image:TvCustomImage2); var cb:t_write_back_cb; - cformat:array[0..1] of TVkFormat; begin + if (cmd=nil) or (image=nil) then Exit; cb:=a_tiling_cbs[Byte(image.key.params.tiling)].write_back; @@ -827,25 +806,11 @@ begin Assert (false ,'tiling:'+IntToStr(image.key.params.tiling.idx)+' alt:'+IntToStr(image.key.params.tiling.alt)); end; - cformat[0]:=GetDepthOrImageFormat(image.key.cformat); - cformat[1]:=GetStencilOnlyFormat (image.key.cformat); + cb(cmd,image); - if (cformat[0]<>VK_FORMAT_UNDEFINED) then - begin - cb(cmd,image,image.key.Addr,cformat[0]); - end; + image.assign_vm_track; - if (cformat[1]<>VK_FORMAT_UNDEFINED) then - begin - cb(cmd,image,image.key.Stencil,cformat[1]); - end; - - if (image.size=0) then - begin - image.size:=get_image_size(image.key); - end; - - vm_map_track_trigger(p_proc.p_vmspace,QWORD(image.key.Addr),QWORD(image.key.Addr)+image.size); + vm_map_track_trigger(p_proc.p_vmspace,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']; @@ -870,33 +835,33 @@ Procedure LoadFromBuffer(cmd:TvCustomCmdBuffer;image:TObject); begin if (cmd=nil) then Exit; - Case TvImage2(image).key.params.tiling_idx of + Case TvCustomImage2(image).key.params.tiling_idx of kTileModeDisplay_LinearAligned, kTileModeDisplay_LinearGeneral: - _Load_Linear(cmd,TvImage2(image)); + _Load_Linear(cmd,TvCustomImage2(image)); kTileModeDisplay_2dThin: //render target tiling todo - _Load_Linear(cmd,TvImage2(image)); + _Load_Linear(cmd,TvCustomImage2(image)); kTileModeDepth_2dThin_64 , kTileModeDepth_2dThin_128, kTileModeDepth_2dThin_256, kTileModeDepth_2dThin_512, kTileModeDepth_2dThin_1K : //depth tiling todo - _Load_Linear(cmd,TvImage2(image)); + _Load_Linear(cmd,TvCustomImage2(image)); kTileModeDepth_1dThin, kTileModeDisplay_1dThin, kTileModeThin_1dThin, //texture $1B: - _Load_Thin_1dThin(cmd,TvImage2(image)); + _Load_Thin_1dThin(cmd,TvCustomImage2(image)); kTileModeThin_2dThin: - _Load_Linear(cmd,TvImage2(image)); //TODO + _Load_Linear(cmd,TvCustomImage2(image)); //TODO else if not SKIP_UNKNOW_TILING then - Assert(false,'TODO tiling_idx:'+get_tiling_idx_str(TvImage2(image).key.params.tiling_idx)); + Assert(false,'TODO tiling_idx:'+get_tiling_idx_str(TvCustomImage2(image).key.params.tiling_idx)); end; end; diff --git a/vulkan/vMemory.pas b/vulkan/vMemory.pas index 451e525e..49e63281 100644 --- a/vulkan/vMemory.pas +++ b/vulkan/vMemory.pas @@ -54,6 +54,7 @@ type // Constructor Create(Handle:TVkDeviceMemory;Size:TVkDeviceSize;mem_type:Byte;mem_info:PVkMemoryType); Destructor Destroy; override; + Procedure Flush; end; TvHostMemory=class(TvDeviceMemory) @@ -143,6 +144,8 @@ type Function FetchHostMap(Addr,Size:TVkDeviceSize;mtindex:Byte):TvPointer; Function FetchHostMap(Addr,Size:TVkDeviceSize;device_local:Boolean):TvPointer; + + Procedure Flush; end; var @@ -826,6 +829,22 @@ begin inherited; end; +Procedure TvDeviceMemory.Flush; +var + range:TVkMappedMemoryRange; +begin + if (not FMemInfo.host_coherent) then + begin + range:=Default(TVkMappedMemoryRange); + range.sType :=VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE; + range.memory:=FHandle; + range.offset:=0; + range.size :=FSize; + // + vkFlushMappedMemoryRanges(Device.FHandle,1,@range); + end; +end; + // function TvPointer.Acquire:Boolean; @@ -1721,6 +1740,28 @@ begin end; +Procedure TvMemManager.Flush; +var + node:TvHostMemory; +begin + if (Self=nil) then Exit; + + rw_wlock(global_mem_lock); + // + + node:=TvHostMemory(TAILQ_FIRST(@FHosts)); + while (node<>nil) do + begin + + node.Flush; + + node:=TvHostMemory(TAILQ_NEXT(node,@node.entry)); + end; + + // + rw_wunlock(global_mem_lock); +end; + // function vkAllocMemory(device:TVkDevice;Size:TVkDeviceSize;mtindex:TVkUInt32):TVkDeviceMemory; diff --git a/vulkan/vRegs2Vulkan.pas b/vulkan/vRegs2Vulkan.pas index 7432cfdb..32f92f08 100644 --- a/vulkan/vRegs2Vulkan.pas +++ b/vulkan/vRegs2Vulkan.pas @@ -24,13 +24,10 @@ type attachment:TVkUInt32; - //padded:TVkExtent2D; - FImageInfo:TvImageKey; FImageView:TvImageViewKey; COMP_SWAP :Byte; - //FAST_CLEAR:Boolean; IMAGE_USAGE:Byte; @@ -47,25 +44,16 @@ type STENCIL_READ_ADDR :Pointer; STENCIL_WRITE_ADDR:Pointer; - //padded:TVkExtent2D; - - //DEPTH_CLEAR :Boolean; - //STENCIL_CLEAR :Boolean; - - //Z_READ_ONLY :Boolean; - //STENCIL_READ_ONLY:Boolean; - CLEAR_VALUE:TVkClearValue; ds_state:TVkPipelineDepthStencilStateCreateInfo; - DEPTH_USAGE:Byte; + DEPTH_USAGE :Byte; STENCIL_USAGE:Byte; FImageInfo:TvImageKey; zorder_stage:TVkPipelineStageFlags; - end; TBLEND_INFO=packed record @@ -1117,6 +1105,8 @@ var DEPTH_CONTROL :TDB_DEPTH_CONTROL; STENCIL_CONTROL:TDB_STENCIL_CONTROL; SHADER_CONTROL :TDB_SHADER_CONTROL; + DB_Z_INFO :TDB_Z_INFO; + DB_STENCIL_INFO:TDB_STENCIL_INFO; begin Result:=Default(TDB_INFO); @@ -1124,6 +1114,8 @@ begin DEPTH_CONTROL :=CX_REG^.DB_DEPTH_CONTROL; STENCIL_CONTROL:=CX_REG^.DB_STENCIL_CONTROL; SHADER_CONTROL :=CX_REG^.DB_SHADER_CONTROL; + DB_Z_INFO :=CX_REG^.DB_Z_INFO; + DB_STENCIL_INFO:=CX_REG^.DB_STENCIL_INFO; // @@ -1231,8 +1223,6 @@ begin Assert(CX_REG^.DB_DEPTH_VIEW.SLICE_START=0,'DB_DEPTH_VIEW.SLICE_START'); - Result.FImageInfo.cformat:=DB_Z_FORMATS[CX_REG^.DB_Z_INFO.FORMAT,CX_REG^.DB_STENCIL_INFO.FORMAT]; - Result.Z_READ_ADDR :=Pointer(QWORD(CX_REG^.DB_Z_READ_BASE ) shl 8); Result.Z_WRITE_ADDR:=Pointer(QWORD(CX_REG^.DB_Z_WRITE_BASE) shl 8); @@ -1263,17 +1253,28 @@ begin Result.zorder_stage:=Result.zorder_stage or ord(VK_PIPELINE_STAGE_EARLY_FRAGMENT_TESTS_BIT); end; + // + + if (DB_STENCIL_INFO.FORMAT<>0) then + begin + Assert(DB_Z_INFO.TILE_MODE_INDEX=DB_STENCIL_INFO.TILE_MODE_INDEX,'DB_Z_INFO.TILE_MODE_INDEX<>DB_STENCIL_INFO.TILE_MODE_INDEX'); + end; + + // + + Result.FImageInfo.cformat:=DB_Z_FORMATS[DB_Z_INFO.FORMAT,DB_STENCIL_INFO.FORMAT]; + Result.FImageInfo.Addr :=Result.Z_READ_ADDR; - Result.FImageInfo.Stencil:=Result.STENCIL_READ_ADDR; + Result.FImageInfo.Addr2 :=Result.STENCIL_READ_ADDR; Result.FImageInfo.params.width :=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_X); Result.FImageInfo.params.height:=_fix_scissor_range(CX_REG^.PA_SC_SCREEN_SCISSOR_BR.BR_Y); Result.FImageInfo.params.depth :=1; - Result.FImageInfo.params.tiling.idx:=CX_REG^.DB_Z_INFO.TILE_MODE_INDEX; + Result.FImageInfo.params.tiling.idx:=DB_Z_INFO.TILE_MODE_INDEX; Result.FImageInfo.params.itype :=ord(VK_IMAGE_TYPE_2D); - Result.FImageInfo.params.samples :=1 shl (CX_REG^.DB_Z_INFO.NUM_SAMPLES and 3); + Result.FImageInfo.params.samples :=1 shl (DB_Z_INFO.NUM_SAMPLES and 3); Result.FImageInfo.params.mipLevels :=1; Result.FImageInfo.params.arrayLayers:=1; diff --git a/vulkan/vRenderPassManager.pas b/vulkan/vRenderPassManager.pas index 610b4924..d7d3dbfa 100644 --- a/vulkan/vRenderPassManager.pas +++ b/vulkan/vRenderPassManager.pas @@ -118,7 +118,7 @@ begin DepCount:=1; DepthRef.attachment:=id; - DepthRef.layout :=GetDepthStencilLayout(DEPTH_USAGE,STENCIL_USAGE); + DepthRef.layout :=GetDepthStencilInitLayout(DEPTH_USAGE,STENCIL_USAGE); am:=GetDepthStencilAccessMask(DEPTH_USAGE,STENCIL_USAGE); @@ -169,9 +169,9 @@ begin end; With ColorAtd[AtdCount] do - begin - finalLayout:=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - end; + begin + finalLayout:=VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + end; Inc(AtdCount); @@ -231,18 +231,14 @@ begin end; With ColorAtd[AtdCount] do - if (((DEPTH_USAGE or STENCIL_USAGE) and TM_READ)<>0) then begin - initialLayout:=GetDepthStencilLayout(DEPTH_USAGE,STENCIL_USAGE); - end else - begin - initialLayout:=VK_IMAGE_LAYOUT_UNDEFINED; + initialLayout:=GetDepthStencilInitLayout(DEPTH_USAGE,STENCIL_USAGE); end; With ColorAtd[AtdCount] do - begin - finalLayout:=GetDepthStencilLayout(DEPTH_USAGE,STENCIL_USAGE); - end; + begin + finalLayout:=GetDepthStencilSendLayout(DEPTH_USAGE,STENCIL_USAGE); + end; Inc(AtdCount);