TGSI

TGSI, Tungsten Graphics Shader Instructions, is an intermediate language for describing shaders. Since Gallium is inherently shaderful, shaders are an important part of the API. TGSI is the only intermediate representation used by all drivers.

Instruction Set

From GL_NV_vertex_program

ARL - Address Register Load

dst.x = \lfloor src.x\rfloor

dst.y = \lfloor src.y\rfloor

dst.z = \lfloor src.z\rfloor

dst.w = \lfloor src.w\rfloor

MOV - Move

dst.x = src.x

dst.y = src.y

dst.z = src.z

dst.w = src.w

LIT - Light Coefficients

dst.x = 1

dst.y = max(src.x, 0)

dst.z = (src.x > 0) ? max(src.y, 0)^{clamp(src.w, -128, 128))} : 0

dst.w = 1

RCP - Reciprocal

dst.x = \frac{1}{src.x}

dst.y = \frac{1}{src.x}

dst.z = \frac{1}{src.x}

dst.w = \frac{1}{src.x}

RSQ - Reciprocal Square Root

dst.x = \frac{1}{\sqrt{|src.x|}}

dst.y = \frac{1}{\sqrt{|src.x|}}

dst.z = \frac{1}{\sqrt{|src.x|}}

dst.w = \frac{1}{\sqrt{|src.x|}}

EXP - Approximate Exponential Base 2

dst.x = 2^{\lfloor src.x\rfloor}

dst.y = src.x - \lfloor src.x\rfloor

dst.z = 2^{src.x}

dst.w = 1

LOG - Approximate Logarithm Base 2

dst.x = \lfloor\log_2{|src.x|}\rfloor

dst.y = \frac{|src.x|}{2^{\lfloor\log_2{|src.x|}\rfloor}}

dst.z = \log_2{|src.x|}

dst.w = 1

MUL - Multiply

dst.x = src0.x \times src1.x

dst.y = src0.y \times src1.y

dst.z = src0.z \times src1.z

dst.w = src0.w \times src1.w

ADD - Add

dst.x = src0.x + src1.x

dst.y = src0.y + src1.y

dst.z = src0.z + src1.z

dst.w = src0.w + src1.w

DP3 - 3-component Dot Product

dst.x = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z

dst.y = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z

dst.z = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z

dst.w = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z

DP4 - 4-component Dot Product

dst.x = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src0.w \times src1.w

dst.y = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src0.w \times src1.w

dst.z = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src0.w \times src1.w

dst.w = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src0.w \times src1.w

DST - Distance Vector

dst.x = 1

dst.y = src0.y \times src1.y

dst.z = src0.z

dst.w = src1.w

MIN - Minimum

dst.x = min(src0.x, src1.x)

dst.y = min(src0.y, src1.y)

dst.z = min(src0.z, src1.z)

dst.w = min(src0.w, src1.w)

MAX - Maximum

dst.x = max(src0.x, src1.x)

dst.y = max(src0.y, src1.y)

dst.z = max(src0.z, src1.z)

dst.w = max(src0.w, src1.w)

SLT - Set On Less Than

dst.x = (src0.x < src1.x) ? 1 : 0

dst.y = (src0.y < src1.y) ? 1 : 0

dst.z = (src0.z < src1.z) ? 1 : 0

dst.w = (src0.w < src1.w) ? 1 : 0

SGE - Set On Greater Equal Than

dst.x = (src0.x >= src1.x) ? 1 : 0

dst.y = (src0.y >= src1.y) ? 1 : 0

dst.z = (src0.z >= src1.z) ? 1 : 0

dst.w = (src0.w >= src1.w) ? 1 : 0

MAD - Multiply And Add

dst.x = src0.x \times src1.x + src2.x

dst.y = src0.y \times src1.y + src2.y

dst.z = src0.z \times src1.z + src2.z

dst.w = src0.w \times src1.w + src2.w

SUB - Subtract

dst.x = src0.x - src1.x

dst.y = src0.y - src1.y

dst.z = src0.z - src1.z

