[Mesa-dev] [PATCH 3/5] gallivm: implement support for SQRT opcode
Brian Paul
brianp at vmware.com
Fri Feb 1 10:29:54 PST 2013
---
src/gallium/auxiliary/gallivm/lp_bld_limits.h | 2 +
src/gallium/auxiliary/gallivm/lp_bld_tgsi.h | 2 +
src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c | 33 ++++++++++++++++++++
3 files changed, 37 insertions(+), 0 deletions(-)
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_limits.h b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
index 30bed1b..29bb9e3 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_limits.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_limits.h
@@ -110,6 +110,8 @@ gallivm_get_shader_param(enum pipe_shader_cap param)
return 1;
case PIPE_SHADER_CAP_MAX_TEXTURE_SAMPLERS:
return PIPE_MAX_SAMPLERS;
+ case PIPE_SHADER_CAP_TGSI_SQRT_SUPPORTED:
+ return 1;
default:
return 0;
}
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
index 4898849..f9bd2c6 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
+++ b/src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
@@ -309,6 +309,8 @@ struct lp_build_tgsi_context
* should compute 1 / sqrt (src0.x) */
struct lp_build_tgsi_action rsq_action;
+ struct lp_build_tgsi_action sqrt_action;
+
const struct tgsi_shader_info *info;
lp_build_emit_fetch_fn emit_fetch_funcs[TGSI_FILE_COUNT];
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;
--
1.7.3.4
More information about the mesa-dev
mailing list