diff --git a/chip/pm4_me.pas b/chip/pm4_me.pas index 2ba26542..08fd7e86 100644 --- a/chip/pm4_me.pas +++ b/chip/pm4_me.pas @@ -18,6 +18,7 @@ uses vRender, vRenderPassManager, vPipelineManager, + vFramebufferManager, vShader, vShaderExt, vShaderManager, @@ -164,7 +165,9 @@ var GP_KEY:TvGraphicsPipelineKey; GP:TvGraphicsPipeline2; - FFramebuffer:TvFramebufferIL; + FB_KEY:TvFramebufferImagelessKey; + FB_KEY2:TvFramebufferBindedKey; + FFramebuffer:TvFramebuffer; FRenderCmd:TvRenderTargets; @@ -294,36 +297,47 @@ begin GP:=FetchGraphicsPipeline(CmdBuffer,@GP_KEY); - FFramebuffer:=TvFramebufferIL.Create; - FFramebuffer.Key.FRenderPass :=RP; - FFramebuffer.Key.FSize :=GPU_REGS.GET_SCREEN_SIZE; - - if (RT_COUNT<>0) then - For i:=0 to RT_COUNT-1 do - begin - FFramebuffer.Key.AddImageAt(RT_INFO[i].FImageInfo); - end; - - if GPU_REGS.DB_ENABLE then + if limits.VK_KHR_imageless_framebuffer then begin - FFramebuffer.Key.AddImageAt(DB_INFO.FImageInfo); - end; + FB_KEY:=Default(TvFramebufferImagelessKey); - FFramebuffer.Compile; + FB_KEY.SetRenderPass(RP); + FB_KEY.SetSize(GPU_REGS.GET_SCREEN_SIZE); + + if (RT_COUNT<>0) then + For i:=0 to RT_COUNT-1 do + begin + FB_KEY.AddImageAt(RT_INFO[i].FImageInfo); + end; + + if GPU_REGS.DB_ENABLE then + begin + FB_KEY.AddImageAt(DB_INFO.FImageInfo); + end; + end else + begin + FB_KEY2:=Default(TvFramebufferBindedKey); + + FB_KEY2.SetRenderPass(RP); + FB_KEY2.SetSize(GPU_REGS.GET_SCREEN_SIZE); + end; FRenderCmd:=TvRenderTargets.Create; FRenderCmd.FRenderPass:=RP; FRenderCmd.FPipeline :=GP; - FRenderCmd.FFramebuffer:=FFramebuffer; - FRenderCmd.FRenderArea:=GPU_REGS.GET_SCREEN; + if limits.VK_KHR_imageless_framebuffer then + begin + FFramebuffer:=FetchFramebufferImageless(CmdBuffer,@FB_KEY); + FRenderCmd.FFramebuffer:=FFramebuffer; + end; + if (RT_COUNT<>0) then For i:=0 to RT_COUNT-1 do begin - //RT_INFO[i].CLEAR_COLOR.float32[2]:=1; FRenderCmd.AddClearColor(RT_INFO[i].CLEAR_COLOR); @@ -335,7 +349,10 @@ begin iv:=ri.FetchView(CmdBuffer,RT_INFO[i].FImageView,iu_attachment); - FRenderCmd.AddImageView(iv); + if limits.VK_KHR_imageless_framebuffer then + begin + FRenderCmd.AddImageView(iv); + end; ri.PushBarrier(CmdBuffer, ord(VK_ACCESS_TRANSFER_READ_BIT), @@ -348,8 +365,19 @@ begin ord(VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) or ord(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) ); + if not limits.VK_KHR_imageless_framebuffer then + begin + FB_KEY2.AddImageView(iv); + end; + end; + if not limits.VK_KHR_imageless_framebuffer then + begin + FFramebuffer:=FetchFramebufferBinded(CmdBuffer,@FB_KEY2); + FRenderCmd.FFramebuffer:=FFramebuffer; + end; + if GPU_REGS.DB_ENABLE then begin FRenderCmd.AddClearColor(DB_INFO.CLEAR_VALUE); diff --git a/chip/pm4_ring.pas b/chip/pm4_ring.pas index 3a4d52ed..c46b69ec 100644 --- a/chip/pm4_ring.pas +++ b/chip/pm4_ring.pas @@ -78,7 +78,7 @@ begin ring^.wptr:=0; ring^.aptr:=0; - Result:=md_reserve_ex(ring^.buff,size+GC_RING_PADD); + Result:=md_reserve_ex(ring^.buff,size shl 1); if (Result<>0) then Exit; Result:=md_split(ring^.buff,size); @@ -95,7 +95,7 @@ begin Exit; end; - Result:=md_file_mmap_ex(hMem,ring^.buff+size,0,GC_RING_PADD,MD_PROT_RW); + Result:=md_file_mmap_ex(hMem,ring^.buff+size,0,size,MD_PROT_RW); md_memfd_close(hMem); end; @@ -107,7 +107,7 @@ begin if (ring^.buff=nil) then Exit; if (ring^.size=0) then Exit; - Result:=md_unmap_ex(ring^.buff,ring^.size+GC_RING_PADD); + Result:=md_unmap_ex(ring^.buff,ring^.size shl 1); end; function block_id(val,size:DWORD):DWORD; inline; @@ -177,9 +177,7 @@ begin s:=block_ofs(wptr,rsiz)-block_ofs(rptr,rsiz); end else begin - s:=block_ofs(wptr,rsiz); - if (s>GC_RING_PADD) then s:=GC_RING_PADD; - s:=(rsiz-block_ofs(rptr,rsiz))+s; + s:=(rsiz-block_ofs(rptr,rsiz))+block_ofs(wptr,rsiz); end; if (s<>0) then diff --git a/fpPS4.lpi b/fpPS4.lpi index e22c371b..aac7a5c2 100644 --- a/fpPS4.lpi +++ b/fpPS4.lpi @@ -994,6 +994,10 @@ + + + + diff --git a/vulkan/vCmdBuffer.pas b/vulkan/vCmdBuffer.pas index 0a3f26ca..1a4ba1cb 100644 --- a/vulkan/vCmdBuffer.pas +++ b/vulkan/vCmdBuffer.pas @@ -254,8 +254,8 @@ end; function TvCmdBuffer.BeginRenderPass(RT:TvRenderTargets):Boolean; var - info:TVkRenderPassBeginInfo; - info2:TVkRenderPassAttachmentBeginInfo; + rinfo:TVkRenderPassBeginInfo; + ainfo:TVkRenderPassAttachmentBeginInfo; begin Result:=False; @@ -281,10 +281,13 @@ begin EndRenderPass; - info:=RT.GetInfo; - info2:=RT.GetInfo2; + rinfo:=RT.GetRInfo; - info.pNext:=@info2; + if RT.FFramebuffer.IsImageless then + begin + ainfo:=RT.GetAInfo; + rinfo.pNext:=@ainfo; + end; FCurrPipeline[0]:=RT.FPipeline.FHandle; FCurrLayout [0]:=RT.FPipeline.Key.FShaderGroup.FLayout.FHandle; @@ -292,7 +295,7 @@ begin Inc(cmd_count); - vkCmdBeginRenderPass(FCmdbuf,@info,VK_SUBPASS_CONTENTS_INLINE); + vkCmdBeginRenderPass(FCmdbuf,@rinfo,VK_SUBPASS_CONTENTS_INLINE); vkCmdBindPipeline (FCmdbuf,VK_PIPELINE_BIND_POINT_GRAPHICS,FCurrPipeline[0]); if AddDependence(@RT.Release) then @@ -300,7 +303,7 @@ begin RT.Acquire(Self); end; - FRenderPass:=info.renderPass; + FRenderPass:=rinfo.renderPass; Result:=True; end; diff --git a/vulkan/vFramebufferManager.pas b/vulkan/vFramebufferManager.pas new file mode 100644 index 00000000..416c5835 --- /dev/null +++ b/vulkan/vFramebufferManager.pas @@ -0,0 +1,260 @@ +unit vFramebufferManager; + +{$mode ObjFPC}{$H+} + +interface + +uses + SysUtils, + mqueue, + g23tree, + vDependence, + vImage; + +type + TvFramebufferImageless2=class(TvFramebufferImageless) + FRefs:ptruint; + Procedure Acquire; + procedure Release(Sender:TObject); + end; + + TvFramebufferBinded2=class(TvFramebufferBinded) + FEntry:TAILQ_ENTRY; + FRefs:ptruint; + Procedure Acquire; + procedure Release(Sender:TObject); + end; + +function FetchFramebufferImageless(cmd:TvDependenciesObject;P:PvFramebufferImagelessKey):TvFramebufferImageless2; +function FetchFramebufferBinded (cmd:TvDependenciesObject;P:PvFramebufferBindedKey ):TvFramebufferBinded2; + +implementation + +uses + kern_rwlock; + +type + TvFramebufferImagelessKey2Compare=object + function c(a,b:PvFramebufferImagelessKey):Integer; static; + end; + + TvFramebufferImageless2Set=specialize T23treeSet; + + TvFramebufferBinded2Set=object + const + MaxCount=256; + var + Queue:TAILQ_HEAD; + Count:Ptruint; + end; + +var + global_lock:Pointer=nil; + + FFramebufferImageless2Set:TvFramebufferImageless2Set; + + FFramebufferBinded:TvFramebufferBinded2Set=( + Queue:(tqh_first:nil;tqh_last:@FFramebufferBinded.Queue.tqh_first); + Count:0 + ); + +function TvFramebufferImagelessKey2Compare.c(a,b:PvFramebufferImagelessKey):Integer; +begin + Result:=CompareByte(a^,b^,SizeOf(TvFramebufferImagelessKey)); +end; + +Procedure TvFramebufferImageless2.Acquire; +begin + System.InterlockedIncrement(Pointer(FRefs)); +end; + +procedure TvFramebufferImageless2.Release(Sender:TObject); +begin + if System.InterlockedDecrement(Pointer(FRefs))=nil then + begin + Free; + end; +end; + +Procedure TvFramebufferBinded2.Acquire; +begin + System.InterlockedIncrement(Pointer(FRefs)); +end; + +procedure TvFramebufferBinded2.Release(Sender:TObject); +begin + if System.InterlockedDecrement(Pointer(FRefs))=nil then + begin + Free; + end; +end; + +Procedure Global_Lock_wr; +begin + rw_wlock(global_lock); +end; + +Procedure Global_Unlock_wr; +begin + rw_wunlock(global_lock); +end; + +function _FindImageless(P:PvFramebufferImagelessKey):TvFramebufferImageless2; +var + i:TvFramebufferImageless2Set.Iterator; +begin + Result:=nil; + i:=FFramebufferImageless2Set.find(P); + if (i.Item<>nil) then + begin + Result:=TvFramebufferImageless2(ptruint(i.Item^)-ptruint(@TvFramebufferImageless2(nil).key)); + end; +end; + +function _FetchImageless(P:PvFramebufferImagelessKey):TvFramebufferImageless2; +var + t:TvFramebufferImageless2; +begin + Result:=nil; + + t:=_FindImageless(P); + + if (t=nil) then + begin + + t:=TvFramebufferImageless2.Create; + t.key:=P^; + + if not t.Compile then + begin + FreeAndNil(t); + end else + begin + t.Acquire; //map ref + FFramebufferImageless2Set.Insert(@t.key); + end; + end; + + Result:=t; +end; + +function FetchFramebufferImageless(cmd:TvDependenciesObject;P:PvFramebufferImagelessKey):TvFramebufferImageless2; +begin + Result:=nil; + if (P=nil) then Exit; + + Global_Lock_wr; + + Result:=_FetchImageless(P); + + if (cmd<>nil) and (Result<>nil) then + begin + if cmd.AddDependence(@Result.Release) then + begin + Result.Acquire; + end; + end; + + Global_Unlock_wr; +end; + +/// + +function _FindBinded(P:PvFramebufferBindedKey):TvFramebufferBinded2; +var + node:TvFramebufferBinded2; +begin + Result:=nil; + + node:=TvFramebufferBinded2(TAILQ_FIRST(@FFramebufferBinded.Queue)); + + while (node<>nil) do + begin + + if (CompareByte(P^,node.Key,SizeOf(TvFramebufferBindedKey))=0) then + begin + if (node<>TvFramebufferBinded2(TAILQ_FIRST(@FFramebufferBinded.Queue))) then + begin + //set to top + TAILQ_REMOVE (@FFramebufferBinded.Queue,node,@node.FEntry); + TAILQ_INSERT_HEAD(@FFramebufferBinded.Queue,node,@node.FEntry); + end; + Break; + end; + + node:=TvFramebufferBinded2(TAILQ_NEXT(node,@node.FEntry)); + end; + +end; + +procedure _BoundBinded; +var + node:TvFramebufferBinded2; +begin + if (FFramebufferBinded.Count>FFramebufferBinded.MaxCount) then + begin + node:=TvFramebufferBinded2(TAILQ_LAST(@FFramebufferBinded.Queue)); + + if (node<>nil) then + begin + TAILQ_REMOVE(@FFramebufferBinded.Queue,node,@node.FEntry); + node.Release(nil); + end; + + Dec(FFramebufferBinded.Count); + end; +end; + +function _FetchBinded(P:PvFramebufferBindedKey):TvFramebufferBinded2; +var + t:TvFramebufferBinded2; +begin + Result:=nil; + + t:=_FindBinded(P); + + if (t=nil) then + begin + + t:=TvFramebufferBinded2.Create; + t.key:=P^; + + if not t.Compile then + begin + FreeAndNil(t); + end else + begin + t.Acquire; //map ref + TAILQ_INSERT_HEAD(@FFramebufferBinded.Queue,t,@t.FEntry); + Inc(FFramebufferBinded.Count); + + _BoundBinded; + end; + end; + + Result:=t; +end; + +function FetchFramebufferBinded(cmd:TvDependenciesObject;P:PvFramebufferBindedKey):TvFramebufferBinded2; +begin + Result:=nil; + if (P=nil) then Exit; + + Global_Lock_wr; + + Result:=_FetchBinded(P); + + if (cmd<>nil) and (Result<>nil) then + begin + if cmd.AddDependence(@Result.Release) then + begin + Result.Acquire; + end; + end; + + Global_Unlock_wr; +end; + + +end. + diff --git a/vulkan/vImage.pas b/vulkan/vImage.pas index a1880861..91e37a23 100644 --- a/vulkan/vImage.pas +++ b/vulkan/vImage.pas @@ -160,40 +160,64 @@ type function GetImageInfo:TVkImageCreateInfo; override; end; - AvFramebufferImages=array[0..8] of TvImageView; + TvFramebufferAttachmentShort=packed record + cformat :TVkFormat; + width :Word; + height :Word; + layerCount:Word; + end; + AvFramebufferAttach=array[0..8] of TVkFramebufferAttachmentImageInfo; + AvFramebufferAShort=array[0..8] of TvFramebufferAttachmentShort; + + AvFramebufferImages=array[0..8] of TvImageView; AvImageViews =array[0..8] of TVkImageView; TvFramebuffer=class FHandle:TVkFramebuffer; + function IsImageless:Boolean; virtual; Destructor Destroy; override; end; + PvFramebufferImagelessKey=^TvFramebufferImagelessKey; TvFramebufferImagelessKey=packed object FRenderPass :TvRenderPass; - FSize :TVkExtent2D; - FImagesCount:ptruint; - FImages :AvFramebufferAttach; + FWidth :Word; + FHeight :Word; + FLayers :Word; + FImagesCount:Word; + FImages :AvFramebufferAShort; + Procedure SetRenderPass(r:TvRenderPass); + Procedure SetSize(Size:TVkExtent2D); Procedure AddImageAt(Key:TvImageKey); + Procedure Export(var F:AvFramebufferAttach); end; - TvFramebufferIL=class(TvFramebuffer) + TvFramebufferImageless=class(TvFramebuffer) Key:TvFramebufferImagelessKey; - function Compile:Boolean; + function IsImageless:Boolean; override; + function Compile:Boolean; end; - TvFramebufferIV=class(TvFramebuffer) - FEdit,FCompile:ptruint; + PvFramebufferBindedKey=^TvFramebufferBindedKey; + TvFramebufferBindedKey=packed object FRenderPass :TvRenderPass; - FSize :TVkExtent2D; - FImagesCount:ptruint; + FWidth :Word; + FHeight :Word; + FLayers :Word; + FImagesCount:Word; FImages :AvFramebufferImages; - Procedure SetRenderPass(r:TvRenderPass); - Procedure SetSize(Size:TVkExtent2D); - Procedure AddImageView(v:TvImageView); - Procedure FreeImageViews; - function IsEdit:Boolean; + Procedure SetRenderPass(r:TvRenderPass); + Procedure SetSize(Size:TVkExtent2D); + Procedure AddImageView(v:TvImageView); + end; + + TvFramebufferBinded=class(TvFramebuffer) + Key:TvFramebufferBindedKey; + FAcquire:bitpacked array[0..8] of Boolean; function Compile:Boolean; + Procedure AcquireImageViews; + Procedure ReleaseImageViews; Destructor Destroy; override; end; @@ -321,6 +345,11 @@ end; // +function TvFramebuffer.IsImageless:Boolean; +begin + Result:=False; +end; + Destructor TvFramebuffer.Destroy; begin if (FHandle<>VK_NULL_HANDLE) then @@ -332,55 +361,24 @@ end; // -Procedure TvFramebufferIV.SetRenderPass(r:TvRenderPass); +Procedure TvFramebufferBindedKey.SetRenderPass(r:TvRenderPass); begin - if (r=FRenderPass) then Exit; FRenderPass:=r; - Inc(FEdit); end; -Procedure TvFramebufferIV.SetSize(Size:TVkExtent2D); +Procedure TvFramebufferBindedKey.SetSize(Size:TVkExtent2D); begin - if CompareByte(Size,FSize,SizeOf(TVkExtent2D))=0 then Exit; - FSize:=Size; - Inc(FEdit); + FWidth :=Size.width; + FHeight:=Size.height; + FLayers:=1; end; -Procedure TvFramebufferIV.AddImageView(v:TvImageView); +Procedure TvFramebufferBindedKey.AddImageView(v:TvImageView); begin if (v=nil) then Exit; if (FImagesCount>=Length(AvFramebufferImages)) then Exit; FImages[FImagesCount]:=v; Inc(FImagesCount); - v.Acquire; - Inc(FEdit); -end; - -Procedure TvFramebufferIV.FreeImageViews; -var - i:Integer; -begin - if (FImagesCount<>0) then - For i:=0 to FImagesCount-1 do - if (FImages[i]<>nil) then - begin - FImages[i].Release; - FImages[i]:=nil; - end; - FImagesCount:=0; - - //It:=FImages.cbegin; - //if (It.Item<>nil) then - //repeat - // TvImageView(It.Item^).Release; - //until not It.Next; - //FImages.Free; - Inc(FEdit); -end; - -function TvFramebufferIV.IsEdit:Boolean; -begin - Result:=(FEdit<>FCompile); end; /// @@ -893,37 +891,90 @@ begin end; end; +Procedure TvFramebufferImagelessKey.SetRenderPass(r:TvRenderPass); +begin + FRenderPass:=r; +end; + +Procedure TvFramebufferImagelessKey.SetSize(Size:TVkExtent2D); +begin + FWidth :=Size.width; + FHeight:=Size.height; + FLayers:=1; +end; + Procedure TvFramebufferImagelessKey.AddImageAt(Key:TvImageKey); -var - MUTABLE:PVkFormat; begin if (FImagesCount>=Length(FImages)) then Exit; - MUTABLE:=GET_VK_IMAGE_MUTABLE(Key.cformat); + if (Key.params.width>FWidth) then + begin + FWidth:=Key.params.width; + end; + + if (Key.params.height>FHeight) then + begin + FHeight:=Key.params.height; + end; + + if (Key.params.arrayLayers>FLayers) then + begin + FLayers:=Key.params.arrayLayers; + end; with FImages[FImagesCount] do begin - sType :=VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO; - pNext :=nil; - flags :=GET_VK_IMAGE_CREATE_DEFAULT(Key.cformat); - usage :=GET_VK_IMAGE_USAGE_DEFAULT (Key.cformat); - width :=Key.params.width; - height :=Key.params.height; - layerCount :=key.params.arrayLayers; - viewFormatCount:=GET_FORMATS_LEN(MUTABLE); - pViewFormats :=MUTABLE; + cformat :=Key.cformat; + width :=Key.params.width; + height :=Key.params.height; + layerCount:=key.params.arrayLayers; end; Inc(FImagesCount); end; +Procedure TvFramebufferImagelessKey.Export(var F:AvFramebufferAttach); +var + cformat:TVkFormat; + MUTABLE:PVkFormat; + i:Word; +begin + + if (FImagesCount<>0) then + For i:=0 to FImagesCount-1 do + begin + cformat:=FImages[i].cformat; + MUTABLE:=GET_VK_IMAGE_MUTABLE(cformat); + + with F[i] do + begin + sType :=VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENT_IMAGE_INFO; + pNext :=nil; + flags :=GET_VK_IMAGE_CREATE_DEFAULT(cformat); + usage :=GET_VK_IMAGE_USAGE_DEFAULT (cformat); + width :=FImages[i].width; + height :=FImages[i].height; + layerCount :=FImages[i].layerCount; + viewFormatCount:=GET_FORMATS_LEN(MUTABLE); + pViewFormats :=MUTABLE; + end; + end; + +end; + /// -function TvFramebufferIL.Compile:Boolean; +function TvFramebufferImageless.IsImageless:Boolean; +begin + Result:=True; +end; + +function TvFramebufferImageless.Compile:Boolean; var r:TVkResult; info:TVkFramebufferCreateInfo; imgs:TVkFramebufferAttachmentsCreateInfo; + fatt:AvFramebufferAttach; begin Result:=False; if (FHandle<>VK_NULL_HANDLE) then Exit(True); @@ -931,22 +982,24 @@ begin if (Key.FRenderPass=nil) then Exit; if (Key.FRenderPass.FHandle=VK_NULL_HANDLE) then Exit; if (Key.FImagesCount=0) then Exit; - if (Key.FSize.width=0) or (Key.FSize.height=0) then Exit; + if (Key.FWidth=0) or (Key.FHeight=0) then Exit; info:=Default(TVkFramebufferCreateInfo); info.sType :=VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; info.renderPass :=Key.FRenderPass.FHandle; info.attachmentCount:=Key.FImagesCount; - info.width :=Key.FSize.width; - info.height :=Key.FSize.height; - info.layers :=1; + info.width :=Key.FWidth; + info.height :=Key.FHeight; + info.layers :=Key.FLayers; info.flags :=ord(VK_FRAMEBUFFER_CREATE_IMAGELESS_BIT); info.pAttachments :=nil; + Key.Export(fatt); + imgs:=Default(TVkFramebufferAttachmentsCreateInfo); imgs.sType:=VK_STRUCTURE_TYPE_FRAMEBUFFER_ATTACHMENTS_CREATE_INFO; imgs.attachmentImageInfoCount:=Key.FImagesCount; - imgs.pAttachmentImageInfos :=@Key.FImages; + imgs.pAttachmentImageInfos :=@fatt; info.pNext:=@imgs; @@ -961,7 +1014,35 @@ end; /// -function TvFramebufferIV.Compile:Boolean; +Procedure TvFramebufferBinded.AcquireImageViews; +var + i:Word; +begin + if (Key.FImagesCount<>0) then + For i:=0 to Key.FImagesCount-1 do + if (Key.FImages[i]<>nil) then + if (not FAcquire[i]) then + begin + Key.FImages[i].Acquire; + FAcquire[i]:=True; + end; +end; + +Procedure TvFramebufferBinded.ReleaseImageViews; +var + i:Word; +begin + if (Key.FImagesCount<>0) then + For i:=0 to Key.FImagesCount-1 do + if (Key.FImages[i]<>nil) then + if (FAcquire[i]) then + begin + Key.FImages[i].Release; + FAcquire[i]:=False; + end; +end; + +function TvFramebufferBinded.Compile:Boolean; var i:TVkUInt32; r:TVkResult; @@ -969,32 +1050,29 @@ var FImageViews:AvImageViews; begin Result:=False; - if (not IsEdit) then Exit(true); - if (FRenderPass=nil) then Exit; - if (FRenderPass.FHandle=VK_NULL_HANDLE) then Exit; - if (FImagesCount=0) then Exit; - if (FSize.width=0) or (FSize.height=0) then Exit; + if (FHandle<>VK_NULL_HANDLE) then Exit(True); - if (FHandle<>VK_NULL_HANDLE) then - begin - vkDestroyFramebuffer(Device.FHandle,FHandle,nil); - FHandle:=VK_NULL_HANDLE; - end; + if (Key.FRenderPass=nil) then Exit; + if (Key.FRenderPass.FHandle=VK_NULL_HANDLE) then Exit; + if (Key.FImagesCount=0) then Exit; + if (Key.FWidth=0) or (Key.FHeight=0) then Exit; + + AcquireImageViews; info:=Default(TVkFramebufferCreateInfo); info.sType :=VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO; - info.renderPass :=FRenderPass.FHandle; - info.attachmentCount:=FImagesCount; - info.width :=FSize.width; - info.height :=FSize.height; - info.layers :=1; + info.renderPass :=Key.FRenderPass.FHandle; + info.attachmentCount:=Key.FImagesCount; + info.width :=Key.FWidth; + info.height :=Key.FHeight; + info.layers :=Key.FLayers; FImageViews:=Default(AvImageViews); - For i:=0 to FImagesCount-1 do - if (FImages[i]<>nil) then + For i:=0 to Key.FImagesCount-1 do + if (Key.FImages[i]<>nil) then begin - FImageViews[i]:=FImages[i].FHandle; + FImageViews[i]:=Key.FImages[i].FHandle; end; info.pAttachments:=@FImageViews; @@ -1008,9 +1086,9 @@ begin Result:=(r=VK_SUCCESS); end; -Destructor TvFramebufferIV.Destroy; +Destructor TvFramebufferBinded.Destroy; begin - FreeImageViews; + ReleaseImageViews; inherited; end; diff --git a/vulkan/vImageManager.pas b/vulkan/vImageManager.pas index a7a02bdc..ec7fdf5d 100644 --- a/vulkan/vImageManager.pas +++ b/vulkan/vImageManager.pas @@ -393,7 +393,7 @@ begin t.Parent :=Self; t.key :=key2; - t.Acquire; + t.Acquire; //map ref FViews.Insert(@t.key); end; diff --git a/vulkan/vMemory.pas b/vulkan/vMemory.pas index f65c4fd7..0761658e 100644 --- a/vulkan/vMemory.pas +++ b/vulkan/vMemory.pas @@ -150,9 +150,9 @@ const handleTypes:ord(VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT); ); -function vkAllocMemory(device:TVkDevice;Size:TVkDeviceSize;mtindex:TVkUInt32):TVkDeviceMemory; -function vkAllocHostMemory(device:TVkDevice;Size:TVkDeviceSize;mtindex:TVkUInt32;adr:Pointer):TVkDeviceMemory; -function vkAllocDedicatedImage(device:TVkDevice;Size:TVkDeviceSize;mtindex:TVkUInt32;FHandle:TVkImage):TVkDeviceMemory; +function vkAllocMemory (device:TVkDevice;Size:TVkDeviceSize;mtindex:TVkUInt32):TVkDeviceMemory; +function vkAllocHostMemory (device:TVkDevice;Size:TVkDeviceSize;mtindex:TVkUInt32;addr:Pointer ):TVkDeviceMemory; +function vkAllocDedicatedImage (device:TVkDevice;Size:TVkDeviceSize;mtindex:TVkUInt32;FHandle:TVkImage ):TVkDeviceMemory; function vkAllocDedicatedBuffer(device:TVkDevice;Size:TVkDeviceSize;mtindex:TVkUInt32;FHandle:TVkBuffer):TVkDeviceMemory; function GetHostMappedRequirements:TVkMemoryRequirements; @@ -1136,7 +1136,7 @@ begin end; end; -function vkAllocHostMemory(device:TVkDevice;Size:TVkDeviceSize;mtindex:TVkUInt32;adr:Pointer):TVkDeviceMemory; +function vkAllocHostMemory(device:TVkDevice;Size:TVkDeviceSize;mtindex:TVkUInt32;addr:Pointer):TVkDeviceMemory; var ainfo:TVkMemoryAllocateInfo; import:TVkImportMemoryHostPointerInfoEXT; @@ -1151,7 +1151,7 @@ begin import:=Default(TVkImportMemoryHostPointerInfoEXT); import.sType :=VK_STRUCTURE_TYPE_IMPORT_MEMORY_HOST_POINTER_INFO_EXT; import.handleType :=VK_EXTERNAL_MEMORY_HANDLE_TYPE_HOST_ALLOCATION_BIT_EXT; - import.pHostPointer:=adr; + import.pHostPointer:=addr; // Result:=VK_NULL_HANDLE; r:=vkAllocateMemory(device,@ainfo,nil,@Result); diff --git a/vulkan/vPipelineManager.pas b/vulkan/vPipelineManager.pas index ac2b9e73..62c298b0 100644 --- a/vulkan/vPipelineManager.pas +++ b/vulkan/vPipelineManager.pas @@ -251,13 +251,6 @@ begin // - //VK_EXT_vertex_input_dynamic_state - //VK_EXT_VERTEX_INPUT_DYNAMIC_STATE_EXTENSION_NAME - // VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT - // VK_DYNAMIC_STATE_VERTEX_INPUT_EXT - // VkVertexInputBindingDescription2EXT - // VkVertexInputAttributeDescription2EXT - vertexInputInfo:=Default(TVkPipelineVertexInputStateCreateInfo); vertexInputInfo.sType :=VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO; vertexInputInfo.vertexBindingDescriptionCount :=Key.vertexInputInfo.vertexBindingDescriptionCount; @@ -388,7 +381,7 @@ begin FreeAndNil(t); end else begin - t.Acquire; + t.Acquire; //map ref FGraphicsPipeline2Set.Insert(@t.key); end; end; diff --git a/vulkan/vRender.pas b/vulkan/vRender.pas index 66c4a64f..1d0ec5d9 100644 --- a/vulkan/vRender.pas +++ b/vulkan/vRender.pas @@ -102,8 +102,8 @@ type Procedure AddClearColor(clr:TVkClearValue); Procedure AddClearColor(clr:TVkClearColorValue); Procedure AddImageView(v:TvImageView); - Function GetInfo:TVkRenderPassBeginInfo; - Function GetInfo2:TVkRenderPassAttachmentBeginInfo; + Function GetRInfo:TVkRenderPassBeginInfo; + Function GetAInfo:TVkRenderPassAttachmentBeginInfo; class function c(const a,b:TvRenderTargets):Integer; Destructor Destroy; override; Procedure Acquire(Sender:TObject); @@ -624,7 +624,7 @@ begin Inc(FImagesCount); end; -Function TvRenderTargets.GetInfo:TVkRenderPassBeginInfo; +Function TvRenderTargets.GetRInfo:TVkRenderPassBeginInfo; begin Result:=Default(TVkRenderPassBeginInfo); Result.sType :=VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO; @@ -635,7 +635,7 @@ begin Result.framebuffer :=FFramebuffer.FHandle; end; -Function TvRenderTargets.GetInfo2:TVkRenderPassAttachmentBeginInfo; +Function TvRenderTargets.GetAInfo:TVkRenderPassAttachmentBeginInfo; begin Result:=Default(TVkRenderPassAttachmentBeginInfo); Result.sType :=VK_STRUCTURE_TYPE_RENDER_PASS_ATTACHMENT_BEGIN_INFO; @@ -652,7 +652,7 @@ Destructor TvRenderTargets.Destroy; begin /////FreeAndNil(FRenderPass); /////FreeAndNil(FPipeline); - FreeAndNil(FFramebuffer); + //FreeAndNil(FFramebuffer); inherited; end; diff --git a/vulkan/vRenderPassManager.pas b/vulkan/vRenderPassManager.pas index 9c33bb3d..59f70d69 100644 --- a/vulkan/vRenderPassManager.pas +++ b/vulkan/vRenderPassManager.pas @@ -347,7 +347,7 @@ begin FreeAndNil(t); end else begin - t.Acquire; + t.Acquire; //map ref FRenderPass2Set.Insert(@t.key); end; end;