This commit is contained in:
Pavel 2024-06-25 11:58:26 +03:00
parent bb0490cd69
commit 6d56cf0fda
18 changed files with 1162 additions and 440 deletions

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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>;
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^.rtype<n2^.rtype);
if (Result<>0) then Exit;
//1 Addr
Result:=Integer(n1^.rkey.Addr>n2^.rkey.Addr)-Integer(n1^.rkey.Addr<n2^.rkey.Addr);
if (Result<>0) then Exit;
//1 Stencil
Result:=Integer(n1^.rkey.Addr2>n2^.rkey.Addr2)-Integer(n1^.rkey.Addr2<n2^.rkey.Addr2);
if (Result<>0) then Exit;
//2 cformat
Result:=Integer(n1^.rkey.cformat>n2^.rkey.cformat)-Integer(n1^.rkey.cformat<n2^.rkey.cformat);
if (Result<>0) then Exit;
//3 params
Result:=CompareByte(n1^.rkey.params,n2^.rkey.params,SizeOf(TvImageKey.params));
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;

View File

@ -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

View File

@ -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;

View File

@ -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

View File

@ -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

View File

@ -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;

View File

@ -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);

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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<PvImageViewKey,TvImageView2Compare>;
{
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^.Addr<b^.Addr);
if (Result<>0) then Exit;
//1 Stencil
Result:=Integer(a^.Stencil>b^.Stencil)-Integer(a^.Stencil<b^.Stencil);
Result:=Integer(a^.Addr2>b^.Addr2)-Integer(a^.Addr2<b^.Addr2);
if (Result<>0) then Exit;
//2 cformat
Result:=Integer(a^.cformat>b^.cformat)-Integer(a^.cformat<b^.cformat);
@ -181,13 +201,143 @@ begin
Result:=CompareByte(a^,b^,SizeOf(TvImageViewKey));
end;
{
Constructor TvImageView2.Create;
//
function on_destroy(handle:Pointer):Integer; SysV_ABI_CDecl;
var
image:TvCustomImage2;
begin
image:=TvCustomImage2(handle);
image.tobj:=nil;
//
Result:=DO_DELETE;
end;
function on_trigger(handle:Pointer;start,__end:QWORD):Integer; SysV_ABI_CDecl;
var
image:TvCustomImage2;
begin
Result:=DO_NOTHING;
image:=TvCustomImage2(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;
//
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

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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);