swr: call swr_update_derived unconditionally when drawing/clearing
authorIlia Mirkin <imirkin@alum.mit.edu>
Sun, 20 Nov 2016 05:04:42 +0000 (00:04 -0500)
committerIlia Mirkin <imirkin@alum.mit.edu>
Tue, 22 Nov 2016 02:11:26 +0000 (21:11 -0500)
Currently a sequence like draw/map/draw/map will cause the second map to
not wait for the second draw. This is because the first map will clear
the resource business bit, and the second draw won't reset it since no
state has changed.

swr_update_derived does a tiny bit of extra work, including updating the
SWR_BACKEND_STATE as well as waiting for prending fences. If that's a
problem, we could call swr_update_resource_status directly from
draw/clear handlers.

Fixes clearbuffer-stencil, clearbuffer-depth, clearbuffer-depth-stencil,
and clearbuffer-display-lists.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
src/gallium/drivers/swr/swr_clear.cpp
src/gallium/drivers/swr/swr_draw.cpp

index 0101b4ba32b45722ad0044442f588edac9ab7591..ff3eca85f00c3d906be52f8ce897f6a899d9ff22 100644 (file)
@@ -39,8 +39,7 @@ swr_clear(struct pipe_context *pipe,
    if (!swr_check_render_cond(pipe))
       return;
 
-   if (ctx->dirty)
-      swr_update_derived(pipe);
+   swr_update_derived(pipe);
 
    if (buffers & PIPE_CLEAR_COLOR && fb->nr_cbufs) {
       for (unsigned i = 0; i < fb->nr_cbufs; ++i)
index 39378e61bb293cab9b400947f1807d0321b02c89..920ca9f582c91ae1bee2194a328372bb13f90296 100644 (file)
@@ -90,8 +90,7 @@ swr_draw_vbo(struct pipe_context *pipe, const struct pipe_draw_info *info)
    }
 
    /* Update derived state, pass draw info to update function */
-   if (ctx->dirty)
-      swr_update_derived(pipe, info);
+   swr_update_derived(pipe, info);
 
    swr_update_draw_context(ctx);