freedreno: fix resource flushing confusion
authorIlia Mirkin <imirkin@alum.mit.edu>
Fri, 3 Apr 2015 02:28:21 +0000 (22:28 -0400)
committerRob Clark <robclark@freedesktop.org>
Sun, 5 Apr 2015 20:36:34 +0000 (16:36 -0400)
A resource flush is an upload of a hypothetically-staging texture to the
GPU. For a UMA system, this will largely be a no-op or
cache-maintenance. Move the render flush logic into transfer_map where
it belongs, and clear out the transfer_flush function.

Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
src/gallium/drivers/freedreno/freedreno_resource.c

index efafb8988b46982b4809d4d5222cbe0f3f9c2fa4..407a3528aaa26e2743b32051a0a66ec80fe073ef 100644 (file)
@@ -64,16 +64,6 @@ static void fd_resource_transfer_flush_region(struct pipe_context *pctx,
                struct pipe_transfer *ptrans,
                const struct pipe_box *box)
 {
-       struct fd_context *ctx = fd_context(pctx);
-       struct fd_resource *rsc = fd_resource(ptrans->resource);
-
-       if (rsc->dirty)
-               fd_context_render(pctx);
-
-       if (rsc->timestamp) {
-               fd_pipe_wait(ctx->screen->pipe, rsc->timestamp);
-               rsc->timestamp = 0;
-       }
 }
 
 static void
@@ -127,13 +117,19 @@ fd_resource_transfer_map(struct pipe_context *pctx,
        if (usage & PIPE_TRANSFER_WRITE)
                op |= DRM_FREEDRENO_PREP_WRITE;
 
-       /* some state trackers (at least XA) don't do this.. */
-       if (!(usage & (PIPE_TRANSFER_FLUSH_EXPLICIT | PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE)))
-               fd_resource_transfer_flush_region(pctx, ptrans, box);
-
        if (usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE) {
                realloc_bo(rsc, fd_bo_size(rsc->bo));
        } else if (!(usage & PIPE_TRANSFER_UNSYNCHRONIZED)) {
+               /* If the GPU is writing to the resource, or if it is reading from the
+                * resource and we're trying to write to it, flush the renders.
+                */
+               if (rsc->dirty)
+                       fd_context_render(pctx);
+
+               /* The GPU keeps track of how the various bo's are being used, and
+                * will wait if necessary for the proper operation to have
+                * completed.
+                */
                ret = fd_bo_cpu_prep(rsc->bo, ctx->screen->pipe, op);
                if (ret)
                        goto fail;