summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c
diff options
context:
space:
mode:
authorBrian Paul <brianp@vmware.com>2013-02-01 11:16:22 -0700
committerBrian Paul <brianp@vmware.com>2013-02-04 09:33:44 -0700
commit2d367e40d98b4084a28e4c6a97ffd234984f9eca (patch)
tree7a7bc8faf7ef11933ea9f933f45cc27864184e0f /src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c
parentad30e4545b4f8b9cbcd0223266a2a461290f4143 (diff)
downloadexternal_mesa3d-2d367e40d98b4084a28e4c6a97ffd234984f9eca.zip
external_mesa3d-2d367e40d98b4084a28e4c6a97ffd234984f9eca.tar.gz
external_mesa3d-2d367e40d98b4084a28e4c6a97ffd234984f9eca.tar.bz2
gallivm: implement support for SQRT opcode
Diffstat (limited to 'src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c
index 8159beb..41ddd99 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c
@@ -648,6 +648,26 @@ const struct lp_build_tgsi_action rsq_action = {
};
+/* TGSI_OPCODE_SQRT */
+
+static void
+sqrt_emit(
+ const struct lp_build_tgsi_action * action,
+ struct lp_build_tgsi_context * bld_base,
+ struct lp_build_emit_data * emit_data)
+{
+ if (bld_base->sqrt_action.emit) {
+ bld_base->sqrt_action.emit(&bld_base->sqrt_action, bld_base, emit_data);
+ } else {
+ emit_data->output[emit_data->chan] = bld_base->base.undef;
+ }
+}
+
+const struct lp_build_tgsi_action sqrt_action = {
+ scalar_unary_fetch_args, /* fetch_args */
+ sqrt_emit /* emit */
+};
+
/* TGSI_OPCODE_SCS */
static void
scs_emit(
@@ -839,6 +859,7 @@ lp_set_default_actions(struct lp_build_tgsi_context * bld_base)
bld_base->op_actions[TGSI_OPCODE_LIT] = lit_action;
bld_base->op_actions[TGSI_OPCODE_LOG] = log_action;
bld_base->op_actions[TGSI_OPCODE_RSQ] = rsq_action;
+ bld_base->op_actions[TGSI_OPCODE_SQRT] = sqrt_action;
bld_base->op_actions[TGSI_OPCODE_POW] = pow_action;
bld_base->op_actions[TGSI_OPCODE_SCS] = scs_action;
bld_base->op_actions[TGSI_OPCODE_XPD] = xpd_action;
@@ -1322,6 +1343,17 @@ recip_sqrt_emit_cpu(
emit_data->args[0]);
}
+static void
+sqrt_emit_cpu(
+ const struct lp_build_tgsi_action * action,
+ struct lp_build_tgsi_context * bld_base,
+ struct lp_build_emit_data * emit_data)
+{
+ emit_data->output[emit_data->chan] = lp_build_sqrt(&bld_base->base,
+ emit_data->args[0]);
+}
+
+
/* TGSI_OPCODE_ROUND (CPU Only) */
static void
round_emit_cpu(
@@ -1665,6 +1697,7 @@ lp_set_default_actions_cpu(
bld_base->op_actions[TGSI_OPCODE_TRUNC].emit = trunc_emit_cpu;
bld_base->rsq_action.emit = recip_sqrt_emit_cpu;
+ bld_base->sqrt_action.emit = sqrt_emit_cpu;
bld_base->op_actions[TGSI_OPCODE_UADD].emit = uadd_emit_cpu;
bld_base->op_actions[TGSI_OPCODE_UDIV].emit = udiv_emit_cpu;