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;