dst.w = src0.w - src1.w

LRP - Linear Interpolate

dst.x = src0.x \times (src1.x - src2.x) + src2.x

dst.y = src0.y \times (src1.y - src2.y) + src2.y

dst.z = src0.z \times (src1.z - src2.z) + src2.z

dst.w = src0.w \times (src1.w - src2.w) + src2.w

CND - Condition

dst.x = (src2.x > 0.5) ? src0.x : src1.x

dst.y = (src2.y > 0.5) ? src0.y : src1.y

dst.z = (src2.z > 0.5) ? src0.z : src1.z

dst.w = (src2.w > 0.5) ? src0.w : src1.w

DP2A - 2-component Dot Product And Add

dst.x = src0.x \times src1.x + src0.y \times src1.y + src2.x

dst.y = src0.x \times src1.x + src0.y \times src1.y + src2.x

dst.z = src0.x \times src1.x + src0.y \times src1.y + src2.x

dst.w = src0.x \times src1.x + src0.y \times src1.y + src2.x

FRAC - Fraction

dst.x = src.x - \lfloor src.x\rfloor

dst.y = src.y - \lfloor src.y\rfloor

dst.z = src.z - \lfloor src.z\rfloor

dst.w = src.w - \lfloor src.w\rfloor

CLAMP - Clamp

dst.x = clamp(src0.x, src1.x, src2.x)

dst.y = clamp(src0.y, src1.y, src2.y)

dst.z = clamp(src0.z, src1.z, src2.z)

dst.w = clamp(src0.w, src1.w, src2.w)

FLR - Floor

This is identical to ARL.

dst.x = \lfloor src.x\rfloor

dst.y = \lfloor src.y\rfloor

dst.z = \lfloor src.z\rfloor

dst.w = \lfloor src.w\rfloor

ROUND - Round

dst.x = round(src.x)

dst.y = round(src.y)

dst.z = round(src.z)

dst.w = round(src.w)

EX2 - Exponential Base 2

dst.x = 2^{src.x}

dst.y = 2^{src.x}

dst.z = 2^{src.x}

dst.w = 2^{src.x}

LG2 - Logarithm Base 2

dst.x = \log_2{src.x}

dst.y = \log_2{src.x}

dst.z = \log_2{src.x}

dst.w = \log_2{src.x}

POW - Power

dst.x = src0.x^{src1.x}

dst.y = src0.x^{src1.x}

dst.z = src0.x^{src1.x}

dst.w = src0.x^{src1.x}

XPD - Cross Product

dst.x = src0.y \times src1.z - src1.y \times src0.z

dst.y = src0.z \times src1.x - src1.z \times src0.x

dst.z = src0.x \times src1.y - src1.x \times src0.y

dst.w = 1

ABS - Absolute

dst.x = |src.x|

dst.y = |src.y|

dst.z = |src.z|

dst.w = |src.w|

RCC - Reciprocal Clamped

XXX cleanup on aisle three

dst.x = (1 / src.x) > 0 ? clamp(1 / src.x, 5.42101e-020, 1.884467e+019) : clamp(1 / src.x, -1.884467e+019, -5.42101e-020)

dst.y = (1 / src.x) > 0 ? clamp(1 / src.x, 5.42101e-020, 1.884467e+019) : clamp(1 / src.x, -1.884467e+019, -5.42101e-020)

dst.z = (1 / src.x) > 0 ? clamp(1 / src.x, 5.42101e-020, 1.884467e+019) : clamp(1 / src.x, -1.884467e+019, -5.42101e-020)

dst.w = (1 / src.x) > 0 ? clamp(1 / src.x, 5.42101e-020, 1.884467e+019) : clamp(1 / src.x, -1.884467e+019, -5.42101e-020)

DPH - Homogeneous Dot Product

dst.x = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src1.w

dst.y = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src1.w

dst.z = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src1.w

dst.w = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src1.w

COS - Cosine

dst.x = \cos{src.x}

dst.y = \cos{src.x}

dst.z = \cos{src.x}

