2022-05-31 07:17:14 +00:00
|
|
|
{$mode objfpc}{$H+}
|
|
|
|
|
|
|
|
Uses
|
|
|
|
classes,
|
|
|
|
Sysutils,
|
|
|
|
si_ci_vi_merged_offset,
|
|
|
|
si_ci_vi_merged_registers,
|
|
|
|
ps4_pssl,
|
|
|
|
ps4_shader,
|
|
|
|
//spirv,
|
|
|
|
srBuffer,
|
|
|
|
SprvEmit,
|
|
|
|
|
|
|
|
emit_post,
|
|
|
|
emit_alloc,
|
|
|
|
emit_print,
|
|
|
|
emit_bin;
|
|
|
|
|
|
|
|
var
|
|
|
|
cfg:record
|
|
|
|
FName:RawByteString;
|
|
|
|
FSave:RawByteString;
|
|
|
|
FPrintInfo:Boolean;
|
|
|
|
FPrintAsm:Boolean;
|
|
|
|
FPrintSpv:Boolean;
|
|
|
|
FUseVertexInput:Boolean;
|
|
|
|
FUseTexelBuffer:Boolean;
|
2022-06-02 11:39:14 +00:00
|
|
|
FUseOutput16:Boolean;
|
2022-05-31 07:17:14 +00:00
|
|
|
|
|
|
|
BufferCfg:TsrBufferCfg;
|
|
|
|
end;
|
|
|
|
|
|
|
|
type
|
|
|
|
TDUMP_WORD=packed record
|
|
|
|
REG,COUNT:WORD;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{
|
|
|
|
procedure load_spv(const fname:RawByteString);
|
|
|
|
var
|
|
|
|
M:TMemoryStream;
|
|
|
|
Header:TSPIRVHeader;
|
|
|
|
|
|
|
|
DW:TSPIRVInstruction;
|
|
|
|
|
|
|
|
label
|
|
|
|
_exit;
|
|
|
|
begin
|
|
|
|
M:=TMemoryStream.Create;
|
|
|
|
M.LoadFromFile(fname);
|
|
|
|
M.Position:=0;
|
|
|
|
|
|
|
|
Header:=Default(TSPIRVHeader);
|
|
|
|
M.Read(Header,SizeOf(TSPIRVHeader));
|
|
|
|
if (Header.MAGIC<>spirv.MagicNumber) then Goto _exit;
|
|
|
|
Writeln(HexStr(Header.TOOL_ID,8));
|
|
|
|
|
|
|
|
DW:=Default(TSPIRVInstruction);
|
|
|
|
repeat
|
|
|
|
if M.Read(DW,SizeOf(TSPIRVInstruction))<>SizeOf(TSPIRVInstruction) then Break;
|
|
|
|
Writeln(spirv.Op.GetStr(DW.OP));
|
|
|
|
if (DW.COUNT>1) then
|
|
|
|
begin
|
|
|
|
M.Seek(SizeOf(DWORD)*(DW.COUNT-1),soCurrent);
|
|
|
|
end;
|
|
|
|
until false;
|
|
|
|
|
|
|
|
_exit:
|
|
|
|
M.Free;
|
|
|
|
end;
|
|
|
|
}
|
|
|
|
|
|
|
|
procedure post_SprvEmit(var SprvEmit:TSprvEmit);
|
|
|
|
begin
|
|
|
|
TSprvEmit_post(SprvEmit).Post;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure alloc_SprvEmit(var SprvEmit:TSprvEmit);
|
|
|
|
begin
|
|
|
|
TSprvEmit_alloc(SprvEmit).Alloc;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure print_SprvEmit(var SprvEmit:TSprvEmit);
|
|
|
|
begin
|
|
|
|
TSprvEmit_print(SprvEmit).Print;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure SaveToStream_SprvEmit(Stream:TStream;var SprvEmit:TSprvEmit);
|
|
|
|
begin
|
|
|
|
TSprvEmit_bin(SprvEmit).SaveToStream(Stream);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure SaveToFile_SprvEmit(const FName:RawByteString;var SprvEmit:TSprvEmit);
|
|
|
|
var
|
|
|
|
F:TFileStream;
|
|
|
|
begin
|
|
|
|
F:=TFileStream.Create(FName,fmCreate);
|
|
|
|
SaveToStream_SprvEmit(F,SprvEmit);
|
|
|
|
F.Free;
|
|
|
|
end;
|
|
|
|
|
|
|
|
type
|
|
|
|
TSPI_USER_DATA=array[0..15] of DWORD;
|
|
|
|
|
|
|
|
var
|
|
|
|
GPU_REGS:packed record
|
|
|
|
|
|
|
|
PS:packed record
|
|
|
|
Addr:Pointer;
|
|
|
|
|
|
|
|
INPUT_CNTL:array[0..31] of TSPI_PS_INPUT_CNTL_0;
|
|
|
|
|
|
|
|
RSRC1:TSPI_SHADER_PGM_RSRC1_PS;
|
|
|
|
RSRC2:TSPI_SHADER_PGM_RSRC2_PS;
|
|
|
|
RSRC3:TSPI_SHADER_PGM_RSRC3_PS;
|
|
|
|
|
|
|
|
Z_FORMAT :TSPI_SHADER_Z_FORMAT;
|
|
|
|
COL_FORMAT:TSPI_SHADER_COL_FORMAT;
|
|
|
|
|
|
|
|
INPUT_ENA :TSPI_PS_INPUT_ENA;
|
|
|
|
INPUT_ADDR:TSPI_PS_INPUT_ADDR;
|
|
|
|
IN_CONTROL:TSPI_PS_IN_CONTROL;
|
|
|
|
BARYC_CNTL:TSPI_BARYC_CNTL;
|
|
|
|
|
|
|
|
SHADER_CONTROL:TDB_SHADER_CONTROL;
|
|
|
|
SHADER_MASK:TCB_SHADER_MASK;
|
|
|
|
|
|
|
|
USER_DATA:TSPI_USER_DATA;
|
|
|
|
end;
|
|
|
|
|
|
|
|
VS:packed record
|
|
|
|
Addr:Pointer;
|
|
|
|
|
|
|
|
RSRC1:TSPI_SHADER_PGM_RSRC1_VS;
|
|
|
|
RSRC2:TSPI_SHADER_PGM_RSRC2_VS;
|
|
|
|
RSRC3:TSPI_SHADER_PGM_RSRC3_VS;
|
|
|
|
|
|
|
|
OUT_CONFIG:TSPI_VS_OUT_CONFIG;
|
|
|
|
POS_FORMAT:TSPI_SHADER_POS_FORMAT;
|
|
|
|
OUT_CNTL :TPA_CL_VS_OUT_CNTL;
|
|
|
|
|
|
|
|
USER_DATA:TSPI_USER_DATA;
|
|
|
|
end;
|
|
|
|
|
|
|
|
CS:packed record
|
|
|
|
Addr:Pointer;
|
|
|
|
|
|
|
|
RSRC1:TCOMPUTE_PGM_RSRC1;
|
|
|
|
RSRC2:TCOMPUTE_PGM_RSRC2;
|
|
|
|
|
|
|
|
STATIC_THREAD_MGMT_SE0:TCOMPUTE_STATIC_THREAD_MGMT_SE0;
|
|
|
|
STATIC_THREAD_MGMT_SE1:TCOMPUTE_STATIC_THREAD_MGMT_SE1;
|
|
|
|
RESOURCE_LIMITS:TCOMPUTE_RESOURCE_LIMITS;
|
|
|
|
|
|
|
|
NUM_THREAD_X:TCOMPUTE_NUM_THREAD_X;
|
|
|
|
NUM_THREAD_Y:TCOMPUTE_NUM_THREAD_Y;
|
|
|
|
NUM_THREAD_Z:TCOMPUTE_NUM_THREAD_Z;
|
|
|
|
|
|
|
|
USER_DATA:TSPI_USER_DATA;
|
|
|
|
end;
|
|
|
|
|
|
|
|
VGT_NUM_INSTANCES:TVGT_NUM_INSTANCES;
|
|
|
|
end;
|
|
|
|
|
|
|
|
Blocks:TFPList;
|
|
|
|
|
|
|
|
procedure ClearBlocks;
|
|
|
|
var
|
|
|
|
i:Integer;
|
|
|
|
begin
|
|
|
|
if (Blocks=nil) then
|
|
|
|
begin
|
|
|
|
Blocks:=TFPList.Create;
|
|
|
|
Exit;
|
|
|
|
end;
|
|
|
|
if (Blocks.Count<>0) then
|
|
|
|
For i:=0 to Blocks.Count-1 do
|
|
|
|
begin
|
|
|
|
FreeMem(Blocks.Items[i]);
|
|
|
|
end;
|
|
|
|
Blocks.Clear;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure load_dump(const fname:RawByteString);
|
|
|
|
var
|
|
|
|
M:TMemoryStream;
|
|
|
|
W:TDUMP_WORD;
|
|
|
|
V:DWORD;
|
|
|
|
addr:Pointer;
|
|
|
|
size,i:DWORD;
|
|
|
|
begin
|
|
|
|
ClearBlocks;
|
|
|
|
FillChar(GPU_REGS,SizeOf(GPU_REGS),0);
|
|
|
|
M:=TMemoryStream.Create;
|
|
|
|
M.LoadFromFile(fname);
|
|
|
|
M.Position:=0;
|
|
|
|
V:=0;
|
|
|
|
W:=Default(TDUMP_WORD);
|
|
|
|
repeat
|
|
|
|
if M.Read(W,SizeOf(W))<>SizeOf(W) then Break;
|
|
|
|
if (W.COUNT=0) then //simple
|
|
|
|
begin
|
|
|
|
if M.Read(V,SizeOf(V))<>SizeOf(V) then Break;
|
|
|
|
|
|
|
|
Case W.REG of
|
|
|
|
mmCOMPUTE_PGM_RSRC1 :DWORD(GPU_REGS.CS.RSRC1 ):=V;
|
|
|
|
mmCOMPUTE_PGM_RSRC2 :DWORD(GPU_REGS.CS.RSRC2 ):=V;
|
|
|
|
mmCOMPUTE_NUM_THREAD_X:DWORD(GPU_REGS.CS.NUM_THREAD_X):=V;
|
|
|
|
mmCOMPUTE_NUM_THREAD_Y:DWORD(GPU_REGS.CS.NUM_THREAD_Y):=V;
|
|
|
|
mmCOMPUTE_NUM_THREAD_Z:DWORD(GPU_REGS.CS.NUM_THREAD_Z):=V;
|
|
|
|
//
|
|
|
|
mmCOMPUTE_USER_DATA_0..mmCOMPUTE_USER_DATA_15:
|
|
|
|
begin
|
|
|
|
i:=W.REG-mmCOMPUTE_USER_DATA_0;
|
|
|
|
GPU_REGS.CS.USER_DATA[i]:=V;
|
|
|
|
end;
|
|
|
|
//
|
|
|
|
mmCOMPUTE_STATIC_THREAD_MGMT_SE0:DWORD(GPU_REGS.CS.STATIC_THREAD_MGMT_SE0):=V;
|
|
|
|
mmCOMPUTE_STATIC_THREAD_MGMT_SE1:DWORD(GPU_REGS.CS.STATIC_THREAD_MGMT_SE1):=V;
|
|
|
|
mmCOMPUTE_RESOURCE_LIMITS :DWORD(GPU_REGS.CS.RESOURCE_LIMITS ):=V;
|
|
|
|
//
|
|
|
|
mmSPI_SHADER_PGM_RSRC1_PS:DWORD(GPU_REGS.PS.RSRC1 ):=V;
|
|
|
|
mmSPI_SHADER_PGM_RSRC2_PS:DWORD(GPU_REGS.PS.RSRC2 ):=V;
|
|
|
|
mmSPI_SHADER_PGM_RSRC3_PS:DWORD(GPU_REGS.PS.RSRC3 ):=V;
|
|
|
|
mmSPI_SHADER_Z_FORMAT :DWORD(GPU_REGS.PS.Z_FORMAT ):=V;
|
|
|
|
mmSPI_SHADER_COL_FORMAT :DWORD(GPU_REGS.PS.COL_FORMAT ):=V;
|
|
|
|
mmSPI_PS_INPUT_ENA :DWORD(GPU_REGS.PS.INPUT_ENA ):=V;
|
|
|
|
mmSPI_PS_INPUT_ADDR :DWORD(GPU_REGS.PS.INPUT_ADDR ):=V;
|
|
|
|
mmSPI_PS_IN_CONTROL :DWORD(GPU_REGS.PS.IN_CONTROL ):=V;
|
|
|
|
mmSPI_BARYC_CNTL :DWORD(GPU_REGS.PS.BARYC_CNTL ):=V;
|
|
|
|
mmDB_SHADER_CONTROL :DWORD(GPU_REGS.PS.SHADER_CONTROL):=V;
|
|
|
|
mmCB_SHADER_MASK :DWORD(GPU_REGS.PS.SHADER_MASK ):=V;
|
|
|
|
//
|
|
|
|
mmSPI_SHADER_USER_DATA_PS_0..mmSPI_SHADER_USER_DATA_PS_15:
|
|
|
|
begin
|
|
|
|
i:=W.REG-mmSPI_SHADER_USER_DATA_PS_0;
|
|
|
|
GPU_REGS.PS.USER_DATA[i]:=V;
|
|
|
|
end;
|
|
|
|
//
|
|
|
|
mmSPI_PS_INPUT_CNTL_0..mmSPI_PS_INPUT_CNTL_31:
|
|
|
|
begin
|
|
|
|
i:=W.REG-mmSPI_PS_INPUT_CNTL_0;
|
|
|
|
DWORD(GPU_REGS.PS.INPUT_CNTL[i]):=V;
|
|
|
|
end;
|
|
|
|
//
|
|
|
|
mmSPI_SHADER_PGM_RSRC1_VS:DWORD(GPU_REGS.VS.RSRC1 ):=V;
|
|
|
|
mmSPI_SHADER_PGM_RSRC2_VS:DWORD(GPU_REGS.VS.RSRC2 ):=V;
|
|
|
|
mmSPI_SHADER_PGM_RSRC3_VS:DWORD(GPU_REGS.VS.RSRC3 ):=V;
|
|
|
|
mmSPI_VS_OUT_CONFIG :DWORD(GPU_REGS.VS.OUT_CONFIG):=V;
|
|
|
|
mmSPI_SHADER_POS_FORMAT :DWORD(GPU_REGS.VS.POS_FORMAT):=V;
|
|
|
|
mmPA_CL_VS_OUT_CNTL :DWORD(GPU_REGS.VS.OUT_CNTL ):=V;
|
|
|
|
//
|
|
|
|
mmSPI_SHADER_USER_DATA_VS_0..mmSPI_SHADER_USER_DATA_VS_15:
|
|
|
|
begin
|
|
|
|
i:=W.REG-mmSPI_SHADER_USER_DATA_VS_0;
|
|
|
|
GPU_REGS.VS.USER_DATA[i]:=V;
|
|
|
|
end;
|
|
|
|
//
|
|
|
|
mmVGT_NUM_INSTANCES :DWORD(GPU_REGS.VGT_NUM_INSTANCES):=V;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
end else
|
|
|
|
begin
|
|
|
|
size:=(W.COUNT+1)*4;
|
|
|
|
|
|
|
|
if cfg.FPrintInfo then
|
|
|
|
if (W.COUNT<>0) then Writeln('block:',getRegName(W.REG),' size:',size);
|
|
|
|
|
|
|
|
addr:=AllocMem(size+7);
|
|
|
|
if M.Read(Align(addr,8)^,size)<>size then
|
|
|
|
begin
|
|
|
|
FreeMem(addr);
|
|
|
|
Break;
|
|
|
|
end else
|
|
|
|
begin
|
|
|
|
Blocks.Add(addr);
|
|
|
|
addr:=Align(addr,8);
|
|
|
|
end;
|
|
|
|
|
|
|
|
Case W.REG of
|
|
|
|
mmCOMPUTE_PGM_LO:
|
|
|
|
begin
|
|
|
|
GPU_REGS.CS.Addr:=addr;
|
|
|
|
end;
|
|
|
|
mmSPI_SHADER_PGM_LO_PS:
|
|
|
|
begin
|
|
|
|
GPU_REGS.PS.Addr:=addr;
|
|
|
|
end;
|
|
|
|
mmSPI_SHADER_PGM_LO_VS:
|
|
|
|
begin
|
|
|
|
GPU_REGS.VS.Addr:=addr;
|
|
|
|
end;
|
|
|
|
|
|
|
|
mmCOMPUTE_USER_DATA_0..mmCOMPUTE_USER_DATA_14:
|
|
|
|
begin
|
|
|
|
i:=W.REG-mmCOMPUTE_USER_DATA_0;
|
|
|
|
GPU_REGS.CS.USER_DATA[i+0]:=DWORD({%H-}QWORD(addr));
|
|
|
|
GPU_REGS.CS.USER_DATA[i+1]:=DWORD({%H-}QWORD(addr) shr 32);
|
|
|
|
end;
|
|
|
|
|
|
|
|
mmSPI_SHADER_USER_DATA_PS_0..mmSPI_SHADER_USER_DATA_PS_14:
|
|
|
|
begin
|
|
|
|
i:=W.REG-mmSPI_SHADER_USER_DATA_PS_0;
|
|
|
|
GPU_REGS.PS.USER_DATA[i+0]:=DWORD({%H-}QWORD(addr));
|
|
|
|
GPU_REGS.PS.USER_DATA[i+1]:=DWORD({%H-}QWORD(addr) shr 32);
|
|
|
|
end;
|
|
|
|
|
|
|
|
mmSPI_SHADER_USER_DATA_VS_0..mmSPI_SHADER_USER_DATA_VS_14:
|
|
|
|
begin
|
|
|
|
i:=W.REG-mmSPI_SHADER_USER_DATA_VS_0;
|
|
|
|
GPU_REGS.VS.USER_DATA[i+0]:=DWORD({%H-}QWORD(addr));
|
|
|
|
GPU_REGS.VS.USER_DATA[i+1]:=DWORD({%H-}QWORD(addr) shr 32);
|
|
|
|
end;
|
|
|
|
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
until false;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure load_pssl(base:Pointer);
|
|
|
|
var
|
|
|
|
info:PShaderBinaryInfo;
|
|
|
|
Slots:PInputUsageSlot;
|
|
|
|
|
|
|
|
SprvEmit:TSprvEmit;
|
|
|
|
|
|
|
|
//LParser:TsrLParser;
|
|
|
|
//FCode:TsrCodeBlock;
|
|
|
|
|
|
|
|
i:Byte;
|
|
|
|
|
|
|
|
begin
|
|
|
|
if (base=nil) then Exit;
|
|
|
|
|
|
|
|
info:=_calc_shader_info(base,MemSize(base) div 4);
|
|
|
|
|
|
|
|
if cfg.FPrintInfo then
|
|
|
|
if (info<>nil) then
|
|
|
|
begin
|
|
|
|
Writeln('signature =',info^.signature );
|
|
|
|
Writeln('version =',info^.version );
|
|
|
|
Writeln('pssl_or_cg =',info^.pssl_or_cg );
|
|
|
|
Writeln('cached =',info^.cached );
|
|
|
|
Writeln('m_type =',info^.m_type );
|
|
|
|
Writeln('source_type =',info^.source_type );
|
|
|
|
Writeln('length =',info^.length );
|
|
|
|
Writeln('chunkUsageBaseOffsetInDW=',info^.chunkUsageBaseOffsetInDW);
|
|
|
|
Writeln('numInputUsageSlots =',info^.numInputUsageSlots );
|
|
|
|
Writeln('isSrt =',info^.isSrt );
|
|
|
|
Writeln('isSrtUsedInfoValid =',info^.isSrtUsedInfoValid );
|
|
|
|
Writeln('isExtendedUsageInfo =',info^.isExtendedUsageInfo );
|
|
|
|
Writeln('reserved2 =',info^.reserved2 );
|
|
|
|
Writeln('reserved3 =',info^.reserved3 );
|
|
|
|
Writeln('shaderHash0 =','0x',HexStr(info^.shaderHash0,8));
|
|
|
|
Writeln('shaderHash1 =','0x',HexStr(info^.shaderHash1,8));
|
|
|
|
Writeln('crc32 =','0x',HexStr(info^.crc32,8) );
|
|
|
|
writeln;
|
|
|
|
|
|
|
|
if (info^.numInputUsageSlots<>0) then
|
|
|
|
begin
|
|
|
|
Slots:=_calc_shader_slot(info);
|
|
|
|
|
|
|
|
For i:=0 to info^.numInputUsageSlots-1 do
|
|
|
|
begin
|
|
|
|
Writeln('Slot[',i,']');
|
|
|
|
|
|
|
|
case Slots[i].m_usageType of
|
|
|
|
kShaderInputUsageImmResource :Writeln(' ','kShaderInputUsageImmResource ');
|
|
|
|
kShaderInputUsageImmSampler :Writeln(' ','kShaderInputUsageImmSampler ');
|
|
|
|
kShaderInputUsageImmConstBuffer :Writeln(' ','kShaderInputUsageImmConstBuffer ');
|
|
|
|
kShaderInputUsageImmVertexBuffer :Writeln(' ','kShaderInputUsageImmVertexBuffer ');
|
|
|
|
kShaderInputUsageImmRwResource :Writeln(' ','kShaderInputUsageImmRwResource ');
|
|
|
|
kShaderInputUsageImmAluFloatConst :Writeln(' ','kShaderInputUsageImmAluFloatConst ');
|
|
|
|
kShaderInputUsageImmAluBool32Const :Writeln(' ','kShaderInputUsageImmAluBool32Const ');
|
|
|
|
kShaderInputUsageImmGdsCounterRange :Writeln(' ','kShaderInputUsageImmGdsCounterRange ');
|
|
|
|
kShaderInputUsageImmGdsMemoryRange :Writeln(' ','kShaderInputUsageImmGdsMemoryRange ');
|
|
|
|
kShaderInputUsageImmGwsBase :Writeln(' ','kShaderInputUsageImmGwsBase ');
|
|
|
|
kShaderInputUsageImmShaderResourceTable :Writeln(' ','kShaderInputUsageImmShaderResourceTable ');
|
|
|
|
kShaderInputUsageImmLdsEsGsSize :Writeln(' ','kShaderInputUsageImmLdsEsGsSize ');
|
|
|
|
kShaderInputUsageSubPtrFetchShader :Writeln(' ','kShaderInputUsageSubPtrFetchShader ');
|
|
|
|
kShaderInputUsagePtrResourceTable :Writeln(' ','kShaderInputUsagePtrResourceTable ');
|
|
|
|
kShaderInputUsagePtrInternalResourceTable :Writeln(' ','kShaderInputUsagePtrInternalResourceTable ');
|
|
|
|
kShaderInputUsagePtrSamplerTable :Writeln(' ','kShaderInputUsagePtrSamplerTable ');
|
|
|
|
kShaderInputUsagePtrConstBufferTable :Writeln(' ','kShaderInputUsagePtrConstBufferTable ');
|
|
|
|
kShaderInputUsagePtrVertexBufferTable :Writeln(' ','kShaderInputUsagePtrVertexBufferTable ');
|
|
|
|
kShaderInputUsagePtrSoBufferTable :Writeln(' ','kShaderInputUsagePtrSoBufferTable ');
|
|
|
|
kShaderInputUsagePtrRwResourceTable :Writeln(' ','kShaderInputUsagePtrRwResourceTable ');
|
|
|
|
kShaderInputUsagePtrInternalGlobalTable :Writeln(' ','kShaderInputUsagePtrInternalGlobalTable ');
|
|
|
|
kShaderInputUsagePtrExtendedUserData :Writeln(' ','kShaderInputUsagePtrExtendedUserData ');
|
|
|
|
kShaderInputUsagePtrIndirectResourceTable :Writeln(' ','kShaderInputUsagePtrIndirectResourceTable ');
|
|
|
|
kShaderInputUsagePtrIndirectInternalResourceTable:Writeln(' ','kShaderInputUsagePtrIndirectInternalResourceTable');
|
|
|
|
kShaderInputUsagePtrIndirectRwResourceTable :Writeln(' ','kShaderInputUsagePtrIndirectRwResourceTable ');
|
|
|
|
kShaderInputUsageImmGdsKickRingBufferOffse :Writeln(' ','kShaderInputUsageImmGdsKickRingBufferOffse ');
|
|
|
|
kShaderInputUsageImmVertexRingBufferOffse :Writeln(' ','kShaderInputUsageImmVertexRingBufferOffse ');
|
|
|
|
kShaderInputUsagePtrDispatchDraw :Writeln(' ','kShaderInputUsagePtrDispatchDraw ');
|
|
|
|
kShaderInputUsageImmDispatchDrawInstances :Writeln(' ','kShaderInputUsageImmDispatchDrawInstances ');
|
|
|
|
else
|
|
|
|
Writeln(' m_usageType=',Slots[i].m_usageType);
|
|
|
|
end;
|
|
|
|
|
|
|
|
Writeln(' apiSlot=',Slots[i].m_apiSlot);
|
|
|
|
Writeln(' startRegister=',Slots[i].m_startRegister);
|
|
|
|
|
|
|
|
Writeln(' param=',HexStr(Slots[i].m_srtSizeInDWordMinusOne,2));
|
|
|
|
end;
|
|
|
|
Writeln;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
Assert(info<>nil);
|
|
|
|
|
|
|
|
case info^.m_type of
|
|
|
|
kShaderTypePs :
|
|
|
|
begin
|
|
|
|
if cfg.FPrintInfo then
|
|
|
|
Writeln('USGPR:',GPU_REGS.PS.RSRC2.USER_SGPR,' VGPRS:',GPU_REGS.PS.RSRC1.VGPRS,' SGPRS:',GPU_REGS.PS.RSRC1.SGPRS);
|
|
|
|
|
|
|
|
SprvEmit.InitPs(GPU_REGS.PS.RSRC2,GPU_REGS.PS.INPUT_ENA);
|
|
|
|
SprvEmit.SetUserData(@GPU_REGS.PS.USER_DATA);
|
|
|
|
end;
|
|
|
|
kShaderTypeVsVs:
|
|
|
|
begin
|
|
|
|
if cfg.FPrintInfo then
|
|
|
|
Writeln('USGPR:',GPU_REGS.VS.RSRC2.USER_SGPR,' VGPRS:',GPU_REGS.VS.RSRC1.VGPRS,' SGPRS:',GPU_REGS.VS.RSRC1.SGPRS);
|
|
|
|
|
|
|
|
SprvEmit.InitVs(GPU_REGS.VS.RSRC2,GPU_REGS.VGT_NUM_INSTANCES);
|
|
|
|
SprvEmit.SetUserData(@GPU_REGS.VS.USER_DATA);
|
|
|
|
end;
|
|
|
|
kShaderTypeCs:
|
|
|
|
begin
|
|
|
|
if cfg.FPrintInfo then
|
|
|
|
Writeln('USGPR:',GPU_REGS.CS.RSRC2.USER_SGPR,' VGPRS:',GPU_REGS.CS.RSRC1.VGPRS,' SGPRS:',GPU_REGS.CS.RSRC1.SGPRS);
|
|
|
|
|
|
|
|
SprvEmit.InitCs(GPU_REGS.CS.RSRC2,GPU_REGS.CS.NUM_THREAD_X,GPU_REGS.CS.NUM_THREAD_Y,GPU_REGS.CS.NUM_THREAD_Z);
|
|
|
|
SprvEmit.SetUserData(@GPU_REGS.CS.USER_DATA);
|
|
|
|
|
|
|
|
end;
|
|
|
|
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
_parse_print(base);
|
|
|
|
Exit;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
SprvEmit.FPrintAsm :=cfg.FPrintAsm;
|
|
|
|
SprvEmit.FUseVertexInput:=cfg.FUseVertexInput;
|
|
|
|
SprvEmit.FUseTexelBuffer:=cfg.FUseTexelBuffer;
|
2022-06-02 11:39:14 +00:00
|
|
|
SprvEmit.FUseOutput16 :=cfg.FUseOutput16;
|
2022-05-31 07:17:14 +00:00
|
|
|
|
|
|
|
SprvEmit.FBuffers.cfg:=cfg.BufferCfg;
|
|
|
|
|
|
|
|
if (SprvEmit.Parse(base)>1) then
|
|
|
|
begin
|
|
|
|
Writeln(StdErr,'Shader Parse Err');
|
|
|
|
end;
|
|
|
|
|
|
|
|
if cfg.FPrintAsm or cfg.FPrintSpv or (cfg.FSave<>'') then
|
|
|
|
begin
|
|
|
|
post_SprvEmit(SprvEmit);
|
|
|
|
alloc_SprvEmit(SprvEmit);
|
|
|
|
end;
|
|
|
|
|
|
|
|
if cfg.FPrintSpv then
|
|
|
|
begin
|
|
|
|
print_SprvEmit(SprvEmit);
|
|
|
|
Writeln;
|
|
|
|
end;
|
|
|
|
|
|
|
|
if (cfg.FSave<>'') then
|
|
|
|
begin
|
|
|
|
SaveToFile_SprvEmit(cfg.FSave,SprvEmit);
|
|
|
|
end;
|
|
|
|
|
|
|
|
if cfg.FPrintInfo then
|
|
|
|
Writeln('used_size=',SprvEmit.FAllocator.used_size);
|
|
|
|
|
|
|
|
SprvEmit.FAllocator.Free;
|
|
|
|
end;
|
|
|
|
|
|
|
|
function ParseCmd:Boolean;
|
|
|
|
var
|
|
|
|
i,n:Integer;
|
|
|
|
label
|
|
|
|
promo;
|
|
|
|
begin
|
|
|
|
if (ParamCount=0) then
|
|
|
|
begin
|
|
|
|
promo:
|
|
|
|
|
|
|
|
Exit(False);
|
|
|
|
end;
|
|
|
|
|
|
|
|
cfg.FUseVertexInput:=True;
|
|
|
|
cfg.BufferCfg.Init;
|
|
|
|
|
|
|
|
n:=-1;
|
|
|
|
For i:=1 to ParamCount do
|
|
|
|
begin
|
|
|
|
case LowerCase(ParamStr(i)) of
|
|
|
|
'-i':cfg.FPrintInfo:=True;
|
|
|
|
'-a':cfg.FPrintAsm:=True;
|
|
|
|
'-p':cfg.FPrintSpv:=True;
|
2022-06-02 11:39:14 +00:00
|
|
|
|
2022-05-31 07:17:14 +00:00
|
|
|
'-eva':cfg.FUseVertexInput:=True;
|
|
|
|
'-dva':cfg.FUseVertexInput:=False;
|
2022-06-02 11:39:14 +00:00
|
|
|
|
2022-05-31 07:17:14 +00:00
|
|
|
'-etb':cfg.FUseTexelBuffer:=True;
|
|
|
|
'-dtb':cfg.FUseTexelBuffer:=False;
|
|
|
|
|
2022-06-02 11:39:14 +00:00
|
|
|
'-eoh':cfg.FUseOutput16:=True;
|
|
|
|
'-doh':cfg.FUseOutput16:=False;
|
|
|
|
|
2022-05-31 07:17:14 +00:00
|
|
|
'-b':n:=0;
|
|
|
|
|
|
|
|
'-mubo':n:=1;//maxUniformBufferRange
|
|
|
|
'-pco':n:=2;//PushConstantsOffset
|
|
|
|
'-pcs':n:=3;//maxPushConstantsSize
|
|
|
|
'-sboa':n:=4;//minStorageBufferOffsetAlignment
|
|
|
|
'-uboa':n:=5;//minUniformBufferOffsetAlignment
|
|
|
|
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
Case n of
|
|
|
|
-1:cfg.FName:=ParamStr(i);
|
|
|
|
0:cfg.FSave:=ParamStr(i);
|
|
|
|
1:cfg.BufferCfg.maxUniformBufferRange :=StrToInt64Def(ParamStr(i),0);
|
|
|
|
2:cfg.BufferCfg.PushConstantsOffset :=StrToInt64Def(ParamStr(i),0);
|
|
|
|
3:cfg.BufferCfg.maxPushConstantsSize :=StrToInt64Def(ParamStr(i),0);
|
|
|
|
4:cfg.BufferCfg.minStorageBufferOffsetAlignment:=StrToInt64Def(ParamStr(i),0);
|
|
|
|
5:cfg.BufferCfg.minUniformBufferOffsetAlignment:=StrToInt64Def(ParamStr(i),0);
|
|
|
|
end;
|
|
|
|
n:=-1;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
Result:=True;
|
|
|
|
end;
|
|
|
|
|
|
|
|
begin
|
|
|
|
DefaultSystemCodePage:=CP_UTF8;
|
|
|
|
DefaultUnicodeCodePage:=CP_UTF8;
|
|
|
|
DefaultFileSystemCodePage:=CP_UTF8;
|
|
|
|
DefaultRTLFileSystemCodePage:=CP_UTF8;
|
|
|
|
UTF8CompareLocale:=CP_UTF8;
|
|
|
|
|
|
|
|
FillChar(cfg,SizeOf(cfg),0);
|
|
|
|
|
|
|
|
ParseCmd;
|
|
|
|
|
|
|
|
if (cfg.FName='') then
|
|
|
|
begin
|
|
|
|
//loadspv('vert.spv');
|
|
|
|
|
|
|
|
//branch adr
|
|
|
|
//load_dump('shader_dump\MomodoraRUtM\MomodoraRUtM_ps_595F5E5D.dump');
|
|
|
|
//load_dump('shader_dump\MomodoraRUtM\MomodoraRUtM_vs_B9E80F51.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\MomodoraRUtM\MomodoraRUtM_vs_72685B15.dump');
|
|
|
|
|
|
|
|
//branch
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_cs_3685EFC7.dump');
|
|
|
|
|
|
|
|
//branch
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_ps_8D309F69.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_ps_30AC6582.dump');
|
|
|
|
|
|
|
|
//V_MED3_F32
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_ps_46F7D0CB.dump');
|
|
|
|
|
|
|
|
//branch
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_ps_897BFEFF.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_ps_A9A43387.dump');
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_ps_BD5B57D5.dump');
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_ps_C342C7CD.dump');
|
|
|
|
|
|
|
|
//V_MED3_F32
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_ps_E125C5F7.dump');
|
|
|
|
|
|
|
|
//branch cycle
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_ps_E820FFDE.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_vs_1CE5C47E.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_vs_22E9CA76.dump');
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_vs_48FA7A4C.dump');
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_vs_243D8C75.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_vs_B4E470AF.dump');
|
|
|
|
//load_dump('shader_dump\tutorial_anti-aliasing_debug\tutorial_anti-aliasing_debug_vs_E1C90BE3.dump');
|
|
|
|
|
|
|
|
//branch
|
|
|
|
////load_dump('shader_dump\WeAreDoomed\WeAreDoomed_ps4_cs_FEA061C5.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\simplet-simple-fs_debug\simplet-simple-fs_debug_vs_398C5BF6.dump');
|
|
|
|
//load_dump('shader_dump\simplet-simple-fs_debug\simplet-simple-fs_debug_ps_F327ABD1.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\simplet-single-triangle_debug\simplet-single-triangle_debug_vs_78EF9008.dump');
|
2022-06-02 11:39:14 +00:00
|
|
|
load_dump('shader_dump\simplet-single-triangle_debug\simplet-single-triangle_debug_ps_FBCA196D.dump');
|
2022-05-31 07:17:14 +00:00
|
|
|
|
|
|
|
//load_dump('shader_dump\basic_quad_debug\basic_quad_debug_ps_C342C7CD.dump');
|
|
|
|
//load_dump('shader_dump\basic_quad_debug\basic_quad_debug_vs_D216FEB8.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\basic_quad_debug\basic_quad_debug_cs_3685EFC7.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\basic_quad_debug\basic_quad_debug_ps_A9F64695.dump');
|
|
|
|
//load_dump('shader_dump\basic_quad_debug\basic_quad_debug_vs_B4E470AF.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\basic_quad_debug\basic_quad_debug_vs_1CE5C47E.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\basic-compute_debug\basic-compute_debug_ps_4BD7E17E.dump');
|
|
|
|
//load_dump('shader_dump\basic-compute_debug\basic-compute_debug_vs_0C30DA0F.dump');
|
|
|
|
|
|
|
|
//load_dump('shader_dump\SonicMania\SonicMania_ps_0C48E8B2.dump');
|
|
|
|
|
|
|
|
|
|
|
|
//load_dump('shader_dump\SonicMania\SonicMania_ps_B4281DBF.dump');
|
|
|
|
|
2022-06-02 11:39:14 +00:00
|
|
|
//load_dump('shader_dump\SonicMania\SonicMania_ps_11DF2A32.dump');
|
2022-05-31 07:17:14 +00:00
|
|
|
|
|
|
|
//load_dump('shader_dump\SonicMania\SonicMania_ps_3CC22A00.dump'); //cfg
|
|
|
|
end;
|
|
|
|
|
|
|
|
if (cfg.FName<>'') then
|
|
|
|
load_dump(cfg.FName);
|
|
|
|
|
|
|
|
load_pssl(GPU_REGS.CS.Addr);
|
|
|
|
|
|
|
|
load_pssl(GPU_REGS.VS.Addr);
|
|
|
|
load_pssl(GPU_REGS.PS.Addr);
|
|
|
|
|
|
|
|
if cfg.FPrintInfo then
|
|
|
|
readln;
|
|
|
|
end.
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
///////////////////source ext
|
|
|
|
|
|
|
|
[USER_DATA]
|
|
|
|
|
|
|
|
|
v
|
|
|
|
//DATA LAYOUT
|
|
|
|
[PARENT_LAYOUT|DATA_TYPE|OFFSET|INDEX]
|
|
|
|
^ ^ ^
|
|
|
|
| | | //CHILD LAYOUT //UNIFORM
|
|
|
|
| |[PARENT_LAYOUT|DATA_TYPE|OFFSET] <- [SOURCE_LAYOUT|HANDLE_TYPE|PVAR|PREG]
|
|
|
|
| | ^ ^
|
|
|
|
| | | |
|
|
|
|
| | /-------------------------/ |
|
|
|
|
| | | |
|
|
|
|
| | v |
|
|
|
|
| | [PVAR] <- [opLoad]<--------------/
|
|
|
|
| |
|
|
|
|
| | //CHILD LAYOUT //BUFFER
|
|
|
|
| [PARENT_LAYOUT|DATA_TYPE|OFFSET] <- [SOURCE_LAYOUT|CAST_NUM|PVAR] <-> [PVAR]<----------\
|
|
|
|
| ^ |
|
|
|
|
| | //BUFFER FIELD |
|
|
|
|
| [SOURCE_BUFFER|SOURCE_FIELD|ID|OFFSET|SIZE|PREG] |
|
|
|
|
| ^ | |
|
|
|
|
| /------------/ | |
|
|
|
|
| | | |
|
|
|
|
| [OpAccessChain|ID|ID...]<-------------------------/
|
|
|
|
| ^ |
|
|
|
|
| | |
|
|
|
|
| [opLoad]<-----------------------------------/
|
|
|
|
|
|
|
|
|
|[SET]
|
|
|
|
|
|
|
|
|
| //CHAIN LAYOUT
|
|
|
|
[SOURCE_LAYOUT|OFFSET|PREG] <-> [opLoad]
|
|
|
|
|
|
|
|
///////////////////
|
|
|
|
|
|
|
|
|
|
|
|
[FUserDataVar]
|
|
|
|
^
|
|
|
|
| /----------------------------------------v---------------------------\
|
|
|
|
[pArray|Source] <- [OpAccessChain|[Index]] <- [PChain|pWriter|ID] <- [opLoad] <- [pReg|ID]
|
|
|
|
|
|
|
|
|
|
|
|
[PChain]*x
|
|
|
|
^ ^
|
|
|
|
| |
|
|
|
|
[pGroup|chains]
|
|
|
|
|
|
|
|
//////////////////
|
|
|
|
|
|
|
|
[pUniform]
|
|
|
|
| ^
|
|
|
|
v /-----------------------\
|
|
|
|
[Forked_Var] <- [opLoad] <- [pReg|ID] <- [OpImageRead1D]
|
|
|
|
|
|
|
|
//////////////////
|
|
|
|
|
|
|
|
[OpVariable] [pointer struct] PushConstant
|
|
|
|
^ ^
|
|
|
|
| |
|
|
|
|
| [OpTypePointer] PushConstant [struct]
|
|
|
|
| ^
|
|
|
|
| |
|
|
|
|
| [OpTypeStruct] [item1:type] <- aType
|
|
|
|
| ^ ^ ^
|
|
|
|
| | | |
|
|
|
|
| | [OpMemberDecorate] [struct] [item1:index] Offset 0
|
|
|
|
| |
|
|
|
|
| [OpDecorate] [struct] Block
|
|
|
|
|
|
|
|
|
| [OpTypePointer] PushConstant [item1:type]
|
|
|
|
| |
|
|
|
|
| v
|
|
|
|
[OpAccessChain] [pointer type] [pVar] [item1:index]
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
x:=1 //write
|
|
|
|
|
|
|
|
[opLabel]->
|
|
|
|
|
|
|
|
y:=x+1 //read ^make var
|
|
|
|
|
|
|
|
[opLabel]<-
|
|
|
|
|
|
|
|
//////////////////////////////
|
|
|
|
|
|
|
|
y:=0 //write
|
|
|
|
|
|
|
|
[opLabel]->
|
|
|
|
|
|
|
|
y:=1 //write
|
|
|
|
|
|
|
|
y:=y+y //write <-
|
|
|
|
|
|
|
|
[opLabel]<-
|
|
|
|
|
|
|
|
x:=y+1; //read ^make var
|
|
|
|
|
|
|
|
y:=1 //write <- reset var
|
|
|
|
|
|
|
|
//////////////////////////////
|
|
|
|
|
|
|
|
y:=0 //write
|
|
|
|
|
|
|
|
[opLabel]->
|
|
|
|
|
|
|
|
x:=1 //write
|
|
|
|
|
|
|
|
[opLabel]<-
|
|
|
|
|
|
|
|
x:=y+1; //read ^nop
|
|
|
|
|
|
|
|
//////////////////////////////
|
|
|
|
|
|
|
|
[OpCond]
|
|
|
|
|
|
|
|
IF[ [OpSelectionMerge] [OpBranchConditional] [OpLabel]
|
|
|
|
|
|
|
|
//body
|
|
|
|
|
|
|
|
[OpLabel] ]ENDIF
|
|
|
|
|
|
|
|
//////////////////////////////
|
|
|
|
|
|
|
|
IF[ [OpBranch] [OpLabel]
|
|
|
|
|
|
|
|
WHILE[ [OpLoopMerge] [OpBranch] [OpLabel]
|
|
|
|
|
|
|
|
//body
|
|
|
|
|
|
|
|
[OpBranch] [OpLabel] ]WHILE(1)
|
|
|
|
|
|
|
|
[OpCond]
|
|
|
|
|
|
|
|
[OpBranchConditional] [OpLabel] ]WHILE(2) ]ENDIF
|
|
|
|
|
|
|
|
//////////////////////////////
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|