diff --git a/docs/gallium/screen.rst b/docs/gallium/screen.rst index cc75a2869dc..67f7049940a 100644 --- a/docs/gallium/screen.rst +++ b/docs/gallium/screen.rst @@ -639,6 +639,7 @@ The integer capabilities: * ``PIPE_CAP_HARDWARE_GL_SELECT``: Enable hardware accelerated GL_SELECT for this driver. * ``PIPE_CAP_DEVICE_PROTECTED_CONTEXT``: Whether the device supports protected / encrypted context which can manipulate protected / encrypted content (some devices might need protected contexts to access protected content, whereas ``PIPE_CAP_DEVICE_PROTECTED_SURFACE`` does not require any particular context to do so). * ``PIPE_CAP_ALLOW_GLTHREAD_BUFFER_SUBDATA_OPT``: Whether to allow glthread to convert glBufferSubData to glCopyBufferSubData. This may improve or worsen performance depending on your driver. +* ``PIPE_CAP_VALIDATE_ALL_DIRTY_STATES`` : Whether state validation must also validate the state changes for resources types used in the previous shader but not in the current shader. .. _pipe_capf: diff --git a/src/gallium/auxiliary/util/u_screen.c b/src/gallium/auxiliary/util/u_screen.c index 16c31819c89..f0e1b7e599d 100644 --- a/src/gallium/auxiliary/util/u_screen.c +++ b/src/gallium/auxiliary/util/u_screen.c @@ -523,6 +523,9 @@ u_pipe_screen_get_param_defaults(struct pipe_screen *pscreen, case PIPE_CAP_QUERY_TIMESTAMP_BITS: return 64; + case PIPE_CAP_VALIDATE_ALL_DIRTY_STATES: + return 0; + default: unreachable("bad PIPE_CAP_*"); } diff --git a/src/gallium/include/pipe/p_defines.h b/src/gallium/include/pipe/p_defines.h index 7830a7699c9..9ba20522406 100644 --- a/src/gallium/include/pipe/p_defines.h +++ b/src/gallium/include/pipe/p_defines.h @@ -1016,6 +1016,7 @@ enum pipe_cap PIPE_CAP_DEVICE_PROTECTED_CONTEXT, PIPE_CAP_ALLOW_GLTHREAD_BUFFER_SUBDATA_OPT, + PIPE_CAP_VALIDATE_ALL_DIRTY_STATES, PIPE_CAP_LAST, /* XXX do not add caps after PIPE_CAP_LAST! */ }; diff --git a/src/mesa/main/state.c b/src/mesa/main/state.c index 04ae1d1e225..4946e072662 100644 --- a/src/mesa/main/state.c +++ b/src/mesa/main/state.c @@ -397,6 +397,11 @@ update_program(struct gl_context *ctx) tcp_changed || cp_changed) { /* This will mask out unused shader resources. */ st->active_states = _mesa_get_active_states(ctx); + + /* Some drivers need to clean up previous states too */ + if (st->validate_all_dirty_states) + st->active_states |= dirty; + return _NEW_PROGRAM; } diff --git a/src/mesa/state_tracker/st_context.c b/src/mesa/state_tracker/st_context.c index 7d50658f660..a62260564c7 100644 --- a/src/mesa/state_tracker/st_context.c +++ b/src/mesa/state_tracker/st_context.c @@ -639,6 +639,10 @@ st_create_context_priv(struct gl_context *ctx, struct pipe_context *pipe, PIPE_SHADER_CAP_MAX_HW_ATOMIC_COUNTERS) ? true : false; + st->validate_all_dirty_states = + screen->get_param(screen, PIPE_CAP_VALIDATE_ALL_DIRTY_STATES) + ? true : false; + util_throttle_init(&st->throttle, screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_UPLOAD_MEMORY_BUDGET)); diff --git a/src/mesa/state_tracker/st_context.h b/src/mesa/state_tracker/st_context.h index f8c4646eb91..6f86c5eeeda 100644 --- a/src/mesa/state_tracker/st_context.h +++ b/src/mesa/state_tracker/st_context.h @@ -206,6 +206,7 @@ struct st_context boolean draw_needs_minmax_index; boolean has_hw_atomics; + boolean validate_all_dirty_states; /* driver supports scissored clears */ boolean can_scissor_clear;