FPPS4/spirv/pssl-spirv.lpr

792 lines
24 KiB
Plaintext
Raw Normal View History

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
//////////////////////////////
}