blob: 9eaac7ac2687f131087255cf2811a6a3c1524a34 [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_GRAPHICS_DRIVERS_MSD_INTEL_GEN_SRC_INSTRUCTION_DECODER_H_
#define SRC_GRAPHICS_DRIVERS_MSD_INTEL_GEN_SRC_INSTRUCTION_DECODER_H_
#include <stdint.h>
class InstructionDecoder {
public:
enum Id {
NOOP = 0x0,
MI_BATCH_BUFFER_END = 0x0500,
STORE_DWORD_IMM = 0x1000,
STORE_QWORD_IMM = 0x1020,
LOAD_REGISTER_IMM = 0x1100,
_3DSTATE_CLEAR_PARAMS = 0x7804,
_3DSTATE_DEPTH_BUFFER = 0x7805,
_3DSTATE_STENCIL_BUFFER = 0x7806,
_3DSTATE_HIER_DEPTH_BUFFER = 0x7807,
_3DSTATE_VERTEX_BUFFERS = 0x7808,
_3DSTATE_VERTEX_ELEMENTS = 0x7809,
_3DSTATE_MULTISAMPLE = 0x780d,
_3DSTATE_INDEX_BUFFER = 0x780a,
_3DSTATE_VF = 0x780c,
_3DSTATE_SCISSOR_STATE_POINTERS = 0x780f,
_3DSTATE_VS = 0x7810,
_3DSTATE_GS = 0x7811,
_3DSTATE_CLIP = 0x7812,
_3DSTATE_SF = 0x7813,
_3DSTATE_WM = 0x7814,
_3DSTATE_CONSTANT_VS = 0x7815,
_3DSTATE_CONSTANT_GS = 0x7816,
_3DSTATE_CONSTANT_PS = 0x7817,
_3DSTATE_SAMPLE_MASK = 0x7818,
_3DSTATE_CONSTANT_HS = 0x7819,
_3DSTATE_CONSTANT_DS = 0x781a,
_3DSTATE_HS = 0x781b,
_3DSTATE_TE = 0x781c,
_3DSTATE_DS = 0x781d,
_3DSTATE_STREAMOUT = 0x781e,
_3DSTATE_SBE = 0x781f,
_3DSTATE_PS = 0x7820,
_3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP = 0x7821,
_3DSTATE_VIEWPORT_STATE_POINTERS_CC = 0x7823,
_3DSTATE_BINDING_TABLE_POINTERS_VS = 0x7826,
_3DSTATE_BINDING_TABLE_POINTERS_HS = 0x7827,
_3DSTATE_BINDING_TABLE_POINTERS_DS = 0x7828,
_3DSTATE_BINDING_TABLE_POINTERS_GS = 0x7829,
_3DSTATE_BINDING_TABLE_POINTERS_PS = 0x782a,
_3DSTATE_SAMPLER_STATE_POINTERS_PS = 0x782f,
_3DSTATE_CC_STATE_POINTERS = 0x780e,
_3DSTATE_BLEND_STATE_POINTERS = 0x7824,
_3DSTATE_URB_VS = 0x7830,
_3DSTATE_URB_HS = 0x7831,
_3DSTATE_URB_DS = 0x7832,
_3DSTATE_URB_GS = 0x7833,
_3DSTATE_VF_INSTANCING = 0x7849,
_3DSTATE_VF_SGVS = 0x784a,
_3DSTATE_VF_TOPOLOGY = 0x784b,
_3DSTATE_PS_BLEND = 0x784d,
_3DSTATE_WM_DEPTH_STENCIL = 0x784e,
_3DSTATE_PS_EXTRA = 0x784f,
_3DSTATE_RASTER = 0x7850,
_3DSTATE_SBE_SWIZ = 0x7851,
_3DSTATE_WM_HZ_OP = 0x7852,
_3DSTATE_PUSH_CONSTANT_ALLOC_VS = 0x7912,
_3DSTATE_PUSH_CONSTANT_ALLOC_HS = 0x7913,
_3DSTATE_PUSH_CONSTANT_ALLOC_DS = 0x7914,
_3DSTATE_PUSH_CONSTANT_ALLOC_GS = 0x7915,
_3DSTATE_PUSH_CONSTANT_ALLOC_PS = 0x7916,
PIPE_CONTROL = 0x7a00,
_3DPRIMITIVE = 0x7b00,
STATE_BASE_ADDRESS = 0x6101,
PIPELINE_SELECT = 0x6904,
};
static const char* name(Id id) {
switch (id) {
case _3DSTATE_VERTEX_BUFFERS:
return "3DSTATE_VERTEX_BUFFERS";
case _3DSTATE_VERTEX_ELEMENTS:
return "3DSTATE_VERTEX_ELEMENTS";
case LOAD_REGISTER_IMM:
return "LOAD_REGISTER_IMM";
case STORE_DWORD_IMM:
return "STORE_DWORD_IMM";
case STORE_QWORD_IMM:
return "STORE_QWORD_IMM";
case PIPE_CONTROL:
return "PIPE_CONTROL";
case PIPELINE_SELECT:
return "PIPELINE_SELECT";
case STATE_BASE_ADDRESS:
return "STATE_BASE_ADDRESS";
case _3DSTATE_VF_SGVS:
return "3DSTATE_VF_SGVS";
case _3DSTATE_VF_INSTANCING:
return "3DSTATE_VF_INSTANCING";
case _3DSTATE_VF_TOPOLOGY:
return "3DSTATE_VF_TOPOLOGY";
case _3DSTATE_URB_VS:
return "3DSTATE_URB_VS";
case _3DSTATE_URB_HS:
return "3DSTATE_URB_HS";
case _3DSTATE_URB_DS:
return "3DSTATE_URB_DS";
case _3DSTATE_URB_GS:
return "3DSTATE_URB_GS";
case _3DSTATE_BLEND_STATE_POINTERS:
return "3DSTATE_BLEND_STATE_POINTERS";
case _3DSTATE_PS_BLEND:
return "3DSTATE_PS_BLEND";
case _3DSTATE_CC_STATE_POINTERS:
return "3DSTATE_CC_STATE_POINTERS";
case _3DSTATE_WM_DEPTH_STENCIL:
return "3DSTATE_WM_DEPTH_STENCIL";
case _3DSTATE_CONSTANT_VS:
return "3DSTATE_CONSTANT_VS";
case _3DSTATE_CONSTANT_HS:
return "3DSTATE_CONSTANT_HS";
case _3DSTATE_CONSTANT_DS:
return "3DSTATE_CONSTANT_DS";
case _3DSTATE_CONSTANT_GS:
return "3DSTATE_CONSTANT_GS";
case _3DSTATE_CONSTANT_PS:
return "3DSTATE_CONSTANT_PS";
case _3DSTATE_BINDING_TABLE_POINTERS_VS:
return "3DSTATE_BINDING_TABLE_POINTERS_VS";
case _3DSTATE_BINDING_TABLE_POINTERS_HS:
return "3DSTATE_BINDING_TABLE_POINTERS_HS";
case _3DSTATE_BINDING_TABLE_POINTERS_DS:
return "3DSTATE_BINDING_TABLE_POINTERS_DS";
case _3DSTATE_BINDING_TABLE_POINTERS_GS:
return "3DSTATE_BINDING_TABLE_POINTERS_GS";
case _3DSTATE_BINDING_TABLE_POINTERS_PS:
return "3DSTATE_BINDING_TABLE_POINTERS_PS";
case _3DSTATE_SAMPLER_STATE_POINTERS_PS:
return "3DSTATE_SAMPLER_STATE_POINTERS_PS";
case _3DSTATE_MULTISAMPLE:
return "3DSTATE_MULTISAMPLE";
case _3DSTATE_SAMPLE_MASK:
return "3DSTATE_SAMPLE_MASK";
case _3DSTATE_VS:
return "3DSTATE_VS";
case _3DSTATE_HS:
return "3DSTATE_HS";
case _3DSTATE_TE:
return "3DSTATE_TE";
case _3DSTATE_DS:
return "3DSTATE_DS";
case _3DSTATE_STREAMOUT:
return "3DSTATE_STREAMOUT";
case _3DSTATE_GS:
return "3DSTATE_GS";
case _3DSTATE_CLIP:
return "3DSTATE_CLIP";
case _3DSTATE_SF:
return "3DSTATE_SF";
case _3DSTATE_RASTER:
return "3DSTATE_RASTER";
case _3DSTATE_SBE:
return "3DSTATE_SBE";
case _3DSTATE_WM:
return "3DSTATE_WM";
case _3DSTATE_PS:
return "3DSTATE_PS";
case _3DSTATE_PS_EXTRA:
return "3DSTATE_PS_EXTRA";
case _3DSTATE_VIEWPORT_STATE_POINTERS_CC:
return "3DSTATE_VIEWPORT_STATE_POINTERS_CC";
case _3DSTATE_DEPTH_BUFFER:
return "3DSTATE_DEPTH_BUFFER";
case _3DSTATE_HIER_DEPTH_BUFFER:
return "3DSTATE_HIER_DEPTH_BUFFER";
case _3DSTATE_STENCIL_BUFFER:
return "3DSTATE_STENCIL_BUFFER";
case _3DSTATE_CLEAR_PARAMS:
return "3DSTATE_CLEAR_PARAMS";
case _3DPRIMITIVE:
return "3DPRIMITIVE";
case _3DSTATE_INDEX_BUFFER:
return "3DSTATE_INDEX_BUFFER";
case _3DSTATE_SBE_SWIZ:
return "3DSTATE_SBE_SWIZ";
case _3DSTATE_PUSH_CONSTANT_ALLOC_VS:
return "3DSTATE_PUSH_CONSTANT_ALLOC_VS";
case _3DSTATE_PUSH_CONSTANT_ALLOC_HS:
return "3DSTATE_PUSH_CONSTANT_ALLOC_HS";
case _3DSTATE_PUSH_CONSTANT_ALLOC_DS:
return "3DSTATE_PUSH_CONSTANT_ALLOC_DS";
case _3DSTATE_PUSH_CONSTANT_ALLOC_GS:
return "3DSTATE_PUSH_CONSTANT_ALLOC_GS";
case _3DSTATE_PUSH_CONSTANT_ALLOC_PS:
return "3DSTATE_PUSH_CONSTANT_ALLOC_PS";
case _3DSTATE_WM_HZ_OP:
return "3DSTATE_WM_HZ_OP";
case _3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP:
return "3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP";
case _3DSTATE_SCISSOR_STATE_POINTERS:
return "3DSTATE_SCISSOR_STATE_POINTERS";
case _3DSTATE_VF:
return "3DSTATE_VF";
case MI_BATCH_BUFFER_END:
return "MI_BATCH_BUFFER_END";
case NOOP:
return "NOOP";
}
return "UNKNOWN";
}
static bool Decode(uint32_t dword, Id* id_out, uint32_t* dword_count_out) {
if (dword == 0) {
*id_out = NOOP;
*dword_count_out = 1;
return true;
}
uint16_t id = dword >> 16;
switch (id) {
case PIPELINE_SELECT:
case MI_BATCH_BUFFER_END:
*dword_count_out = 1;
break;
case LOAD_REGISTER_IMM:
*dword_count_out = 3;
break;
case _3DSTATE_BLEND_STATE_POINTERS:
case _3DSTATE_CC_STATE_POINTERS:
case _3DSTATE_VIEWPORT_STATE_POINTERS_CC:
*dword_count_out = 2;
break;
case _3DSTATE_VF:
case _3DSTATE_SCISSOR_STATE_POINTERS:
case _3DSTATE_VIEWPORT_STATE_POINTERS_SF_CLIP:
case _3DSTATE_PUSH_CONSTANT_ALLOC_PS:
case _3DSTATE_PUSH_CONSTANT_ALLOC_GS:
case _3DSTATE_PUSH_CONSTANT_ALLOC_DS:
case _3DSTATE_PUSH_CONSTANT_ALLOC_HS:
case _3DSTATE_PUSH_CONSTANT_ALLOC_VS:
case _3DSTATE_SBE_SWIZ:
case _3DSTATE_INDEX_BUFFER:
case _3DPRIMITIVE:
case _3DSTATE_CLEAR_PARAMS:
case _3DSTATE_STENCIL_BUFFER:
case _3DSTATE_HIER_DEPTH_BUFFER:
case _3DSTATE_DEPTH_BUFFER:
case _3DSTATE_PS_EXTRA:
case _3DSTATE_PS:
case _3DSTATE_WM:
case _3DSTATE_SBE:
case _3DSTATE_RASTER:
case _3DSTATE_SF:
case _3DSTATE_CLIP:
case _3DSTATE_GS:
case _3DSTATE_STREAMOUT:
case _3DSTATE_DS:
case _3DSTATE_TE:
case _3DSTATE_VS:
case _3DSTATE_HS:
case _3DSTATE_SAMPLE_MASK:
case _3DSTATE_MULTISAMPLE:
case _3DSTATE_SAMPLER_STATE_POINTERS_PS:
case _3DSTATE_BINDING_TABLE_POINTERS_PS:
case _3DSTATE_BINDING_TABLE_POINTERS_GS:
case _3DSTATE_BINDING_TABLE_POINTERS_DS:
case _3DSTATE_BINDING_TABLE_POINTERS_HS:
case _3DSTATE_BINDING_TABLE_POINTERS_VS:
case _3DSTATE_CONSTANT_PS:
case _3DSTATE_CONSTANT_GS:
case _3DSTATE_CONSTANT_DS:
case _3DSTATE_CONSTANT_HS:
case _3DSTATE_CONSTANT_VS:
case _3DSTATE_WM_DEPTH_STENCIL:
case _3DSTATE_PS_BLEND:
case _3DSTATE_URB_GS:
case _3DSTATE_URB_DS:
case _3DSTATE_URB_HS:
case _3DSTATE_URB_VS:
case _3DSTATE_VF_TOPOLOGY:
case _3DSTATE_VF_INSTANCING:
case _3DSTATE_VF_SGVS:
case _3DSTATE_VERTEX_BUFFERS:
case _3DSTATE_VERTEX_ELEMENTS:
case _3DSTATE_WM_HZ_OP:
case PIPE_CONTROL:
case STATE_BASE_ADDRESS:
case STORE_DWORD_IMM:
case STORE_QWORD_IMM:
*dword_count_out = (dword & 0xFF) + 2;
break;
default:
return false;
}
*id_out = static_cast<Id>(id);
return true;
}
};
#endif // SRC_GRAPHICS_DRIVERS_MSD_INTEL_GEN_SRC_INSTRUCTION_DECODER_H_