iris: Handle PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE somewhat
authorKenneth Graunke <kenneth@whitecape.org>
Tue, 1 Jan 2019 06:03:35 +0000 (22:03 -0800)
committerKenneth Graunke <kenneth@whitecape.org>
Thu, 21 Feb 2019 18:26:11 +0000 (10:26 -0800)
Various places in the transfer code need to know whether they must
read the existing resource's values.  Rather than checking both flags
everywhere, just make PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE also flag
PIPE_TRANSFER_DISCARD_RANGE - if we can discard everything, we can
discard a subrange, too.

Obviously, we can do better for PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE,
but eventually u_threaded_context should handle swapping out buffers
for new idle buffers, anyway.  In the meantime, this is at least better.

src/gallium/drivers/iris/iris_resource.c

index 48f348b643e0c62a49f8d1e18be0983108a5aefd..ca8832c5b345d0afd1eda6686f845849ad819f89 100644 (file)
@@ -824,6 +824,12 @@ iris_transfer_map(struct pipe_context *ctx,
    struct iris_resource *res = (struct iris_resource *)resource;
    struct isl_surf *surf = &res->surf;
 
+    /* If we can discard the whole resource, we can also discard the
+     * subrange being accessed.
+     */
+    if (usage & PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE)
+       usage |= PIPE_TRANSFER_DISCARD_RANGE;
+
    if (surf->tiling != ISL_TILING_LINEAR &&
        (usage & PIPE_TRANSFER_MAP_DIRECTLY))
       return NULL;
@@ -841,9 +847,6 @@ iris_transfer_map(struct pipe_context *ctx,
    struct iris_transfer *map = slab_alloc(&ice->transfer_pool);
    struct pipe_transfer *xfer = &map->base;
 
-   // PIPE_TRANSFER_DISCARD_WHOLE_RESOURCE
-   // PIPE_TRANSFER_DISCARD_RANGE
-
    if (!map)
       return NULL;