From 153af03b941469c22a1b66e7d9e015d5564322a1 Mon Sep 17 00:00:00 2001 From: Gert Wollny Date: Tue, 3 Jan 2023 17:04:19 +0100 Subject: [PATCH] gallium: Add cap to request state validation for all dirty state With aaa4b0e6 state validation is no longer called for all changed states, but only for states that will be active with a new shader program. Not all drivers support this and might prefer if the state validation is emitted for all states that might be changed. So add a cap that the driver can signal one or the other preference, and default to the new behavior. Fixes: aaa4b0e6 st/mesa: move check_program_state code into _mesa_update_state v2: - Rename cap and and invert its meaning, query the cap only once and store it in st, handle the mask update when updating the shader i.e. not in st_validate_state (Marek) Signed-off-by: Gert Wollny Part-of: --- docs/gallium/screen.rst | 1 + src/gallium/auxiliary/util/u_screen.c | 3 +++ src/gallium/include/pipe/p_defines.h | 1 + src/mesa/main/state.c | 5 +++++ src/mesa/state_tracker/st_context.c | 4 ++++ src/mesa/state_tracker/st_context.h | 1 + 6 files changed, 15 insertions(+) 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;