This commit is contained in:
Pavel 2024-07-08 00:38:15 +03:00
parent 5065abc02c
commit 3fb2bb3763
7 changed files with 166 additions and 9 deletions

View File

@ -878,6 +878,8 @@ var
begin begin
//ClearDepthTarget //ClearDepthTarget
CmdBuffer.EndRenderPass;
ri:=FetchImage(CmdBuffer, ri:=FetchImage(CmdBuffer,
rt_info.DB_INFO.FImageInfo, rt_info.DB_INFO.FImageInfo,
[iu_depthstenc] [iu_depthstenc]
@ -1392,6 +1394,63 @@ begin
end; end;
procedure pm4_FastClear(var ctx:t_me_render_context;node:p_pm4_node_FastClear);
{
var
ri:TvImage2;
range:TVkImageSubresourceRange;
resource_instance:p_pm4_resource_instance;
}
begin
{
//
pm4_InitStream(ctx);
//
StartFrameCapture;
ctx.BeginCmdBuffer;
ctx.Cmd.EndRenderPass;
ri:=FetchImage(ctx.Cmd,
node^.RT.FImageInfo,
[iu_attachment]
);
ri.PushBarrier(ctx.Cmd,
ord(VK_ACCESS_TRANSFER_WRITE_BIT),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
range:=ri.GetSubresRange;
ctx.Cmd.ClearColorImage(ri.FHandle,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
@node^.RT.CLEAR_COLOR,
1,@range);
//writeback
ri.mark_init;
resource_instance:=ctx.node^.scope.find_image_resource_instance(node^.RT.FImageInfo);
Assert(resource_instance<>nil);
if (resource_instance^.next_overlap.mem_usage<>0) then
begin
pm4_write_back(ctx.Cmd,ri);
//
resource_instance^.resource^.rwriteback:=False;
end else
begin
//
resource_instance^.resource^.rwriteback:=True;
end;
//writeback
}
end;
procedure Prepare_htile(var ctx:t_me_render_context; procedure Prepare_htile(var ctx:t_me_render_context;
var UniformBuilder:TvUniformBuilder); var UniformBuilder:TvUniformBuilder);
var var
@ -1591,7 +1650,7 @@ begin
ctx.me^.knote_eventid($40,0,curr*NSEC_PER_UNIT,0); //(absolute time) (freq???) ctx.me^.knote_eventid($40,0,curr*NSEC_PER_UNIT,0); //(absolute time) (freq???)
end; end;
ctx.on_idle; //ctx.on_idle;
end; end;
procedure pm4_SubmitFlipEop(var ctx:t_me_render_context;node:p_pm4_node_SubmitFlipEop); procedure pm4_SubmitFlipEop(var ctx:t_me_render_context;node:p_pm4_node_SubmitFlipEop);
@ -1614,7 +1673,7 @@ begin
ctx.me^.knote_eventid($40,0,curr*NSEC_PER_UNIT,0); //(absolute time) (freq???) ctx.me^.knote_eventid($40,0,curr*NSEC_PER_UNIT,0); //(absolute time) (freq???)
end; end;
ctx.on_idle; //ctx.on_idle;
end; end;
procedure pm4_EventWrite(var ctx:t_me_render_context;node:p_pm4_node_EventWrite); procedure pm4_EventWrite(var ctx:t_me_render_context;node:p_pm4_node_EventWrite);
@ -1624,7 +1683,8 @@ begin
//CACHE_FLUSH_AND_INV_EVENT :Writeln(' eventType=FLUSH_AND_INV_EVENT'); //CACHE_FLUSH_AND_INV_EVENT :Writeln(' eventType=FLUSH_AND_INV_EVENT');
//FLUSH_AND_INV_CB_PIXEL_DATA:Writeln(' eventType=FLUSH_AND_INV_CB_PIXEL_DATA'); //FLUSH_AND_INV_CB_PIXEL_DATA:Writeln(' eventType=FLUSH_AND_INV_CB_PIXEL_DATA');
//FLUSH_AND_INV_DB_DATA_TS :Writeln(' eventType=FLUSH_AND_INV_DB_DATA_TS'); //FLUSH_AND_INV_DB_DATA_TS :Writeln(' eventType=FLUSH_AND_INV_DB_DATA_TS');
FLUSH_AND_INV_DB_META: FLUSH_AND_INV_DB_META, //HTILE
FLUSH_AND_INV_CB_META: //CMASK
begin begin
if (ctx.Cmd<>nil) and ctx.Cmd.IsAllocated then if (ctx.Cmd<>nil) and ctx.Cmd.IsAllocated then
begin begin
@ -1633,7 +1693,6 @@ begin
end; end;
end; end;
//FLUSH_AND_INV_CB_DATA_TS :Writeln(' eventType=FLUSH_AND_INV_CB_DATA_TS'); //FLUSH_AND_INV_CB_DATA_TS :Writeln(' eventType=FLUSH_AND_INV_CB_DATA_TS');
//FLUSH_AND_INV_CB_META :Writeln(' eventType=FLUSH_AND_INV_CB_META');
THREAD_TRACE_MARKER: THREAD_TRACE_MARKER:
begin begin
// //
@ -1961,6 +2020,7 @@ begin
ntDrawIndex2 :pm4_Draw (ctx,Pointer(ctx.node)); ntDrawIndex2 :pm4_Draw (ctx,Pointer(ctx.node));
ntDrawIndexAuto :pm4_Draw (ctx,Pointer(ctx.node)); ntDrawIndexAuto :pm4_Draw (ctx,Pointer(ctx.node));
ntClearDepth :pm4_Draw (ctx,Pointer(ctx.node)); ntClearDepth :pm4_Draw (ctx,Pointer(ctx.node));
ntFastClear :pm4_FastClear (ctx,Pointer(ctx.node));
ntDispatchDirect:pm4_DispatchDirect(ctx,Pointer(ctx.node)); ntDispatchDirect:pm4_DispatchDirect(ctx,Pointer(ctx.node));
ntEventWrite :pm4_EventWrite (ctx,Pointer(ctx.node)); ntEventWrite :pm4_EventWrite (ctx,Pointer(ctx.node));
ntEventWriteEop :pm4_EventWriteEop (ctx,Pointer(ctx.node)); ntEventWriteEop :pm4_EventWriteEop (ctx,Pointer(ctx.node));
@ -2016,7 +2076,7 @@ begin
ctx.rel_time:=0; //reset time ctx.rel_time:=0; //reset time
// //
ctx.on_idle; //ctx.on_idle;
// //
RTLEventWaitFor(me^.event); RTLEventWaitFor(me^.event);

View File

@ -294,7 +294,7 @@ type
p_pm4_node_FastClear=^t_pm4_node_FastClear; p_pm4_node_FastClear=^t_pm4_node_FastClear;
t_pm4_node_FastClear=object(t_pm4_node) t_pm4_node_FastClear=object(t_pm4_node)
CX_REG:TCONTEXT_REG_GROUP; // 0xA000 RT:TRT_INFO;
end; end;
p_pm4_node_Resolve=^t_pm4_node_Resolve; p_pm4_node_Resolve=^t_pm4_node_Resolve;
@ -959,13 +959,40 @@ end;
procedure t_pm4_stream.FastClear(var CX_REG:TCONTEXT_REG_GROUP); procedure t_pm4_stream.FastClear(var CX_REG:TCONTEXT_REG_GROUP);
var var
GPU_REGS:TGPU_REGS;
RT:TRT_INFO;
node:p_pm4_node_FastClear; node:p_pm4_node_FastClear;
begin begin
GPU_REGS:=Default(TGPU_REGS);
GPU_REGS.CX_REG:=@CX_REG;
node:=allocator.Alloc(SizeOf(t_pm4_node_FastClear)); node:=allocator.Alloc(SizeOf(t_pm4_node_FastClear));
node^.ntype :=ntFastClear; node^.ntype :=ntFastClear;
node^.scope :=Default(t_pm4_resource_curr_scope); node^.scope :=Default(t_pm4_resource_curr_scope);
node^.CX_REG:=CX_REG;
//
RT:=GPU_REGS.GET_RT_INFO(0);
{
//clear TM_READ
RT.IMAGE_USAGE:=RT.IMAGE_USAGE and (not TM_READ);
//set TM_CLEAR
RT.IMAGE_USAGE:=RT.IMAGE_USAGE or TM_CLEAR;
//
insert_image_resource(@node^.scope,
RT.FImageInfo,
RT.IMAGE_USAGE,
[iu_attachment]);
}
//
node^.RT:=RT;
//
add_node(node); add_node(node);
end; end;

View File

@ -251,6 +251,8 @@ begin
Continue; Continue;
end; end;
pm4_me_gfx.on_idle();
RTLEventWaitFor(ring_gfx_event); RTLEventWaitFor(ring_gfx_event);
until false; until false;

View File

@ -1369,6 +1369,7 @@ begin
Exit; Exit;
end; end;
EndRenderPass;
if (not BeginCmdBuffer) then Exit; if (not BeginCmdBuffer) then Exit;
Case eventType of Case eventType of
@ -1383,6 +1384,17 @@ begin
ord(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT)); //dstStageMask ord(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT)); //dstStageMask
end; end;
FLUSH_AND_INV_CB_META:
begin
Inc(cmd_count);
vkMemoryBarrier(FCmdbuf,
VK_ACCESS_PS, //srcAccessMask
ord(VK_ACCESS_TRANSFER_WRITE_BIT), //dstAccessMask
ord(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT), //srcStageMask
ord(VK_PIPELINE_STAGE_TRANSFER_BIT)); //dstStageMask
end;
else else
Assert(false,'WriteEvent.eventType'); Assert(false,'WriteEvent.eventType');

View File

@ -367,13 +367,15 @@ var
begin begin
if (size<=SizeOf(TSPIRVHeader)) then Exit; if (size<=SizeOf(TSPIRVHeader)) then Exit;
if (PSPIRVHeader(data)^.MAGIC<>MagicNumber) then Exit; if (PSPIRVHeader(data)^.MAGIC<>MagicNumber) then Exit;
data:=data+SizeOf(TSPIRVHeader); data:=data+SizeOf(TSPIRVHeader);
size:=size-SizeOf(TSPIRVHeader); size:=size-SizeOf(TSPIRVHeader);
//orig_data:=data; //orig_data:=data;
//orig_size:=size; //orig_size:=size;
repeat while (size<>0) do
begin
I:=PSPIRVInstruction(data)^; I:=PSPIRVInstruction(data)^;
Case I.OP of Case I.OP of
OpSourceExtension: OpSourceExtension:
@ -449,7 +451,7 @@ begin
if (size<f) then Break; if (size<f) then Break;
data:=data+f; data:=data+f;
size:=size-f; size:=size-f;
until false; end;
end; end;
procedure TvShaderParser.OnEntryPoint(Stage:DWORD;P:PChar); procedure TvShaderParser.OnEntryPoint(Stage:DWORD;P:PChar);

View File

@ -89,6 +89,12 @@ type
FShaderFuncs:AShaderFuncKey; FShaderFuncs:AShaderFuncKey;
FInstance:record
VGPR_COMP_CNT:Byte;
STEP_RATE_0:DWORD;
STEP_RATE_1:DWORD;
end;
procedure ClearInfo; override; procedure ClearInfo; override;
Destructor Destroy; override; Destructor Destroy; override;
function parser:CvShaderParser; override; function parser:CvShaderParser; override;
@ -108,6 +114,7 @@ type
Procedure EnumFuncLayout(cb:TvCustomLayoutCb;Fset:TVkUInt32;FData:PDWORD); Procedure EnumFuncLayout(cb:TvCustomLayoutCb;Fset:TVkUInt32;FData:PDWORD);
procedure FreeShaderFuncs; procedure FreeShaderFuncs;
Procedure PreloadShaderFuncs(pUserData:Pointer); Procedure PreloadShaderFuncs(pUserData:Pointer);
Procedure SetInstance(VGPR_COMP_CNT:Byte;STEP_RATE_0,STEP_RATE_1:DWORD);
end; end;
TBufBindExt=packed record TBufBindExt=packed record
@ -665,6 +672,22 @@ begin
end; end;
end; end;
Procedure TvShaderExt.SetInstance(VGPR_COMP_CNT:Byte;STEP_RATE_0,STEP_RATE_1:DWORD);
begin
FInstance.VGPR_COMP_CNT:=VGPR_COMP_CNT;
if (VGPR_COMP_CNT>=1) then
begin
FInstance.STEP_RATE_0:=STEP_RATE_0;
end;
if (VGPR_COMP_CNT>=2) then
begin
FInstance.STEP_RATE_1:=STEP_RATE_1;
end;
end;
/// ///
function GetSharpByPatch(pData:Pointer;const addr:ADataLayout):Pointer; function GetSharpByPatch(pData:Pointer;const addr:ADataLayout):Pointer;

View File

@ -391,6 +391,29 @@ begin
end; end;
end; end;
function test_instance(FShader:TvShaderExt;FStage:TvShaderStage;var GPU_REGS:TGPU_REGS):Boolean;
var
VGPR_COMP_CNT:Byte;
begin
if (FStage<>vShaderStageVs) then Exit(True);
VGPR_COMP_CNT:=GPU_REGS.SH_REG^.SPI_SHADER_PGM_RSRC1_VS.VGPR_COMP_CNT;
if (FShader.FInstance.VGPR_COMP_CNT<>VGPR_COMP_CNT) then Exit(False);
if (VGPR_COMP_CNT>=1) then
begin
if (FShader.FInstance.STEP_RATE_0<>GPU_REGS.CX_REG^.VGT_INSTANCE_STEP_RATE_0) then Exit(False);
end;
if (VGPR_COMP_CNT>=2) then
begin
if (FShader.FInstance.STEP_RATE_1<>GPU_REGS.CX_REG^.VGT_INSTANCE_STEP_RATE_1) then Exit(False);
end;
Result:=True;
end;
function test_unif(FShader:TvShaderExt;FDescSetId:Integer;pUserData:Pointer):Boolean; function test_unif(FShader:TvShaderExt;FDescSetId:Integer;pUserData:Pointer):Boolean;
var var
ch:TvBufOffsetChecker; ch:TvBufOffsetChecker;
@ -460,6 +483,7 @@ begin
FShader:=t.FShaderAliases[i]; FShader:=t.FShaderAliases[i];
if test_func(FShader,pUserData) then if test_func(FShader,pUserData) then
if test_instance(FShader,FStage,GPU_REGS) then
if test_unif(FShader,FDescSetId,pUserData) then //Checking offsets within a shader if test_unif(FShader,FDescSetId,pUserData) then //Checking offsets within a shader
if test_push_const(FShader,pc_offset,pc_size) then if test_push_const(FShader,pc_offset,pc_size) then
begin begin
@ -481,6 +505,13 @@ begin
FShader:=t.AddShader(FDescSetId,M,pUserData); FShader:=t.AddShader(FDescSetId,M,pUserData);
if (FStage=vShaderStageVs) then
begin
FShader.SetInstance(GPU_REGS.SH_REG^.SPI_SHADER_PGM_RSRC1_VS.VGPR_COMP_CNT,
GPU_REGS.CX_REG^.VGT_INSTANCE_STEP_RATE_0,
GPU_REGS.CX_REG^.VGT_INSTANCE_STEP_RATE_1);
end;
DumpSpv(FStage,M); DumpSpv(FStage,M);
M.Free; M.Free;