[Mesa-dev] [PATCH v2 1/2] mesa: Add a _mesa_active_fragment_shader_has_side_effects helper
Samuel Iglesias Gonsálvez
siglesias at igalia.com
Tue Dec 22 00:47:55 PST 2015
On Tue, 2015-12-22 at 10:39 +0200, Tapani Pälli wrote:
>
> On 12/16/2015 10:59 AM, Iago Toral Quiroga wrote:
> > Some drivers can disable the FS unit if there is nothing in the
> > shader code
> > that writes to an output (i.e. color, depth, etc). Right now, mesa
> > has
> > a function to check for atomic buffers and the i965 driver also
> > checks for
> > images. Refactor this logic into a generic function that we can use
> > for
> > any source of side effects in a fragment shader. Sugested by Jason.
> > ---
> > src/mesa/drivers/dri/i965/gen7_wm_state.c | 6 +-----
> > src/mesa/drivers/dri/i965/gen8_ps_state.c | 3 +--
> > src/mesa/main/mtypes.h | 15 ++++++++++++---
> > 3 files changed, 14 insertions(+), 10 deletions(-)
> >
> > diff --git a/src/mesa/drivers/dri/i965/gen7_wm_state.c
> > b/src/mesa/drivers/dri/i965/gen7_wm_state.c
> > index 06d5e65..a6d1028 100644
> > --- a/src/mesa/drivers/dri/i965/gen7_wm_state.c
> > +++ b/src/mesa/drivers/dri/i965/gen7_wm_state.c
> > @@ -77,13 +77,9 @@ upload_wm_state(struct brw_context *brw)
> > dw1 |= GEN7_WM_KILL_ENABLE;
> > }
> >
> > - if (_mesa_active_fragment_shader_has_atomic_ops(&brw->ctx)) {
> > - dw1 |= GEN7_WM_DISPATCH_ENABLE;
> > - }
> > -
> > /* _NEW_BUFFERS | _NEW_COLOR */
> > if (brw_color_buffer_write_enabled(brw) || writes_depth ||
> > - prog_data->base.nr_image_params ||
> > + _mesa_active_fragment_shader_has_side_effects(&brw->ctx) ||
> > dw1 & GEN7_WM_KILL_ENABLE) {
> > dw1 |= GEN7_WM_DISPATCH_ENABLE;
> > }
> > diff --git a/src/mesa/drivers/dri/i965/gen8_ps_state.c
> > b/src/mesa/drivers/dri/i965/gen8_ps_state.c
> > index 945f710..3cc8c68 100644
> > --- a/src/mesa/drivers/dri/i965/gen8_ps_state.c
> > +++ b/src/mesa/drivers/dri/i965/gen8_ps_state.c
> > @@ -90,8 +90,7 @@ gen8_upload_ps_extra(struct brw_context *brw,
> > *
> > * BRW_NEW_FS_PROG_DATA | BRW_NEW_FRAGMENT_PROGRAM |
> > _NEW_BUFFERS | _NEW_COLOR
> > */
> > - if ((_mesa_active_fragment_shader_has_atomic_ops(&brw->ctx) ||
> > - prog_data->base.nr_image_params) &&
> > + if (_mesa_active_fragment_shader_has_side_effects(&brw->ctx) &&
> > !brw_color_buffer_write_enabled(brw))
> > dw1 |= GEN8_PSX_SHADER_HAS_UAV;
> >
> > diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h
> > index 191a9ea..834ba59 100644
> > --- a/src/mesa/main/mtypes.h
> > +++ b/src/mesa/main/mtypes.h
> > @@ -4538,11 +4538,20 @@ enum _debug
> > DEBUG_INCOMPLETE_FBO = (1 << 3)
> > };
> >
> > +/**
> > + * Checks if the active fragment shader program can have side
> > effects due
> > + * to use of things like atomic buffers or images
> > + */
> > static inline bool
> > -_mesa_active_fragment_shader_has_atomic_ops(const struct
> > gl_context *ctx)
> > +_mesa_active_fragment_shader_has_side_effects(const struct
> > gl_context *ctx)
> > {
> > - return ctx->Shader._CurrentFragmentProgram != NULL &&
> > - ctx->Shader._CurrentFragmentProgram-
> > >_LinkedShaders[MESA_SHADER_FRAGMENT]->NumAtomicBuffers > 0;
> > + const struct gl_shader *sh;
> > +
> > + if (!ctx->Shader._CurrentFragmentProgram)
> > + return false;
> > +
> > + sh = ctx->Shader._CurrentFragmentProgram-
> > >_LinkedShaders[MESA_SHADER_FRAGMENT];
> > + return sh->NumAtomicBuffers > 0 || sh->NumImages > 0;
>
> If you make this use '_Shader' it will fix also following test:
>
> ES31-CTS.shader_atomic_counters.advanced-usage-many-draw-calls2
>
> This is filed as bug here:
> https://bugs.freedesktop.org/show_bug.cgi?id=93317
>
> (sorry for late notice, took quite some time to figure this out :/)
>
No problem. I have not pushed anything yet :-)
Thanks!
Sam
> > }
> >
> > #ifdef __cplusplus
> >
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list