dst.w = \cos{src.w}

DDX - Derivative Relative To X

dst.x = partialx(src.x)

dst.y = partialx(src.y)

dst.z = partialx(src.z)

dst.w = partialx(src.w)

DDY - Derivative Relative To Y

dst.x = partialy(src.x)

dst.y = partialy(src.y)

dst.z = partialy(src.z)

dst.w = partialy(src.w)

KILP - Predicated Discard

discard

PK2H - Pack Two 16-bit Floats

TBD

PK2US - Pack Two Unsigned 16-bit Scalars

TBD

PK4B - Pack Four Signed 8-bit Scalars

TBD

PK4UB - Pack Four Unsigned 8-bit Scalars

TBD

RFL - Reflection Vector

dst.x = 2 \times (src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z) / (src0.x \times src0.x + src0.y \times src0.y + src0.z \times src0.z) \times src0.x - src1.x

dst.y = 2 \times (src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z) / (src0.x \times src0.x + src0.y \times src0.y + src0.z \times src0.z) \times src0.y - src1.y

dst.z = 2 \times (src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z) / (src0.x \times src0.x + src0.y \times src0.y + src0.z \times src0.z) \times src0.z - src1.z

dst.w = 1

Considered for removal.

SEQ - Set On Equal

dst.x = (src0.x == src1.x) ? 1 : 0
dst.y = (src0.y == src1.y) ? 1 : 0
dst.z = (src0.z == src1.z) ? 1 : 0
dst.w = (src0.w == src1.w) ? 1 : 0

SFL - Set On False

dst.x = 0
dst.y = 0
dst.z = 0
dst.w = 0

Considered for removal.

SGT - Set On Greater Than

dst.x = (src0.x > src1.x) ? 1 : 0
dst.y = (src0.y > src1.y) ? 1 : 0
dst.z = (src0.z > src1.z) ? 1 : 0
dst.w = (src0.w > src1.w) ? 1 : 0

SIN - Sine

dst.x = \sin{src.x}

dst.y = \sin{src.x}

dst.z = \sin{src.x}

dst.w = \sin{src.w}

SLE - Set On Less Equal Than

dst.x = (src0.x <= src1.x) ? 1 : 0
dst.y = (src0.y <= src1.y) ? 1 : 0
dst.z = (src0.z <= src1.z) ? 1 : 0
dst.w = (src0.w <= src1.w) ? 1 : 0

SNE - Set On Not Equal

dst.x = (src0.x != src1.x) ? 1 : 0
dst.y = (src0.y != src1.y) ? 1 : 0
dst.z = (src0.z != src1.z) ? 1 : 0
dst.w = (src0.w != src1.w) ? 1 : 0

STR - Set On True

dst.x = 1
dst.y = 1
dst.z = 1
dst.w = 1

TEX - Texture Lookup

TBD

TXD - Texture Lookup with Derivatives

TBD

TXP - Projective Texture Lookup

TBD

UP2H - Unpack Two 16-Bit Floats

TBD

Considered for removal.

UP2US - Unpack Two Unsigned 16-Bit Scalars

TBD

Considered for removal.

UP4B - Unpack Four Signed 8-Bit Values

TBD

Considered for removal.

UP4UB - Unpack Four Unsigned 8-Bit Scalars

TBD

Considered for removal.

X2D - 2D Coordinate Transformation

dst.x = src0.x + src1.x \times src2.x + src1.y \times src2.y
dst.y = src0.y + src1.x \times src2.z + src1.y \times src2.w
dst.z = src0.x + src1.x \times src2.x + src1.y \times src2.y
dst.w = src0.y + src1.x \times src2.z + src1.y \times src2.w

Considered for removal.

From GL_NV_vertex_program2

ARA - Address Register Add

TBD

Considered for removal.

ARR - Address Register Load With Round

dst.x = round(src.x)

dst.y = round(src.y)

dst.z = round(src.z)

dst.w = round(src.w)

BRA - Branch

pc = target

Considered for removal.

CAL - Subroutine Call

