/** ****************************************************************************** * Xenia : Xbox 360 Emulator Research Project * ****************************************************************************** * Copyright 2013 Ben Vanik. All rights reserved. * * Released under the BSD license - see LICENSE in the root for more details. * ****************************************************************************** */ #ifndef XENIA_GPU_XENOS_PACKETS_H_ #define XENIA_GPU_XENOS_PACKETS_H_ #include namespace xe { namespace gpu { namespace xenos { // Opcodes (IT_OPCODE) for Type-3 commands in the ringbuffer. // https://github.com/freedreno/amd-gpu/blob/master/include/api/gsl_pm4types.h // Not sure if all of these are used. enum Type3Opcode { PM4_ME_INIT = 0x48, // initialize CP's micro-engine PM4_NOP = 0x10, // skip N 32-bit words to get to the next packet PM4_INDIRECT_BUFFER = 0x3f, // indirect buffer dispatch. prefetch parser uses this packet type to determine whether to pre-fetch the IB PM4_INDIRECT_BUFFER_PFD = 0x37, // indirect buffer dispatch. same as IB, but init is pipelined PM4_WAIT_FOR_IDLE = 0x26, // wait for the IDLE state of the engine PM4_WAIT_REG_MEM = 0x3c, // wait until a register or memory location is a specific value PM4_WAIT_REG_EQ = 0x52, // wait until a register location is equal to a specific value PM4_WAT_REG_GTE = 0x53, // wait until a register location is >= a specific value PM4_WAIT_UNTIL_READ = 0x5c, // wait until a read completes PM4_WAIT_IB_PFD_COMPLETE = 0x5d, // wait until all base/size writes from an IB_PFD packet have completed PM4_REG_RMW = 0x21, // register read/modify/write PM4_REG_TO_MEM = 0x3e, // reads register in chip and writes to memory PM4_MEM_WRITE = 0x3d, // write N 32-bit words to memory PM4_MEM_WRITE_CNTR = 0x4f, // write CP_PROG_COUNTER value to memory PM4_COND_EXEC = 0x44, // conditional execution of a sequence of packets PM4_COND_WRITE = 0x45, // conditional write to memory or register PM4_EVENT_WRITE = 0x46, // generate an event that creates a write to memory when completed PM4_EVENT_WRITE_SHD = 0x58, // generate a VS|PS_done event PM4_EVENT_WRITE_CFL = 0x59, // generate a cache flush done event PM4_EVENT_WRITE_ZPD = 0x5b, // generate a z_pass done event PM4_DRAW_INDX = 0x22, // initiate fetch of index buffer and draw PM4_DRAW_INDX_2 = 0x36, // draw using supplied indices in packet PM4_DRAW_INDX_BIN = 0x34, // initiate fetch of index buffer and binIDs and draw PM4_DRAW_INDX_2_BIN = 0x35, // initiate fetch of bin IDs and draw using supplied indices PM4_VIZ_QUERY = 0x23, // begin/end initiator for viz query extent processing PM4_SET_STATE = 0x25, // fetch state sub-blocks and initiate shader code DMAs PM4_SET_CONSTANT = 0x2d, // load constant into chip and to memory PM4_LOAD_ALU_CONSTANT = 0x2f, // load constants from memory PM4_IM_LOAD = 0x27, // load sequencer instruction memory (pointer-based) PM4_IM_LOAD_IMMEDIATE = 0x2b, // load sequencer instruction memory (code embedded in packet) PM4_LOAD_CONSTANT_CONTEXT = 0x2e, // load constants from a location in memory PM4_INVALIDATE_STATE = 0x3b, // selective invalidation of state pointers PM4_SET_SHADER_BASES = 0x4A, // dynamically changes shader instruction memory partition PM4_SET_BIN_BASE_OFFSET = 0x4B, // program an offset that will added to the BIN_BASE value of the 3D_DRAW_INDX_BIN packet PM4_SET_BIN_MASK = 0x50, // sets the 64-bit BIN_MASK register in the PFP PM4_SET_BIN_SELECT = 0x51, // sets the 64-bit BIN_SELECT register in the PFP PM4_CONTEXT_UPDATE = 0x5e, // updates the current context, if needed PM4_INTERRUPT = 0x54, // generate interrupt from the command stream PM4_IM_STORE = 0x2c, // copy sequencer instruction memory to system memory // Tiled rendering: // https://www.google.com/patents/US20060055701 PM4_SET_BIN_MASK_LO = 0x60, PM4_SET_BIN_MASK_HI = 0x61, PM4_SET_BIN_SELECT_LO = 0x62, PM4_SET_BIN_SELECT_HI = 0x63, }; } // namespace xenos } // namespace gpu } // namespace xe #endif // XENIA_GPU_XENOS_PACKETS_H_