gallium: add PIPE_RESOURCE_FLAG_SINGLE_THREAD_USE to skip util_range lock
authorMarek Olšák <marek.olsak@amd.com>
Thu, 26 Sep 2019 01:38:40 +0000 (21:38 -0400)
committerMarek Olšák <marek.olsak@amd.com>
Tue, 8 Oct 2019 00:05:00 +0000 (20:05 -0400)
u_upload_mgr sets it, so that util_range_add can skip the lock.

The time spent in tc_transfer_flush_region decreases from 0.8% to 0.2%
in torcs on radeonsi.

Reviewed-by: Kenneth Graunke <kenneth@whitecape.org>
39 files changed:
src/gallium/auxiliary/util/u_range.h
src/gallium/auxiliary/util/u_threaded_context.c
src/gallium/auxiliary/util/u_upload_mgr.c
src/gallium/drivers/freedreno/freedreno_resource.c
src/gallium/drivers/freedreno/freedreno_state.c
src/gallium/drivers/iris/iris_blit.c
src/gallium/drivers/iris/iris_clear.c
src/gallium/drivers/iris/iris_resource.c
src/gallium/drivers/iris/iris_state.c
src/gallium/drivers/nouveau/nouveau_buffer.c
src/gallium/drivers/nouveau/nv50/nv50_state.c
src/gallium/drivers/nouveau/nv50/nv50_surface.c
src/gallium/drivers/nouveau/nvc0/nvc0_compute.c
src/gallium/drivers/nouveau/nvc0/nvc0_query_hw.c
src/gallium/drivers/nouveau/nvc0/nvc0_state.c
src/gallium/drivers/nouveau/nvc0/nvc0_state_validate.c
src/gallium/drivers/nouveau/nvc0/nvc0_surface.c
src/gallium/drivers/nouveau/nvc0/nvc0_tex.c
src/gallium/drivers/nouveau/nvc0/nve4_compute.c
src/gallium/drivers/panfrost/pan_resource.c
src/gallium/drivers/r600/evergreen_hw_context.c
src/gallium/drivers/r600/evergreen_state.c
src/gallium/drivers/r600/r600_buffer_common.c
src/gallium/drivers/r600/r600_hw_context.c
src/gallium/drivers/r600/r600_streamout.c
src/gallium/drivers/radeonsi/cik_sdma.c
src/gallium/drivers/radeonsi/si_buffer.c
src/gallium/drivers/radeonsi/si_cp_dma.c
src/gallium/drivers/radeonsi/si_descriptors.c
src/gallium/drivers/radeonsi/si_dma.c
src/gallium/drivers/radeonsi/si_dma_cs.c
src/gallium/drivers/radeonsi/si_state_streamout.c
src/gallium/drivers/virgl/virgl_buffer.c
src/gallium/drivers/virgl/virgl_context.c
src/gallium/drivers/virgl/virgl_encode.c
src/gallium/drivers/virgl/virgl_query.c
src/gallium/drivers/virgl/virgl_resource.c
src/gallium/drivers/virgl/virgl_streamout.c
src/gallium/include/pipe/p_defines.h

index 66faa10a991f28660066b36b90248fa80861242c..9a158a4fcf9c777a98a7c8669ed1b78eecc83472 100644 (file)
@@ -35,7 +35,7 @@
 #define U_RANGE_H
 
 #include "os/os_thread.h"
-
+#include "pipe/p_state.h"
 #include "util/u_math.h"
 #include "util/simple_mtx.h"
 
@@ -57,13 +57,19 @@ util_range_set_empty(struct util_range *range)
 
 /* This is like a union of two sets. */
 static inline void
-util_range_add(struct util_range *range, unsigned start, unsigned end)
+util_range_add(struct pipe_resource *resource, struct util_range *range,
+               unsigned start, unsigned end)
 {
    if (start < range->start || end > range->end) {
-      simple_mtx_lock(&range->write_mutex);
-      range->start = MIN2(start, range->start);
-      range->end = MAX2(end, range->end);
-      simple_mtx_unlock(&range->write_mutex);
+      if (resource->flags & PIPE_RESOURCE_FLAG_SINGLE_THREAD_USE) {
+         range->start = MIN2(start, range->start);
+         range->end = MAX2(end, range->end);
+      } else {
+         simple_mtx_lock(&range->write_mutex);
+         range->start = MIN2(start, range->start);
+         range->end = MAX2(end, range->end);
+         simple_mtx_unlock(&range->write_mutex);
+      }
    }
 }
 
index 31aa18e3b97f0ba06e4717ac0b5c1cf088525a7c..b50b2c0d24ec4622b60d02764a31d51eb9650c36 100644 (file)
@@ -879,7 +879,8 @@ tc_set_shader_images(struct pipe_context *_pipe,
             struct threaded_resource *tres =
                threaded_resource(images[i].resource);
 
-            util_range_add(&tres->valid_buffer_range, images[i].u.buf.offset,
+            util_range_add(&tres->b, &tres->valid_buffer_range,
+                           images[i].u.buf.offset,
                            images[i].u.buf.offset + images[i].u.buf.size);
          }
       }
