This commit is contained in:
Pavel 2022-06-09 13:18:47 +03:00
parent caf49c32bc
commit 41f6222972
9 changed files with 313 additions and 188 deletions

View File

@ -88,6 +88,8 @@ type
Queue:TIntrusiveMPSCQueue;
Current:PvSubmitNode;
CmdBuffer:TvCmdBuffer;
SetShCount:ptruint;
SetCxCount:ptruint;
LastSetReg:WORD;
Procedure Init;
Function Next:Boolean;
@ -333,6 +335,7 @@ var
time:Int64;
work_do:Boolean;
begin
Result:=0;
repeat
work_do:=False;
@ -355,7 +358,7 @@ begin
if GFXMicroEngine.Next then
begin
if not me_node_submit(GFXMicroEngine.Current) then Assert(false);
me_node_submit(GFXMicroEngine.Current);
work_do:=True;
end;
@ -566,7 +569,8 @@ end;
procedure vSubmitDone;
begin
Device.WaitIdle;
//Sleep(100);
//Device.WaitIdle;
end;
@ -701,22 +705,22 @@ procedure onEventWrite(pm4Hdr:PM4_TYPE_3_HEADER;Body:PTPM4CMDEVENTWRITE);
begin
{$ifdef ww}
Case Body^.eventType of
THREAD_TRACE_MARKER :Writeln('THREAD_TRACE_MARKER');
FLUSH_AND_INV_CB_PIXEL_DATA:Writeln('FLUSH_AND_INV_CB_PIXEL_DATA');
FLUSH_AND_INV_CB_META :Writeln('FLUSH_AND_INV_CB_META');
THREAD_TRACE_MARKER :Writeln(' THREAD_TRACE_MARKER');
FLUSH_AND_INV_CB_PIXEL_DATA:Writeln(' FLUSH_AND_INV_CB_PIXEL_DATA');
FLUSH_AND_INV_CB_META :Writeln(' FLUSH_AND_INV_CB_META');
else
Assert(False,IntToStr(Body^.eventType));
end;
Case Body^.EVENTINDEX of
EVENT_WRITE_INDEX_ANY_NON_TIMESTAMP :Writeln('ANY_NON_TIMESTAMP');
EVENT_WRITE_INDEX_ZPASS_DONE :Writeln('ZPASS_DONE');
EVENT_WRITE_INDEX_SAMPLE_PIPELINESTAT :Writeln('SAMPLE_PIPELINESTATS');
EVENT_WRITE_INDEX_SAMPLE_STREAMOUTSTATS:Writeln('SAMPLE_STREAMOUTSTAT[S|S1|S2|S3]');
EVENT_WRITE_INDEX_VS_PS_PARTIAL_FLUSH :Writeln('[CS|VS|PS]_PARTIAL_FLUSH');
EVENT_WRITE_INDEX_ANY_EOP_TIMESTAMP :Writeln('ANY_EOP_TIMESTAMP');
EVENT_WRITE_INDEX_ANY_EOS_TIMESTAMP :Writeln('ANY_EOS_TIMESTAMP');
EVENT_WRITE_INDEX_CACHE_FLUSH_EVENT :Writeln('CACHE_FLUSH, CACHE_FLUSH_AND_INV_EVENT');
EVENT_WRITE_INDEX_ANY_NON_TIMESTAMP :Writeln(' ANY_NON_TIMESTAMP');
EVENT_WRITE_INDEX_ZPASS_DONE :Writeln(' ZPASS_DONE');
EVENT_WRITE_INDEX_SAMPLE_PIPELINESTAT :Writeln(' SAMPLE_PIPELINESTATS');
EVENT_WRITE_INDEX_SAMPLE_STREAMOUTSTATS:Writeln(' SAMPLE_STREAMOUTSTAT[S|S1|S2|S3]');
EVENT_WRITE_INDEX_VS_PS_PARTIAL_FLUSH :Writeln(' [CS|VS|PS]_PARTIAL_FLUSH');
EVENT_WRITE_INDEX_ANY_EOP_TIMESTAMP :Writeln(' ANY_EOP_TIMESTAMP');
EVENT_WRITE_INDEX_ANY_EOS_TIMESTAMP :Writeln(' ANY_EOS_TIMESTAMP');
EVENT_WRITE_INDEX_CACHE_FLUSH_EVENT :Writeln(' CACHE_FLUSH, CACHE_FLUSH_AND_INV_EVENT');
else
Assert(False);
end;
@ -857,17 +861,17 @@ procedure onWaitRegMem(pm4Hdr:PM4_TYPE_3_HEADER;Body:PPM4CMDWAITREGMEM);
begin
{$ifdef ww}
Case Body^.engine of
0:
0: //ME
Case Body^.memSpace of
0:Writeln('waitOnRegister');
1:Writeln('waitOnAddress');
0:Writeln(' waitOnRegister');
1:Writeln(' waitOnAddress');
else
Assert(false);
end;
1:
1: //PFP
Case Body^.memSpace of
0:Writeln('waitOnRegisterAndStall');
1:Writeln('waitOnAddressAndStall');
0:Writeln(' waitOnRegisterAndStall');
1:Writeln(' waitOnAddressAndStall');
else
Assert(false);
end;
@ -1272,6 +1276,8 @@ begin
//{$ifdef ww}Writeln('SetContextReg:',getRegName(r),'=',HexStr(v,8));{$endif}
//Continue;
Inc(GFXRing.SetCxCount);
onSetCommonReg(r,v);
end;
@ -1295,6 +1301,8 @@ begin
//{$ifdef ww}Writeln('SetShReg:',getRegName(r),'=',HexStr(v,8));{$endif}
//Continue;
Inc(GFXRing.SetShCount);
onSetCommonReg(r,v);
end;
@ -1370,6 +1378,11 @@ end;
var
FShaderGroup:TvShaderGroup;
LastSetShCount:ptruint;
LastSetCxCount:ptruint;
LastRenderCmd:TvRenderTargets;
procedure UpdateGpuRegsInfo;
var
FAttrBuilder:TvAttrBuilder;
@ -1404,10 +1417,23 @@ var
FVSShader:TvShaderExt;
FPSShader:TvShaderExt;
ctx_change:Boolean;
begin
{$ifdef null_rt}Exit;{$endif}
if (LastSetShCount=GFXRing.SetShCount) and
(LastSetCxCount=GFXRing.SetCxCount) then
begin
Exit;
end;
ctx_change:=(LastSetCxCount<>GFXRing.SetCxCount);
LastSetShCount:=GFXRing.SetShCount;
LastSetCxCount:=GFXRing.SetCxCount;
fdump_ps:=DumpPS(GPU_REGS);
fdump_vs:=DumpVS(GPU_REGS);
@ -1422,190 +1448,199 @@ begin
///////////////////
FRenderCmd:=TvRenderTargets.Create;
if ctx_change then
begin
FRenderCmd.FRenderPass:=TvRenderPass.Create;
FRenderCmd.FPipeline :=TvGraphicsPipeline.Create;
/////FRenderCmd.FPipeline.FLayout:=TvPipelineLayout.Create;
FRenderCmd.FPipeline.FRenderPass:=FRenderCmd.FRenderPass;
FRenderCmd:=TvRenderTargets.Create;
LastRenderCmd:=FRenderCmd;
FRenderCmd.FFramebuffer:=TvFramebuffer.Create;
FRenderCmd.FFramebuffer.SetRenderPass(FRenderCmd.FRenderPass);
FRenderCmd.FRenderPass:=TvRenderPass.Create;
FRenderCmd.FPipeline :=TvGraphicsPipeline.Create;
/////FRenderCmd.FPipeline.FLayout:=TvPipelineLayout.Create;
FRenderCmd.FPipeline.FRenderPass:=FRenderCmd.FRenderPass;
//////////////////
FRenderCmd.FFramebuffer:=TvFramebuffer.Create;
FRenderCmd.FFramebuffer.SetRenderPass(FRenderCmd.FRenderPass);
//////////////////
FRenderCmd.FFramebuffer.FreeImageViews;
FRenderCmd.FRenderPass.Clear;
FRenderCmd.FPipeline.Clear;
FRenderCmd.FFramebuffer.FreeImageViews;
FRenderCmd.FRenderPass.Clear;
FRenderCmd.FPipeline.Clear;
FRenderCmd.FFramebuffer.SetSize(GPU_REGS.GET_SCREEN_SIZE);
FRenderCmd.FFramebuffer.SetSize(GPU_REGS.GET_SCREEN_SIZE);
FRenderCmd.FPipeline.SetPrimType(GPU_REGS.GET_PRIM_TYPE);
FRenderCmd.FPipeline.SetBlendColors(@GPU_REGS.CB_BLEND_RGBA);
FRenderCmd.FPipeline.SetPrimType(GPU_REGS.GET_PRIM_TYPE);
FRenderCmd.FPipeline.SetBlendColors(@GPU_REGS.CB_BLEND_RGBA);
FRenderCmd.FRenderArea:=GPU_REGS.GET_SCREEN;
FRenderCmd.FRenderArea:=GPU_REGS.GET_SCREEN;
For i:=0 to 15 do
if GPU_REGS.VP_ENABLE(i) then
For i:=0 to 15 do
if GPU_REGS.VP_ENABLE(i) then
begin
FRenderCmd.FPipeline.AddVPort(GPU_REGS.GET_VPORT(i),GPU_REGS.GET_SCISSOR(i));
end;
GFXRing.CmdBuffer.EndRenderPass;
if GPU_REGS.COMP_ENABLE then
For i:=0 to 7 do
if GPU_REGS.RT_ENABLE(i) then
begin
RT_INFO:=GPU_REGS.GET_RT_INFO(i);
{$ifdef ww}Writeln('RT:',i,' ',HexStr(RT_INFO.FImageInfo.Addr));{$endif}
//RT_INFO.IMAGE_USAGE:=RT_INFO.IMAGE_USAGE or TM_CLEAR;
//RT_INFO.IMAGE_USAGE:=RT_INFO.IMAGE_USAGE and (not TM_READ);
ri:=FetchImage(GFXRing.CmdBuffer,
RT_INFO.FImageInfo,
ord(VK_IMAGE_USAGE_SAMPLED_BIT) or
ord(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) or
ord(VK_IMAGE_USAGE_TRANSFER_SRC_BIT) or
ord(VK_IMAGE_USAGE_TRANSFER_DST_BIT),
RT_INFO.IMAGE_USAGE
);
//ri.data_usage:=ri.data_usage and (not TM_READ); //reset read
iv:=ri.FetchView(GFXRing.CmdBuffer,RT_INFO.FImageView);
//
{$ifdef ww}
Writeln('TM_READ :',RT_INFO.IMAGE_USAGE and TM_READ <>0);
Writeln('TM_WRITE:',RT_INFO.IMAGE_USAGE and TM_WRITE<>0);
Writeln('TM_CLEAR:',RT_INFO.IMAGE_USAGE and TM_CLEAR<>0);
{$endif}
//Writeln(hexstr(PDWORD(RT_INFO.FImageInfo.Addr)[0],8));
//writeln;
//RT_INFO.IMAGE_USAGE:={TM_CLEAR or }TM_READ{ or TM_WRITE};
//RT_INFO.IMAGE_USAGE:=RT_INFO.IMAGE_USAGE and (not TM_CLEAR);
GFXRing.CmdBuffer.PushImageBarrier(ri.FHandle,
iv.GetSubresRange,
GetColorAccessMask(RT_INFO.IMAGE_USAGE),
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
ord(VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) or
ord(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) );
FRenderCmd.FFramebuffer.AddImageView(iv);
//Writeln('colorAttachmentCount:',FRenderCmd.FRenderPass.subpass.colorAttachmentCount);
//Writeln('AtCount:',FRenderCmd.FRenderPass.AtCount);
FRenderCmd.FRenderPass.AddColorRef(FRenderCmd.FRenderPass.subpass.colorAttachmentCount,RT_INFO.IMAGE_USAGE);
FRenderCmd.FRenderPass.AddColorAt(RT_INFO.FImageInfo.cformat,
RT_INFO.IMAGE_USAGE,
TVkSampleCountFlagBits(RT_INFO.FImageInfo.params.samples));
//RT_INFO.blend.blendEnable:=0;
FRenderCmd.FPipeline.AddBlend(RT_INFO.blend);
//if RT_INFO.FAST_CLEAR then
begin
FRenderCmd.AddClearColor(TVkClearValue(RT_INFO.CLEAR_COLOR));
end;
end;
if GPU_REGS.DB_ENABLE then
begin
FRenderCmd.FPipeline.AddVPort(GPU_REGS.GET_VPORT(i),GPU_REGS.GET_SCISSOR(i));
end;
DB_INFO:=GPU_REGS.GET_DB_INFO;
GFXRing.CmdBuffer.EndRenderPass;
{$ifdef ww}
Writeln('DB');
Writeln('TM_READ :',DB_INFO.DEPTH_USAGE and TM_READ <>0);
Writeln('TM_WRITE:',DB_INFO.DEPTH_USAGE and TM_WRITE<>0);
Writeln('TM_CLEAR:',DB_INFO.DEPTH_USAGE and TM_CLEAR<>0);
{$endif}
if GPU_REGS.COMP_ENABLE then
For i:=0 to 7 do
if GPU_REGS.RT_ENABLE(i) then
begin
RT_INFO:=GPU_REGS.GET_RT_INFO(i);
//DB_INFO.DEPTH_USAGE:={TM_CLEAR or} TM_READ or TM_WRITE;
{$ifdef ww}Writeln('RT:',i,' ',HexStr(RT_INFO.FImageInfo.Addr));{$endif}
//RT_INFO.IMAGE_USAGE:=RT_INFO.IMAGE_USAGE or TM_CLEAR;
//RT_INFO.IMAGE_USAGE:=RT_INFO.IMAGE_USAGE and (not TM_READ);
ri:=FetchImage(GFXRing.CmdBuffer,
RT_INFO.FImageInfo,
ord(VK_IMAGE_USAGE_SAMPLED_BIT) or
ord(VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT) or
DB_INFO.FImageInfo,
ord(VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) or
ord(VK_IMAGE_USAGE_TRANSFER_SRC_BIT) or
ord(VK_IMAGE_USAGE_TRANSFER_DST_BIT),
RT_INFO.IMAGE_USAGE
{DB_INFO.DEPTH_USAGE}0
);
//ri.data_usage:=ri.data_usage and (not TM_READ); //reset read
iv:=ri.FetchView(GFXRing.CmdBuffer,RT_INFO.FImageView);
iv:=ri.FetchView(GFXRing.CmdBuffer);
//
{$ifdef ww}
Writeln('TM_READ :',RT_INFO.IMAGE_USAGE and TM_READ <>0);
Writeln('TM_WRITE:',RT_INFO.IMAGE_USAGE and TM_WRITE<>0);
Writeln('TM_CLEAR:',RT_INFO.IMAGE_USAGE and TM_CLEAR<>0);
{$endif}
if not GPU_REGS.COMP_ENABLE then
begin
GFXRing.CmdBuffer.PushImageBarrier(ri.FHandle,
iv.GetSubresRange,
ord(VK_ACCESS_TRANSFER_WRITE_BIT),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
//Writeln(hexstr(PDWORD(RT_INFO.FImageInfo.Addr)[0],8));
//writeln;
range:=iv.GetSubresRange;
clr2:=DB_INFO.CLEAR_VALUE.depthStencil;
//RT_INFO.IMAGE_USAGE:={TM_CLEAR or }TM_READ{ or TM_WRITE};
GFXRing.CmdBuffer.ClearDepthStencilImage(ri.FHandle,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
@clr2,
1,@range);
//RT_INFO.IMAGE_USAGE:=RT_INFO.IMAGE_USAGE and (not TM_CLEAR);
Exit;
end;
GFXRing.CmdBuffer.PushImageBarrier(ri.FHandle,
iv.GetSubresRange,
GetColorAccessMask(RT_INFO.IMAGE_USAGE),
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
ord(VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT) or
ord(VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT) );
GetDepthStencilAccessMask(DB_INFO.DEPTH_USAGE,DB_INFO.STENCIL_USAGE),
GetDepthStencilLayout (DB_INFO.DEPTH_USAGE,DB_INFO.STENCIL_USAGE),
DB_INFO.zorder_stage );
FRenderCmd.FFramebuffer.AddImageView(iv);
//Writeln('colorAttachmentCount:',FRenderCmd.FRenderPass.subpass.colorAttachmentCount);
//Writeln('AtCount:',FRenderCmd.FRenderPass.AtCount);
FRenderCmd.FRenderPass.AddColorRef(FRenderCmd.FRenderPass.subpass.colorAttachmentCount,RT_INFO.IMAGE_USAGE);
FRenderCmd.FRenderPass.SetDepthStencilRef(FRenderCmd.FRenderPass.subpass.colorAttachmentCount,DB_INFO.DEPTH_USAGE,DB_INFO.STENCIL_USAGE);
FRenderCmd.FRenderPass.AddColorAt(RT_INFO.FImageInfo.cformat,
RT_INFO.IMAGE_USAGE,
TVkSampleCountFlagBits(RT_INFO.FImageInfo.params.samples));
//if not GPU_REGS.COMP_ENABLE then
//begin
// DB_INFO.DEPTH_CLEAR:=True;
//end;
FRenderCmd.FRenderPass.AddDepthAt(
DB_INFO.FImageInfo.cformat,
DB_INFO.DEPTH_USAGE,
DB_INFO.STENCIL_USAGE);
//RT_INFO.blend.blendEnable:=0;
FRenderCmd.FPipeline.AddBlend(RT_INFO.blend);
FRenderCmd.FRenderPass.SetZorderStage(DB_INFO.zorder_stage);
//if RT_INFO.FAST_CLEAR then
begin
FRenderCmd.AddClearColor(TVkClearValue(RT_INFO.CLEAR_COLOR));
end;
FRenderCmd.AddClearColor(DB_INFO.CLEAR_VALUE);
FRenderCmd.FPipeline.DepthStencil.depthTestEnable :=DB_INFO.depthTestEnable ;
FRenderCmd.FPipeline.DepthStencil.depthWriteEnable :=DB_INFO.depthWriteEnable ;
FRenderCmd.FPipeline.DepthStencil.depthCompareOp :=DB_INFO.depthCompareOp ;
FRenderCmd.FPipeline.DepthStencil.depthBoundsTestEnable:=DB_INFO.depthBoundsTestEnable;
FRenderCmd.FPipeline.DepthStencil.stencilTestEnable :=DB_INFO.stencilTestEnable ;
FRenderCmd.FPipeline.DepthStencil.front :=DB_INFO.front ;
FRenderCmd.FPipeline.DepthStencil.back :=DB_INFO.back ;
FRenderCmd.FPipeline.DepthStencil.minDepthBounds :=DB_INFO.minDepthBounds ;
FRenderCmd.FPipeline.DepthStencil.maxDepthBounds :=DB_INFO.maxDepthBounds ;
end;
if GPU_REGS.DB_ENABLE then
end else //ctx_change
begin
DB_INFO:=GPU_REGS.GET_DB_INFO;
{$ifdef ww}
Writeln('DB');
Writeln('TM_READ :',DB_INFO.DEPTH_USAGE and TM_READ <>0);
Writeln('TM_WRITE:',DB_INFO.DEPTH_USAGE and TM_WRITE<>0);
Writeln('TM_CLEAR:',DB_INFO.DEPTH_USAGE and TM_CLEAR<>0);
{$endif}
//DB_INFO.DEPTH_USAGE:={TM_CLEAR or} TM_READ or TM_WRITE;
ri:=FetchImage(GFXRing.CmdBuffer,
DB_INFO.FImageInfo,
ord(VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) or
ord(VK_IMAGE_USAGE_TRANSFER_SRC_BIT) or
ord(VK_IMAGE_USAGE_TRANSFER_DST_BIT),
{DB_INFO.DEPTH_USAGE}0
);
//ri.data_usage:=ri.data_usage and (not TM_READ); //reset read
iv:=ri.FetchView(GFXRing.CmdBuffer);
if not GPU_REGS.COMP_ENABLE then
begin
GFXRing.CmdBuffer.PushImageBarrier(ri.FHandle,
iv.GetSubresRange,
ord(VK_ACCESS_TRANSFER_WRITE_BIT),
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
range:=iv.GetSubresRange;
clr2:=DB_INFO.CLEAR_VALUE.depthStencil;
GFXRing.CmdBuffer.ClearDepthStencilImage(ri.FHandle,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
@clr2,
1,@range);
Exit;
end;
GFXRing.CmdBuffer.PushImageBarrier(ri.FHandle,
iv.GetSubresRange,
GetDepthStencilAccessMask(DB_INFO.DEPTH_USAGE,DB_INFO.STENCIL_USAGE),
GetDepthStencilLayout (DB_INFO.DEPTH_USAGE,DB_INFO.STENCIL_USAGE),
DB_INFO.zorder_stage );
FRenderCmd.FFramebuffer.AddImageView(iv);
//Writeln('colorAttachmentCount:',FRenderCmd.FRenderPass.subpass.colorAttachmentCount);
//Writeln('AtCount:',FRenderCmd.FRenderPass.AtCount);
FRenderCmd.FRenderPass.SetDepthStencilRef(FRenderCmd.FRenderPass.subpass.colorAttachmentCount,DB_INFO.DEPTH_USAGE,DB_INFO.STENCIL_USAGE);
//if not GPU_REGS.COMP_ENABLE then
//begin
// DB_INFO.DEPTH_CLEAR:=True;
//end;
FRenderCmd.FRenderPass.AddDepthAt(
DB_INFO.FImageInfo.cformat,
DB_INFO.DEPTH_USAGE,
DB_INFO.STENCIL_USAGE);
FRenderCmd.FRenderPass.SetZorderStage(DB_INFO.zorder_stage);
FRenderCmd.AddClearColor(DB_INFO.CLEAR_VALUE);
FRenderCmd.FPipeline.DepthStencil.depthTestEnable :=DB_INFO.depthTestEnable ;
FRenderCmd.FPipeline.DepthStencil.depthWriteEnable :=DB_INFO.depthWriteEnable ;
FRenderCmd.FPipeline.DepthStencil.depthCompareOp :=DB_INFO.depthCompareOp ;
FRenderCmd.FPipeline.DepthStencil.depthBoundsTestEnable:=DB_INFO.depthBoundsTestEnable;
FRenderCmd.FPipeline.DepthStencil.stencilTestEnable :=DB_INFO.stencilTestEnable ;
FRenderCmd.FPipeline.DepthStencil.front :=DB_INFO.front ;
FRenderCmd.FPipeline.DepthStencil.back :=DB_INFO.back ;
FRenderCmd.FPipeline.DepthStencil.minDepthBounds :=DB_INFO.minDepthBounds ;
FRenderCmd.FPipeline.DepthStencil.maxDepthBounds :=DB_INFO.maxDepthBounds ;
FRenderCmd:=LastRenderCmd;
end;
{$ifdef ww}Writeln('[FVSShader]');{$endif}
@ -1743,6 +1778,7 @@ begin
}
if ctx_change then
GFXRing.CmdBuffer.PushImageBarrier(ri.FHandle,
iv.GetSubresRange,
ord(VK_ACCESS_SHADER_READ_BIT),
@ -1753,12 +1789,17 @@ begin
end;
end;
if not GFXRing.CmdBuffer.BeginRenderPass(FRenderCmd) then
if ctx_change then
begin
Writeln('!BeginRenderPass');
Assert(false);
if not GFXRing.CmdBuffer.BeginRenderPass(FRenderCmd) then
begin
Writeln('!BeginRenderPass');
Assert(false);
end;
end;
//
if (FVSShader.FPushConst.size<>0) then
begin
pData:=FVSShader.GetPushConstData(@GPU_REGS.SPI.VS.USER_DATA);
@ -1892,6 +1933,15 @@ begin
{$ifdef null_rt}Exit;{$endif}
if (LastSetShCount=GFXRing.SetShCount) and
(LastSetCxCount=GFXRing.SetCxCount) then
begin
Exit;
end;
LastSetShCount:=GFXRing.SetShCount;
LastSetCxCount:=GFXRing.SetCxCount;
fdump_cs:=DumpCS(GPU_REGS);
GFXRing.AllocCmdBuffer;
@ -2016,6 +2066,8 @@ begin
GFXRing.CmdBuffer.DrawIndex2(Addr,GPU_REGS.VGT_DMA.INDICES,GPU_REGS.GET_INDEX_TYPE);
{$ifdef ww}Writeln('DrawIndex:',Body^.indexCount);{$endif}
//GFXMicroEngine.PushCmd(GFXRing.CmdBuffer);
end;
procedure onDrawIndexAuto(pm4Hdr:PM4_TYPE_3_HEADER;Body:PPM4CMDDRAWINDEXAUTO);
@ -2027,6 +2079,8 @@ begin
GFXRing.CmdBuffer.DrawIndexAuto(GPU_REGS.VGT_DMA.INDICES);
{$ifdef ww}Writeln('onDrawIndexAuto:',Body^.indexCount);{$endif}
//GFXMicroEngine.PushCmd(GFXRing.CmdBuffer);
end;
procedure onDispatchDirect(pm4Hdr:PM4_TYPE_3_HEADER;Body:PPM4CMDDISPATCHDIRECT);
@ -2037,6 +2091,8 @@ begin
GFXRing.CmdBuffer.DispatchDirect(Body^.dimX,Body^.dimY,Body^.dimZ);
{$ifdef ww}Writeln('onDispatchDirect:',Body^.dimX,':',Body^.dimY,':',Body^.dimZ);{$endif}
//GFXMicroEngine.PushCmd(GFXRing.CmdBuffer);
end;
type
@ -2057,14 +2113,15 @@ var
begin
if (node=nil) then Exit;
if (node^.ccbGpuAddrs<>nil) and (node^.ccbSizesInBytes<>nil) then
begin
Assert(false,'TODO CCB');
end;
n:=0;
While (n<node^.count) do
begin
if (node^.ccbGpuAddrs<>nil) and (node^.ccbSizesInBytes<>nil) then
begin
Assert(node^.ccbSizesInBytes[n]=0,'TODO CCB');
end;
i:=0;
s:=node^.dcbSizesInBytes[n];
P:=PByte(node^.dcbGpuAddrs[n]);
@ -2223,7 +2280,7 @@ function gfx_test(CmdBuffer:TvCmdBuffer):Boolean;
begin
Result:=True;
if (CmdBuffer=nil) then Exit;
Result:=(CmdBuffer.Fence.Status=VK_SUCCESS);
Result:=(CmdBuffer.ret<>0) or (CmdBuffer.Fence.Status=VK_SUCCESS);
if Result then
begin
CmdBuffer.ReleaseResource;

View File

@ -464,6 +464,9 @@ begin
//ps4_app.app_path:='G:\Games\Super Meat Boy\';
//ps4_app.app_file:='G:\Games\Super Meat Boy\eboot.bin';
//ps4_app.app_path:='C:\Users\User\Desktop\Games\Super Meat Boy\';
//ps4_app.app_file:='C:\Users\User\Desktop\Games\Super Meat Boy\eboot.bin';
//elf:=Telf_file(LoadPs4ElfFromFile('libSceLibcInternal.sprx'));
//elf.Prepare;
//elf.SavePs4ElfToFile('libSceLibcInternal.prx');

View File

@ -287,7 +287,7 @@ begin
_sig_lock;
Writeln('>sceKernelWaitEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
//Writeln('>sceKernelWaitEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
if (pTimeout<>nil) then
begin
@ -415,7 +415,7 @@ begin
spin_unlock(ef^.lock_list);
end;
Writeln('<sceKernelWaitEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
//Writeln('<sceKernelWaitEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
_sig_unlock;
ef_leave(ef);
@ -436,7 +436,7 @@ begin
_sig_lock;
Writeln('>sceKernelSetEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
//Writeln('>sceKernelSetEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
spin_lock(ef^.lock_list);
@ -450,7 +450,7 @@ begin
end else
begin
Writeln('!sceKernelSetEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
//Writeln('!sceKernelSetEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
bits:=load_acq_rel(ef^.bitPattern) or bitPattern;
@ -487,7 +487,7 @@ begin
Result:=ef_enter(ef);
if (Result<>0) then Exit;
Writeln('sceKernelClearEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
//Writeln('sceKernelClearEventFlag:',HexStr(ef),':',ef^.name,':',HexStr(bitPattern,16),':',ThreadID);
spin_lock(ef^.lock_list);
fetch_and(ef^.bitPattern,bitPattern);

View File

@ -587,7 +587,7 @@ begin
end;
if (err<>0) then
if (err<>0) and (err<>paOutputUnderflow) then
Writeln('Pa_GetErrorText:',Pa_GetErrorText(err));
//Writeln('sceAudioOutOutput:',handle,':',HexStr(ptr));

View File

@ -51,6 +51,10 @@ Const
SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_CHAT_RESTRICTION=(1);
SCE_MSG_DIALOG_SYSMSG_TYPE_TRC_PSN_UGC_RESTRICTION =(2);
//SceSaveDataDialogAnimation
SCE_SAVE_DATA_DIALOG_ANIMATION_ON =(0);
SCE_SAVE_DATA_DIALOG_ANIMATION_OFF =(1);
function ps4_sceCommonDialogInitialize():Integer; SysV_ABI_CDecl;
begin
Writeln('sceCommonDialogInitialize');
@ -69,6 +73,12 @@ begin
Result:=0;
end;
function ps4_sceSaveDataDialogInitialize():Integer; SysV_ABI_CDecl;
begin
Writeln('sceSaveDataDialogInitialize');
Result:=0;
end;
function ps4_sceSaveDataDialogUpdateStatus():Integer; SysV_ABI_CDecl;
begin
//Writeln('sceSaveDataDialogUpdateStatus');
@ -109,6 +119,18 @@ begin
Result:=SCE_COMMON_DIALOG_ERROR_NOT_FINISHED;
end;
type
pSceSaveDataDialogCloseParam=^SceSaveDataDialogCloseParam;
SceSaveDataDialogCloseParam=packed record
anim:Integer;
reserved:array[0..31] of Byte;
end;
function ps4_sceSaveDataDialogClose(closeParam:pSceSaveDataDialogCloseParam):Integer; SysV_ABI_CDecl;
begin
Result:=0;
end;
//
function ps4_sceMsgDialogInitialize():Integer; SysV_ABI_CDecl;
@ -239,10 +261,12 @@ begin
Result:=TElf_node.Create;
Result.pFileName:=name;
lib:=Result._add_lib('libSceSaveDataDialog');
lib^.set_proc($B3D7B7F98A519F3C,@ps4_sceSaveDataDialogInitialize);
lib^.set_proc($28ADC1760D5158AD,@ps4_sceSaveDataDialogUpdateStatus);
lib^.set_proc($85ACB509F4E62F20,@ps4_sceSaveDataDialogProgressBarSetValue);
lib^.set_proc($62E1F6140EDACEA4,@ps4_sceSaveDataDialogTerminate);
lib^.set_proc($C84889FEAAABE828,@ps4_sceSaveDataDialogGetResult);
lib^.set_proc($7C7E3A2DA83CF176,@ps4_sceSaveDataDialogClose);
end;
function Load_libSceMsgDialog(Const name:RawByteString):TElf_node;

View File

@ -72,6 +72,7 @@ type
SceNpTitleSecret=array[0..SCE_NP_TITLE_SECRET_SIZE-1] of Byte;
const
//SceNpState
SCE_NP_STATE_UNKNOWN =0;
SCE_NP_STATE_SIGNED_OUT =1;
SCE_NP_STATE_SIGNED_IN =2;
@ -122,6 +123,12 @@ begin
Result:=0;
end;
function ps4_sceNpGetState(userId:Integer;state:PInteger):Integer; SysV_ABI_CDecl;
begin
if (state<>nil) then state^:=SCE_NP_STATE_SIGNED_OUT;
Result:=0;
end;
function GetStr(p:Pointer;L:SizeUint):RawByteString; inline;
begin
SetString(Result,P,L);
@ -206,6 +213,7 @@ begin
lib^.set_proc($036090DE4812A294,@ps4_sceNpSetContentRestriction);
lib^.set_proc($A7FA3BE029E83736,@ps4_sceNpGetNpId);
lib^.set_proc($5C39DC5D02095129,@ps4_sceNpGetOnlineId);
lib^.set_proc($7901FB9D63DC0207,@ps4_sceNpGetState);
lib^.set_proc($11CEB7CB9F65F6DC,@ps4_sceNpSetNpTitleId);
lib^.set_proc($DD997C05E3D387D6,@ps4_sceNpCheckCallback);
lib^.set_proc($55F45298F9A3F10F,@ps4_sceNpRegisterStateCallback);

View File

@ -74,6 +74,7 @@ type
cmdbuf:TVkCommandBuffer;
cmd_count:qword;
ret:Integer;
FCurrPipeline:array[0..1] of TVkPipeline;
FCurrLayout:array[0..1] of TVkPipelineLayout;
@ -353,7 +354,10 @@ begin
vkCmdBeginRenderPass(cmdbuf,@info,VK_SUBPASS_CONTENTS_INLINE);
vkCmdBindPipeline (cmdbuf,VK_PIPELINE_BIND_POINT_GRAPHICS,FCurrPipeline[0]);
AddDependence(@RT.Release);
if AddDependence(@RT.Release) then
begin
RT.Acquire(Self);
end;
FRenderPass:=info.renderPass;
@ -439,6 +443,7 @@ begin
r:=FQueue.Submit(1,@info,FFence);
ret:=Integer(r);
if (r<>VK_SUCCESS) then
begin
Writeln('vkQueueSubmit:',r);
@ -471,6 +476,7 @@ begin
FImageBarriers .Free;
cmd_count:=0;
ret:=0;
end;
function TvCustomCmdBuffer.AddDependence(cb:TvReleaseCb):Boolean;

View File

@ -612,15 +612,18 @@ begin
if (buf^.cmdbuf=nil) then Exit;
if (buf^.cmdbuf.Fence=nil) then Exit;
r:=buf^.cmdbuf.Fence.Status;
Case r of
VK_SUCCESS :;
VK_NOT_READY:Exit(False);
else
begin
Writeln('vkGetEventStatus:',r);
Exit;
end;
if (buf^.cmdbuf.ret=0) then
begin
r:=buf^.cmdbuf.Fence.Status;
Case r of
VK_SUCCESS :;
VK_NOT_READY:Exit(False);
else
begin
Writeln('vkGetEventStatus:',r);
Exit;
end;
end;
end;
buf^.cmdbuf.ReleaseResource;
@ -649,7 +652,7 @@ var
prInfo:TVkPresentInfoKHR;
img_reg:TVkImageCopy;
//img_reg:TVkImageCopy;
ur:TvImage2;
begin
@ -698,7 +701,10 @@ begin
SwapImage:=FSwapChain.FImage[imageIndex];
//Writeln('>Flip.Fence.Wait');
buf^.cmdbuf.Fence.Wait(High(uint64));
if (buf^.cmdbuf.ret=0) then
begin
buf^.cmdbuf.Fence.Wait(High(uint64));
end;
//Writeln('<Flip.Fence.Wait');
buf^.cmdbuf.Fence.Reset;
@ -1036,7 +1042,10 @@ begin
buf^.cmdbuf.AddWaitSemaphore(imageAvailableSemaphore,ord(VK_PIPELINE_STAGE_TRANSFER_BIT));
buf^.cmdbuf.SignalSemaphore:=renderFinishedSemaphore;
buf^.cmdbuf.QueueSubmit;
if not buf^.cmdbuf.QueueSubmit then
begin
//
end;
prInfo:=Default(TVkPresentInfoKHR);
prInfo.sType :=VK_STRUCTURE_TYPE_PRESENT_INFO_KHR;
@ -1047,6 +1056,12 @@ begin
prInfo.pImageIndices :=@imageIndex;
prInfo.pResults:=nil;
if (buf^.cmdbuf.ret<>0) then
begin
prInfo.waitSemaphoreCount:=0;
prInfo.pWaitSemaphores :=nil;
end;
R:=FlipQueue.PresentKHR(@prInfo);
Case R of
VK_SUCCESS:;

View File

@ -86,10 +86,14 @@ type
FRenderArea:TVkRect2D;
FClearValuesCount:TVkUInt32;
FClearValues:array[0..8] of TVkClearValue;
//
FRefs:ptruint;
//
Procedure AddClearColor(clr:TVkClearValue);
Function GetInfo:TVkRenderPassBeginInfo;
class function c(const a,b:TvRenderTargets):Integer;
Destructor Destroy; override;
Procedure Acquire(Sender:TObject);
Procedure Release(Sender:TOBject);
end;
@ -625,9 +629,17 @@ begin
inherited;
end;
Procedure TvRenderTargets.Acquire(Sender:TObject);
begin
System.InterlockedIncrement(Pointer(FRefs));
end;
Procedure TvRenderTargets.Release(Sender:TOBject);
begin
Free; //fref todo
if System.InterlockedDecrement(Pointer(FRefs))=nil then
begin
Free;
end;
end;
//////////////