mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
caf49c32bc
commit
41f6222972
|
@ -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;
|
||||
|
|
|
@ -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');
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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:;
|
||||
|
|
|
@ -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;
|
||||
|
||||
//////////////
|
||||
|
|
Loading…
Reference in New Issue