2009-12-20 23:00:40 +00:00
|
|
|
TGSI
|
|
|
|
====
|
|
|
|
|
2010-01-04 11:52:43 +00:00
|
|
|
TGSI, Tungsten Graphics Shader Infrastructure, is an intermediate language
|
2009-12-20 23:00:40 +00:00
|
|
|
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.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:36:34 +00:00
|
|
|
Basics
|
|
|
|
------
|
|
|
|
|
|
|
|
All TGSI instructions, known as *opcodes*, operate on arbitrary-precision
|
|
|
|
floating-point four-component vectors. An opcode may have up to one
|
|
|
|
destination register, known as *dst*, and between zero and three source
|
|
|
|
registers, called *src0* through *src2*, or simply *src* if there is only
|
|
|
|
one.
|
|
|
|
|
|
|
|
Some instructions, like :opcode:`I2F`, permit re-interpretation of vector
|
|
|
|
components as integers. Other instructions permit using registers as
|
|
|
|
two-component vectors with double precision; see :ref:`Double Opcodes`.
|
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
When an instruction has a scalar result, the result is usually copied into
|
|
|
|
each of the components of *dst*. When this happens, the result is said to be
|
|
|
|
*replicated* to *dst*. :opcode:`RCP` is one such instruction.
|
|
|
|
|
2009-12-22 05:04:10 +00:00
|
|
|
Instruction Set
|
|
|
|
---------------
|
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
Core ISA
|
2009-12-22 05:04:10 +00:00
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
These opcodes are guaranteed to be available regardless of the driver being
|
|
|
|
used.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ARL - Address Register Load
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.x = \lfloor src.x\rfloor
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.y = \lfloor src.y\rfloor
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.z = \lfloor src.z\rfloor
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.w = \lfloor src.w\rfloor
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: MOV - Move
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
dst.x = src.x
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = src.y
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = src.z
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = src.w
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: LIT - Light Coefficients
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = 1
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.y = max(src.x, 0)
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.z = (src.x > 0) ? max(src.y, 0)^{clamp(src.w, -128, 128))} : 0
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = 1
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: RCP - Reciprocal
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = \frac{1}{src.x}
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: RSQ - Reciprocal Square Root
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = \frac{1}{\sqrt{|src.x|}}
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: EXP - Approximate Exponential Base 2
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:41:09 +00:00
|
|
|
dst.x = 2^{\lfloor src.x\rfloor}
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.y = src.x - \lfloor src.x\rfloor
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:41:09 +00:00
|
|
|
dst.z = 2^{src.x}
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = 1
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: LOG - Approximate Logarithm Base 2
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:57:56 +00:00
|
|
|
dst.x = \lfloor\log_2{|src.x|}\rfloor
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:57:56 +00:00
|
|
|
dst.y = \frac{|src.x|}{2^{\lfloor\log_2{|src.x|}\rfloor}}
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:57:56 +00:00
|
|
|
dst.z = \log_2{|src.x|}
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:57:56 +00:00
|
|
|
dst.w = 1
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: MUL - Multiply
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.x = src0.x \times src1.x
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.y = src0.y \times src1.y
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.z = src0.z \times src1.z
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.w = src0.w \times src1.w
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ADD - Add
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
dst.x = src0.x + src1.x
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = src0.y + src1.y
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = src0.z + src1.z
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = src0.w + src1.w
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: DP3 - 3-component Dot Product
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: DP4 - 4-component Dot Product
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src0.w \times src1.w
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: DST - Distance Vector
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = 1
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.y = src0.y \times src1.y
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = src0.z
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = src1.w
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: MIN - Minimum
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
dst.x = min(src0.x, src1.x)
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = min(src0.y, src1.y)
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = min(src0.z, src1.z)
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = min(src0.w, src1.w)
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: MAX - Maximum
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
dst.x = max(src0.x, src1.x)
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = max(src0.y, src1.y)
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = max(src0.z, src1.z)
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = max(src0.w, src1.w)
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SLT - Set On Less Than
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = (src0.x < src1.x) ? 1 : 0
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.y = (src0.y < src1.y) ? 1 : 0
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.z = (src0.z < src1.z) ? 1 : 0
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = (src0.w < src1.w) ? 1 : 0
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SGE - Set On Greater Equal Than
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = (src0.x >= src1.x) ? 1 : 0
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.y = (src0.y >= src1.y) ? 1 : 0
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.z = (src0.z >= src1.z) ? 1 : 0
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = (src0.w >= src1.w) ? 1 : 0
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: MAD - Multiply And Add
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.x = src0.x \times src1.x + src2.x
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.y = src0.y \times src1.y + src2.y
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.z = src0.z \times src1.z + src2.z
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.w = src0.w \times src1.w + src2.w
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SUB - Subtract
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
dst.x = src0.x - src1.x
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = src0.y - src1.y
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = src0.z - src1.z
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = src0.w - src1.w
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: LRP - Linear Interpolate
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-01-04 11:59:17 +00:00
|
|
|
dst.x = src0.x \times src1.x + (1 - src0.x) \times src2.x
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-01-04 11:59:17 +00:00
|
|
|
dst.y = src0.y \times src1.y + (1 - src0.y) \times src2.y
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-01-04 11:59:17 +00:00
|
|
|
dst.z = src0.z \times src1.z + (1 - src0.z) \times src2.z
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-01-04 11:59:17 +00:00
|
|
|
dst.w = src0.w \times src1.w + (1 - src0.w) \times src2.w
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: CND - Condition
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
dst.x = (src2.x > 0.5) ? src0.x : src1.x
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = (src2.y > 0.5) ? src0.y : src1.y
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = (src2.z > 0.5) ? src0.z : src1.z
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = (src2.w > 0.5) ? src0.w : src1.w
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: DP2A - 2-component Dot Product And Add
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.x = src0.x \times src1.x + src0.y \times src1.y + src2.x
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.y = src0.x \times src1.x + src0.y \times src1.y + src2.x
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.z = src0.x \times src1.x + src0.y \times src1.y + src2.x
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.w = src0.x \times src1.x + src0.y \times src1.y + src2.x
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-06-01 16:25:05 +01:00
|
|
|
.. opcode:: FRC - Fraction
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.x = src.x - \lfloor src.x\rfloor
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.y = src.y - \lfloor src.y\rfloor
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.z = src.z - \lfloor src.z\rfloor
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.w = src.w - \lfloor src.w\rfloor
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: CLAMP - Clamp
|
2009-12-22 03:12:55 +00:00
|
|
|
|
|
|
|
.. math::
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
dst.x = clamp(src0.x, src1.x, src2.x)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = clamp(src0.y, src1.y, src2.y)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = clamp(src0.z, src1.z, src2.z)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = clamp(src0.w, src1.w, src2.w)
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: FLR - Floor
|
2009-12-22 03:30:29 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This is identical to :opcode:`ARL`.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.x = \lfloor src.x\rfloor
|
|
|
|
|
|
|
|
dst.y = \lfloor src.y\rfloor
|
|
|
|
|
|
|
|
dst.z = \lfloor src.z\rfloor
|
|
|
|
|
|
|
|
dst.w = \lfloor src.w\rfloor
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ROUND - Round
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = round(src.x)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = round(src.y)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = round(src.z)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = round(src.w)
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: EX2 - Exponential Base 2
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 03:41:09 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 03:41:09 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = 2^{src.x}
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: LG2 - Logarithm Base 2
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 03:57:56 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 03:57:56 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = \log_2{src.x}
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: POW - Power
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 03:41:09 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 03:41:09 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = src0.x^{src1.x}
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: XPD - Cross Product
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.x = src0.y \times src1.z - src1.y \times src0.z
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.y = src0.z \times src1.x - src1.z \times src0.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.z = src0.x \times src1.y - src1.x \times src0.y
|
2009-12-22 04:32:46 +00:00
|
|
|
|
|
|
|
dst.w = 1
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ABS - Absolute
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 03:57:56 +00:00
|
|
|
dst.x = |src.x|
|
|
|
|
|
|
|
|
dst.y = |src.y|
|
|
|
|
|
|
|
|
dst.z = |src.z|
|
|
|
|
|
|
|
|
dst.w = |src.w|
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: RCC - Reciprocal Clamped
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
XXX cleanup on aisle three
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = (1 / src.x) > 0 ? clamp(1 / src.x, 5.42101e-020, 1.884467e+019) : clamp(1 / src.x, -1.884467e+019, -5.42101e-020)
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: DPH - Homogeneous Dot Product
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src1.w
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: COS - Cosine
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 03:30:29 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 03:30:29 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = \cos{src.x}
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: DDX - Derivative Relative To X
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = partialx(src.x)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = partialx(src.y)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = partialx(src.z)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = partialx(src.w)
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: DDY - Derivative Relative To Y
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = partialy(src.x)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = partialy(src.y)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = partialy(src.z)
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = partialy(src.w)
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: KILP - Predicated Discard
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
discard
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: PK2H - Pack Two 16-bit Floats
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: PK2US - Pack Two Unsigned 16-bit Scalars
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: PK4B - Pack Four Signed 8-bit Scalars
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: PK4UB - Pack Four Unsigned 8-bit Scalars
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: RFL - Reflection Vector
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
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
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for removal.
|
2009-12-21 23:38:29 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SEQ - Set On Equal
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = (src0.x == src1.x) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.y = (src0.y == src1.y) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.z = (src0.z == src1.z) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = (src0.w == src1.w) ? 1 : 0
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SFL - Set On False
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
Considered for removal.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SGT - Set On Greater Than
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = (src0.x > src1.x) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.y = (src0.y > src1.y) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.z = (src0.z > src1.z) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = (src0.w > src1.w) ? 1 : 0
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SIN - Sine
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 03:30:29 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 03:30:29 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = \sin{src.x}
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SLE - Set On Less Equal Than
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = (src0.x <= src1.x) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.y = (src0.y <= src1.y) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.z = (src0.z <= src1.z) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = (src0.w <= src1.w) ? 1 : 0
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SNE - Set On Not Equal
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = (src0.x != src1.x) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.y = (src0.y != src1.y) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.z = (src0.z != src1.z) ? 1 : 0
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = (src0.w != src1.w) ? 1 : 0
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: STR - Set On True
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = 1
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: TEX - Texture Lookup
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: TXD - Texture Lookup with Derivatives
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: TXP - Projective Texture Lookup
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: UP2H - Unpack Two 16-Bit Floats
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for removal.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: UP2US - Unpack Two Unsigned 16-Bit Scalars
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for removal.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: UP4B - Unpack Four Signed 8-Bit Values
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for removal.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: UP4UB - Unpack Four Unsigned 8-Bit Scalars
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for removal.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: X2D - 2D Coordinate Transformation
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.x = src0.x + src1.x \times src2.x + src1.y \times src2.y
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.y = src0.y + src1.x \times src2.z + src1.y \times src2.w
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.z = src0.x + src1.x \times src2.x + src1.y \times src2.y
|
2010-01-19 01:31:56 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.w = src0.y + src1.x \times src2.z + src1.y \times src2.w
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for removal.
|
2009-12-21 23:38:29 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ARA - Address Register Add
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for removal.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ARR - Address Register Load With Round
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = round(src.x)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = round(src.y)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = round(src.z)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = round(src.w)
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: BRA - Branch
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
pc = target
|
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for removal.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: CAL - Subroutine Call
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
push(pc)
|
|
|
|
pc = target
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: RET - Subroutine Call Return
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
pc = pop()
|
|
|
|
|
2009-12-21 23:38:29 +00:00
|
|
|
Potential restrictions:
|
2010-01-04 12:15:28 +00:00
|
|
|
* Only occurs at end of function.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SSG - Set Sign
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = (src.x > 0) ? 1 : (src.x < 0) ? -1 : 0
|
|
|
|
|
|
|
|
dst.y = (src.y > 0) ? 1 : (src.y < 0) ? -1 : 0
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.z = (src.z > 0) ? 1 : (src.z < 0) ? -1 : 0
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = (src.w > 0) ? 1 : (src.w < 0) ? -1 : 0
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: CMP - Compare
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
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
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: KIL - Conditional Discard
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
if (src.x < 0 || src.y < 0 || src.z < 0 || src.w < 0)
|
2009-12-21 23:25:15 +00:00
|
|
|
discard
|
|
|
|
endif
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SCS - Sine Cosine
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 03:30:29 +00:00
|
|
|
dst.x = \cos{src.x}
|
|
|
|
|
|
|
|
dst.y = \sin{src.x}
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.z = 0
|
2009-12-22 03:30:29 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.y = 1
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: TXB - Texture Lookup With Bias
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: NRM - 3-component Vector Normalise
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.x = src.x / (src.x \times src.x + src.y \times src.y + src.z \times src.z)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.y = src.y / (src.x \times src.x + src.y \times src.y + src.z \times src.z)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-22 04:07:10 +00:00
|
|
|
dst.z = src.z / (src.x \times src.x + src.y \times src.y + src.z \times src.z)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
|
|
|
dst.w = 1
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: DIV - Divide
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = \frac{src0.x}{src1.x}
|
|
|
|
|
|
|
|
dst.y = \frac{src0.y}{src1.y}
|
|
|
|
|
|
|
|
dst.z = \frac{src0.z}{src1.z}
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = \frac{src0.w}{src1.w}
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: DP2 - 2-component Dot Product
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = src0.x \times src1.x + src0.y \times src1.y
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: TXL - Texture Lookup With LOD
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: BRK - Break
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: IF - If
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ELSE - Else
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ENDIF - End If
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: PUSHA - Push Address Register On Stack
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
push(src.x)
|
|
|
|
push(src.y)
|
|
|
|
push(src.z)
|
|
|
|
push(src.w)
|
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for cleanup.
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for removal.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: POPA - Pop Address Register From Stack
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
dst.w = pop()
|
|
|
|
dst.z = pop()
|
|
|
|
dst.y = pop()
|
|
|
|
dst.x = pop()
|
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for cleanup.
|
|
|
|
|
|
|
|
.. note::
|
|
|
|
|
|
|
|
Considered for removal.
|
2009-12-21 23:38:29 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
Compute ISA
|
2009-12-22 05:04:10 +00:00
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
These opcodes are primarily provided for special-use computational shaders.
|
2009-12-21 23:38:29 +00:00
|
|
|
Support for these opcodes indicated by a special pipe capability bit (TBD).
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
XXX so let's discuss it, yeah?
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: CEIL - Ceiling
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 03:57:56 +00:00
|
|
|
dst.x = \lceil src.x\rceil
|
|
|
|
|
|
|
|
dst.y = \lceil src.y\rceil
|
|
|
|
|
|
|
|
dst.z = \lceil src.z\rceil
|
|
|
|
|
|
|
|
dst.w = \lceil src.w\rceil
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: I2F - Integer To Float
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = (float) src.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = (float) src.y
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = (float) src.z
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = (float) src.w
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: NOT - Bitwise Not
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = ~src.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = ~src.y
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = ~src.z
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = ~src.w
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: TRUNC - Truncate
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = trunc(src.x)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = trunc(src.y)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = trunc(src.z)
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = trunc(src.w)
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SHL - Shift Left
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = src0.x << src1.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = src0.y << src1.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = src0.z << src1.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = src0.w << src1.x
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SHR - Shift Right
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = src0.x >> src1.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = src0.y >> src1.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = src0.z >> src1.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = src0.w >> src1.x
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: AND - Bitwise And
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = src0.x & src1.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = src0.y & src1.y
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = src0.z & src1.z
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = src0.w & src1.w
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: OR - Bitwise Or
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.x = src0.x | src1.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.y = src0.y | src1.y
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.z = src0.z | src1.z
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
dst.w = src0.w | src1.w
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: MOD - Modulus
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.x = src0.x \bmod src1.x
|
|
|
|
|
|
|
|
dst.y = src0.y \bmod src1.y
|
|
|
|
|
|
|
|
dst.z = src0.z \bmod src1.z
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
dst.w = src0.w \bmod src1.w
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: XOR - Bitwise Xor
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2010-01-19 01:37:25 +00:00
|
|
|
dst.x = src0.x \oplus src1.x
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2010-01-19 01:37:25 +00:00
|
|
|
dst.y = src0.y \oplus src1.y
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2010-01-19 01:37:25 +00:00
|
|
|
dst.z = src0.z \oplus src1.z
|
2009-12-22 04:32:46 +00:00
|
|
|
|
2010-01-19 01:37:25 +00:00
|
|
|
dst.w = src0.w \oplus src1.w
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: SAD - Sum Of Absolute Differences
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:12:55 +00:00
|
|
|
.. math::
|
|
|
|
|
2009-12-22 03:57:56 +00:00
|
|
|
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
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: TXF - Texel Fetch
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: TXQ - Texture Size Query
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: CONT - Continue
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
.. note::
|
|
|
|
|
|
|
|
Support for CONT is determined by a special capability bit,
|
|
|
|
``TGSI_CONT_SUPPORTED``. See :ref:`Screen` for more information.
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
Geometry ISA
|
2009-12-22 05:04:10 +00:00
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
These opcodes are only supported in geometry shaders; they have no meaning
|
|
|
|
in any other type of shader.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: EMIT - Emit
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ENDPRIM - End Primitive
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
GLSL ISA
|
2009-12-22 05:04:10 +00:00
|
|
|
^^^^^^^^^^
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
These opcodes are part of :term:`GLSL`'s opcode set. Support for these
|
|
|
|
opcodes is determined by a special capability bit, ``GLSL``.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: BGNLOOP - Begin a Loop
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: BGNSUB - Begin Subroutine
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ENDLOOP - End a Loop
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: ENDSUB - End Subroutine
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: NOP - No Operation
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-01-04 12:23:41 +00:00
|
|
|
Do nothing.
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: NRM4 - 4-component Vector Normalise
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
This instruction replicates its result.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
.. math::
|
2009-12-22 03:12:55 +00:00
|
|
|
|
2010-02-03 01:02:28 +00:00
|
|
|
dst = \frac{src.x}{src.x \times src.x + src.y \times src.y + src.z \times src.z + src.w \times src.w}
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
ps_2_x
|
2009-12-22 05:04:10 +00:00
|
|
|
^^^^^^^^^^^^
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
XXX wait what
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: CALLNZ - Subroutine Call If Not Zero
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: IFC - If
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
|
|
|
|
2010-02-03 00:20:12 +00:00
|
|
|
.. opcode:: BREAKC - Break Conditional
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
TBD
|
|
|
|
|
2010-02-03 00:36:34 +00:00
|
|
|
.. _doubleopcodes:
|
|
|
|
|
2010-06-17 02:34:32 +01:00
|
|
|
Double ISA
|
2010-01-25 23:23:04 +00:00
|
|
|
^^^^^^^^^^^^^^^
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
The double-precision opcodes reinterpret four-component vectors into
|
|
|
|
two-component vectors with doubled precision in each component.
|
|
|
|
|
|
|
|
Support for these opcodes is XXX undecided. :T
|
|
|
|
|
|
|
|
.. opcode:: DADD - Add
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = src0.xy + src1.xy
|
|
|
|
|
|
|
|
dst.zw = src0.zw + src1.zw
|
|
|
|
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DDIV - Divide
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = src0.xy / src1.xy
|
|
|
|
|
|
|
|
dst.zw = src0.zw / src1.zw
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DSEQ - Set on Equal
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = src0.xy == src1.xy ? 1.0F : 0.0F
|
|
|
|
|
|
|
|
dst.zw = src0.zw == src1.zw ? 1.0F : 0.0F
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DSLT - Set on Less than
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = src0.xy < src1.xy ? 1.0F : 0.0F
|
|
|
|
|
|
|
|
dst.zw = src0.zw < src1.zw ? 1.0F : 0.0F
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DFRAC - Fraction
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = src.xy - \lfloor src.xy\rfloor
|
|
|
|
|
|
|
|
dst.zw = src.zw - \lfloor src.zw\rfloor
|
|
|
|
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DFRACEXP - Convert Number to Fractional and Integral Components
|
2010-01-25 23:23:04 +00:00
|
|
|
|
2010-06-17 02:45:50 +01:00
|
|
|
Like the ``frexp()`` routine in many math libraries, this opcode stores the
|
|
|
|
exponent of its source to ``dst0``, and the significand to ``dst1``, such that
|
|
|
|
:math:`dst1 \times 2^{dst0} = src` .
|
|
|
|
|
2010-01-25 23:23:04 +00:00
|
|
|
.. math::
|
|
|
|
|
2010-06-17 02:45:50 +01:00
|
|
|
dst0.xy = exp(src.xy)
|
|
|
|
|
|
|
|
dst1.xy = frac(src.xy)
|
|
|
|
|
|
|
|
dst0.zw = exp(src.zw)
|
|
|
|
|
|
|
|
dst1.zw = frac(src.zw)
|
2010-01-25 23:23:04 +00:00
|
|
|
|
2010-06-17 02:45:50 +01:00
|
|
|
.. opcode:: DLDEXP - Multiply Number by Integral Power of 2
|
2010-01-25 23:23:04 +00:00
|
|
|
|
2010-06-17 02:45:50 +01:00
|
|
|
This opcode is the inverse of :opcode:`DFRACEXP`.
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
2010-06-17 02:45:50 +01:00
|
|
|
dst.xy = src0.xy \times 2^{src1.xy}
|
2010-01-25 23:23:04 +00:00
|
|
|
|
2010-06-17 02:45:50 +01:00
|
|
|
dst.zw = src0.zw \times 2^{src1.zw}
|
2010-01-25 23:23:04 +00:00
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DMIN - Minimum
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = min(src0.xy, src1.xy)
|
|
|
|
|
|
|
|
dst.zw = min(src0.zw, src1.zw)
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DMAX - Maximum
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = max(src0.xy, src1.xy)
|
|
|
|
|
|
|
|
dst.zw = max(src0.zw, src1.zw)
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DMUL - Multiply
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = src0.xy \times src1.xy
|
|
|
|
|
|
|
|
dst.zw = src0.zw \times src1.zw
|
|
|
|
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DMAD - Multiply And Add
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = src0.xy \times src1.xy + src2.xy
|
|
|
|
|
|
|
|
dst.zw = src0.zw \times src1.zw + src2.zw
|
|
|
|
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DRCP - Reciprocal
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = \frac{1}{src.xy}
|
|
|
|
|
|
|
|
dst.zw = \frac{1}{src.zw}
|
|
|
|
|
2010-06-17 02:34:51 +01:00
|
|
|
.. opcode:: DSQRT - Square Root
|
2010-01-25 23:23:04 +00:00
|
|
|
|
|
|
|
.. math::
|
|
|
|
|
|
|
|
dst.xy = \sqrt{src.xy}
|
|
|
|
|
|
|
|
dst.zw = \sqrt{src.zw}
|
|
|
|
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
Explanation of symbols used
|
2009-12-22 05:04:10 +00:00
|
|
|
------------------------------
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
Functions
|
2009-12-22 05:04:10 +00:00
|
|
|
^^^^^^^^^^^^^^
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2009-12-22 03:57:56 +00:00
|
|
|
:math:`|x|` Absolute value of `x`.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:57:56 +00:00
|
|
|
:math:`\lceil x \rceil` Ceiling of `x`.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
clamp(x,y,z) Clamp x between y and z.
|
|
|
|
(x < y) ? y : (x > z) ? z : x
|
|
|
|
|
2009-12-22 03:41:09 +00:00
|
|
|
:math:`\lfloor x\rfloor` Floor of `x`.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2009-12-22 03:57:56 +00:00
|
|
|
:math:`\log_2{x}` Logarithm of `x`, base 2.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
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.
|
|
|
|
|
2009-12-22 03:41:09 +00:00
|
|
|
:math:`x^y` `x` to the power `y`.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
push(x) Push x on stack.
|
|
|
|
|
|
|
|
round(x) Round x.
|
|
|
|
|
2010-01-04 12:21:32 +00:00
|
|
|
trunc(x) Truncate x, i.e. drop the fraction bits.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
Keywords
|
2009-12-22 05:04:10 +00:00
|
|
|
^^^^^^^^^^^^^
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
|
|
|
discard Discard fragment.
|
|
|
|
|
|
|
|
pc Program counter.
|
|
|
|
|
|
|
|
target Label of target instruction.
|
|
|
|
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
Other tokens
|
2009-12-22 05:04:10 +00:00
|
|
|
---------------
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
2010-02-03 14:45:32 +00:00
|
|
|
Declaration
|
|
|
|
^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
|
|
Declares a register that is will be referenced as an operand in Instruction
|
|
|
|
tokens.
|
|
|
|
|
|
|
|
File field contains register file that is being declared and is one
|
|
|
|
of TGSI_FILE.
|
|
|
|
|
|
|
|
UsageMask field specifies which of the register components can be accessed
|
|
|
|
and is one of TGSI_WRITEMASK.
|
|
|
|
|
|
|
|
Interpolate field is only valid for fragment shader INPUT register files.
|
|
|
|
It specifes the way input is being interpolated by the rasteriser and is one
|
|
|
|
of TGSI_INTERPOLATE.
|
|
|
|
|
|
|
|
If Dimension flag is set to 1, a Declaration Dimension token follows.
|
|
|
|
|
|
|
|
If Semantic flag is set to 1, a Declaration Semantic token follows.
|
|
|
|
|
|
|
|
CylindricalWrap bitfield is only valid for fragment shader INPUT register
|
|
|
|
files. It specifies which register components should be subject to cylindrical
|
|
|
|
wrapping when interpolating by the rasteriser. If TGSI_CYLINDRICAL_WRAP_X
|
|
|
|
is set to 1, the X component should be interpolated according to cylindrical
|
|
|
|
wrapping rules.
|
|
|
|
|
|
|
|
|
2009-12-22 04:32:46 +00:00
|
|
|
Declaration Semantic
|
2009-12-22 05:04:10 +00:00
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
2009-12-21 23:25:15 +00:00
|
|
|
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
2009-12-24 07:36:06 +00:00
|
|
|
TGSI_SEMANTIC_POSITION
|
|
|
|
""""""""""""""""""""""
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-06-24 00:00:10 +01:00
|
|
|
For vertex shaders, TGSI_SEMANTIC_POSITION indicates the vertex shader
|
|
|
|
output register which contains the homogeneous vertex position in the clip
|
|
|
|
space coordinate system. After clipping, the X, Y and Z components of the
|
|
|
|
vertex will be divided by the W value to get normalized device coordinates.
|
2009-12-21 23:25:15 +00:00
|
|
|
|
2010-06-24 00:00:10 +01:00
|
|
|
For fragment shaders, TGSI_SEMANTIC_POSITION is used to indicate that
|
|
|
|
fragment shader input contains the fragment's window position. The X
|
|
|
|
component starts at zero and always increases from left to right.
|
|
|
|
The Y component starts at zero and always increases but Y=0 may either
|
|
|
|
indicate the top of the window or the bottom depending on the fragment
|
|
|
|
coordinate origin convention (see TGSI_PROPERTY_FS_COORD_ORIGIN).
|
|
|
|
The Z coordinate ranges from 0 to 1 to represent depth from the front
|
|
|
|
to the back of the Z buffer. The W component contains the reciprocol
|
|
|
|
of the interpolated vertex position W component.
|
2009-12-24 07:36:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
TGSI_SEMANTIC_COLOR
|
|
|
|
"""""""""""""""""""
|
|
|
|
|
2010-06-24 00:00:10 +01:00
|
|
|
For vertex shader outputs or fragment shader inputs/outputs, this
|
|
|
|
label indicates that the resister contains an R,G,B,A color.
|
|
|
|
|
|
|
|
Several shader inputs/outputs may contain colors so the semantic index
|
|
|
|
is used to distinguish them. For example, color[0] may be the diffuse
|
|
|
|
color while color[1] may be the specular color.
|
|
|
|
|
|
|
|
This label is needed so that the flat/smooth shading can be applied
|
|
|
|
to the right interpolants during rasterization.
|
|
|
|
|
2009-12-24 07:36:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
TGSI_SEMANTIC_BCOLOR
|
|
|
|
""""""""""""""""""""
|
|
|
|
|
|
|
|
Back-facing colors are only used for back-facing polygons, and are only valid
|
|
|
|
in vertex shader outputs. After rasterization, all polygons are front-facing
|
2010-06-24 00:00:10 +01:00
|
|
|
and COLOR and BCOLOR end up occupying the same slots in the fragment shader,
|
|
|
|
so all BCOLORs effectively become regular COLORs in the fragment shader.
|
|
|
|
|
2009-12-24 07:36:06 +00:00
|
|
|
|
|
|
|
TGSI_SEMANTIC_FOG
|
|
|
|
"""""""""""""""""
|
|
|
|
|
|
|
|
The fog coordinate historically has been used to replace the depth coordinate
|
|
|
|
for generation of fog in dedicated fog blocks. Gallium, however, does not use
|
|
|
|
dedicated fog acceleration, placing it entirely in the fragment shader
|
|
|
|
instead.
|
|
|
|
|
|
|
|
The fog coordinate should be written in ``(f, 0, 0, 1)`` format. Only the first
|
|
|
|
component matters when writing from the vertex shader; the driver will ensure
|
|
|
|
that the coordinate is in this format when used as a fragment shader input.
|
|
|
|
|
|
|
|
TGSI_SEMANTIC_PSIZE
|
|
|
|
"""""""""""""""""""
|
|
|
|
|
|
|
|
PSIZE, or point size, is used to specify point sizes per-vertex. It should
|
2010-02-03 17:27:32 +00:00
|
|
|
be in ``(s, 0, 0, 1)`` format, where ``s`` is the (possibly clamped) point size.
|
|
|
|
Only the first component matters when writing from the vertex shader.
|
2009-12-24 07:36:06 +00:00
|
|
|
|
|
|
|
When using this semantic, be sure to set the appropriate state in the
|
|
|
|
:ref:`rasterizer` first.
|
|
|
|
|
|
|
|
TGSI_SEMANTIC_GENERIC
|
|
|
|
"""""""""""""""""""""
|
|
|
|
|
|
|
|
Generic semantics are nearly always used for texture coordinate attributes,
|
|
|
|
in ``(s, t, r, q)`` format. ``t`` and ``r`` may be unused for certain kinds
|
|
|
|
of lookups, and ``q`` is the level-of-detail bias for biased sampling.
|
|
|
|
|
|
|
|
These attributes are called "generic" because they may be used for anything
|
|
|
|
else, including parameters, texture generation information, or anything that
|
|
|
|
can be stored inside a four-component vector.
|
|
|
|
|
|
|
|
TGSI_SEMANTIC_NORMAL
|
|
|
|
""""""""""""""""""""
|
|
|
|
|
2010-01-04 12:38:58 +00:00
|
|
|
Vertex normal; could be used to implement per-pixel lighting for legacy APIs
|
|
|
|
that allow mixing fixed-function and programmable stages.
|
2009-12-24 07:36:06 +00:00
|
|
|
|
|
|
|
TGSI_SEMANTIC_FACE
|
|
|
|
""""""""""""""""""
|
|
|
|
|
|
|
|
FACE is the facing bit, to store the facing information for the fragment
|
|
|
|
shader. ``(f, 0, 0, 1)`` is the format. The first component will be positive
|
|
|
|
when the fragment is front-facing, and negative when the component is
|
|
|
|
back-facing.
|
|
|
|
|
|
|
|
TGSI_SEMANTIC_EDGEFLAG
|
|
|
|
""""""""""""""""""""""
|
|
|
|
|
2010-06-24 00:38:58 +01:00
|
|
|
For vertex shaders, this sematic label indicates that an input or
|
|
|
|
output is a boolean edge flag. The register layout is [F, x, x, x]
|
|
|
|
where F is 0.0 or 1.0 and x = don't care. Normally, the vertex shader
|
|
|
|
simply copies the edge flag input to the edgeflag output.
|
|
|
|
|
|
|
|
Edge flags are used to control which lines or points are actually
|
|
|
|
drawn when the polygon mode converts triangles/quads/polygons into
|
|
|
|
points or lines.
|
|
|
|
|
2010-01-21 04:36:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
Properties
|
|
|
|
^^^^^^^^^^^^^^^^^^^^^^^^
|
|
|
|
|
|
|
|
|
|
|
|
Properties are general directives that apply to the whole TGSI program.
|
|
|
|
|
|
|
|
FS_COORD_ORIGIN
|
|
|
|
"""""""""""""""
|
|
|
|
|
|
|
|
Specifies the fragment shader TGSI_SEMANTIC_POSITION coordinate origin.
|
|
|
|
The default value is UPPER_LEFT.
|
|
|
|
|
|
|
|
If UPPER_LEFT, the position will be (0,0) at the upper left corner and
|
|
|
|
increase downward and rightward.
|
|
|
|
If LOWER_LEFT, the position will be (0,0) at the lower left corner and
|
|
|
|
increase upward and rightward.
|
|
|
|
|
|
|
|
OpenGL defaults to LOWER_LEFT, and is configurable with the
|
|
|
|
GL_ARB_fragment_coord_conventions extension.
|
|
|
|
|
|
|
|
DirectX 9/10 use UPPER_LEFT.
|
|
|
|
|
|
|
|
FS_COORD_PIXEL_CENTER
|
|
|
|
"""""""""""""""""""""
|
|
|
|
|
|
|
|
Specifies the fragment shader TGSI_SEMANTIC_POSITION pixel center convention.
|
|
|
|
The default value is HALF_INTEGER.
|
|
|
|
|
|
|
|
If HALF_INTEGER, the fractionary part of the position will be 0.5
|
|
|
|
If INTEGER, the fractionary part of the position will be 0.0
|
|
|
|
|
|
|
|
Note that this does not affect the set of fragments generated by
|
|
|
|
rasterization, which is instead controlled by gl_rasterization_rules in the
|
|
|
|
rasterizer.
|
|
|
|
|
|
|
|
OpenGL defaults to HALF_INTEGER, and is configurable with the
|
|
|
|
GL_ARB_fragment_coord_conventions extension.
|
|
|
|
|
|
|
|
DirectX 9 uses INTEGER.
|
|
|
|
DirectX 10 uses HALF_INTEGER.
|
2010-02-02 15:14:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Texture Sampling and Texture Formats
|
|
|
|
------------------------------------
|
|
|
|
|
2010-02-03 01:07:26 +00:00
|
|
|
This table shows how texture image components are returned as (x,y,z,w) tuples
|
|
|
|
by TGSI texture instructions, such as :opcode:`TEX`, :opcode:`TXD`, and
|
|
|
|
:opcode:`TXP`. For reference, OpenGL and Direct3D conventions are shown as
|
|
|
|
well.
|
2010-02-02 20:44:22 +00:00
|
|
|
|
|
|
|
+--------------------+--------------+--------------------+--------------+
|
|
|
|
| Texture Components | Gallium | OpenGL | Direct3D 9 |
|
|
|
|
+====================+==============+====================+==============+
|
2010-06-17 00:56:55 +01:00
|
|
|
| R | (r, 0, 0, 1) | (r, 0, 0, 1) | (r, 1, 1, 1) |
|
2010-02-02 20:44:22 +00:00
|
|
|
+--------------------+--------------+--------------------+--------------+
|
2010-06-17 00:56:55 +01:00
|
|
|
| RG | (r, g, 0, 1) | (r, g, 0, 1) | (r, g, 1, 1) |
|
2010-02-02 20:44:22 +00:00
|
|
|
+--------------------+--------------+--------------------+--------------+
|
|
|
|
| RGB | (r, g, b, 1) | (r, g, b, 1) | (r, g, b, 1) |
|
|
|
|
+--------------------+--------------+--------------------+--------------+
|
|
|
|
| RGBA | (r, g, b, a) | (r, g, b, a) | (r, g, b, a) |
|
|
|
|
+--------------------+--------------+--------------------+--------------+
|
|
|
|
| A | (0, 0, 0, a) | (0, 0, 0, a) | (0, 0, 0, a) |
|
|
|
|
+--------------------+--------------+--------------------+--------------+
|
|
|
|
| L | (l, l, l, 1) | (l, l, l, 1) | (l, l, l, 1) |
|
|
|
|
+--------------------+--------------+--------------------+--------------+
|
|
|
|
| LA | (l, l, l, a) | (l, l, l, a) | (l, l, l, a) |
|
|
|
|
+--------------------+--------------+--------------------+--------------+
|
|
|
|
| I | (i, i, i, i) | (i, i, i, i) | N/A |
|
|
|
|
+--------------------+--------------+--------------------+--------------+
|
|
|
|
| UV | XXX TBD | (0, 0, 0, 1) | (u, v, 1, 1) |
|
|
|
|
| | | [#envmap-bumpmap]_ | |
|
|
|
|
+--------------------+--------------+--------------------+--------------+
|
2010-02-02 23:27:07 +00:00
|
|
|
| Z | XXX TBD | (z, z, z, 1) | (0, z, 0, 1) |
|
2010-02-02 20:44:22 +00:00
|
|
|
| | | [#depth-tex-mode]_ | |
|
|
|
|
+--------------------+--------------+--------------------+--------------+
|
|
|
|
|
|
|
|
.. [#envmap-bumpmap] http://www.opengl.org/registry/specs/ATI/envmap_bumpmap.txt
|
2010-02-02 23:27:07 +00:00
|
|
|
.. [#depth-tex-mode] the default is (z, z, z, 1) but may also be (0, 0, 0, z)
|
2010-02-03 01:07:26 +00:00
|
|
|
or (z, z, z, z) depending on the value of GL_DEPTH_TEXTURE_MODE.
|