[Mesa-dev] [RFC 24/27] i965/fs: Add helpers for de/normalizing values
Topi Pohjolainen
topi.pohjolainen at intel.com
Sat Feb 22 01:05:50 PST 2014
Signed-off-by: Topi Pohjolainen <topi.pohjolainen at intel.com>
---
src/mesa/drivers/dri/i965/brw_fs.h | 6 +++++
src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 39 ++++++++++++++++++++++++++++
2 files changed, 45 insertions(+)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h
index 968ae77..2b3ac34 100644
--- a/src/mesa/drivers/dri/i965/brw_fs.h
+++ b/src/mesa/drivers/dri/i965/brw_fs.h
@@ -514,6 +514,12 @@ public:
void visit_atomic_counter_intrinsic(ir_call *ir);
fs_reg fetch_resinfo(int sampler, const fs_reg& lod);
+ void normalize(const fs_reg& norm,
+ const fs_reg& unorm,
+ const fs_reg& range);
+ void denormalize(const fs_reg& unorm,
+ const fs_reg& norm,
+ const fs_reg& range);
struct gl_fragment_program *fp;
diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
index 42836ac..10afe5d 100644
--- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
+++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
@@ -1589,6 +1589,45 @@ fs_visitor::fetch_resinfo(int sampler, const fs_reg& lod)
}
void
+fs_visitor::denormalize(const fs_reg& unorm,
+ const fs_reg& norm,
+ const fs_reg& range)
+{
+ fs_reg range_f = fs_reg(this, glsl_type::float_type);
+ fs_reg unorm_f = fs_reg(this, glsl_type::float_type);
+
+ /* Make sure the math is performed using floats - range is likely to be
+ * unsigned. Move will do the needed conversion and optimizing passes will
+ * remove the copy if the range is already a float.
+ */
+ emit(MOV(range_f, range));
+
+ emit(MUL(unorm_f, norm, range_f));
+
+ /* Such as range the unnormalized is likely to be unsigned. */
+ emit(MOV(unorm, unorm_f));
+}
+
+void
+fs_visitor::normalize(const fs_reg& norm,
+ const fs_reg& unorm,
+ const fs_reg& range)
+{
+ fs_reg range_inv = fs_reg(this, glsl_type::float_type);
+ fs_reg unorm_f = fs_reg(this, glsl_type::float_type);
+
+ /* Make sure the math is performed using floats - range and unnormalized
+ * are likely to be unsigned. Move will do the needed conversion and
+ * optimizing passes will remove the copies if they are already floats.
+ */
+ emit(MOV(range_inv, range));
+ emit(MOV(unorm_f, unorm));
+
+ emit(SHADER_OPCODE_RCP, range_inv, range_inv);
+ emit(MUL(norm, unorm_f, range_inv));
+}
+
+void
fs_visitor::visit(ir_texture *ir)
{
fs_inst *inst = NULL;
--
1.8.3.1
More information about the mesa-dev
mailing list