mirror of https://github.com/red-prig/fpPS4.git
This commit is contained in:
parent
15530c05a4
commit
abf83b729e
|
@ -235,7 +235,10 @@ type
|
||||||
MAX_INDX:DWORD;
|
MAX_INDX:DWORD;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
VGT_MULTI_PRIM_IB_RESET_INDX:TVGT_MULTI_PRIM_IB_RESET_INDX;
|
VGT_MULTI_PRIM:packed record
|
||||||
|
IB_RESET_EN :TVGT_MULTI_PRIM_IB_RESET_EN;
|
||||||
|
IB_RESET_INDX:TVGT_MULTI_PRIM_IB_RESET_INDX;
|
||||||
|
end;
|
||||||
|
|
||||||
VGT_OUTPUT_PATH_CNTL:TVGT_OUTPUT_PATH_CNTL;
|
VGT_OUTPUT_PATH_CNTL:TVGT_OUTPUT_PATH_CNTL;
|
||||||
|
|
||||||
|
|
|
@ -1280,7 +1280,8 @@ begin
|
||||||
|
|
||||||
mmVGT_INDX_OFFSET :DWORD(GPU_REGS.VGT_VTX_INDX.INDX_OFFSET):=value;
|
mmVGT_INDX_OFFSET :DWORD(GPU_REGS.VGT_VTX_INDX.INDX_OFFSET):=value;
|
||||||
|
|
||||||
mmVGT_MULTI_PRIM_IB_RESET_INDX:DWORD(GPU_REGS.VGT_MULTI_PRIM_IB_RESET_INDX):=value;
|
mmVGT_MULTI_PRIM_IB_RESET_EN :DWORD(GPU_REGS.VGT_MULTI_PRIM.IB_RESET_EN):=value;
|
||||||
|
mmVGT_MULTI_PRIM_IB_RESET_INDX:DWORD(GPU_REGS.VGT_MULTI_PRIM.IB_RESET_INDX):=value;
|
||||||
|
|
||||||
mmVGT_OUTPUT_PATH_CNTL:DWORD(GPU_REGS.VGT_OUTPUT_PATH_CNTL):=value;
|
mmVGT_OUTPUT_PATH_CNTL:DWORD(GPU_REGS.VGT_OUTPUT_PATH_CNTL):=value;
|
||||||
|
|
||||||
|
@ -1766,7 +1767,9 @@ begin
|
||||||
|
|
||||||
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.SetPrimType (GPU_REGS.GET_PRIM_TYPE);
|
||||||
|
FRenderCmd.FPipeline.SetPrimReset(GPU_REGS.VGT_MULTI_PRIM.IB_RESET_EN.RESET_EN);
|
||||||
|
|
||||||
FRenderCmd.FPipeline.SetBlendColors(@GPU_REGS.CB_BLEND_RGBA);
|
FRenderCmd.FPipeline.SetBlendColors(@GPU_REGS.CB_BLEND_RGBA);
|
||||||
|
|
||||||
//FRenderCmd.FPipeline.multisampling.sampleShadingEnable :=VK_FALSE;
|
//FRenderCmd.FPipeline.multisampling.sampleShadingEnable :=VK_FALSE;
|
||||||
|
@ -1890,7 +1893,7 @@ begin
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
//if not GPU_REGS.COMP_ENABLE then Exit(false);
|
if not GPU_REGS.COMP_ENABLE then Exit(false);
|
||||||
if GPU_REGS.DB_ENABLE {false} then
|
if GPU_REGS.DB_ENABLE {false} then
|
||||||
begin
|
begin
|
||||||
DB_INFO:=GPU_REGS.GET_DB_INFO;
|
DB_INFO:=GPU_REGS.GET_DB_INFO;
|
||||||
|
@ -2299,6 +2302,19 @@ begin
|
||||||
//
|
//
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure test_reset_index(INDEX_TYPE:TVkIndexType;RESET_EN:Byte;IB_RESET_INDX:DWORD);
|
||||||
|
begin
|
||||||
|
if (RESET_EN<>0) then
|
||||||
|
begin
|
||||||
|
Case INDEX_TYPE of
|
||||||
|
VK_INDEX_TYPE_UINT8_EXT:Assert(IB_RESET_INDX=$000000FF,'unsupport reset index:'+HexStr(IB_RESET_INDX,8));
|
||||||
|
VK_INDEX_TYPE_UINT16 :Assert(IB_RESET_INDX=$0000FFFF,'unsupport reset index:'+HexStr(IB_RESET_INDX,8));
|
||||||
|
VK_INDEX_TYPE_UINT32 :Assert(IB_RESET_INDX=$FFFFFFFF,'unsupport reset index:'+HexStr(IB_RESET_INDX,8));
|
||||||
|
else;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure onDrawIndex2(pm4Hdr:PM4_TYPE_3_HEADER;Body:PPM4CMDDRAWINDEX2);
|
procedure onDrawIndex2(pm4Hdr:PM4_TYPE_3_HEADER;Body:PPM4CMDDRAWINDEX2);
|
||||||
var
|
var
|
||||||
Addr:Pointer;
|
Addr:Pointer;
|
||||||
|
@ -2312,13 +2328,26 @@ begin
|
||||||
|
|
||||||
//drawInitiator:TVGT_DRAW_INITIATOR;
|
//drawInitiator:TVGT_DRAW_INITIATOR;
|
||||||
|
|
||||||
|
test_reset_index(GPU_REGS.GET_INDEX_TYPE,
|
||||||
|
GPU_REGS.VGT_MULTI_PRIM.IB_RESET_EN.RESET_EN,
|
||||||
|
GPU_REGS.VGT_MULTI_PRIM.IB_RESET_INDX);
|
||||||
|
|
||||||
if UpdateGpuRegsInfo then
|
if UpdateGpuRegsInfo then
|
||||||
begin
|
begin
|
||||||
Addr:=getIndexAddress(GPU_REGS.VGT_DMA.BASE_LO,GPU_REGS.VGT_DMA.BASE_HI);
|
Addr:=getIndexAddress(GPU_REGS.VGT_DMA.BASE_LO,GPU_REGS.VGT_DMA.BASE_HI);
|
||||||
GFXRing.CmdBuffer.DrawIndex2(Addr,GPU_REGS.VGT_DMA.INDICES,GPU_REGS.GET_INDEX_TYPE);
|
GFXRing.CmdBuffer.DrawIndex2(Addr,GPU_REGS.VGT_DMA.INDICES,GPU_REGS.GET_INDEX_TYPE);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$ifdef ww}Writeln('DrawIndex:',Body^.indexCount);{$endif}
|
{$ifdef ww}
|
||||||
|
Writeln('DrawIndex:',Body^.indexCount);
|
||||||
|
Writeln('VGT_VTX_INDX.CNT_EN :',GPU_REGS.VGT_VTX_INDX.CNT_EN.VTX_CNT_EN);
|
||||||
|
Writeln('VGT_VTX_INDX.INDX_OFFSET :',GPU_REGS.VGT_VTX_INDX.INDX_OFFSET);
|
||||||
|
|
||||||
|
Writeln('VGT_MULTI_PRIM.IB_RESET_EN :',GPU_REGS.VGT_MULTI_PRIM.IB_RESET_EN.RESET_EN);
|
||||||
|
Writeln('VGT_MULTI_PRIM.IB_RESET_INDX:',HexStr(GPU_REGS.VGT_MULTI_PRIM.IB_RESET_INDX,8));
|
||||||
|
{$endif}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//GFXMicroEngine.PushCmd(GFXRing.CmdBuffer);
|
//GFXMicroEngine.PushCmd(GFXRing.CmdBuffer);
|
||||||
end;
|
end;
|
||||||
|
@ -2332,7 +2361,10 @@ begin
|
||||||
GFXRing.CmdBuffer.DrawIndexAuto(GPU_REGS.VGT_DMA.INDICES);
|
GFXRing.CmdBuffer.DrawIndexAuto(GPU_REGS.VGT_DMA.INDICES);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$ifdef ww}Writeln('onDrawIndexAuto:',Body^.indexCount);{$endif}
|
{$ifdef ww}
|
||||||
|
Writeln('onDrawIndexAuto:',Body^.indexCount);
|
||||||
|
Writeln('VGT_VTX_INDX.CNT_EN:',GPU_REGS.VGT_VTX_INDX.CNT_EN.VTX_CNT_EN);
|
||||||
|
{$endif}
|
||||||
|
|
||||||
//GFXMicroEngine.PushCmd(GFXRing.CmdBuffer);
|
//GFXMicroEngine.PushCmd(GFXRing.CmdBuffer);
|
||||||
end;
|
end;
|
||||||
|
@ -2352,13 +2384,25 @@ begin
|
||||||
GPU_REGS.VGT_DMA.SIZE :=Body^.indexCount;
|
GPU_REGS.VGT_DMA.SIZE :=Body^.indexCount;
|
||||||
GPU_REGS.VGT_DMA.INDICES :=Body^.indexCount;
|
GPU_REGS.VGT_DMA.INDICES :=Body^.indexCount;
|
||||||
|
|
||||||
|
test_reset_index(GPU_REGS.GET_INDEX_TYPE,
|
||||||
|
GPU_REGS.VGT_MULTI_PRIM.IB_RESET_EN.RESET_EN,
|
||||||
|
GPU_REGS.VGT_MULTI_PRIM.IB_RESET_INDX);
|
||||||
|
|
||||||
if UpdateGpuRegsInfo then
|
if UpdateGpuRegsInfo then
|
||||||
begin
|
begin
|
||||||
Addr:=getIndexAddress(GPU_REGS.VGT_DMA.BASE_LO,GPU_REGS.VGT_DMA.BASE_HI);
|
Addr:=getIndexAddress(GPU_REGS.VGT_DMA.BASE_LO,GPU_REGS.VGT_DMA.BASE_HI);
|
||||||
GFXRing.CmdBuffer.DrawIndexOffset2(Addr,Body^.indexOffset,GPU_REGS.VGT_DMA.INDICES,GPU_REGS.GET_INDEX_TYPE);
|
GFXRing.CmdBuffer.DrawIndexOffset2(Addr,Body^.indexOffset,GPU_REGS.VGT_DMA.INDICES,GPU_REGS.GET_INDEX_TYPE);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{$ifdef ww}Writeln('DrawIndexOffset2:',Body^.indexOffset,' ',Body^.indexCount);{$endif}
|
{$ifdef ww}
|
||||||
|
Writeln('DrawIndexOffset2:',Body^.indexOffset,' ',Body^.indexCount);
|
||||||
|
|
||||||
|
Writeln('VGT_VTX_INDX.CNT_EN :',GPU_REGS.VGT_VTX_INDX.CNT_EN.VTX_CNT_EN);
|
||||||
|
Writeln('VGT_VTX_INDX.INDX_OFFSET :',GPU_REGS.VGT_VTX_INDX.INDX_OFFSET);
|
||||||
|
|
||||||
|
Writeln('VGT_MULTI_PRIM.IB_RESET_EN :',GPU_REGS.VGT_MULTI_PRIM.IB_RESET_EN.RESET_EN);
|
||||||
|
Writeln('VGT_MULTI_PRIM.IB_RESET_INDX:',HexStr(GPU_REGS.VGT_MULTI_PRIM.IB_RESET_INDX,8));
|
||||||
|
{$endif}
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -2380,6 +2424,7 @@ type
|
||||||
procedure onNumInstances(pm4Hdr:PM4_TYPE_3_HEADER;Body:PVGT_DMA_NUM_INSTANCES);
|
procedure onNumInstances(pm4Hdr:PM4_TYPE_3_HEADER;Body:PVGT_DMA_NUM_INSTANCES);
|
||||||
begin
|
begin
|
||||||
GPU_REGS.VGT_DMA.NUM_INSTANCES:=Body^;
|
GPU_REGS.VGT_DMA.NUM_INSTANCES:=Body^;
|
||||||
|
Assert(GPU_REGS.VGT_DMA.NUM_INSTANCES<=1,'instancing TODO:'+IntToStr(GPU_REGS.VGT_DMA.NUM_INSTANCES));
|
||||||
{$ifdef ww}Writeln('onNumInstances:',Body^);{$endif}
|
{$ifdef ww}Writeln('onNumInstances:',Body^);{$endif}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ type
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function VkBindSparseBufferMemory(queue:TVkQueue;buffer:TVkBuffer;bindCount:TVkUInt32;pBinds:PVkSparseMemoryBind):TVkResult;
|
function VkBindSparseBufferMemory(queue:TVkQueue;buffer:TVkBuffer;bindCount:TVkUInt32;pBinds:PVkSparseMemoryBind):TVkResult;
|
||||||
function GetRequirements(size:TVkDeviceSize;usage:TVkFlags;ext:Pointer=nil):TVkMemoryRequirements;
|
function GetRequirements(sparce:boolean;size:TVkDeviceSize;usage:TVkFlags;ext:Pointer=nil):TVkMemoryRequirements;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
|
@ -72,11 +72,14 @@ begin
|
||||||
vkDestroyFence(Device.FHandle,fence,nil);
|
vkDestroyFence(Device.FHandle,fence,nil);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function GetRequirements(size:TVkDeviceSize;usage:TVkFlags;ext:Pointer=nil):TVkMemoryRequirements;
|
function GetRequirements(sparce:boolean;size:TVkDeviceSize;usage:TVkFlags;ext:Pointer=nil):TVkMemoryRequirements;
|
||||||
var
|
var
|
||||||
Buffer:TvBuffer;
|
Buffer:TvBuffer;
|
||||||
begin
|
begin
|
||||||
Buffer:=TvBuffer.Create(size,usage,ext);
|
Case sparce of
|
||||||
|
True :Buffer:=TvBuffer.CreateSparce(size,usage,ext);
|
||||||
|
False:Buffer:=TvBuffer.Create(size,usage,ext);
|
||||||
|
end;
|
||||||
Result:=Buffer.GetRequirements;
|
Result:=Buffer.GetRequirements;
|
||||||
Buffer.Free;
|
Buffer.Free;
|
||||||
end;
|
end;
|
||||||
|
|
|
@ -89,28 +89,65 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _fix_buf_size(var Offset,Size:TVkDeviceSize;usage:TVkFlags):TVkDeviceSize;
|
function Max(a,b:QWORD):QWORD; inline;
|
||||||
var
|
|
||||||
mr:TVkMemoryRequirements;
|
|
||||||
pAlign:TVkDeviceSize;
|
|
||||||
begin
|
begin
|
||||||
mr:=GetRequirements(Size,usage,@buf_ext);
|
if (a>b) then Result:=a else Result:=b;
|
||||||
|
|
||||||
pAlign:=AlignDw(Offset,mr.alignment);
|
|
||||||
Result:=(Offset-pAlign);
|
|
||||||
|
|
||||||
Offset:=pAlign;
|
|
||||||
Size :=Size+Result;
|
|
||||||
|
|
||||||
if (Size<mr.size) then Size:=mr.size;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function _New_simple(host:TvPointer;Size:TVkDeviceSize;usage:TVkFlags):TvHostBuffer;
|
function Min(a,b:QWORD):QWORD; inline;
|
||||||
|
begin
|
||||||
|
if (a<b) then Result:=a else Result:=b;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function _fix_buf_size(sparce:Boolean;var Addr:Pointer;var Size:TVkDeviceSize;usage:TVkFlags):TVkDeviceSize;
|
||||||
var
|
var
|
||||||
|
mr:TVkMemoryRequirements;
|
||||||
|
pAlign:Pointer;
|
||||||
|
begin
|
||||||
|
mr:=GetRequirements(sparce,Size,usage,@buf_ext);
|
||||||
|
|
||||||
|
pAlign:=AlignDw(Addr,mr.alignment);
|
||||||
|
Result:=(Addr-pAlign);
|
||||||
|
|
||||||
|
Addr:=pAlign;
|
||||||
|
Size:=Max(Size+Result,mr.size);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function _is_sparce(Addr:Pointer;Size:TVkDeviceSize;usage:TVkFlags):Integer;
|
||||||
|
var
|
||||||
|
host:TvPointer;
|
||||||
|
hsize:qword;
|
||||||
|
begin
|
||||||
|
_fix_buf_size(False,Addr,Size,usage);
|
||||||
|
|
||||||
|
host:=Default(TvPointer);
|
||||||
|
if not TryGetHostPointerByAddr(addr,host,@hsize) then
|
||||||
|
begin
|
||||||
|
Exit(-1);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if (hsize>=Size) then
|
||||||
|
begin
|
||||||
|
Result:=0;
|
||||||
|
end else
|
||||||
|
begin
|
||||||
|
Result:=1;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
function _New_simple(Addr:Pointer;Size:TVkDeviceSize;usage:TVkFlags):TvHostBuffer;
|
||||||
|
var
|
||||||
|
host:TvPointer;
|
||||||
|
|
||||||
t:TvHostBuffer;
|
t:TvHostBuffer;
|
||||||
delta:TVkDeviceSize;
|
delta:TVkDeviceSize;
|
||||||
begin
|
begin
|
||||||
delta:=_fix_buf_size(host.FOffset,Size,usage);
|
Result:=nil;
|
||||||
|
|
||||||
|
delta:=_fix_buf_size(False,Addr,Size,usage);
|
||||||
|
|
||||||
|
host:=Default(TvPointer);
|
||||||
|
if not TryGetHostPointerByAddr(addr,host) then Exit;
|
||||||
|
|
||||||
t:=TvHostBuffer.Create(Size,usage,@buf_ext);
|
t:=TvHostBuffer.Create(Size,usage,@buf_ext);
|
||||||
|
|
||||||
|
@ -121,11 +158,6 @@ begin
|
||||||
Result:=t;
|
Result:=t;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function Min(a,b:QWORD):QWORD; inline;
|
|
||||||
begin
|
|
||||||
if (a<b) then Result:=a else Result:=b;
|
|
||||||
end;
|
|
||||||
|
|
||||||
function _New_sparce(queue:TVkQueue;Addr:Pointer;Size:TVkDeviceSize;usage:TVkFlags):TvHostBuffer;
|
function _New_sparce(queue:TVkQueue;Addr:Pointer;Size:TVkDeviceSize;usage:TVkFlags):TvHostBuffer;
|
||||||
var
|
var
|
||||||
host:TvPointer;
|
host:TvPointer;
|
||||||
|
@ -145,7 +177,7 @@ begin
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
|
|
||||||
//hack; alignment is the same in virtual memory
|
//hack; alignment is the same in virtual memory
|
||||||
delta:=_fix_buf_size(TVkDeviceSize(Addr),Size,usage);
|
delta:=_fix_buf_size(True,Addr,Size,usage);
|
||||||
|
|
||||||
Binds:=Default(AVkSparseMemoryBind);
|
Binds:=Default(AVkSparseMemoryBind);
|
||||||
host :=Default(TvPointer);
|
host :=Default(TvPointer);
|
||||||
|
@ -188,9 +220,6 @@ end;
|
||||||
function FetchHostBuffer(cmd:TvCustomCmdBuffer;Addr:Pointer;Size:TVkDeviceSize;usage:TVkFlags):TvHostBuffer;
|
function FetchHostBuffer(cmd:TvCustomCmdBuffer;Addr:Pointer;Size:TVkDeviceSize;usage:TVkFlags):TvHostBuffer;
|
||||||
var
|
var
|
||||||
t:TvHostBuffer;
|
t:TvHostBuffer;
|
||||||
host:TvPointer;
|
|
||||||
|
|
||||||
_size:qword;
|
|
||||||
|
|
||||||
label
|
label
|
||||||
_exit;
|
_exit;
|
||||||
|
@ -217,20 +246,18 @@ begin
|
||||||
if (t=nil) then
|
if (t=nil) then
|
||||||
begin
|
begin
|
||||||
//Writeln('NewBuf:',HexStr(Addr));
|
//Writeln('NewBuf:',HexStr(Addr));
|
||||||
host:=Default(TvPointer);
|
|
||||||
if not TryGetHostPointerByAddr(addr,host,@_size) then
|
|
||||||
begin
|
|
||||||
Goto _exit;
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (_size>=Size) then
|
t:=nil;
|
||||||
begin
|
Case _is_sparce(Addr,Size,usage) of
|
||||||
t:=_New_simple(host,Size,usage);
|
0:begin
|
||||||
end else
|
t:=_New_simple(Addr,Size,usage);
|
||||||
begin //is Sparse buffers
|
end;
|
||||||
Assert(vDevice.sparseBinding,'sparseBinding not support');
|
1:begin //is Sparse buffers
|
||||||
Assert(MemManager.SparceSupportHost,'sparse not support for host');
|
Assert(vDevice.sparseBinding,'sparseBinding not support');
|
||||||
t:=_New_sparce(cmd.FQueue.FHandle,Addr,Size,usage);
|
Assert(MemManager.SparceSupportHost,'sparse not support for host');
|
||||||
|
t:=_New_sparce(cmd.FQueue.FHandle,Addr,Size,usage);
|
||||||
|
end;
|
||||||
|
else;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
t.FAddr:=addr;
|
t.FAddr:=addr;
|
||||||
|
|
|
@ -73,6 +73,7 @@ type
|
||||||
emulate_primtype:Integer;
|
emulate_primtype:Integer;
|
||||||
|
|
||||||
Procedure SetPrimType(t:TVkPrimitiveTopology);
|
Procedure SetPrimType(t:TVkPrimitiveTopology);
|
||||||
|
Procedure SetPrimReset(enable:TVkBool32);
|
||||||
Procedure AddVPort(const V:TVkViewport;const S:TVkRect2D);
|
Procedure AddVPort(const V:TVkViewport;const S:TVkRect2D);
|
||||||
Procedure AddBlend(const b:TVkPipelineColorBlendAttachmentState);
|
Procedure AddBlend(const b:TVkPipelineColorBlendAttachmentState);
|
||||||
Procedure Clear;
|
Procedure Clear;
|
||||||
|
@ -398,6 +399,11 @@ begin
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
Procedure TvGraphicsPipeline.SetPrimReset(enable:TVkBool32);
|
||||||
|
begin
|
||||||
|
inputAssembly.primitiveRestartEnable:=enable;
|
||||||
|
end;
|
||||||
|
|
||||||
Procedure TvGraphicsPipeline.AddVPort(const V:TVkViewport;const S:TVkRect2D);
|
Procedure TvGraphicsPipeline.AddVPort(const V:TVkViewport;const S:TVkRect2D);
|
||||||
begin
|
begin
|
||||||
if (s.extent.width=0) or (s.extent.height=0) then Assert(false);
|
if (s.extent.width=0) or (s.extent.height=0) then Assert(false);
|
||||||
|
|
Loading…
Reference in New Issue