st/xa: Bind destination before setting new state
authorThomas Hellstrom <thellstrom@vmware.com>
Mon, 7 Apr 2014 09:37:39 +0000 (02:37 -0700)
committerThomas Hellstrom <thellstrom@vmware.com>
Tue, 8 Apr 2014 05:34:10 +0000 (22:34 -0700)
Binding a new destination may cause the svga driver to emit draw calls
while propagating the surface. Make sure this doesn't happen in the middle
of sampler state setup where state may be incosistent.

In practice, surface propagation should never happen here and even if it did,
it wouldn't be a valid reason for the svga driver to emit partially set up
state, but to avoid future uncertainties, make sure this doesn't happen
anyway.

Found while auditing the state tracker for inconsistent sampler state /
sampler view setup.

Cc: "10.1" <mesa-stable@freedesktop.org>
Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com>
Reviewed-by: Jakob Bornecrantz <jakob@vmware.com>
src/gallium/state_trackers/xa/xa_renderer.c

index 9ba78bed4df06c9a20aaefbfee7c404173e0ed9a..0f5044df9e2cc832b93cbdc6fd903bcc8f24b0b6 100644 (file)
@@ -406,6 +406,9 @@ renderer_copy_prepare(struct xa_context *r,
                                       PIPE_BIND_RENDER_TARGET));
     (void)screen;
 
+    renderer_bind_destination(r, dst_surface,
+                             dst_surface->width, dst_surface->height);
+
     /* set misc state we care about */
     {
        struct pipe_blend_state blend;
@@ -435,9 +438,6 @@ renderer_copy_prepare(struct xa_context *r,
        cso_single_sampler_done(r->cso, PIPE_SHADER_FRAGMENT);
     }
 
-    renderer_bind_destination(r, dst_surface,
-                             dst_surface->width, dst_surface->height);
-
     /* texture/sampler view */
     {
        struct pipe_sampler_view templ;