浏览代码

gallium: add TGSI opcodes UARL and UCMP

They are needed by glsl_to_tgsi for an efficient implementation using native
integers.

Reviewed-by: Brian Paul <brianp@vmware.com>
tags/mesa-8.0-rc1
Bryan Cain 14 年前
父节点
当前提交
324ac982d8

+ 30
- 0
src/gallium/auxiliary/tgsi/tgsi_exec.c 查看文件

@@ -3366,6 +3366,28 @@ micro_usne(union tgsi_exec_channel *dst,
dst->u[3] = src0->u[3] != src1->u[3] ? ~0 : 0;
}

static void
micro_uarl(union tgsi_exec_channel *dst,
const union tgsi_exec_channel *src)
{
dst->i[0] = src->u[0];
dst->i[1] = src->u[1];
dst->i[2] = src->u[2];
dst->i[3] = src->u[3];
}

static void
micro_ucmp(union tgsi_exec_channel *dst,
const union tgsi_exec_channel *src0,
const union tgsi_exec_channel *src1,
const union tgsi_exec_channel *src2)
{
dst->u[0] = src0->u[0] ? src1->u[0] : src2->u[0];
dst->u[1] = src0->u[1] ? src1->u[1] : src2->u[1];
dst->u[2] = src0->u[2] ? src1->u[2] : src2->u[2];
dst->u[3] = src0->u[3] ? src1->u[3] : src2->u[3];
}

static void
exec_instruction(
struct tgsi_exec_machine *mach,
@@ -4126,6 +4148,14 @@ exec_instruction(
assert(0);
break;

case TGSI_OPCODE_UARL:
exec_vector_unary(mach, inst, micro_uarl, TGSI_EXEC_DATA_INT, TGSI_EXEC_DATA_UINT);
break;

case TGSI_OPCODE_UCMP:
exec_vector_trinary(mach, inst, micro_ucmp, TGSI_EXEC_DATA_FLOAT, TGSI_EXEC_DATA_UINT);
break;

default:
assert( 0 );
}

+ 3
- 0
src/gallium/auxiliary/tgsi/tgsi_info.c 查看文件

@@ -189,6 +189,9 @@ static const struct tgsi_opcode_info opcode_info[TGSI_OPCODE_LAST] =
{ 1, 2, 0, 0, 0, 0, "RESINFO", TGSI_OPCODE_RESINFO },
{ 1, 2, 0, 0, 0, 0, "SAMPLE_POS", TGSI_OPCODE_SAMPLE_POS },
{ 1, 2, 0, 0, 0, 0, "SAMPLE_INFO", TGSI_OPCODE_SAMPLE_INFO },
{ 1, 1, 0, 0, 0, 0, "UARL", TGSI_OPCODE_UARL },
{ 1, 3, 0, 0, 0, 0, "UCMP", TGSI_OPCODE_UCMP },
};

const struct tgsi_opcode_info *

+ 19
- 0
src/gallium/docs/source/tgsi.rst 查看文件

@@ -1013,6 +1013,25 @@ XXX so let's discuss it, yeah?
dst.w = src0.w \oplus src1.w


.. opcode:: UCMP - Integer Conditional Move

.. math::

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


.. opcode:: UARL - Integer Address Register Load

Moves the contents of the source register, assumed to be an integer, into the
destination register, which is assumed to be an address (ADDR) register.


.. opcode:: SAD - Sum Of Absolute Differences

.. math::

+ 4
- 1
src/gallium/include/pipe/p_shader_tokens.h 查看文件

@@ -363,7 +363,10 @@ struct tgsi_property_data {
#define TGSI_OPCODE_SAMPLE_POS 155
#define TGSI_OPCODE_SAMPLE_INFO 156

#define TGSI_OPCODE_LAST 157
#define TGSI_OPCODE_UARL 157
#define TGSI_OPCODE_UCMP 158

#define TGSI_OPCODE_LAST 159

#define TGSI_SAT_NONE 0 /* do not saturate */
#define TGSI_SAT_ZERO_ONE 1 /* clamp to [0,1] */

正在加载...
取消
保存