[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