push(pc) pc = target

RET - Subroutine Call Return

pc = pop()

Potential restrictions: times Only occurs at end of function.

SSG - Set Sign

dst.x = (src.x > 0) ? 1 : (src.x < 0) ? -1 : 0

dst.y = (src.y > 0) ? 1 : (src.y < 0) ? -1 : 0

dst.z = (src.z > 0) ? 1 : (src.z < 0) ? -1 : 0

dst.w = (src.w > 0) ? 1 : (src.w < 0) ? -1 : 0

CMP - Compare

dst.x = (src0.x < 0) ? src1.x : src2.x

dst.y = (src0.y < 0) ? src1.y : src2.y

dst.z = (src0.z < 0) ? src1.z : src2.z

dst.w = (src0.w < 0) ? src1.w : src2.w

KIL - Conditional Discard

if (src.x < 0 || src.y < 0 || src.z < 0 || src.w < 0)
  discard
endif

SCS - Sine Cosine

dst.x = \cos{src.x}

dst.y = \sin{src.x}

dst.z = 0

dst.y = 1

TXB - Texture Lookup With Bias

TBD

NRM - 3-component Vector Normalise

dst.x = src.x / (src.x \times src.x + src.y \times src.y + src.z \times src.z)

dst.y = src.y / (src.x \times src.x + src.y \times src.y + src.z \times src.z)

dst.z = src.z / (src.x \times src.x + src.y \times src.y + src.z \times src.z)

dst.w = 1

DIV - Divide

dst.x = \frac{src0.x}{src1.x}

dst.y = \frac{src0.y}{src1.y}

dst.z = \frac{src0.z}{src1.z}

dst.w = \frac{src0.w}{src1.w}

DP2 - 2-component Dot Product

dst.x = src0.x \times src1.x + src0.y \times src1.y

dst.y = src0.x \times src1.x + src0.y \times src1.y

dst.z = src0.x \times src1.x + src0.y \times src1.y

dst.w = src0.x \times src1.x + src0.y \times src1.y

TXL - Texture Lookup With LOD

TBD

BRK - Break

TBD

IF - If

TBD

BGNFOR - Begin a For-Loop

dst.x = floor(src.x) dst.y = floor(src.y) dst.z = floor(src.z)

if (dst.y <= 0)
pc = [matching ENDFOR] + 1

endif

Note: The destination must be a loop register.
The source must be a constant register.

Considered for cleanup / removal.

REP - Repeat

TBD

ELSE - Else

TBD

ENDIF - End If

TBD

ENDFOR - End a For-Loop

dst.x = dst.x + dst.z dst.y = dst.y - 1.0

if (dst.y > 0)
pc = [matching BGNFOR instruction] + 1

endif

Note: The destination must be a loop register.

Considered for cleanup / removal.

ENDREP - End Repeat

TBD

PUSHA - Push Address Register On Stack

push(src.x) push(src.y) push(src.z) push(src.w)

Considered for cleanup / removal.

POPA - Pop Address Register From Stack

dst.w = pop() dst.z = pop() dst.y = pop() dst.x = pop()

Considered for cleanup / removal.

From GL_NV_gpu_program4

Support for these opcodes indicated by a special pipe capability bit (TBD).

CEIL - Ceiling

dst.x = \lceil src.x\rceil

dst.y = \lceil src.y\rceil

dst.z = \lceil src.z\rceil

dst.w = \lceil src.w\rceil

I2F - Integer To Float

dst.x = (float) src.x

dst.y = (float) src.y

dst.z = (float) src.z

dst.w = (float) src.w

NOT - Bitwise Not

dst.x = ~src.x

dst.y = ~src.y

dst.z = ~src.z

dst.w = ~src.w

TRUNC - Truncate

XXX how is this different from floor?

dst.x = trunc(src.x)

dst.y = trunc(src.y)

dst.z = trunc(src.z)

dst.w = trunc(src.w)

SHL - Shift Left

dst.x = src0.x << src1.x

dst.y = src0.y << src1.x