@@ -945,7 +946,8 @@ tc_set_shader_buffers(struct pipe_context *_pipe,
          if (src->buffer) {
             struct threaded_resource *tres = threaded_resource(src->buffer);
 
-            util_range_add(&tres->valid_buffer_range, src->buffer_offset,
+            util_range_add(&tres->b, &tres->valid_buffer_range,
+                           src->buffer_offset,
                            src->buffer_offset + src->buffer_size);
          }
       }
@@ -1135,7 +1137,7 @@ tc_create_stream_output_target(struct pipe_context *_pipe,
    struct pipe_stream_output_target *view;
 
    tc_sync(threaded_context(_pipe));
-   util_range_add(&tres->valid_buffer_range, buffer_offset,
+   util_range_add(&tres->b, &tres->valid_buffer_range, buffer_offset,
                   buffer_offset + buffer_size);
 
    view = pipe->create_stream_output_target(pipe, res, buffer_offset,
@@ -1538,7 +1540,8 @@ tc_buffer_do_flush_region(struct threaded_context *tc,
                               ttrans->staging, 0, &src_box);
    }
 
-   util_range_add(tres->base_valid_buffer_range, box->x, box->x + box->width);
+   util_range_add(&tres->b, tres->base_valid_buffer_range,
+                  box->x, box->x + box->width);
 }
 
 static void
@@ -1658,7 +1661,7 @@ tc_buffer_subdata(struct pipe_context *_pipe,
       return;
    }
 
-   util_range_add(&tres->valid_buffer_range, offset, offset + size);
+   util_range_add(&tres->b, &tres->valid_buffer_range, offset, offset + size);
 
    /* The upload is small. Enqueue it. */
    struct tc_buffer_subdata *p =
@@ -2185,7 +2188,8 @@ tc_resource_copy_region(struct pipe_context *_pipe,
    p->src_box = *src_box;
 
    if (dst->target == PIPE_BUFFER)
-      util_range_add(&tdst->valid_buffer_range, dstx, dstx + src_box->width);
+      util_range_add(&tdst->b, &tdst->valid_buffer_range,
+                     dstx, dstx + src_box->width);
 }
 
 static void
@@ -2401,7 +2405,7 @@ tc_clear_buffer(struct pipe_context *_pipe, struct pipe_resource *res,
    memcpy(p->clear_value, clear_value, clear_value_size);
    p->clear_value_size = clear_value_size;
 
-   util_range_add(&tres->valid_buffer_range, offset, offset + size);
+   util_range_add(&tres->b, &tres->valid_buffer_range, offset, offset + size);
 }
 
 struct tc_clear_texture {
index 73f6cae0b6dddd9274d4c1e414e26d1df1cc1e94..4ac468524d835c6021b487aa7c55b317da03a644 100644 (file)
@@ -202,7 +202,7 @@ u_upload_alloc_buffer(struct u_upload_mgr *upload, unsigned min_size)
    buffer.format = PIPE_FORMAT_R8_UNORM; /* want TYPELESS or similar */
    buffer.bind = upload->bind;
    buffer.usage = upload->usage;
-   buffer.flags = upload->flags;
+   buffer.flags = upload->flags | PIPE_RESOURCE_FLAG_SINGLE_THREAD_USE;
    buffer.width0 = size;
    buffer.height0 = 1;
    buffer.depth0 = 1;
index fcc8fc66189e0583b4d20f642023d6bf62f800b6..d52f9441f6361cc1e898d5eb89b243a8803aaf36 100644 (file)
@@ -419,7 +419,7 @@ static void fd_resource_transfer_flush_region(struct pipe_context *pctx,
        struct fd_resource *rsc = fd_resource(ptrans->resource);
 
        if (ptrans->resource->target == PIPE_BUFFER)
-               util_range_add(&rsc->valid_buffer_range,
+               util_range_add(&rsc->base, &rsc->valid_buffer_range,
                                           ptrans->box.x + box->x,
                                           ptrans->box.x + box->x + box->width);
 }
@@ -489,7 +489,7 @@ fd_resource_transfer_unmap(struct pipe_context *pctx,
                fd_bo_cpu_fini(rsc->bo);
        }
 
-       util_range_add(&rsc->valid_buffer_range,
+       util_range_add(&rsc->base, &rsc->valid_buffer_range,
                                   ptrans->box.x,
                                   ptrans->box.x + ptrans->box.width);
 
index 3133d2746b2f6d36372d203c3f6581f2c2a36d99..4f315488d1b39eafcbe8cc95ee34b00a17a984ae 100644 (file)
@@ -472,7 +472,7 @@ fd_create_stream_output_target(struct pipe_context *pctx,
        target->buffer_size = buffer_size;
 
        assert(rsc->base.target == PIPE_BUFFER);
-       util_range_add(&rsc->valid_buffer_range,
+       util_range_add(&rsc->base, &rsc->valid_buffer_range,
                buffer_offset, buffer_offset + buffer_size);
 
        return target;
index 1246abe46eb264a887fced6c8c21bfff5891e06c..8dfc9cc17bb84028451683ee17831ca9fb71be6b 100644 (file)
@@ -453,7 +453,7 @@ iris_blit(struct pipe_context *ctx, const struct pipe_blit_info *info)
       tex_cache_flush_hack(batch, src_fmt.fmt, src_res->surf.format);
 
    if (dst_res->base.target == PIPE_BUFFER)
-      util_range_add(&dst_res->valid_buffer_range, dst_x0, dst_x1);
+      util_range_add(&dst_res->base, &dst_res->valid_buffer_range, dst_x0, dst_x1);
 
    struct blorp_batch blorp_batch;
    blorp_batch_init(&ice->blorp, &blorp_batch, batch, blorp_flags);
@@ -577,7 +577,7 @@ iris_copy_region(struct blorp_context *blorp,
       tex_cache_flush_hack(batch, ISL_FORMAT_UNSUPPORTED, src_res->surf.format);
 
    if (dst->target == PIPE_BUFFER)
-      util_range_add(&dst_res->valid_buffer_range, dstx, dstx + src_box->width);
+      util_range_add(&dst_res->base, &dst_res->valid_buffer_range, dstx, dstx + src_box->width);
 
    if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
       struct blorp_address src_addr = {
index ff78352a9f2d70e62cdb2a6728ed3d229862e70c..b71d4f2886aff6055ad0775b0c05aeae30018ebc 100644 (file)
@@ -351,7 +351,7 @@ clear_color(struct iris_context *ice,
    }
 
    if (p_res->target == PIPE_BUFFER)
-      util_range_add(&res->valid_buffer_range, box->x, box->x + box->width);
+      util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
 
    iris_batch_maybe_flush(batch, 1500);
 
index b2f91eb32ed7b455ab276246b4372b8528bb578b..cfdd43c6e2179fce2abfd1a1a4674324d399c5e0 100644 (file)
@@ -920,7 +920,7 @@ iris_resource_from_user_memory(struct pipe_screen *pscreen,
       return NULL;
    }
 
-   util_range_add(&res->valid_buffer_range, 0, templ->width0);
+   util_range_add(&res->base, &res->valid_buffer_range, 0, templ->width0);
 
    return &res->base;
 }
@@ -1789,7 +1789,7 @@ iris_transfer_map(struct pipe_context *ctx,
                             box->x + box->width);
 
    if (usage & PIPE_TRANSFER_WRITE)
-      util_range_add(&res->valid_buffer_range, box->x, box->x + box->width);
+      util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
 
    /* Avoid using GPU copies for persistent/coherent buffers, as the idea
     * there is to access them simultaneously on the CPU & GPU.  This also
@@ -1874,7 +1874,7 @@ iris_transfer_flush_region(struct pipe_context *ctx,
       if (map->dest_had_defined_contents)
          history_flush |= iris_flush_bits_for_history(res);
 
-      util_range_add(&res->valid_buffer_range, box->x, box->x + box->width);
+      util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
    }
 
    if (history_flush & ~PIPE_CONTROL_CS_STALL) {
index ed7d600c5353cab76a4bc904fa967f90e03be200..ab1578fc1848aa9b8c41f1e3da0b6c365e3cbeb8 100644 (file)
@@ -2481,7 +2481,7 @@ iris_set_shader_images(struct pipe_context *ctx,
                                       &image_params[start_slot + i],
                                       &res->surf, &view);
          } else {
-            util_range_add(&res->valid_buffer_range, img->u.buf.offset,
+            util_range_add(&res->base, &res->valid_buffer_range, img->u.buf.offset,
                            img->u.buf.offset + img->u.buf.size);
 
             fill_buffer_surface_state(&screen->isl_dev, res, map,
@@ -3010,7 +3010,7 @@ iris_set_shader_buffers(struct pipe_context *ctx,
          res->bind_history |= PIPE_BIND_SHADER_BUFFER;
          res->bind_stages |= 1 << stage;
 
-         util_range_add(&res->valid_buffer_range, ssbo->buffer_offset,
+         util_range_add(&res->base, &res->valid_buffer_range, ssbo->buffer_offset,
                         ssbo->buffer_offset + ssbo->buffer_size);
       } else {
          pipe_resource_reference(&shs->ssbo[start_slot + i].buffer, NULL);
@@ -3254,7 +3254,7 @@ iris_create_stream_output_target(struct pipe_context *ctx,
    cso->base.buffer_size = buffer_size;
    cso->base.context = ctx;
 
-   util_range_add(&res->valid_buffer_range, buffer_offset,
+   util_range_add(&res->base, &res->valid_buffer_range, buffer_offset,
                   buffer_offset + buffer_size);
 
    upload_state(ctx->stream_uploader, &cso->offset, sizeof(uint32_t), 4);
index 97305d993ff99941b154cb6c6b2896e45e4d6222..42f68fa9bdf629eacb7f5516732173911102508f 100644 (file)
@@ -515,7 +515,7 @@ nouveau_buffer_transfer_flush_region(struct pipe_context *pipe,
    if (tx->map)
       nouveau_transfer_write(nouveau_context(pipe), tx, box->x, box->width);
 
-   util_range_add(&buf->valid_buffer_range,
+   util_range_add(&buf->base, &buf->valid_buffer_range,
                   tx->base.box.x + box->x,
                   tx->base.box.x + box->x + box->width);
 }
@@ -539,7 +539,7 @@ nouveau_buffer_transfer_unmap(struct pipe_context *pipe,
          if (tx->map)
             nouveau_transfer_write(nv, tx, 0, tx->base.box.width);
 
-         util_range_add(&buf->valid_buffer_range,
+         util_range_add(&buf->base, &buf->valid_buffer_range,
                         tx->base.box.x, tx->base.box.x + tx->base.box.width);
       }
 
@@ -590,7 +590,7 @@ nouveau_copy_buffer(struct nouveau_context *nv,
                                 &src->base, 0, &src_box);
    }
 
-   util_range_add(&dst->valid_buffer_range, dstx, dstx + size);
+   util_range_add(&dst->base, &dst->valid_buffer_range, dstx, dstx + size);
 }
 
 
@@ -725,7 +725,7 @@ nouveau_user_buffer_create(struct pipe_screen *pscreen, void *ptr,
    buffer->status = NOUVEAU_BUFFER_STATUS_USER_MEMORY;
 
    util_range_init(&buffer->valid_buffer_range);
-   util_range_add(&buffer->valid_buffer_range, 0, bytes);
+   util_range_add(&buffer->base, &buffer->valid_buffer_range, 0, bytes);
 
    return &buffer->base;
 }
index a4163aa17132a81e96ec63bb289d3f90859365b8..6488c71f4ad8a307b0c023241ebd99b4d82c9f89 100644 (file)
@@ -1148,7 +1148,7 @@ nv50_so_target_create(struct pipe_context *pipe,
    pipe_reference_init(&targ->pipe.reference, 1);
 
    assert(buf->base.target == PIPE_BUFFER);
-   util_range_add(&buf->valid_buffer_range, offset, offset + size);
+   util_range_add(&buf->base, &buf->valid_buffer_range, offset, offset + size);
 
    return &targ->pipe;
 }
index de840eb531bd58dc45d0c71885c9b1e88a3bcdfe..84e537c7cfa9fd7b2e504c0ff4c36277091cf633 100644 (file)
@@ -724,7 +724,7 @@ nv50_clear_buffer(struct pipe_context *pipe,
       return;
    }
 
-   util_range_add(&buf->valid_buffer_range, offset, offset + size);
+   util_range_add(&buf->base, &buf->valid_buffer_range, offset, offset + size);
 
    assert(size % data_size == 0);
 
index 3ab2f5e3d7f147f42e64a1298848ca944ccad090..af5c6f7e6900a97f220ec0a8a5ad5275f6a94b88 100644 (file)
@@ -285,7 +285,7 @@ nvc0_compute_validate_buffers(struct nvc0_context *nvc0)
          PUSH_DATA (push, nvc0->buffers[s][i].buffer_size);
          PUSH_DATA (push, 0);
          BCTX_REFN(nvc0->bufctx_cp, CP_BUF, res, RDWR);
-         util_range_add(&res->valid_buffer_range,
+         util_range_add(&res->base, &res->valid_buffer_range,
                         nvc0->buffers[s][i].buffer_offset,
                         nvc0->buffers[s][i].buffer_offset +
                         nvc0->buffers[s][i].buffer_size);
index 672b3e10eedec86c7c1fa997034475521ebb5077..af23798c17820cb26b0d6ea1da76f67d1a6232be 100644 (file)
@@ -409,7 +409,7 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0,
                          result_type >= PIPE_QUERY_TYPE_I64 ? 2 : 1,
                          ready);
 
-      util_range_add(&buf->valid_buffer_range, offset,
+      util_range_add(&buf->base, &buf->valid_buffer_range, offset,
                      offset + (result_type >= PIPE_QUERY_TYPE_I64 ? 8 : 4));
 
       nvc0_resource_validate(buf, NOUVEAU_BO_WR);
@@ -508,7 +508,7 @@ nvc0_hw_get_query_result_resource(struct nvc0_context *nvc0,
    PUSH_DATAh(push, buf->address + offset);
    PUSH_DATA (push, buf->address + offset);
 
-   util_range_add(&buf->valid_buffer_range, offset,
+   util_range_add(&buf->base, &buf->valid_buffer_range, offset,
                   offset + (result_type >= PIPE_QUERY_TYPE_I64 ? 8 : 4));
 
    nvc0_resource_validate(buf, NOUVEAU_BO_WR);
index 6fde2de94693739b16e7dc634d478c1f002c84b7..49546e5de68b60afeef83a9ff99f42ef85d09661 100644 (file)
@@ -1065,7 +1065,7 @@ nvc0_so_target_create(struct pipe_context *pipe,
    pipe_reference_init(&targ->pipe.reference, 1);
 
    assert(buf->base.target == PIPE_BUFFER);
-   util_range_add(&buf->valid_buffer_range, offset, offset + size);
+   util_range_add(&buf->base, &buf->valid_buffer_range, offset, offset + size);
 
    return &targ->pipe;
 }
index 40a42f5116fe1ef53a934e042cd28e41667ab965..85dcf80655c0feb95dfc87fb387c01aea57790ef 100644 (file)
@@ -644,7 +644,7 @@ nvc0_validate_buffers(struct nvc0_context *nvc0)
             PUSH_DATA (push, nvc0->buffers[s][i].buffer_size);
             PUSH_DATA (push, 0);
             BCTX_REFN(nvc0->bufctx_3d, 3D_BUF, res, RDWR);
-            util_range_add(&res->valid_buffer_range,
+            util_range_add(&res->base, &res->valid_buffer_range,
                            nvc0->buffers[s][i].buffer_offset,
                            nvc0->buffers[s][i].buffer_offset +
                            nvc0->buffers[s][i].buffer_size);
index 56f459cb6bac8e1da868c5de14c06418b074f46b..7031aef6244e344728e2599567a25b68bf0fb013 100644 (file)
@@ -534,7 +534,7 @@ nvc0_clear_buffer(struct pipe_context *pipe,
       return;
    }
 
-   util_range_add(&buf->valid_buffer_range, offset, offset + size);
+   util_range_add(&buf->base, &buf->valid_buffer_range, offset, offset + size);
 
    assert(size % data_size == 0);
 
index 8820b5aac660377e3f106bbfe42999cc9c21244a..f62e508258ba96f3dcc7219ef8e2ec63ab4f20be 100644 (file)
@@ -948,7 +948,7 @@ nvc0_mark_image_range_valid(const struct pipe_image_view *view)
 
    assert(view->resource->target == PIPE_BUFFER);
 
-   util_range_add(&res->valid_buffer_range,
+   util_range_add(&res->base, &res->valid_buffer_range,
                   view->u.buf.offset,
                   view->u.buf.offset + view->u.buf.size);
 }
@@ -1472,7 +1472,7 @@ gm107_make_image_handle_resident(struct pipe_context *pipe, uint64_t handle,
       res->flags = (access & 3) << 8;
       if (res->buf->base.target == PIPE_BUFFER &&
           access & PIPE_IMAGE_ACCESS_WRITE)
-         util_range_add(&res->buf->valid_buffer_range,
+         util_range_add(&res->buf->base, &res->buf->valid_buffer_range,
                         tic->pipe.u.buf.offset,
                         tic->pipe.u.buf.offset + tic->pipe.u.buf.size);
       list_add(&res->list, &nvc0->img_head);
index 91c26718fbec3f758c0f4d69b46d3c4547a0e7f9..146eeb35f85fad07754be56045a5fdd491763c9a 100644 (file)
@@ -448,7 +448,7 @@ nve4_compute_validate_buffers(struct nvc0_context *nvc0)
          PUSH_DATA (push, nvc0->buffers[s][i].buffer_size);
          PUSH_DATA (push, 0);
          BCTX_REFN(nvc0->bufctx_cp, CP_BUF, res, RDWR);
-         util_range_add(&res->valid_buffer_range,
+         util_range_add(&res->base, &res->valid_buffer_range,
                         nvc0->buffers[s][i].buffer_offset,
                         nvc0->buffers[s][i].buffer_offset +
                         nvc0->buffers[s][i].buffer_size);
index 49088618ae4bb3776ebb64debfaab4ef2a245b69..01ef5c5776d20d92fbebe900d75f1df4604ca6f2 100644 (file)
@@ -680,7 +680,7 @@ panfrost_transfer_unmap(struct pipe_context *pctx,
         }
 
 
-        util_range_add(&prsrc->valid_buffer_range,
+        util_range_add(&prsrc->base, &prsrc->valid_buffer_range,
                        transfer->box.x,
                        transfer->box.x + transfer->box.width);
 
@@ -699,7 +699,7 @@ panfrost_transfer_flush_region(struct pipe_context *pctx,
         struct panfrost_resource *rsc = pan_resource(transfer->resource);
 
         if (transfer->resource->target == PIPE_BUFFER) {
-                util_range_add(&rsc->valid_buffer_range,
+                util_range_add(&rsc->base, &rsc->valid_buffer_range,
                                transfer->box.x + box->x,
                                transfer->box.x + box->x + box->width);
         } else {
index 5e0e27b0f16f9dfde4b28c259382265219dab413..da8553886ce83f6cda3658e35380a930252ce89d 100644 (file)
@@ -43,7 +43,7 @@ void evergreen_dma_copy_buffer(struct r600_context *rctx,
        /* Mark the buffer range of destination as valid (initialized),
         * so that transfer_map knows it should wait for the GPU when mapping
         * that range. */
-       util_range_add(&rdst->valid_buffer_range, dst_offset,
+       util_range_add(&rdst->b.b, &rdst->valid_buffer_range, dst_offset,
                       dst_offset + size);
 
        dst_offset += rdst->gpu_address;
@@ -93,7 +93,7 @@ void evergreen_cp_dma_clear_buffer(struct r600_context *rctx,
        /* Mark the buffer range of destination as valid (initialized),
         * so that transfer_map knows it should wait for the GPU when mapping
         * that range. */
-       util_range_add(&r600_resource(dst)->valid_buffer_range, offset,
+       util_range_add(dst, &r600_resource(dst)->valid_buffer_range, offset,
                       offset + size);
 
        offset += r600_resource(dst)->gpu_address;
index b8315612fdd7b587a0a3ee6901edfcd75dfca4b1..ca2ad5e6fbb5f16c536bbbd9c10ac80038ffbd29 100644 (file)
@@ -1308,7 +1308,7 @@ void evergreen_init_color_surface_rat(struct r600_context *rctx,
        surf->cb_color_view = 0;
 
        /* Set the buffer range the GPU will have access to: */
-       util_range_add(&r600_resource(pipe_buffer)->valid_buffer_range,
+       util_range_add(pipe_buffer, &r600_resource(pipe_buffer)->valid_buffer_range,
                       0, pipe_buffer->width0);
 }
 
index 04f80daec1d6ab86b7df8a61e63496ab786f89b1..d0f44dcb66215bb3d7f335f2ddd2ecc5c3da6375 100644 (file)
@@ -498,7 +498,7 @@ static void r600_buffer_do_flush_region(struct pipe_context *ctx,
                ctx->resource_copy_region(ctx, dst, 0, box->x, 0, 0, src, 0, &dma_box);
        }
 
-       util_range_add(&rbuffer->valid_buffer_range, box->x,
+       util_range_add(&rbuffer->b.b, &rbuffer->valid_buffer_range, box->x,
                       box->x + box->width);
 }
 
@@ -643,8 +643,8 @@ r600_buffer_from_user_memory(struct pipe_screen *screen,
        rbuffer->domains = RADEON_DOMAIN_GTT;
        rbuffer->flags = 0;
        rbuffer->b.is_user_ptr = true;
-       util_range_add(&rbuffer->valid_buffer_range, 0, templ->width0);
-       util_range_add(&rbuffer->b.valid_buffer_range, 0, templ->width0);
+       util_range_add(&rbuffer->b.b, &rbuffer->valid_buffer_range, 0, templ->width0);
+       util_range_add(&rbuffer->b.b, &rbuffer->b.valid_buffer_range, 0, templ->width0);
 
        /* Convert a user pointer to a buffer. */
        rbuffer->buf = ws->buffer_from_ptr(ws, user_memory, templ->width0);
index abf5d03e4f9206fd38cb6491e61b2d8819bfb15c..494b7ed69eb5a411888ce78187daace8f972d89c 100644 (file)
@@ -510,7 +510,7 @@ void r600_cp_dma_copy_buffer(struct r600_context *rctx,
        /* Mark the buffer range of destination as valid (initialized),
         * so that transfer_map knows it should wait for the GPU when mapping
         * that range. */
-       util_range_add(&r600_resource(dst)->valid_buffer_range, dst_offset,
+       util_range_add(dst, &r600_resource(dst)->valid_buffer_range, dst_offset,
                       dst_offset + size);
 
        dst_offset += r600_resource(dst)->gpu_address;
@@ -592,7 +592,7 @@ void r600_dma_copy_buffer(struct r600_context *rctx,
        /* Mark the buffer range of destination as valid (initialized),
         * so that transfer_map knows it should wait for the GPU when mapping
         * that range. */
-       util_range_add(&rdst->valid_buffer_range, dst_offset,
+       util_range_add(&rdst->b.b, &rdst->valid_buffer_range, dst_offset,
                       dst_offset + size);
 
        size >>= 2; /* convert to dwords */
index de3e767acc0e89fdc78c65fa34876633972b2d48..f925c07b26d89050b54c69b5b6f5599f6a16f41b 100644 (file)
@@ -65,7 +65,7 @@ r600_create_so_target(struct pipe_context *ctx,
        t->b.buffer_offset = buffer_offset;
        t->b.buffer_size = buffer_size;
 
-       util_range_add(&rbuffer->valid_buffer_range, buffer_offset,
+       util_range_add(buffer, &rbuffer->valid_buffer_range, buffer_offset,
                       buffer_offset + buffer_size);
        return &t->b;
 }
index 47d8afc05da746dc89691f8a74ebdcf805eeef9b..f45903affa3272ec157d3ad52e1d9ceb1b190f03 100644 (file)
@@ -41,7 +41,7 @@ static void cik_sdma_copy_buffer(struct si_context *ctx,
        /* Mark the buffer range of destination as valid (initialized),
         * so that transfer_map knows it should wait for the GPU when mapping
         * that range. */
-       util_range_add(&sdst->valid_buffer_range, dst_offset,
+       util_range_add(dst, &sdst->valid_buffer_range, dst_offset,
                       dst_offset + size);
 
        dst_offset += sdst->gpu_address;
index 57b8aeea4866fd154600eb1d6476e43d628f1a83..4fda5cb15a54bf186162f1c5cef3dfec7d4bac7e 100644 (file)
@@ -590,7 +590,7 @@ static void si_buffer_do_flush_region(struct pipe_context *ctx,
                               box->x, src_offset, box->width);
        }
 
-       util_range_add(&buf->valid_buffer_range, box->x,
+       util_range_add(&buf->b.b, &buf->valid_buffer_range, box->x,
                       box->x + box->width);
 }
 
@@ -744,8 +744,8 @@ si_buffer_from_user_memory(struct pipe_screen *screen,
        buf->domains = RADEON_DOMAIN_GTT;
        buf->flags = 0;
        buf->b.is_user_ptr = true;
-       util_range_add(&buf->valid_buffer_range, 0, templ->width0);
-       util_range_add(&buf->b.valid_buffer_range, 0, templ->width0);
+       util_range_add(&buf->b.b, &buf->valid_buffer_range, 0, templ->width0);
+       util_range_add(&buf->b.b, &buf->b.valid_buffer_range, 0, templ->width0);
 
        /* Convert a user pointer to a buffer. */
        buf->buf = ws->buffer_from_ptr(ws, user_memory, templ->width0);
index d1b44b894b14337d3355df2fdf80ef873a77e454..974f2b2223834b911839730c71ab191493076933 100644 (file)
@@ -222,7 +222,7 @@ void si_cp_dma_clear_buffer(struct si_context *sctx, struct radeon_cmdbuf *cs,
         * so that transfer_map knows it should wait for the GPU when mapping
         * that range. */
        if (sdst)
-               util_range_add(&sdst->valid_buffer_range, offset, offset + size);
+               util_range_add(dst, &sdst->valid_buffer_range, offset, offset + size);
 
        /* Flush the caches. */
        if (sdst && !(user_flags & SI_CPDMA_SKIP_GFX_SYNC)) {
@@ -325,7 +325,7 @@ void si_cp_dma_copy_buffer(struct si_context *sctx,
                        /* Mark the buffer range of destination as valid (initialized),
                         * so that transfer_map knows it should wait for the GPU when mapping
                         * that range. */
-                       util_range_add(&si_resource(dst)->valid_buffer_range, dst_offset,
+                       util_range_add(dst, &si_resource(dst)->valid_buffer_range, dst_offset,
                                       dst_offset + size);
                }
 
index a5769df28cbc75a0a43bf1fed7869c931c3eebf5..28fe5c1e5850fb18ecf5c03cee1c7030057619f3 100644 (file)
@@ -692,7 +692,7 @@ si_mark_image_range_valid(const struct pipe_image_view *view)
        if (res->b.b.target != PIPE_BUFFER)
                return;
 
-       util_range_add(&res->valid_buffer_range,
+       util_range_add(&res->b.b, &res->valid_buffer_range,
                       view->u.buf.offset,
                       view->u.buf.offset + view->u.buf.size);
 }
@@ -1395,7 +1395,7 @@ static void si_set_shader_buffer(struct si_context *sctx,
        buffers->enabled_mask |= 1u << slot;
        sctx->descriptors_dirty |= 1u << descriptors_idx;
 
-       util_range_add(&buf->valid_buffer_range, sbuffer->buffer_offset,
+       util_range_add(&buf->b.b, &buf->valid_buffer_range, sbuffer->buffer_offset,
                       sbuffer->buffer_offset + sbuffer->buffer_size);
 }
 
index 450ed82b4d6753392d8c02b32783503125a317b3..1a5962ea78ba9a598f377b54723cd6088df47f8a 100644 (file)
@@ -43,7 +43,7 @@ static void si_dma_copy_buffer(struct si_context *ctx,
        /* Mark the buffer range of destination as valid (initialized),
         * so that transfer_map knows it should wait for the GPU when mapping
         * that range. */
-       util_range_add(&sdst->valid_buffer_range, dst_offset,
+       util_range_add(dst, &sdst->valid_buffer_range, dst_offset,
                       dst_offset + size);
 
        dst_offset += sdst->gpu_address;
index 8bc5d0ed209035e756da4cbb462a95e0418e6867..d7b7681f8e5820f142fc1698d2de80f9f7c91123 100644 (file)
@@ -50,7 +50,7 @@ void si_dma_emit_timestamp(struct si_context *sctx, struct si_resource *dst,
        /* Mark the buffer range of destination as valid (initialized),
         * so that transfer_map knows it should wait for the GPU when mapping
         * that range. */
-       util_range_add(&dst->valid_buffer_range, offset, offset + 8);
+       util_range_add(&dst->b.b, &dst->valid_buffer_range, offset, offset + 8);
 
        assert(va % 8 == 0);
 
@@ -83,7 +83,7 @@ void si_sdma_clear_buffer(struct si_context *sctx, struct pipe_resource *dst,
        /* Mark the buffer range of destination as valid (initialized),
         * so that transfer_map knows it should wait for the GPU when mapping
         * that range. */
-       util_range_add(&sdst->valid_buffer_range, offset, offset + size);
+       util_range_add(dst, &sdst->valid_buffer_range, offset, offset + size);
 
        offset += sdst->gpu_address;
 
index 9b1d05f4df8279736f137de9ecdcca17528825ba..85ac4a119c50eb62d5f83cb397859095117a43d9 100644 (file)
@@ -65,7 +65,7 @@ si_create_so_target(struct pipe_context *ctx,
        t->b.buffer_offset = buffer_offset;
        t->b.buffer_size = buffer_size;
 
-       util_range_add(&buf->valid_buffer_range, buffer_offset,
+       util_range_add(&buf->b.b, &buf->valid_buffer_range, buffer_offset,
                       buffer_offset + buffer_size);
        return &t->b;
 }
index 9f999fec1fbbda732a52e333056a9f39b95ce3ac..ba32c29ce2c6a688566ab052ce0dee094b2d1a50 100644 (file)
@@ -71,7 +71,7 @@ static void virgl_buffer_transfer_flush_region(struct pipe_context *ctx,
     *
     * We'll end up flushing 25 --> 70.
     */
-   util_range_add(&trans->range, box->x, box->x + box->width);
+   util_range_add(transfer->resource, &trans->range, box->x, box->x + box->width);
 }
 
 static const struct u_resource_vtbl virgl_buffer_vtbl =
index bbb5247c86f1b4585a02b8e3dcc1248785052af4..0554570f1aa9e15740b1964990f0c06f46635548 100644 (file)
@@ -1116,7 +1116,7 @@ static void virgl_resource_copy_region(struct pipe_context *ctx,
    struct virgl_resource *sres = virgl_resource(src);
 
    if (dres->u.b.target == PIPE_BUFFER)
-      util_range_add(&dres->valid_buffer_range, dstx, dstx + src_box->width);
+      util_range_add(&dres->u.b, &dres->valid_buffer_range, dstx, dstx + src_box->width);
    virgl_resource_dirty(dres, dst_level);
 
    virgl_encode_resource_copy_region(vctx, dres,
index 096b7e9b0266a5646fcb4d8cb5beb8b2424fea6b..5d2f7dff6beaee7c8febec936166e47ed59965e1 100644 (file)
@@ -1213,7 +1213,7 @@ int virgl_encode_set_shader_buffers(struct virgl_context *ctx,
          virgl_encoder_write_dword(ctx->cbuf, buffers[i].buffer_size);
          virgl_encoder_write_res(ctx, res);
 
-         util_range_add(&res->valid_buffer_range, buffers[i].buffer_offset,
+         util_range_add(&res->u.b, &res->valid_buffer_range, buffers[i].buffer_offset,
                buffers[i].buffer_offset + buffers[i].buffer_size);
          virgl_resource_dirty(res, 0);
       } else {
@@ -1240,7 +1240,7 @@ int virgl_encode_set_hw_atomic_buffers(struct virgl_context *ctx,
          virgl_encoder_write_dword(ctx->cbuf, buffers[i].buffer_size);
          virgl_encoder_write_res(ctx, res);
 
-         util_range_add(&res->valid_buffer_range, buffers[i].buffer_offset,
+         util_range_add(&res->u.b, &res->valid_buffer_range, buffers[i].buffer_offset,
                buffers[i].buffer_offset + buffers[i].buffer_size);
          virgl_resource_dirty(res, 0);
       } else {
@@ -1272,7 +1272,7 @@ int virgl_encode_set_shader_images(struct virgl_context *ctx,
          virgl_encoder_write_res(ctx, res);
 
          if (res->u.b.target == PIPE_BUFFER) {
-            util_range_add(&res->valid_buffer_range, images[i].u.buf.offset,
+            util_range_add(&res->u.b, &res->valid_buffer_range, images[i].u.buf.offset,
                   images[i].u.buf.offset + images[i].u.buf.size);
          }
          virgl_resource_dirty(res, images[i].u.tex.level);
index e8ef4557d5a97ae293417e6afaf2d7c63747b930..9d6989c0ae322d1b7b1e4e457ce4947a2b0fd4a4 100644 (file)
@@ -114,7 +114,7 @@ static struct pipe_query *virgl_create_query(struct pipe_context *ctx,
    query->result_size = (query_type == PIPE_QUERY_TIMESTAMP ||
                          query_type == PIPE_QUERY_TIME_ELAPSED) ? 8 : 4;
 
-   util_range_add(&query->buf->valid_buffer_range, 0,
+   util_range_add(&query->buf->u.b, &query->buf->valid_buffer_range, 0,
                   sizeof(struct virgl_host_query_state));
    virgl_resource_dirty(query->buf, 0);
 
index fa0eb708438b32344577b04e275525deb4dee219..b5d82bdde59407da1bf155c132e98529af9efa8d 100644 (file)
@@ -446,7 +446,7 @@ virgl_resource_transfer_map(struct pipe_context *ctx,
       }
 
       if (usage & PIPE_TRANSFER_WRITE)
-          util_range_add(&vres->valid_buffer_range, box->x, box->x + box->width);
+          util_range_add(&vres->u.b, &vres->valid_buffer_range, box->x, box->x + box->width);
    }
 
    *transfer = &trans->base;
@@ -608,7 +608,7 @@ static void virgl_buffer_subdata(struct pipe_context *pipe,
        likely(!(virgl_debug & VIRGL_DEBUG_XFER)) &&
        virgl_transfer_queue_extend_buffer(&vctx->queue,
                                           vbuf->hw_res, offset, size, data)) {
-      util_range_add(&vbuf->valid_buffer_range, offset, offset + size);
+      util_range_add(&vbuf->u.b, &vbuf->valid_buffer_range, offset, offset + size);
       return;
    }
 
index edd5bc58f88292045e7b4f357938f719def8a915..ba601f9fef19ac7a7fc73d4ad36211e084d2a46f 100644 (file)
@@ -50,7 +50,7 @@ static struct pipe_stream_output_target *virgl_create_so_target(
    t->handle = handle;
 
    res->bind_history |= PIPE_BIND_STREAM_OUTPUT;
-   util_range_add(&res->valid_buffer_range, buffer_offset,
+   util_range_add(&res->u.b, &res->valid_buffer_range, buffer_offset,
                   buffer_offset + buffer_size);
    virgl_resource_dirty(res, 0);
 
index 1dc880bfc72a0251a12540a3424940e87d2cffbd..9e579e479e9a4429df20522cb49f3de08f13f2fa 100644 (file)
@@ -494,6 +494,7 @@ enum pipe_flush_flags
 #define PIPE_RESOURCE_FLAG_MAP_COHERENT   (1 << 1)
 #define PIPE_RESOURCE_FLAG_TEXTURING_MORE_LIKELY (1 << 2)
 #define PIPE_RESOURCE_FLAG_SPARSE                (1 << 3)
+#define PIPE_RESOURCE_FLAG_SINGLE_THREAD_USE     (1 << 4)
 #define PIPE_RESOURCE_FLAG_DRV_PRIV    (1 << 8) /* driver/winsys private */
 #define PIPE_RESOURCE_FLAG_ST_PRIV     (1 << 24) /* state-tracker/winsys private */