--- src/mesa/drivers/dri/i965/brw_fs.h | 2 ++ src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 12 ++++++++++++ src/mesa/drivers/dri/i965/brw_vec4.h | 3 +++ src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp | 11 +++++++++++ 4 files changed, 28 insertions(+)
diff --git a/src/mesa/drivers/dri/i965/brw_fs.h b/src/mesa/drivers/dri/i965/brw_fs.h index 6e5fa1d..df6b825 100644 --- a/src/mesa/drivers/dri/i965/brw_fs.h +++ b/src/mesa/drivers/dri/i965/brw_fs.h @@ -306,6 +306,8 @@ public: const fs_reg &a); void emit_minmax(enum brw_conditional_mod conditionalmod, const fs_reg &dst, const fs_reg &src0, const fs_reg &src1); + /** Copy any live channel from \p src to the first channel of \p dst. */ + void emit_uniformize(const fs_reg &dst, const fs_reg &src); bool try_emit_saturate(ir_expression *ir); bool try_emit_line(ir_expression *ir); bool try_emit_mad(ir_expression *ir); diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp index 4b48f2d..6f1ff20 100644 --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp @@ -337,6 +337,18 @@ fs_visitor::emit_minmax(enum brw_conditional_mod conditionalmod, const fs_reg &d } } +void +fs_visitor::emit_uniformize(const fs_reg &dst, const fs_reg &src) +{ + const fs_reg chan_index = vgrf(glsl_type::uint_type); + + emit(SHADER_OPCODE_FIND_LIVE_CHANNEL, component(chan_index, 0)) + ->force_writemask_all = true; + emit(SHADER_OPCODE_BROADCAST, component(dst, 0), + src, component(chan_index, 0)) + ->force_writemask_all = true; +} + bool fs_visitor::try_emit_saturate(ir_expression *ir) { diff --git a/src/mesa/drivers/dri/i965/brw_vec4.h b/src/mesa/drivers/dri/i965/brw_vec4.h index 7a92d59..adb5fe4 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4.h +++ b/src/mesa/drivers/dri/i965/brw_vec4.h @@ -298,6 +298,9 @@ public: void emit_lrp(const dst_reg &dst, const src_reg &x, const src_reg &y, const src_reg &a); + /** Copy any live channel from \p src to the first channel of \p dst. */ + void emit_uniformize(const dst_reg &dst, const src_reg &src); + void emit_block_move(dst_reg *dst, src_reg *src, const struct glsl_type *type, brw_predicate predicate); diff --git a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp index f6f589d..4515fc7 100644 --- a/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp +++ b/src/mesa/drivers/dri/i965/brw_vec4_visitor.cpp @@ -1304,6 +1304,17 @@ vec4_visitor::emit_lrp(const dst_reg &dst, } void +vec4_visitor::emit_uniformize(const dst_reg &dst, const src_reg &src) +{ + const src_reg chan_index(this, glsl_type::uint_type); + + emit(SHADER_OPCODE_FIND_LIVE_CHANNEL, dst_reg(chan_index)) + ->force_writemask_all = true; + emit(SHADER_OPCODE_BROADCAST, dst, src, chan_index) + ->force_writemask_all = true; +} + +void vec4_visitor::visit(ir_expression *ir) { unsigned int operand; -- 2.1.3 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev