add a 010Editor template for parsing PM4 packet queue

This commit is contained in:
Asuka 2020-01-25 17:13:38 +08:00
parent 29339128e9
commit 7721e5308f

232
Tools/PM4Template.bt Normal file
View file

@ -0,0 +1,232 @@
//-----------------------------------
//--- 010 Editor v2.0 Binary Template
//
// Author: Asuka
// Revision: 1.0
// Purpose: Defines a template for
// parsing AMD PM4 packet queue.
// Changes:
// 1.0:
// - Initial version.
//-----------------------------------
typedef enum <byte>
{
IT_NOP = 0x00000010,
IT_SET_BASE = 0x00000011,
IT_CLEAR_STATE = 0x00000012,
IT_INDEX_BUFFER_SIZE = 0x00000013,
IT_DISPATCH_DIRECT = 0x00000015,
IT_DISPATCH_INDIRECT = 0x00000016,
IT_INDIRECT_BUFFER_END = 0x00000017,
IT_INDIRECT_BUFFER_CNST_END = 0x00000019,
IT_ATOMIC_GDS = 0x0000001d,
IT_ATOMIC_MEM = 0x0000001e,
IT_OCCLUSION_QUERY = 0x0000001f,
IT_SET_PREDICATION = 0x00000020,
IT_REG_RMW = 0x00000021,
IT_COND_EXEC = 0x00000022,
IT_PRED_EXEC = 0x00000023,
IT_DRAW_INDIRECT = 0x00000024,
IT_DRAW_INDEX_INDIRECT = 0x00000025,
IT_INDEX_BASE = 0x00000026,
IT_DRAW_INDEX_2 = 0x00000027,
IT_CONTEXT_CONTROL = 0x00000028,
IT_INDEX_TYPE = 0x0000002a,
IT_DRAW_INDIRECT_MULTI = 0x0000002c,
IT_DRAW_INDEX_AUTO = 0x0000002d,
IT_NUM_INSTANCES = 0x0000002f,
IT_DRAW_INDEX_MULTI_AUTO = 0x00000030,
IT_INDIRECT_BUFFER_PRIV = 0x00000032,
IT_INDIRECT_BUFFER_CNST = 0x00000033,
IT_COND_INDIRECT_BUFFER_CNST = 0x00000033,
IT_STRMOUT_BUFFER_UPDATE = 0x00000034,
IT_DRAW_INDEX_OFFSET_2 = 0x00000035,
IT_DRAW_PREAMBLE = 0x00000036,
IT_WRITE_DATA = 0x00000037,
IT_DRAW_INDEX_INDIRECT_MULTI = 0x00000038,
IT_MEM_SEMAPHORE = 0x00000039,
IT_DRAW_INDEX_MULTI_INST = 0x0000003a,
IT_COPY_DW = 0x0000003b,
IT_WAIT_REG_MEM = 0x0000003c,
IT_INDIRECT_BUFFER = 0x0000003f,
IT_COND_INDIRECT_BUFFER = 0x0000003f,
IT_COPY_DATA = 0x00000040,
IT_CP_DMA = 0x00000041,
IT_PFP_SYNC_ME = 0x00000042,
IT_SURFACE_SYNC = 0x00000043,
IT_ME_INITIALIZE = 0x00000044,
IT_COND_WRITE = 0x00000045,
IT_EVENT_WRITE = 0x00000046,
IT_EVENT_WRITE_EOP = 0x00000047,
IT_EVENT_WRITE_EOS = 0x00000048,
IT_RELEASE_MEM = 0x00000049,
IT_PREAMBLE_CNTL = 0x0000004a,
IT_DRAW_RESERVED0 = 0x0000004c,
IT_DRAW_RESERVED1 = 0x0000004d,
IT_DRAW_RESERVED2 = 0x0000004e,
IT_DRAW_RESERVED3 = 0x0000004f,
IT_DMA_DATA = 0x00000050,
IT_CONTEXT_REG_RMW = 0x00000051,
IT_GFX_CNTX_UPDATE = 0x00000052,
IT_BLK_CNTX_UPDATE = 0x00000053,
IT_INCR_UPDT_STATE = 0x00000055,
IT_ACQUIRE_MEM = 0x00000058,
IT_REWIND = 0x00000059,
IT_INTERRUPT = 0x0000005a,
IT_GEN_PDEPTE = 0x0000005b,
IT_INDIRECT_BUFFER_PASID = 0x0000005c,
IT_PRIME_UTCL2 = 0x0000005d,
IT_LOAD_UCONFIG_REG = 0x0000005e,
IT_LOAD_SH_REG = 0x0000005f,
IT_LOAD_CONFIG_REG = 0x00000060,
IT_LOAD_CONTEXT_REG = 0x00000061,
IT_LOAD_COMPUTE_STATE = 0x00000062,
IT_LOAD_SH_REG_INDEX = 0x00000063,
IT_SET_CONFIG_REG = 0x00000068,
IT_SET_CONTEXT_REG = 0x00000069,
IT_SET_CONTEXT_REG_INDEX = 0x0000006a,
IT_SET_VGPR_REG_DI_MULTI = 0x00000071,
IT_SET_SH_REG_DI = 0x00000072,
IT_SET_CONTEXT_REG_INDIRECT = 0x00000073,
IT_SET_SH_REG_DI_MULTI = 0x00000074,
IT_GFX_PIPE_LOCK = 0x00000075,
IT_SET_SH_REG = 0x00000076,
IT_SET_SH_REG_OFFSET = 0x00000077,
IT_SET_QUEUE_REG = 0x00000078,
IT_SET_UCONFIG_REG = 0x00000079,
IT_SET_UCONFIG_REG_INDEX = 0x0000007a,
IT_FORWARD_HEADER = 0x0000007c,
IT_SCRATCH_RAM_WRITE = 0x0000007d,
IT_SCRATCH_RAM_READ = 0x0000007e,
IT_LOAD_CONST_RAM = 0x00000080,
IT_WRITE_CONST_RAM = 0x00000081,
IT_DUMP_CONST_RAM = 0x00000083,
IT_INCREMENT_CE_COUNTER = 0x00000084,
IT_INCREMENT_DE_COUNTER = 0x00000085,
IT_WAIT_ON_CE_COUNTER = 0x00000086,
IT_WAIT_ON_DE_COUNTER_DIFF = 0x00000088,
IT_SWITCH_BUFFER = 0x0000008b,
IT_FRAME_CONTROL = 0x00000090,
IT_INDEX_ATTRIBUTES_INDIRECT = 0x00000091,
IT_WAIT_REG_MEM64 = 0x00000093,
IT_COND_PREEMPT = 0x00000094,
IT_HDP_FLUSH = 0x00000095,
IT_INVALIDATE_TLBS = 0x00000098,
IT_DMA_DATA_FILL_MULTI = 0x0000009a,
IT_SET_SH_REG_INDEX = 0x0000009b,
IT_DRAW_INDIRECT_COUNT_MULTI = 0x0000009c,
IT_DRAW_INDEX_INDIRECT_COUNT_MULTI = 0x0000009d,
IT_DUMP_CONST_RAM_OFFSET = 0x0000009e,
IT_LOAD_CONTEXT_REG_INDEX = 0x0000009f,
IT_SET_RESOURCES = 0x000000a0,
IT_MAP_PROCESS = 0x000000a1,
IT_MAP_QUEUES = 0x000000a2,
IT_UNMAP_QUEUES = 0x000000a3,
IT_QUERY_STATUS = 0x000000a4,
IT_RUN_LIST = 0x000000a5,
IT_MAP_PROCESS_VM = 0x000000a6,
IT_DISPATCH_DRAW_PREAMBLE__GFX09 = 0x0000008c,
IT_DISPATCH_DRAW_PREAMBLE_ACE__GFX09 = 0x0000008c,
IT_DISPATCH_DRAW__GFX09 = 0x0000008d,
IT_DISPATCH_DRAW_ACE__GFX09 = 0x0000008d,
IT_GET_LOD_STATS__GFX09 = 0x0000008e,
IT_DRAW_MULTI_PREAMBLE__GFX09 = 0x0000008f,
IT_AQL_PACKET__GFX09 = 0x00000099,
IT_DISPATCH_DRAW_PREAMBLE__GFX101 = 0x0000008c,
IT_DISPATCH_DRAW_PREAMBLE_ACE__GFX101 = 0x0000008c,
IT_DISPATCH_DRAW__GFX101 = 0x0000008d,
IT_DISPATCH_DRAW_ACE__GFX101 = 0x0000008d,
IT_DRAW_MULTI_PREAMBLE__GFX101 = 0x0000008f,
IT_AQL_PACKET__GFX101 = 0x00000099,
// Private IT OP TYPE, used for functions in libGnmDriver
IT_GNM_PRIVATE = 0x000000FF,
} IT_OpCodeType;
typedef enum <byte>
{
OP_PRIV_INITIALIZE_DEFAULT_HARDWARE_STATE = 0x00,
OP_PRIV_INITIALIZE_TO_DEFAULT_CONTEXT_STATE = 0x01,
OP_PRIV_SET_EMBEDDED_VS_SHADER = 0x02,
OP_PRIV_SET_EMBEDDED_PS_SHADER = 0x03,
OP_PRIV_SET_VS_SHADER = 0x04,
OP_PRIV_SET_PS_SHADER = 0x05,
OP_PRIV_SET_ES_SHADER = 0x06,
OP_PRIV_SET_GS_SHADER = 0x07,
OP_PRIV_SET_HS_SHADER = 0x08,
OP_PRIV_SET_LS_SHADER = 0x09,
OP_PRIV_UPDATE_GS_SHADER = 0x0A,
OP_PRIV_UPDATE_HS_SHADER = 0x0B,
OP_PRIV_UPDATE_PS_SHADER = 0x0C,
OP_PRIV_UPDATE_VS_SHADER = 0x0D,
OP_PRIV_SET_VGT_CONTROL = 0x0E,
OP_PRIV_RESET_VGT_CONTROL = 0x0F,
OP_PRIV_DRAW_INDEX = 0x10,
OP_PRIV_DRAW_INDEX_AUTO = 0x11,
OP_PRIV_DRAW_INDEX_INDIRECT = 0x12,
OP_PRIV_DRAW_INDEX_INDIRECT_COUNT_MULTI = 0x13,
OP_PRIV_DRAW_INDEX_MULTI_INSTANCED = 0x14,
OP_PRIV_DRAW_INDEX_OFFSET = 0x15,
OP_PRIV_DRAW_INDIRECT = 0x16,
OP_PRIV_DRAW_INDIRECT_COUNT_MULTI = 0x17,
OP_PRIV_DRAW_OPAQUE_AUTO = 0x18,
OP_PRIV_WAIT_UNTIL_SAFE_FOR_RENDERING = 0x19,
OP_PRIV_PUSH_MARKER = 0x1A,
OP_PRIV_PUSH_COLOR_MARKER = 0x1B,
OP_PRIV_POP_MARKER = 0x1C,
OP_PRIV_SET_MARKER = 0x1D,
OP_PRIV_SET_CS_SHADER = 0x1E,
OP_PRIV_DISPATCH_DIRECT = 0x1F,
OP_PRIV_DISPATCH_INDIRECT = 0x20,
} IT_OpCodePriv;
typedef struct
{
uint32 predicate : 1;
uint32 shaderType : 1; // 0: Graphics, 1: Compute Shader
uint32 reserved : 6;
uint32 opcode : 8; // IT_OpCodeType
uint32 count : 14;
uint32 type : 2; // PM4_TYPE
} PM4_HEADER;
typedef struct
{
SetBackColor(cLtRed);
PM4_HEADER header;
SetBackColor(cNone);
uint32 itBody[header.count + 1];
} PM4_PACKET <read=ReadPM4Packet>;
//---------------------------------------------
string ReadPM4Packet( PM4_PACKET &packet )
{
IT_OpCodeType opType = packet.header.opcode;
string name;
if (opType != IT_GNM_PRIVATE)
{
name = EnumToString(opType);
}
else
{
byte priv = (packet.header.reserved << 2) | (packet.header.shaderType << 1) | packet.header.predicate;
IT_OpCodePriv privType = priv;
name = EnumToString(privType);
}
return name;
}
//---------------------------------------------
LittleEndian();
SetBackColor( cLtGray );
while( !FEof() )
{
PM4_PACKET packet;
}