iris: Update SURFACE_STATE addresses when setting sampler views
authorKenneth Graunke <kenneth@whitecape.org>
Fri, 15 Nov 2019 23:18:06 +0000 (15:18 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Mon, 25 Nov 2019 23:54:54 +0000 (15:54 -0800)
We may have replaced the backing storage for a texture buffer while it
was unbound, at which point iris_rebind_buffer would not have caught it
and updated it.  We need to ensure that the current resource's address
matches the one our SURFACE_STATE points at.  If not, update addresses
and re-upload the SURFACE_STATE.

Shader images and buffers do not suffer from this problem because we
re-stream the surface state on every set call, since there isn't a
created CSO object for those with a saved SURFACE_STATE.  Constant
buffers are also currently re-streamed (we pitch the SURFACE_STATE
on every set_constant_buffer call).  Surfaces would need this
treatment (as they're created CSOs) except that we never swap out
their backing storage today (we only do it for buffers), so it's OK
for now.

Fixes misrendering in Unreal 4 demos (Elemental, Matinee Fight Scene).
Huge thanks to Andrii Simiklit for tracking down the problem - it was
quite difficult to find!  Also fixes Andrii's new Piglit test for the
bug, 'arb_texture_buffer_object-re-init'.

Closes: https://gitlab.freedesktop.org/mesa/mesa/issues/1365
src/gallium/drivers/iris/iris_state.c

index 2a1e53d964349f3d473ca099b498c7f663ef2aaa..a30aa61b3ce9465dc4fd4e897b70442ee23b822b 100644 (file)
@@ -2790,6 +2790,9 @@ iris_set_sampler_views(struct pipe_context *ctx,
          view->res->bind_stages |= 1 << stage;
 
          shs->bound_sampler_views |= 1 << (start + i);
+
+         update_surface_state_addrs(ice->state.surface_uploader,
+                                    &view->surface_state, view->res->bo);
       }
    }