mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
bb0490cd69
commit
6d56cf0fda
131
chip/pm4_me.pas
131
chip/pm4_me.pas
|
@ -209,7 +209,8 @@ end;
|
|||
var
|
||||
FCmdPool:TvCmdPool;
|
||||
|
||||
procedure Prepare_Uniforms(var FUniformBuilder:TvUniformBuilder;
|
||||
procedure Prepare_Uniforms(node:p_pm4_node;
|
||||
var FUniformBuilder:TvUniformBuilder;
|
||||
CmdBuffer:TvCmdBuffer);
|
||||
var
|
||||
i:Integer;
|
||||
|
@ -248,7 +249,8 @@ begin
|
|||
Result:=addr-(addr mod alignment);
|
||||
end;
|
||||
|
||||
procedure Bind_Uniforms(var FUniformBuilder:TvUniformBuilder;
|
||||
procedure Bind_Uniforms(node:p_pm4_node;
|
||||
var FUniformBuilder:TvUniformBuilder;
|
||||
var FDescriptorGroup:TvDescriptorGroup;
|
||||
ShaderGroup:TvShaderGroup;
|
||||
CmdBuffer:TvCmdBuffer);
|
||||
|
@ -273,6 +275,8 @@ var
|
|||
diff :TVkDeviceSize;
|
||||
align:TVkDeviceSize;
|
||||
range:TVkDeviceSize;
|
||||
|
||||
resource_instance:p_pm4_resource_instance;
|
||||
begin
|
||||
|
||||
//images
|
||||
|
@ -282,6 +286,16 @@ begin
|
|||
With FUniformBuilder.FImages[i] do
|
||||
begin
|
||||
|
||||
resource_instance:=node^.scope.find_curr_image_resource(FImage);
|
||||
|
||||
if (resource_instance<>nil) then
|
||||
begin
|
||||
Writeln('ri:curr:',HexStr(resource_instance^.curr_mem_usage,1),
|
||||
' prev:',HexStr(resource_instance^.prev_mem_usage,1),
|
||||
' next:',HexStr(resource_instance^.next_mem_usage,1)
|
||||
);
|
||||
end;
|
||||
|
||||
ri:=FetchImage(CmdBuffer,
|
||||
FImage,
|
||||
iu_sampled
|
||||
|
@ -324,6 +338,21 @@ begin
|
|||
With FUniformBuilder.FBuffers[i] do
|
||||
begin
|
||||
|
||||
resource_instance:=node^.scope.find_curr_buffer_resource(addr,size);
|
||||
|
||||
if (resource_instance<>nil) then
|
||||
begin
|
||||
if (resource_instance^.prev_mem_usage<>0) then
|
||||
begin
|
||||
writeln;
|
||||
end;
|
||||
|
||||
Writeln('rb:curr:',HexStr(resource_instance^.curr_mem_usage,1),
|
||||
' prev:',HexStr(resource_instance^.prev_mem_usage,1),
|
||||
' next:',HexStr(resource_instance^.next_mem_usage,1)
|
||||
);
|
||||
end;
|
||||
|
||||
buf:=FetchHostBuffer(CmdBuffer,QWORD(addr),size,ord(VK_BUFFER_USAGE_STORAGE_BUFFER_BIT));
|
||||
|
||||
diff:=QWORD(addr)-buf.FAddr;
|
||||
|
@ -348,7 +377,7 @@ begin
|
|||
range {VK_WHOLE_SIZE});
|
||||
|
||||
//TODO: check write flag
|
||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(addr),QWORD(addr)+size);
|
||||
vm_map_track_trigger(p_proc.p_vmspace,QWORD(addr),QWORD(addr)+size,nil);
|
||||
|
||||
end;
|
||||
end;
|
||||
|
@ -360,33 +389,48 @@ procedure pm4_ClearDepth(var rt_info:t_pm4_rt_info;
|
|||
CmdBuffer:TvCmdBuffer);
|
||||
var
|
||||
ri:TvImage2;
|
||||
cclear:array[0..1] of Boolean;
|
||||
range :TVkImageSubresourceRange;
|
||||
begin
|
||||
//ClearDepthTarget
|
||||
|
||||
ri:=FetchImage(CmdBuffer,
|
||||
rt_info.DB_INFO.FImageInfo,
|
||||
iu_depth
|
||||
iu_depthstenc
|
||||
//rt_info.DB_INFO.DEPTH_USAGE
|
||||
);
|
||||
|
||||
{
|
||||
ri.PushBarrier(CmdBuffer,
|
||||
ord(VK_ACCESS_TRANSFER_READ_BIT),
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
|
||||
}
|
||||
|
||||
ri.PushBarrier(CmdBuffer,
|
||||
ord(VK_ACCESS_TRANSFER_WRITE_BIT),
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
|
||||
|
||||
cclear[0]:=((rt_info.DB_INFO.DEPTH_USAGE and TM_CLEAR)<>0) and
|
||||
(GetDepthOnlyFormat (ri.key.cformat)<>VK_FORMAT_UNDEFINED);
|
||||
|
||||
cclear[1]:=((rt_info.DB_INFO.STENCIL_USAGE and TM_CLEAR)<>0) and
|
||||
(GetStencilOnlyFormat(ri.key.cformat)<>VK_FORMAT_UNDEFINED);
|
||||
|
||||
range:=ri.GetSubresRange;
|
||||
|
||||
range.aspectMask:=(ord(VK_IMAGE_ASPECT_DEPTH_BIT )*ord(cclear[0])) or
|
||||
(ord(VK_IMAGE_ASPECT_STENCIL_BIT)*ord(cclear[1]));
|
||||
|
||||
CmdBuffer.ClearDepthStencilImage(ri.FHandle,
|
||||
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
|
||||
@rt_info.DB_INFO.CLEAR_VALUE.depthStencil,
|
||||
ri.GetSubresRange);
|
||||
range);
|
||||
|
||||
end;
|
||||
|
||||
procedure pm4_DrawPrepare(var rt_info:t_pm4_rt_info;
|
||||
procedure pm4_DrawPrepare(node:p_pm4_node;
|
||||
var rt_info:t_pm4_rt_info;
|
||||
CmdBuffer:TvCmdBuffer;
|
||||
RenderCmd:TvRenderTargets);
|
||||
var
|
||||
|
@ -410,6 +454,8 @@ var
|
|||
iv:TvImageView2;
|
||||
|
||||
FDescriptorGroup:TvDescriptorGroup;
|
||||
|
||||
resource_instance:p_pm4_resource_instance;
|
||||
begin
|
||||
RP_KEY.Clear;
|
||||
|
||||
|
@ -530,6 +576,16 @@ begin
|
|||
For i:=0 to RenderCmd.RT_COUNT-1 do
|
||||
begin
|
||||
|
||||
resource_instance:=node^.scope.find_curr_image_resource(RenderCmd.RT_INFO[i].FImageInfo);
|
||||
|
||||
if (resource_instance<>nil) then
|
||||
begin
|
||||
Writeln('ra:curr:',HexStr(resource_instance^.curr_mem_usage,1),
|
||||
' prev:',HexStr(resource_instance^.prev_mem_usage,1),
|
||||
' next:',HexStr(resource_instance^.next_mem_usage,1)
|
||||
);
|
||||
end;
|
||||
|
||||
RenderCmd.AddClearColor(RenderCmd.RT_INFO[i].CLEAR_COLOR);
|
||||
|
||||
ri:=FetchImage(CmdBuffer,
|
||||
|
@ -542,10 +598,12 @@ begin
|
|||
|
||||
iv:=ri.FetchView(CmdBuffer,RenderCmd.RT_INFO[i].FImageView,iu_attachment);
|
||||
|
||||
{
|
||||
ri.PushBarrier(CmdBuffer,
|
||||
ord(VK_ACCESS_TRANSFER_READ_BIT),
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
|
||||
}
|
||||
|
||||
ri.PushBarrier(CmdBuffer,
|
||||
GetColorAccessMask(RenderCmd.RT_INFO[i].IMAGE_USAGE),
|
||||
|
@ -567,28 +625,55 @@ begin
|
|||
|
||||
if rt_info.DB_ENABLE then
|
||||
begin
|
||||
|
||||
resource_instance:=node^.scope.find_curr_image_resource(GetDepthOnly(RenderCmd.DB_INFO.FImageInfo));
|
||||
|
||||
if (resource_instance<>nil) then
|
||||
begin
|
||||
Writeln('rd:curr:',HexStr(resource_instance^.curr_mem_usage,1),
|
||||
' prev:',HexStr(resource_instance^.prev_mem_usage,1),
|
||||
' next:',HexStr(resource_instance^.next_mem_usage,1)
|
||||
);
|
||||
end;
|
||||
|
||||
resource_instance:=node^.scope.find_curr_image_resource(GetStencilOnly(RenderCmd.DB_INFO.FImageInfo));
|
||||
|
||||
if (resource_instance<>nil) then
|
||||
begin
|
||||
Writeln('rs:curr:',HexStr(resource_instance^.curr_mem_usage,1),
|
||||
' prev:',HexStr(resource_instance^.prev_mem_usage,1),
|
||||
' next:',HexStr(resource_instance^.next_mem_usage,1)
|
||||
);
|
||||
end;
|
||||
|
||||
//
|
||||
|
||||
RenderCmd.AddClearColor(RenderCmd.DB_INFO.CLEAR_VALUE);
|
||||
|
||||
ri:=FetchImage(CmdBuffer,
|
||||
RenderCmd.DB_INFO.FImageInfo,
|
||||
iu_depth
|
||||
iu_depthstenc
|
||||
//RenderCmd.DB_INFO.DEPTH_USAGE
|
||||
);
|
||||
|
||||
pm4_load_from(CmdBuffer,ri,RenderCmd.DB_INFO.DEPTH_USAGE);
|
||||
pm4_load_from(CmdBuffer,ri.DepthOnly ,RenderCmd.DB_INFO.DEPTH_USAGE);
|
||||
pm4_load_from(CmdBuffer,ri.StencilOnly,RenderCmd.DB_INFO.STENCIL_USAGE);
|
||||
|
||||
iv:=ri.FetchView(CmdBuffer,iu_depth);
|
||||
iv:=ri.FetchView(CmdBuffer,iu_depthstenc);
|
||||
|
||||
{
|
||||
ri.PushBarrier(CmdBuffer,
|
||||
ord(VK_ACCESS_TRANSFER_READ_BIT),
|
||||
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
|
||||
ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
|
||||
}
|
||||
|
||||
ri.PushBarrier(CmdBuffer,
|
||||
GetColorAccessMask(RenderCmd.DB_INFO.DEPTH_USAGE),
|
||||
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
|
||||
GetDepthStencilAccessMask(RenderCmd.DB_INFO.DEPTH_USAGE,RenderCmd.DB_INFO.STENCIL_USAGE),
|
||||
GetDepthStencilSendLayout(RenderCmd.DB_INFO.DEPTH_USAGE,RenderCmd.DB_INFO.STENCIL_USAGE),
|
||||
ord(VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) or
|
||||
ord(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) );
|
||||
RenderCmd.DB_INFO.zorder_stage
|
||||
);
|
||||
|
||||
//
|
||||
if limits.VK_KHR_imageless_framebuffer then
|
||||
|
@ -612,13 +697,13 @@ begin
|
|||
FUniformBuilder:=Default(TvUniformBuilder);
|
||||
rt_info.ShaderGroup.ExportUnifBuilder(FUniformBuilder,@rt_info.USERDATA);
|
||||
|
||||
Prepare_Uniforms(FUniformBuilder,CmdBuffer);
|
||||
Prepare_Uniforms(node,FUniformBuilder,CmdBuffer);
|
||||
////////
|
||||
|
||||
if not CmdBuffer.BeginRenderPass(RenderCmd) then
|
||||
begin
|
||||
Writeln(stderr,'BeginRenderPass(FRenderCmd)');
|
||||
Assert(false,'BeginRenderPass(FRenderCmd)');
|
||||
Assert (false ,'BeginRenderPass(FRenderCmd)');
|
||||
end;
|
||||
|
||||
CmdBuffer.SetVertexInput (FAttrBuilder);
|
||||
|
@ -626,7 +711,8 @@ begin
|
|||
|
||||
FDescriptorGroup:=nil;
|
||||
|
||||
Bind_Uniforms(FUniformBuilder,
|
||||
Bind_Uniforms(node,
|
||||
FUniformBuilder,
|
||||
FDescriptorGroup,
|
||||
rt_info.ShaderGroup,
|
||||
CmdBuffer);
|
||||
|
@ -666,11 +752,12 @@ begin
|
|||
|
||||
ri:=FetchImage(CmdBuffer,
|
||||
rt_info.DB_INFO.FImageInfo,
|
||||
iu_depth
|
||||
iu_depthstenc
|
||||
//RenderCmd.DB_INFO.DEPTH_USAGE
|
||||
);
|
||||
|
||||
pm4_write_back(CmdBuffer,ri);
|
||||
pm4_write_back(CmdBuffer,ri.DepthOnly );
|
||||
pm4_write_back(CmdBuffer,ri.StencilOnly);
|
||||
|
||||
//
|
||||
end;
|
||||
|
@ -704,7 +791,8 @@ begin
|
|||
begin
|
||||
RenderCmd:=TvRenderTargets.Create;
|
||||
|
||||
pm4_DrawPrepare(node^.rt_info,
|
||||
pm4_DrawPrepare(node,
|
||||
node^.rt_info,
|
||||
CmdBuffer,
|
||||
RenderCmd);
|
||||
|
||||
|
@ -780,7 +868,7 @@ begin
|
|||
FUniformBuilder:=Default(TvUniformBuilder);
|
||||
CP_KEY.FShaderGroup.ExportUnifBuilder(FUniformBuilder,dst);
|
||||
|
||||
Prepare_Uniforms(FUniformBuilder,CmdBuffer);
|
||||
Prepare_Uniforms(node,FUniformBuilder,CmdBuffer);
|
||||
////////
|
||||
|
||||
if not CmdBuffer.BindCompute(CP) then
|
||||
|
@ -791,7 +879,8 @@ begin
|
|||
|
||||
FDescriptorGroup:=nil;
|
||||
|
||||
Bind_Uniforms(FUniformBuilder,
|
||||
Bind_Uniforms(node,
|
||||
FUniformBuilder,
|
||||
FDescriptorGroup,
|
||||
CP_KEY.FShaderGroup,
|
||||
CmdBuffer);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue