blob: e6731a207d3bda509c161543b2b917f071a1771c [file] [log] [blame]
/*
* Copyright © 2024 Intel Corporation
* SPDX-License-Identifier: MIT
*/
#pragma once
#ifdef __cplusplus
extern "C" {
#endif
enum elk_opcode {
/* These are the actual hardware instructions. */
ELK_OPCODE_ILLEGAL,
ELK_OPCODE_MOV,
ELK_OPCODE_SEL,
ELK_OPCODE_MOVI, /**< G45+ */
ELK_OPCODE_NOT,
ELK_OPCODE_AND,
ELK_OPCODE_OR,
ELK_OPCODE_XOR,
ELK_OPCODE_SHR,
ELK_OPCODE_SHL,
ELK_OPCODE_DIM, /**< Gfx7.5 only */
ELK_OPCODE_SMOV, /**< Gfx8+ */
ELK_OPCODE_ASR,
ELK_OPCODE_CMP,
ELK_OPCODE_CMPN,
ELK_OPCODE_CSEL, /**< Gfx8+ */
ELK_OPCODE_F32TO16, /**< Gfx7 only */
ELK_OPCODE_F16TO32, /**< Gfx7 only */
ELK_OPCODE_BFREV, /**< Gfx7+ */
ELK_OPCODE_BFE, /**< Gfx7+ */
ELK_OPCODE_BFI1, /**< Gfx7+ */
ELK_OPCODE_BFI2, /**< Gfx7+ */
ELK_OPCODE_JMPI,
ELK_OPCODE_BRD, /**< Gfx7+ */
ELK_OPCODE_IF,
ELK_OPCODE_IFF, /**< Pre-Gfx6 */
ELK_OPCODE_BRC, /**< Gfx7+ */
ELK_OPCODE_ELSE,
ELK_OPCODE_ENDIF,
ELK_OPCODE_DO, /**< Pre-Gfx6 */
ELK_OPCODE_CASE, /**< Gfx6 only */
ELK_OPCODE_WHILE,
ELK_OPCODE_BREAK,
ELK_OPCODE_CONTINUE,
ELK_OPCODE_HALT,
ELK_OPCODE_CALLA, /**< Gfx7.5+ */
ELK_OPCODE_MSAVE, /**< Pre-Gfx6 */
ELK_OPCODE_CALL, /**< Gfx6+ */
ELK_OPCODE_MREST, /**< Pre-Gfx6 */
ELK_OPCODE_RET, /**< Gfx6+ */
ELK_OPCODE_PUSH, /**< Pre-Gfx6 */
ELK_OPCODE_FORK, /**< Gfx6 only */
ELK_OPCODE_GOTO, /**< Gfx8+ */
ELK_OPCODE_POP, /**< Pre-Gfx6 */
ELK_OPCODE_WAIT,
ELK_OPCODE_SEND,
ELK_OPCODE_SENDC,
ELK_OPCODE_MATH, /**< Gfx6+ */
ELK_OPCODE_ADD,
ELK_OPCODE_MUL,
ELK_OPCODE_AVG,
ELK_OPCODE_FRC,
ELK_OPCODE_RNDU,
ELK_OPCODE_RNDD,
ELK_OPCODE_RNDE,
ELK_OPCODE_RNDZ,
ELK_OPCODE_MAC,
ELK_OPCODE_MACH,
ELK_OPCODE_LZD,
ELK_OPCODE_FBH, /**< Gfx7+ */
ELK_OPCODE_FBL, /**< Gfx7+ */
ELK_OPCODE_CBIT, /**< Gfx7+ */
ELK_OPCODE_ADDC, /**< Gfx7+ */
ELK_OPCODE_SUBB, /**< Gfx7+ */
ELK_OPCODE_SAD2,
ELK_OPCODE_SADA2,
ELK_OPCODE_DP4,
ELK_OPCODE_DPH,
ELK_OPCODE_DP3,
ELK_OPCODE_DP2,
ELK_OPCODE_LINE,
ELK_OPCODE_PLN, /**< G45+ */
ELK_OPCODE_MAD, /**< Gfx6+ */
ELK_OPCODE_LRP, /**< Gfx6+ */
ELK_OPCODE_MADM, /**< Gfx8+ */
ELK_OPCODE_NENOP, /**< G45 only */
ELK_OPCODE_NOP,
NUM_ELK_OPCODES,
/* These are compiler backend opcodes that get translated into other
* instructions.
*/
ELK_FS_OPCODE_FB_WRITE = NUM_ELK_OPCODES,
/**
* Same as ELK_FS_OPCODE_FB_WRITE but expects its arguments separately as
* individual sources instead of as a single payload blob. The
* position/ordering of the arguments are defined by the enum
* fb_write_logical_srcs.
*/
ELK_FS_OPCODE_FB_WRITE_LOGICAL,
ELK_FS_OPCODE_REP_FB_WRITE,
ELK_SHADER_OPCODE_RCP,
ELK_SHADER_OPCODE_RSQ,
ELK_SHADER_OPCODE_SQRT,
ELK_SHADER_OPCODE_EXP2,
ELK_SHADER_OPCODE_LOG2,
ELK_SHADER_OPCODE_POW,
ELK_SHADER_OPCODE_INT_QUOTIENT,
ELK_SHADER_OPCODE_INT_REMAINDER,
ELK_SHADER_OPCODE_SIN,
ELK_SHADER_OPCODE_COS,
/**
* A generic "send" opcode. The first source is the descriptor and
* the second source is the message payload.
*/
ELK_SHADER_OPCODE_SEND,
/**
* An "undefined" write which does nothing but indicates to liveness that
* we don't care about any values in the register which predate this
* instruction. Used to prevent partial writes from causing issues with
* live ranges.
*/
ELK_SHADER_OPCODE_UNDEF,
/**
* Texture sampling opcodes.
*
* LOGICAL opcodes are eventually translated to the matching non-LOGICAL
* opcode but instead of taking a single payload blob they expect their
* arguments separately as individual sources. The position/ordering of the
* arguments are defined by the enum tex_logical_srcs.
*/
ELK_SHADER_OPCODE_TEX,
ELK_SHADER_OPCODE_TEX_LOGICAL,
ELK_SHADER_OPCODE_TXD,
ELK_SHADER_OPCODE_TXD_LOGICAL,
ELK_SHADER_OPCODE_TXF,
ELK_SHADER_OPCODE_TXF_LOGICAL,
ELK_SHADER_OPCODE_TXF_LZ,
ELK_SHADER_OPCODE_TXL,
ELK_SHADER_OPCODE_TXL_LOGICAL,
ELK_SHADER_OPCODE_TXL_LZ,
ELK_SHADER_OPCODE_TXS,
ELK_SHADER_OPCODE_TXS_LOGICAL,
ELK_FS_OPCODE_TXB,
ELK_FS_OPCODE_TXB_LOGICAL,
ELK_SHADER_OPCODE_TXF_CMS,
ELK_SHADER_OPCODE_TXF_CMS_LOGICAL,
ELK_SHADER_OPCODE_TXF_CMS_W,
ELK_SHADER_OPCODE_TXF_CMS_W_LOGICAL,
ELK_SHADER_OPCODE_TXF_CMS_W_GFX12_LOGICAL,
ELK_SHADER_OPCODE_TXF_UMS,
ELK_SHADER_OPCODE_TXF_UMS_LOGICAL,
ELK_SHADER_OPCODE_TXF_MCS,
ELK_SHADER_OPCODE_TXF_MCS_LOGICAL,
ELK_SHADER_OPCODE_LOD,
ELK_SHADER_OPCODE_LOD_LOGICAL,
ELK_SHADER_OPCODE_TG4,
ELK_SHADER_OPCODE_TG4_LOGICAL,
ELK_SHADER_OPCODE_TG4_OFFSET,
ELK_SHADER_OPCODE_TG4_OFFSET_LOGICAL,
ELK_SHADER_OPCODE_SAMPLEINFO,
ELK_SHADER_OPCODE_SAMPLEINFO_LOGICAL,
ELK_SHADER_OPCODE_IMAGE_SIZE_LOGICAL,
/**
* Combines multiple sources of size 1 into a larger virtual GRF.
* For example, parameters for a send-from-GRF message. Or, updating
* channels of a size 4 VGRF used to store vec4s such as texturing results.
*
* This will be lowered into MOVs from each source to consecutive offsets
* of the destination VGRF.
*
* src[0] may be BAD_FILE. If so, the lowering pass skips emitting the MOV,
* but still reserves the first channel of the destination VGRF. This can be
* used to reserve space for, say, a message header set up by the generators.
*/
ELK_SHADER_OPCODE_LOAD_PAYLOAD,
/**
* Packs a number of sources into a single value. Unlike LOAD_PAYLOAD, this
* acts intra-channel, obtaining the final value for each channel by
* combining the sources values for the same channel, the first source
* occupying the lowest bits and the last source occupying the highest
* bits.
*/
ELK_FS_OPCODE_PACK,
/**
* Typed and untyped surface access opcodes.
*
* LOGICAL opcodes are eventually translated to the matching non-LOGICAL
* opcode but instead of taking a single payload blob they expect their
* arguments separately as individual sources:
*
* Source 0: [required] Surface coordinates.
* Source 1: [optional] Operation source.
* Source 2: [required] Surface index.
* Source 3: [required] Number of coordinate components (as UD immediate).
* Source 4: [required] Opcode-specific control immediate, same as source 2
* of the matching non-LOGICAL opcode.
*/
ELK_VEC4_OPCODE_UNTYPED_ATOMIC,
ELK_SHADER_OPCODE_UNTYPED_ATOMIC_LOGICAL,
ELK_VEC4_OPCODE_UNTYPED_SURFACE_READ,
ELK_SHADER_OPCODE_UNTYPED_SURFACE_READ_LOGICAL,
ELK_VEC4_OPCODE_UNTYPED_SURFACE_WRITE,
ELK_SHADER_OPCODE_UNTYPED_SURFACE_WRITE_LOGICAL,
ELK_SHADER_OPCODE_UNALIGNED_OWORD_BLOCK_READ_LOGICAL,
ELK_SHADER_OPCODE_OWORD_BLOCK_WRITE_LOGICAL,
/**
* Untyped A64 surface access opcodes.
*
* Source 0: 64-bit address
* Source 1: Operational source
* Source 2: [required] Opcode-specific control immediate, same as source 2
* of the matching non-LOGICAL opcode.
*/
ELK_SHADER_OPCODE_A64_UNTYPED_READ_LOGICAL,
ELK_SHADER_OPCODE_A64_UNTYPED_WRITE_LOGICAL,
ELK_SHADER_OPCODE_A64_BYTE_SCATTERED_READ_LOGICAL,
ELK_SHADER_OPCODE_A64_BYTE_SCATTERED_WRITE_LOGICAL,
ELK_SHADER_OPCODE_A64_OWORD_BLOCK_READ_LOGICAL,
ELK_SHADER_OPCODE_A64_UNALIGNED_OWORD_BLOCK_READ_LOGICAL,
ELK_SHADER_OPCODE_A64_OWORD_BLOCK_WRITE_LOGICAL,
ELK_SHADER_OPCODE_A64_UNTYPED_ATOMIC_LOGICAL,
ELK_SHADER_OPCODE_TYPED_ATOMIC_LOGICAL,
ELK_SHADER_OPCODE_TYPED_SURFACE_READ_LOGICAL,
ELK_SHADER_OPCODE_TYPED_SURFACE_WRITE_LOGICAL,
ELK_SHADER_OPCODE_RND_MODE,
ELK_SHADER_OPCODE_FLOAT_CONTROL_MODE,
/**
* Byte scattered write/read opcodes.
*
* LOGICAL opcodes are eventually translated to the matching non-LOGICAL
* opcode, but instead of taking a single payload blog they expect their
* arguments separately as individual sources, like untyped write/read.
*/
ELK_SHADER_OPCODE_BYTE_SCATTERED_READ_LOGICAL,
ELK_SHADER_OPCODE_BYTE_SCATTERED_WRITE_LOGICAL,
ELK_SHADER_OPCODE_DWORD_SCATTERED_READ_LOGICAL,
ELK_SHADER_OPCODE_DWORD_SCATTERED_WRITE_LOGICAL,
/**
* Memory fence messages.
*
* Source 0: Must be register g0, used as header.
* Source 1: Immediate bool to indicate whether control is returned to the
* thread only after the fence has been honored.
* Source 2: Immediate byte indicating which memory to fence. Zero means
* global memory; GFX7_BTI_SLM means SLM (for Gfx11+ only).
*
* Vec4 backend only uses Source 0.
*/
ELK_SHADER_OPCODE_MEMORY_FENCE,
/**
* Scheduling-only fence.
*
* Sources can be used to force a stall until the registers in those are
* available. This might generate MOVs or SYNC_NOPs (Gfx12+).
*/
ELK_FS_OPCODE_SCHEDULING_FENCE,
ELK_SHADER_OPCODE_GFX4_SCRATCH_READ,
ELK_SHADER_OPCODE_GFX4_SCRATCH_WRITE,
ELK_SHADER_OPCODE_GFX7_SCRATCH_READ,
ELK_SHADER_OPCODE_SCRATCH_HEADER,
/**
* Gfx8+ SIMD8 URB messages.
*/
ELK_SHADER_OPCODE_URB_READ_LOGICAL,
ELK_SHADER_OPCODE_URB_WRITE_LOGICAL,
/**
* Return the index of the first enabled live channel and assign it to
* to the first component of the destination. Frequently used as input
* for the BROADCAST pseudo-opcode.
*/
ELK_SHADER_OPCODE_FIND_LIVE_CHANNEL,
/**
* Return the index of the last enabled live channel and assign it to
* the first component of the destination.
*/
ELK_SHADER_OPCODE_FIND_LAST_LIVE_CHANNEL,
/**
* Return the current execution mask in the specified flag subregister.
* Can be CSE'ed more easily than a plain MOV from the ce0 ARF register.
*/
ELK_FS_OPCODE_LOAD_LIVE_CHANNELS,
/**
* Pick the channel from its first source register given by the index
* specified as second source. Useful for variable indexing of surfaces.
*
* Note that because the result of this instruction is by definition
* uniform and it can always be splatted to multiple channels using a
* scalar regioning mode, only the first channel of the destination region
* is guaranteed to be updated, which implies that BROADCAST instructions
* should usually be marked force_writemask_all.
*/
ELK_SHADER_OPCODE_BROADCAST,
/* Pick the channel from its first source register given by the index
* specified as second source.
*
* This is similar to the BROADCAST instruction except that it takes a
* dynamic index and potentially puts a different value in each output
* channel.
*/
ELK_SHADER_OPCODE_SHUFFLE,
/* Select between src0 and src1 based on channel enables.
*
* This instruction copies src0 into the enabled channels of the
* destination and copies src1 into the disabled channels.
*/
ELK_SHADER_OPCODE_SEL_EXEC,
/* This turns into an align16 mov from src0 to dst with a swizzle
* provided as an immediate in src1.
*/
ELK_SHADER_OPCODE_QUAD_SWIZZLE,
/* Take every Nth element in src0 and broadcast it to the group of N
* channels in which it lives in the destination. The offset within the
* cluster is given by src1 and the cluster size is given by src2.
*/
ELK_SHADER_OPCODE_CLUSTER_BROADCAST,
ELK_SHADER_OPCODE_GET_BUFFER_SIZE,
ELK_SHADER_OPCODE_INTERLOCK,
/** Target for a HALT
*
* All HALT instructions in a shader must target the same jump point and
* that point is denoted by a HALT_TARGET instruction.
*/
ELK_SHADER_OPCODE_HALT_TARGET,
ELK_VEC4_OPCODE_MOV_BYTES,
ELK_VEC4_OPCODE_PACK_BYTES,
ELK_VEC4_OPCODE_UNPACK_UNIFORM,
ELK_VEC4_OPCODE_DOUBLE_TO_F32,
ELK_VEC4_OPCODE_DOUBLE_TO_D32,
ELK_VEC4_OPCODE_DOUBLE_TO_U32,
ELK_VEC4_OPCODE_TO_DOUBLE,
ELK_VEC4_OPCODE_PICK_LOW_32BIT,
ELK_VEC4_OPCODE_PICK_HIGH_32BIT,
ELK_VEC4_OPCODE_SET_LOW_32BIT,
ELK_VEC4_OPCODE_SET_HIGH_32BIT,
ELK_VEC4_OPCODE_MOV_FOR_SCRATCH,
ELK_VEC4_OPCODE_ZERO_OOB_PUSH_REGS,
ELK_FS_OPCODE_DDX_COARSE,
ELK_FS_OPCODE_DDX_FINE,
/**
* Compute dFdy(), dFdyCoarse(), or dFdyFine().
*/
ELK_FS_OPCODE_DDY_COARSE,
ELK_FS_OPCODE_DDY_FINE,
ELK_FS_OPCODE_LINTERP,
ELK_FS_OPCODE_PIXEL_X,
ELK_FS_OPCODE_PIXEL_Y,
ELK_FS_OPCODE_UNIFORM_PULL_CONSTANT_LOAD,
ELK_FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_GFX4,
ELK_FS_OPCODE_VARYING_PULL_CONSTANT_LOAD_LOGICAL,
ELK_FS_OPCODE_SET_SAMPLE_ID,
ELK_FS_OPCODE_PACK_HALF_2x16_SPLIT,
ELK_FS_OPCODE_INTERPOLATE_AT_SAMPLE,
ELK_FS_OPCODE_INTERPOLATE_AT_SHARED_OFFSET,
ELK_FS_OPCODE_INTERPOLATE_AT_PER_SLOT_OFFSET,
ELK_VEC4_VS_OPCODE_URB_WRITE,
ELK_VS_OPCODE_PULL_CONSTANT_LOAD,
ELK_VS_OPCODE_PULL_CONSTANT_LOAD_GFX7,
ELK_VS_OPCODE_UNPACK_FLAGS_SIMD4X2,
/**
* Write geometry shader output data to the URB.
*
* Unlike ELK_VEC4_VS_OPCODE_URB_WRITE, this opcode doesn't do an implied move from
* R0 to the first MRF. This allows the geometry shader to override the
* "Slot {0,1} Offset" fields in the message header.
*/
ELK_VEC4_GS_OPCODE_URB_WRITE,
/**
* Write geometry shader output data to the URB and request a new URB
* handle (gfx6).
*
* This opcode doesn't do an implied move from R0 to the first MRF.
*/
ELK_VEC4_GS_OPCODE_URB_WRITE_ALLOCATE,
/**
* Terminate the geometry shader thread by doing an empty URB write.
*
* This opcode doesn't do an implied move from R0 to the first MRF. This
* allows the geometry shader to override the "GS Number of Output Vertices
* for Slot {0,1}" fields in the message header.
*/
ELK_GS_OPCODE_THREAD_END,
/**
* Set the "Slot {0,1} Offset" fields of a URB_WRITE message header.
*
* - dst is the MRF containing the message header.
*
* - src0.x indicates which portion of the URB should be written to (e.g. a
* vertex number)
*
* - src1 is an immediate multiplier which will be applied to src0
* (e.g. the size of a single vertex in the URB).
*
* Note: the hardware will apply this offset *in addition to* the offset in
* vec4_instruction::offset.
*/
ELK_GS_OPCODE_SET_WRITE_OFFSET,
/**
* Set the "GS Number of Output Vertices for Slot {0,1}" fields of a
* URB_WRITE message header.
*
* - dst is the MRF containing the message header.
*
* - src0.x is the vertex count. The upper 16 bits will be ignored.
*/
ELK_GS_OPCODE_SET_VERTEX_COUNT,
/**
* Set DWORD 2 of dst to the value in src.
*/
ELK_GS_OPCODE_SET_DWORD_2,
/**
* Prepare the dst register for storage in the "Channel Mask" fields of a
* URB_WRITE message header.
*
* DWORD 4 of dst is shifted left by 4 bits, so that later,
* ELK_GS_OPCODE_SET_CHANNEL_MASKS can OR DWORDs 0 and 4 together to form the
* final channel mask.
*
* Note: since ELK_GS_OPCODE_SET_CHANNEL_MASKS ORs DWORDs 0 and 4 together to
* form the final channel mask, DWORDs 0 and 4 of the dst register must not
* have any extraneous bits set prior to execution of this opcode (that is,
* they should be in the range 0x0 to 0xf).
*/
ELK_GS_OPCODE_PREPARE_CHANNEL_MASKS,
/**
* Set the "Channel Mask" fields of a URB_WRITE message header.
*
* - dst is the MRF containing the message header.
*
* - src.x is the channel mask, as prepared by
* ELK_GS_OPCODE_PREPARE_CHANNEL_MASKS. DWORDs 0 and 4 are OR'ed together to
* form the final channel mask.
*/
ELK_GS_OPCODE_SET_CHANNEL_MASKS,
/**
* Get the "Instance ID" fields from the payload.
*
* - dst is the GRF for gl_InvocationID.
*/
ELK_GS_OPCODE_GET_INSTANCE_ID,
/**
* Send a FF_SYNC message to allocate initial URB handles (gfx6).
*
* - dst will be used as the writeback register for the FF_SYNC operation.
*
* - src0 is the number of primitives written.
*
* - src1 is the value to hold in M0.0: number of SO vertices to write
* and number of SO primitives needed. Its value will be overwritten
* with the SVBI values if transform feedback is enabled.
*
* Note: This opcode uses an implicit MRF register for the ff_sync message
* header, so the caller is expected to set inst->base_mrf and initialize
* that MRF register to r0. This opcode will also write to this MRF register
* to include the allocated URB handle so it can then be reused directly as
* the header in the URB write operation we are allocating the handle for.
*/
ELK_GS_OPCODE_FF_SYNC,
/**
* Move r0.1 (which holds PrimitiveID information in gfx6) to a separate
* register.
*
* - dst is the GRF where PrimitiveID information will be moved.
*/
ELK_GS_OPCODE_SET_PRIMITIVE_ID,
/**
* Write transform feedback data to the SVB by sending a SVB WRITE message.
* Used in gfx6.
*
* - dst is the MRF register containing the message header.
*
* - src0 is the register where the vertex data is going to be copied from.
*
* - src1 is the destination register when write commit occurs.
*/
ELK_GS_OPCODE_SVB_WRITE,
/**
* Set destination index in the SVB write message payload (M0.5). Used
* in gfx6 for transform feedback.
*
* - dst is the header to save the destination indices for SVB WRITE.
* - src is the register that holds the destination indices value.
*/
ELK_GS_OPCODE_SVB_SET_DST_INDEX,
/**
* Prepare Mx.0 subregister for being used in the FF_SYNC message header.
* Used in gfx6 for transform feedback.
*
* - dst will hold the register with the final Mx.0 value.
*
* - src0 has the number of vertices emitted in SO (NumSOVertsToWrite)
*
* - src1 has the number of needed primitives for SO (NumSOPrimsNeeded)
*
* - src2 is the value to hold in M0: number of SO vertices to write
* and number of SO primitives needed.
*/
ELK_GS_OPCODE_FF_SYNC_SET_PRIMITIVES,
/**
* Terminate the compute shader.
*/
ELK_CS_OPCODE_CS_TERMINATE,
/**
* GLSL barrier()
*/
ELK_SHADER_OPCODE_BARRIER,
/**
* Calculate the high 32-bits of a 32x32 multiply.
*/
ELK_SHADER_OPCODE_MULH,
/** Signed subtraction with saturation. */
ELK_SHADER_OPCODE_ISUB_SAT,
/** Unsigned subtraction with saturation. */
ELK_SHADER_OPCODE_USUB_SAT,
/**
* A MOV that uses VxH indirect addressing.
*
* Source 0: A register to start from (HW_REG).
* Source 1: An indirect offset (in bytes, UD GRF).
* Source 2: The length of the region that could be accessed (in bytes,
* UD immediate).
*/
ELK_SHADER_OPCODE_MOV_INDIRECT,
/** Fills out a relocatable immediate */
ELK_SHADER_OPCODE_MOV_RELOC_IMM,
ELK_VEC4_OPCODE_URB_READ,
ELK_TCS_OPCODE_GET_INSTANCE_ID,
ELK_VEC4_TCS_OPCODE_URB_WRITE,
ELK_VEC4_TCS_OPCODE_SET_INPUT_URB_OFFSETS,
ELK_VEC4_TCS_OPCODE_SET_OUTPUT_URB_OFFSETS,
ELK_TCS_OPCODE_GET_PRIMITIVE_ID,
ELK_TCS_OPCODE_CREATE_BARRIER_HEADER,
ELK_TCS_OPCODE_SRC0_010_IS_ZERO,
ELK_TCS_OPCODE_RELEASE_INPUT,
ELK_TCS_OPCODE_THREAD_END,
ELK_TES_OPCODE_GET_PRIMITIVE_ID,
ELK_TES_OPCODE_CREATE_INPUT_READ_HEADER,
ELK_TES_OPCODE_ADD_INDIRECT_URB_OFFSET,
ELK_SHADER_OPCODE_READ_SR_REG,
};
#ifdef __cplusplus
}
#endif