diff --git a/chip/ps4_videodrv.pas b/chip/ps4_videodrv.pas index 832d4751..146f53bd 100644 --- a/chip/ps4_videodrv.pas +++ b/chip/ps4_videodrv.pas @@ -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 (nnil) 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; diff --git a/fpPS4.lpr b/fpPS4.lpr index 5b2e8243..0a373bd3 100644 --- a/fpPS4.lpr +++ b/fpPS4.lpr @@ -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'); diff --git a/ps4_libkernel/ps4_event_flag.pas b/ps4_libkernel/ps4_event_flag.pas index 6ee7ba38..df711777 100644 --- a/ps4_libkernel/ps4_event_flag.pas +++ b/ps4_libkernel/ps4_event_flag.pas @@ -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('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); diff --git a/ps4_libsceaudioout.pas b/ps4_libsceaudioout.pas index 438cf318..919ee27d 100644 --- a/ps4_libsceaudioout.pas +++ b/ps4_libsceaudioout.pas @@ -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)); diff --git a/ps4_libscedialogs.pas b/ps4_libscedialogs.pas index 4d3c7c71..3fcecede 100644 --- a/ps4_libscedialogs.pas +++ b/ps4_libscedialogs.pas @@ -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; diff --git a/ps4_libscenpmanager.pas b/ps4_libscenpmanager.pas index 6f965d06..67defa18 100644 --- a/ps4_libscenpmanager.pas +++ b/ps4_libscenpmanager.pas @@ -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); diff --git a/vulkan/vCmdBuffer.pas b/vulkan/vCmdBuffer.pas index 95128921..22329541 100644 --- a/vulkan/vCmdBuffer.pas +++ b/vulkan/vCmdBuffer.pas @@ -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; diff --git a/vulkan/vFlip.pas b/vulkan/vFlip.pas index f4d6a4e7..6bd46ac7 100644 --- a/vulkan/vFlip.pas +++ b/vulkan/vFlip.pas @@ -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('0) then + begin + prInfo.waitSemaphoreCount:=0; + prInfo.pWaitSemaphores :=nil; + end; + R:=FlipQueue.PresentKHR(@prInfo); Case R of VK_SUCCESS:; diff --git a/vulkan/vRender.pas b/vulkan/vRender.pas index 7fbc5182..c68f1069 100644 --- a/vulkan/vRender.pas +++ b/vulkan/vRender.pas @@ -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; //////////////