mesa/src
Kenneth Graunke 77ff616b59 iris: Check prog[] instead of uncompiled[] for BLORP state skipping
Huge thanks to Tapani Pälli for debugging this issue, figuring out
what was going wrong, proposing fixes, and walking me through where
things were going off the rails.

BLORP always disables tessellation and geometry shaders.  Our handling
tried to look at ice->shaders.uncompiled[] to determine whether the next
draw needed those shaders.  If not, we can leave BLORP's residual state
that disabled those stages in place, and skip looking at it.

Unfortunately, predicting the future is a bit fraught, in part due to
the uncompiled[] and prog[] arrays being slightly out of sync at times.

Consider the following case:

1. Draw with tessellation shaders in place

   => uncompiled[TES] and prog[TES] will both point at valid shaders.

2. Gallium calls pipe->bind_tes_state(NULL).

   => This makes uncompiled[TES] point at NULL, and flags
      IRIS_STAGE_DIRTY_UNCOMPILED_TES.

      Because iris_update_compiled_shaders() hasn't happened yet,
      uncompiled[TES] is NULL but prog[TES] has the stale TES from
      the previous draw still.

3. BLORP operations happen

   => BLORP sees uncompiled[TES] == NULL and decides that tessellation
      is off for the upcoming draws.  So it skips flagging tess state.

4. Gallium calls pipe->bind_tes_state(shader from step #1).

   => uncompiled[TES] points at the original shader.
      IRIS_STAGE_DIRTY_UNCOMPILED_TES gets flagged again.

5. Draw again

   => This calls iris_update_compiled_shaders(), which sees that
      a TES is bound, and calls iris_update_compiled_tes().  But
      because the same shader was bound as before, the program it
      comes up with is identical to the one already bound at
      ice->shaders.prog[TES].  So, it thinks it doesn't have to
      flag any tessellation state dirty because it was already
      set up for the last draw.

This random unbind and rebind between draws leads to a situation
where, at step #3, BLORP thinks it can skip flagging tessellation
state (nothing is bound), and at step #5, normal state handling
thinks it can skip flagging tessellation state (nothing changed
since last time).  So nobody does, and things break.

This unbind appears to be happening when st_release_variants()
decides it wants to free some shaders.  Then a rebind happens to
put back the actual shader for the draw.  So, it's not theoretical.

To fix this, we change BLORP to look at ice->shaders.prog[] rather
than uncompiled[].  This is equivalent to thinking about the previous
draw, rather than the next.  If the last draw had tessellation off,
then BLORP's disabling was a no-op, and the GPU is still in the same
state as the previous draw.  This is more reliable than predicting
the future.

Cc: mesa-stable
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/8308
Closes: https://gitlab.freedesktop.org/mesa/mesa/-/issues/9678
Reviewed-by: Tapani Pälli <tapani.palli@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24880>
(cherry picked from commit d693027a00)
2023-09-22 11:08:44 -07:00
..
amd ac/nir/ngg: Wait for attribute ring stores in mesh shaders. 2023-09-22 08:46:39 -07:00
android_stub util/log: improve logger_android 2023-02-22 17:55:40 +00:00
asahi asahi: Use txf_ms for MSAA background programs 2023-07-05 05:11:49 +00:00
broadcom v3d/qpu: fix type of function argument 2023-09-22 08:46:38 -07:00
c11 treewide: Replace the usage of TRUE/FALSE with true/false 2023-06-27 18:18:28 +08:00
compiler clc: use CLANG_RESOURCE_DIR for clang's resource path 2023-09-22 16:50:19 +00:00
drm-shim drm-shim: Avoid assertion fail if someone does close(-1). 2023-06-01 01:50:41 +00:00
egl egl/wayland: Always initialise fd_display_gpu 2023-09-22 17:31:12 +00:00
etnaviv etnaviv: linker: handle scenario where there are FS inputs without matching VS output 2023-07-11 11:15:31 +00:00
freedreno tu: Pass real size of prime buffers to allocator 2023-09-22 11:08:42 -07:00
gallium iris: Check prog[] instead of uncompiled[] for BLORP state skipping 2023-09-22 11:08:44 -07:00
gbm gbm: drop unnecessary vulkan dependency 2023-02-23 18:31:22 +00:00
getopt
glx glxsw: check geometry of drawables on creation 2023-08-31 14:36:20 -07:00
gtest gtest: Update to 1.13.0 2023-05-14 11:09:02 +00:00
imagination pvr: do not claim support for ASTC texture compression 2023-08-31 23:30:45 -07:00
imgui
intel intel: Allow using intel_clc from the system 2023-09-22 16:50:20 +00:00
loader dri3: only invalidate drawables on geometry change if geometry has changed 2023-06-15 12:22:24 +00:00
mapi mapi: Remove dead struct _glapi_function in glapi/glapi_getproc.c 2023-06-29 01:36:09 +00:00
mesa mesa: fix some TexParameter and SamplerParameter cases 2023-09-22 08:46:38 -07:00
microsoft ci: avoid running hardware jobs if lint fails - now on Windows too! 2023-07-13 08:42:55 -07:00
nouveau nv50/ir/nir: Fix zero source handling of tex instructions. 2023-08-31 16:08:02 -07:00
panfrost panfrost: upcast uint8/uint16 before shifting them beyond their range 2023-08-31 23:41:22 -07:00
tool meson: remove needless c++17-overrides 2023-05-19 12:45:31 +00:00
util disk_cache: Disable the "List" test for RO disk cache. 2023-09-22 08:46:38 -07:00
virtio venus: fix cmd state leak across implicit reset 2023-08-09 10:00:41 -07:00
vulkan vulkan/wsi/x11: Implement capture hotkey using the keymap 2023-09-22 11:08:43 -07:00
.clang-format clang-format: add wayland foreach macros 2023-07-07 23:00:06 +00:00
meson.build lavapipe: Include llvmpipe 2023-06-30 12:56:35 +00:00