dst.z = src0.z << src1.x

dst.w = src0.w << src1.x

SHR - Shift Right

dst.x = src0.x >> src1.x

dst.y = src0.y >> src1.x

dst.z = src0.z >> src1.x

dst.w = src0.w >> src1.x

AND - Bitwise And

dst.x = src0.x & src1.x

dst.y = src0.y & src1.y

dst.z = src0.z & src1.z

dst.w = src0.w & src1.w

OR - Bitwise Or

dst.x = src0.x | src1.x

dst.y = src0.y | src1.y

dst.z = src0.z | src1.z

dst.w = src0.w | src1.w

MOD - Modulus

dst.x = src0.x \bmod src1.x

dst.y = src0.y \bmod src1.y

dst.z = src0.z \bmod src1.z

dst.w = src0.w \bmod src1.w

XOR - Bitwise Xor

dst.x = src0.x ^ src1.x

dst.y = src0.y ^ src1.y

dst.z = src0.z ^ src1.z

dst.w = src0.w ^ src1.w

SAD - Sum Of Absolute Differences

dst.x = |src0.x - src1.x| + src2.x

dst.y = |src0.y - src1.y| + src2.y

dst.z = |src0.z - src1.z| + src2.z

dst.w = |src0.w - src1.w| + src2.w

TXF - Texel Fetch

TBD

TXQ - Texture Size Query

TBD

CONT - Continue

TBD

From GL_NV_geometry_program4

EMIT - Emit

TBD

ENDPRIM - End Primitive

TBD

From GLSL

BGNLOOP - Begin a Loop

TBD

BGNSUB - Begin Subroutine

TBD

ENDLOOP - End a Loop

TBD

ENDSUB - End Subroutine

TBD

NOP - No Operation

Do nothing.

NRM4 - 4-component Vector Normalise

dst.x = \frac{src.x}{src.x \times src.x + src.y \times src.y + src.z \times src.z + src.w \times src.w}

dst.y = \frac{src.y}{src.x \times src.x + src.y \times src.y + src.z \times src.z + src.w \times src.w}

dst.z = \frac{src.z}{src.x \times src.x + src.y \times src.y + src.z \times src.z + src.w \times src.w}

dst.w = \frac{src.w}{src.x \times src.x + src.y \times src.y + src.z \times src.z + src.w \times src.w}

ps_2_x

CALLNZ - Subroutine Call If Not Zero

TBD

IFC - If

TBD

BREAKC - Break Conditional

TBD

Explanation of symbols used

Functions

|x| Absolute value of x.

\lceil x \rceil Ceiling of x.

clamp(x,y,z) Clamp x between y and z.
(x < y) ? y : (x > z) ? z : x

\lfloor x\rfloor Floor of x.

\log_2{x} Logarithm of x, base 2.

max(x,y) Maximum of x and y.
(x > y) ? x : y
min(x,y) Minimum of x and y.
(x < y) ? x : y

partialx(x) Derivative of x relative to fragment’s X.

partialy(x) Derivative of x relative to fragment’s Y.

pop() Pop from stack.

x^y x to the power y.

push(x) Push x on stack.

round(x) Round x.

trunc(x) Truncate x.

Keywords

discard Discard fragment.

dst First destination register.

dst0 First destination register.

pc Program counter.

src First source register.

src0 First source register.

src1 Second source register.

src2 Third source register.

target Label of target instruction.

Other tokens

Declaration Semantic

Follows Declaration token if Semantic bit is set.

Since its purpose is to link a shader with other stages of the pipeline, it is valid to follow only those Declaration tokens that declare a register either in INPUT or OUTPUT file.

SemanticName field contains the semantic name of the register being declared. There is no default value.

SemanticIndex is an optional subscript that can be used to distinguish different register declarations with the same semantic name. The default value is 0.

The meanings of the individual semantic names are explained in the following sections.

FACE

Valid only in a fragment shader INPUT declaration.

FACE.x is negative when the primitive is back facing. FACE.x is positive when the primitive is front facing.