[Mesa-dev] i965/cs: Enable barrier in MEDIA_INTERFACE_DESCRIPTOR
Kristian Høgsberg
krh at bitplanet.net
Wed Sep 9 17:13:05 PDT 2015
Jordan Justen <jordan.l.justen at intel.com> writes:
> Enable barrier in MEDIA_INTERFACE_DESCRIPTOR if the program uses the
> barrier() GLSL function.
>
> On Ivy Bridge and Haswell, this allows the piglit test
> tests/spec/arb_compute_shader/execution/simple-barrier-atomics.shader_test
> to pass. On gen8, this enables a similar test with a local group size
> of 896 to pass.
>
> Signed-off-by: Jordan Justen <jordan.l.justen at intel.com>
>
> ---
> src/mesa/drivers/dri/i965/brw_context.h | 1 +
> src/mesa/drivers/dri/i965/brw_cs.cpp | 4 +++-
> src/mesa/drivers/dri/i965/brw_defines.h | 2 ++
> src/mesa/drivers/dri/i965/brw_fs_nir.cpp | 2 ++
> 4 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_context.h b/src/mesa/drivers/dri/i965/brw_context.h
> index cd43ac5..883c75c 100644
> --- a/src/mesa/drivers/dri/i965/brw_context.h
> +++ b/src/mesa/drivers/dri/i965/brw_context.h
> @@ -441,6 +441,7 @@ struct brw_cs_prog_data {
> GLuint dispatch_grf_start_reg_16;
> unsigned local_size[3];
> unsigned simd_size;
> + bool uses_barrier;
> };
>
> /**
> diff --git a/src/mesa/drivers/dri/i965/brw_cs.cpp b/src/mesa/drivers/dri/i965/brw_cs.cpp
> index 29ee75b..4ff012a 100644
> --- a/src/mesa/drivers/dri/i965/brw_cs.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_cs.cpp
> @@ -384,7 +384,9 @@ brw_upload_cs_state(struct brw_context *brw)
> SET_FIELD(threads, GEN8_MEDIA_GPGPU_THREAD_COUNT) :
> SET_FIELD(threads, MEDIA_GPGPU_THREAD_COUNT);
> assert(threads <= brw->max_cs_threads);
> - desc[dw++] = media_threads;
> + desc[dw++] =
> + SET_FIELD(cs_prog_data->uses_barrier, MEDIA_BARRIER_ENABLE) |
> + media_threads;
>
> BEGIN_BATCH(4);
> OUT_BATCH(MEDIA_INTERFACE_DESCRIPTOR_LOAD << 16 | (4 - 2));
> diff --git a/src/mesa/drivers/dri/i965/brw_defines.h b/src/mesa/drivers/dri/i965/brw_defines.h
> index f595366..95d74ba 100644
> --- a/src/mesa/drivers/dri/i965/brw_defines.h
> +++ b/src/mesa/drivers/dri/i965/brw_defines.h
> @@ -2615,6 +2615,8 @@ enum brw_wm_barycentric_interp_mode {
>
> #define MEDIA_INTERFACE_DESCRIPTOR_LOAD 0x7002
> /* GEN7 DW5, GEN8+ DW6 */
> +# define MEDIA_BARRIER_ENABLE_SHIFT 21
> +# define MEDIA_BARRIER_ENABLE_MASK INTEL_MASK(21, 21)
> # define MEDIA_GPGPU_THREAD_COUNT_SHIFT 0
> # define MEDIA_GPGPU_THREAD_COUNT_MASK INTEL_MASK(7, 0)
> # define GEN8_MEDIA_GPGPU_THREAD_COUNT_SHIFT 0
> diff --git a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> index e922a85..5549a2d 100644
> --- a/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> +++ b/src/mesa/drivers/dri/i965/brw_fs_nir.cpp
> @@ -1575,7 +1575,9 @@ fs_visitor::nir_emit_intrinsic(const fs_builder &bld, nir_intrinsic_instr *instr
> }
>
> case nir_intrinsic_barrier:
> + assert(stage == MESA_SHADER_COMPUTE);
> emit_barrier();
> + ((struct brw_cs_prog_data *) prog_data)->uses_barrier = true;
> break;
We can get a barrier in tess control shaders too - how about
if (stage == MESA_SHADER_COMPUTE)
((struct brw_cs_prog_data *) prog_data)->uses_barrier = true;
instead?
With that change,
Reviewed-by: Kristian Høgsberg <krh at bitplanet.net>
More information about the mesa-dev
mailing list