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