mesa: Add a _mesa_active_fragment_shader_has_side_effects helper

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. Suggested by Jason.

v2:
- Use '_Shader', as suggested by Tapani, to fix the following CTS test:

ES31-CTS.shader_atomic_counters.advanced-usage-many-draw-calls2

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
This commit is contained in:
Iago Toral Quiroga 2015-12-18 10:17:59 +01:00 committed by Samuel Iglesias Gonsálvez
parent 57f7c85dcf
commit 1a95b87dad
3 changed files with 14 additions and 10 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -4535,11 +4535,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;
}
#ifdef __cplusplus