mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-28 06:00:10 +01:00
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:
parent
57f7c85dcf
commit
1a95b87dad
3 changed files with 14 additions and 10 deletions
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue