[Mesa-dev] [PATCH] i965/simd8vs: Fix SIMD8 atomics (read-only)
Francisco Jerez
currojerez at riseup.net
Wed Feb 18 05:25:37 PST 2015
Jordan Justen <jordan.l.justen at intel.com> writes:
> An *untested* update for d9cd982d556be560af3bcbcdaf62b6b93eb934a5.
>
> A similar change was needed for CS to allow the piglit test
> tests/spec/arb_compute_shader/execution/simple-barrier-atomics.shader_test
> to pass.
>
> I think the previous change will fix cases that write atomics, such as
> atomicCounterIncrement, and this change will fix cases than only read
> atomics, such as atomicCounter.
>
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
> Cc: Ben Widawsky <ben at bwidawsk.net>
> Cc: Francisco Jerez <currojerez at riseup.net>
> ---
> src/mesa/drivers/dri/i965/brw_fs_visitor.cpp | 24 ++++++++++++++++--------
> 1 file changed, 16 insertions(+), 8 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> index c7f321f..951c0ba 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_visitor.cpp
> @@ -3042,9 +3042,6 @@ void
> fs_visitor::emit_untyped_surface_read(unsigned surf_index, fs_reg dst,
> fs_reg offset)
> {
> - bool uses_kill =
> - (stage == MESA_SHADER_FRAGMENT) &&
> - ((brw_wm_prog_data*) this->prog_data)->uses_kill;
> int reg_width = dispatch_width / 8;
>
> fs_reg *sources = ralloc_array(mem_ctx, fs_reg, 2);
> @@ -3054,13 +3051,24 @@ fs_visitor::emit_untyped_surface_read(unsigned surf_index, fs_reg dst,
> emit(MOV(sources[0], fs_reg(0u)))
> ->force_writemask_all = true;
>
> - if (uses_kill) {
> - emit(MOV(component(sources[0], 7), brw_flag_reg(0, 1)))
> - ->force_writemask_all = true;
> + if (stage == MESA_SHADER_FRAGMENT) {
> + if (((brw_wm_prog_data*)this->prog_data)->uses_kill) {
> + emit(MOV(component(sources[0], 7), brw_flag_reg(0, 1)))
> + ->force_writemask_all = true;
> + } else {
> + emit(MOV(component(sources[0], 7),
> + retype(brw_vec1_grf(1, 7), BRW_REGISTER_TYPE_UD)))
> + ->force_writemask_all = true;
> + }
> } else {
> + /* The execution mask is part of the side-band information sent together with
> + * the message payload to the data port. It's implicitly ANDed with the sample
> + * mask sent in the header to compute the actual set of channels that execute
> + * the atomic operation.
> + */
> + assert(stage == MESA_SHADER_VERTEX);
> emit(MOV(component(sources[0], 7),
> - retype(brw_vec1_grf(1, 7), BRW_REGISTER_TYPE_UD)))
> - ->force_writemask_all = true;
> + brw_imm_ud(0xff)))->force_writemask_all = true;
> }
>
> /* Set the surface read offset. */
> --
> 2.1.4
Looks OK to me,
Reviewed-by: Francisco Jerez <currojerez at riseup.net>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20150218/e9aa79b1/attachment.sig>
More information about the mesa-dev
mailing list