mesa/src/gallium/docs/source/tgsi.rst

904 lines
17 KiB
ReStructuredText
Raw Normal View History

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.
TGSI Instruction Specification
==============================
1 Instruction Set Operations
=============================
1.1 GL_NV_vertex_program
-------------------------
1.1.1 ARL - Address Register Load
dst.x = floor(src.x)
dst.y = floor(src.y)
dst.z = floor(src.z)
dst.w = floor(src.w)
1.1.2 MOV - Move
dst.x = src.x
dst.y = src.y
dst.z = src.z
dst.w = src.w
1.1.3 LIT - Light Coefficients
dst.x = 1.0
dst.y = max(src.x, 0.0)
dst.z = (src.x > 0.0) ? pow(max(src.y, 0.0), clamp(src.w, -128.0, 128.0)) : 0.0
dst.w = 1.0
1.1.4 RCP - Reciprocal
dst.x = 1.0 / src.x
dst.y = 1.0 / src.x
dst.z = 1.0 / src.x
dst.w = 1.0 / src.x
1.1.5 RSQ - Reciprocal Square Root
dst.x = 1.0 / sqrt(abs(src.x))
dst.y = 1.0 / sqrt(abs(src.x))
dst.z = 1.0 / sqrt(abs(src.x))
dst.w = 1.0 / sqrt(abs(src.x))
1.1.6 EXP - Approximate Exponential Base 2
dst.x = pow(2.0, floor(src.x))
dst.y = src.x - floor(src.x)
dst.z = pow(2.0, src.x)
dst.w = 1.0
1.1.7 LOG - Approximate Logarithm Base 2
dst.x = floor(lg2(abs(src.x)))
dst.y = abs(src.x) / pow(2.0, floor(lg2(abs(src.x))))
dst.z = lg2(abs(src.x))
dst.w = 1.0
1.1.8 MUL - Multiply
dst.x = src0.x * src1.x
dst.y = src0.y * src1.y
dst.z = src0.z * src1.z
dst.w = src0.w * src1.w
1.1.9 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
1.1.10 DP3 - 3-component Dot Product
dst.x = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z
dst.y = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z
dst.z = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z
dst.w = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z
1.1.11 DP4 - 4-component Dot Product
dst.x = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src0.w * src1.w
dst.y = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src0.w * src1.w
dst.z = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src0.w * src1.w
dst.w = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src0.w * src1.w
1.1.12 DST - Distance Vector
dst.x = 1.0
dst.y = src0.y * src1.y
dst.z = src0.z
dst.w = src1.w
1.1.13 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)
1.1.14 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)
1.1.15 SLT - Set On Less Than
dst.x = (src0.x < src1.x) ? 1.0 : 0.0
dst.y = (src0.y < src1.y) ? 1.0 : 0.0
dst.z = (src0.z < src1.z) ? 1.0 : 0.0
dst.w = (src0.w < src1.w) ? 1.0 : 0.0
1.1.16 SGE - Set On Greater Equal Than
dst.x = (src0.x >= src1.x) ? 1.0 : 0.0
dst.y = (src0.y >= src1.y) ? 1.0 : 0.0
dst.z = (src0.z >= src1.z) ? 1.0 : 0.0
dst.w = (src0.w >= src1.w) ? 1.0 : 0.0
1.1.17 MAD - Multiply And Add
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
1.2.1 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
1.2.4 LRP - Linear Interpolate
dst.x = src0.x * (src1.x - src2.x) + src2.x
dst.y = src0.y * (src1.y - src2.y) + src2.y
dst.z = src0.z * (src1.z - src2.z) + src2.z
dst.w = src0.w * (src1.w - src2.w) + src2.w
1.2.5 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
1.2.7 DP2A - 2-component Dot Product And Add
dst.x = src0.x * src1.x + src0.y * src1.y + src2.x
dst.y = src0.x * src1.x + src0.y * src1.y + src2.x
dst.z = src0.x * src1.x + src0.y * src1.y + src2.x
dst.w = src0.x * src1.x + src0.y * src1.y + src2.x
1.3.4 FRAC - Fraction
dst.x = src.x - floor(src.x)
dst.y = src.y - floor(src.y)
dst.z = src.z - floor(src.z)
dst.w = src.w - floor(src.w)
1.3.7 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)
1.3.8 FLR - Floor
dst.x = floor(src.x)
dst.y = floor(src.y)
dst.z = floor(src.z)
dst.w = floor(src.w)
1.3.9 ROUND - Round
dst.x = round(src.x)
dst.y = round(src.y)
dst.z = round(src.z)
dst.w = round(src.w)
1.3.10 EX2 - Exponential Base 2
dst.x = pow(2.0, src.x)
dst.y = pow(2.0, src.x)
dst.z = pow(2.0, src.x)
dst.w = pow(2.0, src.x)
1.3.11 LG2 - Logarithm Base 2
dst.x = lg2(src.x)
dst.y = lg2(src.x)
dst.z = lg2(src.x)
dst.w = lg2(src.x)
1.3.12 POW - Power
dst.x = pow(src0.x, src1.x)
dst.y = pow(src0.x, src1.x)
dst.z = pow(src0.x, src1.x)
dst.w = pow(src0.x, src1.x)
1.3.15 XPD - Cross Product
dst.x = src0.y * src1.z - src1.y * src0.z
dst.y = src0.z * src1.x - src1.z * src0.x
dst.z = src0.x * src1.y - src1.x * src0.y
dst.w = 1.0
1.4.1 ABS - Absolute
dst.x = abs(src.x)
dst.y = abs(src.y)
dst.z = abs(src.z)
dst.w = abs(src.w)
1.4.2 RCC - Reciprocal Clamped
dst.x = (1.0 / src.x) > 0.0 ? clamp(1.0 / src.x, 5.42101e-020, 1.884467e+019) : clamp(1.0 / src.x, -1.884467e+019, -5.42101e-020)
dst.y = (1.0 / src.x) > 0.0 ? clamp(1.0 / src.x, 5.42101e-020, 1.884467e+019) : clamp(1.0 / src.x, -1.884467e+019, -5.42101e-020)
dst.z = (1.0 / src.x) > 0.0 ? clamp(1.0 / src.x, 5.42101e-020, 1.884467e+019) : clamp(1.0 / src.x, -1.884467e+019, -5.42101e-020)
dst.w = (1.0 / src.x) > 0.0 ? clamp(1.0 / src.x, 5.42101e-020, 1.884467e+019) : clamp(1.0 / src.x, -1.884467e+019, -5.42101e-020)
1.4.3 DPH - Homogeneous Dot Product
dst.x = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src1.w
dst.y = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src1.w
dst.z = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src1.w
dst.w = src0.x * src1.x + src0.y * src1.y + src0.z * src1.z + src1.w
1.5.1 COS - Cosine
dst.x = cos(src.x)
dst.y = cos(src.x)
dst.z = cos(src.x)
dst.w = cos(src.w)
1.5.2 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)
1.5.3 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)
1.5.7 KILP - Predicated Discard
discard
1.5.10 PK2H - Pack Two 16-bit Floats
TBD
1.5.11 PK2US - Pack Two Unsigned 16-bit Scalars
TBD
1.5.12 PK4B - Pack Four Signed 8-bit Scalars
TBD
1.5.13 PK4UB - Pack Four Unsigned 8-bit Scalars
TBD
1.5.15 RFL - Reflection Vector
dst.x = 2.0 * (src0.x * src1.x + src0.y * src1.y + src0.z * src1.z) / (src0.x * src0.x + src0.y * src0.y + src0.z * src0.z) * src0.x - src1.x
dst.y = 2.0 * (src0.x * src1.x + src0.y * src1.y + src0.z * src1.z) / (src0.x * src0.x + src0.y * src0.y + src0.z * src0.z) * src0.y - src1.y
dst.z = 2.0 * (src0.x * src1.x + src0.y * src1.y + src0.z * src1.z) / (src0.x * src0.x + src0.y * src0.y + src0.z * src0.z) * src0.z - src1.z
dst.w = 1.0
Considered for removal.
1.5.16 SEQ - Set On Equal
dst.x = (src0.x == src1.x) ? 1.0 : 0.0
dst.y = (src0.y == src1.y) ? 1.0 : 0.0
dst.z = (src0.z == src1.z) ? 1.0 : 0.0
dst.w = (src0.w == src1.w) ? 1.0 : 0.0
1.5.17 SFL - Set On False
dst.x = 0.0
dst.y = 0.0
dst.z = 0.0
dst.w = 0.0
Considered for removal.
1.5.18 SGT - Set On Greater Than
dst.x = (src0.x > src1.x) ? 1.0 : 0.0
dst.y = (src0.y > src1.y) ? 1.0 : 0.0
dst.z = (src0.z > src1.z) ? 1.0 : 0.0
dst.w = (src0.w > src1.w) ? 1.0 : 0.0
1.5.19 SIN - Sine
dst.x = sin(src.x)
dst.y = sin(src.x)
dst.z = sin(src.x)
dst.w = sin(src.w)
1.5.20 SLE - Set On Less Equal Than
dst.x = (src0.x <= src1.x) ? 1.0 : 0.0
dst.y = (src0.y <= src1.y) ? 1.0 : 0.0
dst.z = (src0.z <= src1.z) ? 1.0 : 0.0
dst.w = (src0.w <= src1.w) ? 1.0 : 0.0
1.5.21 SNE - Set On Not Equal
dst.x = (src0.x != src1.x) ? 1.0 : 0.0
dst.y = (src0.y != src1.y) ? 1.0 : 0.0
dst.z = (src0.z != src1.z) ? 1.0 : 0.0
dst.w = (src0.w != src1.w) ? 1.0 : 0.0
1.5.22 STR - Set On True
dst.x = 1.0
dst.y = 1.0
dst.z = 1.0
dst.w = 1.0
1.5.23 TEX - Texture Lookup
TBD
1.5.24 TXD - Texture Lookup with Derivatives
TBD
1.5.25 TXP - Projective Texture Lookup
TBD
1.5.26 UP2H - Unpack Two 16-Bit Floats
TBD
Considered for removal.
1.5.27 UP2US - Unpack Two Unsigned 16-Bit Scalars
TBD
Considered for removal.
1.5.28 UP4B - Unpack Four Signed 8-Bit Values
TBD
Considered for removal.
1.5.29 UP4UB - Unpack Four Unsigned 8-Bit Scalars
TBD
Considered for removal.
1.5.30 X2D - 2D Coordinate Transformation
dst.x = src0.x + src1.x * src2.x + src1.y * src2.y
dst.y = src0.y + src1.x * src2.z + src1.y * src2.w
dst.z = src0.x + src1.x * src2.x + src1.y * src2.y
dst.w = src0.y + src1.x * src2.z + src1.y * src2.w
Considered for removal.
1.6 GL_NV_vertex_program2
--------------------------
1.6.1 ARA - Address Register Add
TBD
Considered for removal.
1.6.2 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)
1.6.3 BRA - Branch
pc = target
Considered for removal.
1.6.4 CAL - Subroutine Call
push(pc)
pc = target
1.6.5 RET - Subroutine Call Return
pc = pop()
Potential restrictions:
* Only occurs at end of function.
1.6.6 SSG - Set Sign
dst.x = (src.x > 0.0) ? 1.0 : (src.x < 0.0) ? -1.0 : 0.0
dst.y = (src.y > 0.0) ? 1.0 : (src.y < 0.0) ? -1.0 : 0.0
dst.z = (src.z > 0.0) ? 1.0 : (src.z < 0.0) ? -1.0 : 0.0
dst.w = (src.w > 0.0) ? 1.0 : (src.w < 0.0) ? -1.0 : 0.0
1.8.1 CMP - Compare
dst.x = (src0.x < 0.0) ? src1.x : src2.x
dst.y = (src0.y < 0.0) ? src1.y : src2.y
dst.z = (src0.z < 0.0) ? src1.z : src2.z
dst.w = (src0.w < 0.0) ? src1.w : src2.w
1.8.2 KIL - Conditional Discard
if (src.x < 0.0 || src.y < 0.0 || src.z < 0.0 || src.w < 0.0)
discard
endif
1.8.3 SCS - Sine Cosine
dst.x = cos(src.x)
dst.y = sin(src.x)
dst.z = 0.0
dst.y = 1.0
1.8.4 TXB - Texture Lookup With Bias
TBD
1.9.1 NRM - 3-component Vector Normalise
dst.x = src.x / (src.x * src.x + src.y * src.y + src.z * src.z)
dst.y = src.y / (src.x * src.x + src.y * src.y + src.z * src.z)
dst.z = src.z / (src.x * src.x + src.y * src.y + src.z * src.z)
dst.w = 1.0
1.9.2 DIV - Divide
dst.x = src0.x / src1.x
dst.y = src0.y / src1.y
dst.z = src0.z / src1.z
dst.w = src0.w / src1.w
1.9.3 DP2 - 2-component Dot Product
dst.x = src0.x * src1.x + src0.y * src1.y
dst.y = src0.x * src1.x + src0.y * src1.y
dst.z = src0.x * src1.x + src0.y * src1.y
dst.w = src0.x * src1.x + src0.y * src1.y
1.9.5 TXL - Texture Lookup With LOD
TBD
1.9.6 BRK - Break
TBD
1.9.7 IF - If
TBD
1.9.8 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.
1.9.9 REP - Repeat
TBD
1.9.10 ELSE - Else
TBD
1.9.11 ENDIF - End If
TBD
1.9.12 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.
1.9.13 ENDREP - End Repeat
TBD
1.10.1 PUSHA - Push Address Register On Stack
push(src.x)
push(src.y)
push(src.z)
push(src.w)
Considered for cleanup / removal.
1.10.2 POPA - Pop Address Register From Stack
dst.w = pop()
dst.z = pop()
dst.y = pop()
dst.x = pop()
Considered for cleanup / removal.
1.11 GL_NV_gpu_program4
------------------------
Support for these opcodes indicated by a special pipe capability bit (TBD).
1.11.1 CEIL - Ceiling
dst.x = ceil(src.x)
dst.y = ceil(src.y)
dst.z = ceil(src.z)
dst.w = ceil(src.w)
1.11.2 I2F - Integer To Float
dst.x = (float) src.x
dst.y = (float) src.y
dst.z = (float) src.z
dst.w = (float) src.w
1.11.3 NOT - Bitwise Not
dst.x = ~src.x
dst.y = ~src.y
dst.z = ~src.z
dst.w = ~src.w
1.11.4 TRUNC - Truncate
dst.x = trunc(src.x)
dst.y = trunc(src.y)
dst.z = trunc(src.z)
dst.w = trunc(src.w)
1.11.5 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
1.11.6 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
1.11.7 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
1.11.8 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
1.11.9 MOD - Modulus
dst.x = src0.x % src1.x
dst.y = src0.y % src1.y
dst.z = src0.z % src1.z
dst.w = src0.w % src1.w
1.11.10 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
1.11.11 SAD - Sum Of Absolute Differences
dst.x = abs(src0.x - src1.x) + src2.x
dst.y = abs(src0.y - src1.y) + src2.y
dst.z = abs(src0.z - src1.z) + src2.z
dst.w = abs(src0.w - src1.w) + src2.w
1.11.12 TXF - Texel Fetch
TBD
1.11.13 TXQ - Texture Size Query
TBD
1.11.14 CONT - Continue
TBD
1.12 GL_NV_geometry_program4
-----------------------------
1.12.1 EMIT - Emit
TBD
1.12.2 ENDPRIM - End Primitive
TBD
1.13 GLSL
----------
1.13.1 BGNLOOP - Begin a Loop
TBD
1.13.2 BGNSUB - Begin Subroutine
TBD
1.13.3 ENDLOOP - End a Loop
TBD
1.13.4 ENDSUB - End Subroutine
TBD
1.13.10 NOP - No Operation
Do nothing.
1.16.7 NRM4 - 4-component Vector Normalise
dst.x = src.x / (src.x * src.x + src.y * src.y + src.z * src.z + src.w * src.w)
dst.y = src.y / (src.x * src.x + src.y * src.y + src.z * src.z + src.w * src.w)
dst.z = src.z / (src.x * src.x + src.y * src.y + src.z * src.z + src.w * src.w)
dst.w = src.w / (src.x * src.x + src.y * src.y + src.z * src.z + src.w * src.w)
1.17 ps_2_x
------------
1.17.2 CALLNZ - Subroutine Call If Not Zero
TBD
1.17.3 IFC - If
TBD
1.17.5 BREAKC - Break Conditional
TBD
2 Explanation of symbols used
==============================
2.1 Functions
--------------
abs(x) Absolute value of x.
'|x|'
(x < 0.0) ? -x : x
ceil(x) Ceiling of x.
clamp(x,y,z) Clamp x between y and z.
(x < y) ? y : (x > z) ? z : x
cos(x) Cosine of x.
floor(x) Floor of x.
lg2(x) Logarithm base 2 of x.
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.
pow(x,y) Raise x to power of y.
push(x) Push x on stack.
round(x) Round x.
sin(x) Sine of x.
sqrt(x) Square root of x.
trunc(x) Truncate x.
2.2 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.
3 Other tokens
===============
3.1 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.
3.1.1 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.