Mesa (main): crocus: use threaded context base classes

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Jul 6 04:40:57 UTC 2021


Module: Mesa
Branch: main
Commit: a9df8f7b64b903e0039e5b8893e0e0a55d57885e
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=a9df8f7b64b903e0039e5b8893e0e0a55d57885e

Author: Dave Airlie <airlied at redhat.com>
Date:   Mon Jul  5 15:46:54 2021 +1000

crocus: use threaded context base classes

should be a pretty non-functional change

Reviewed-by: Zoltán Böszörményi <zboszor at pr.hu>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/11710>

---

 src/gallium/drivers/crocus/crocus_blit.c     | 14 ++---
 src/gallium/drivers/crocus/crocus_blt.c      | 14 ++---
 src/gallium/drivers/crocus/crocus_clear.c    |  8 +--
 src/gallium/drivers/crocus/crocus_query.c    |  2 +
 src/gallium/drivers/crocus/crocus_resolve.c  | 30 +++++------
 src/gallium/drivers/crocus/crocus_resource.c | 76 +++++++++++++++-------------
 src/gallium/drivers/crocus/crocus_resource.h |  7 +--
 src/gallium/drivers/crocus/crocus_state.c    | 48 +++++++++---------
 8 files changed, 103 insertions(+), 96 deletions(-)

diff --git a/src/gallium/drivers/crocus/crocus_blit.c b/src/gallium/drivers/crocus/crocus_blit.c
index 5cec1ff2287..7620efc932b 100644
--- a/src/gallium/drivers/crocus/crocus_blit.c
+++ b/src/gallium/drivers/crocus/crocus_blit.c
@@ -583,10 +583,10 @@ use_blorp:
 
       struct blorp_surf src_surf, dst_surf;
       crocus_blorp_surf_for_resource(&screen->vtbl, &screen->isl_dev, &src_surf,
-                                     &src_res->base, src_aux_usage,
+                                     &src_res->base.b, src_aux_usage,
                                      info->src.level, false);
       crocus_blorp_surf_for_resource(&screen->vtbl, &screen->isl_dev, &dst_surf,
-                                     &dst_res->base, dst_aux_usage,
+                                     &dst_res->base.b, dst_aux_usage,
                                      info->dst.level, true);
 
       crocus_resource_prepare_render(ice, dst_res, info->dst.level,
@@ -598,8 +598,8 @@ use_blorp:
       if (crocus_batch_references(batch, src_res->bo))
          tex_cache_flush_hack(batch, src_fmt.fmt, src_res->surf.format);
 
-      if (dst_res->base.target == PIPE_BUFFER) {
-         util_range_add(&dst_res->base, &dst_res->valid_buffer_range,
+      if (dst_res->base.b.target == PIPE_BUFFER) {
+         util_range_add(&dst_res->base.b, &dst_res->valid_buffer_range,
                         dst_x0, dst_x1);
       }
 
@@ -703,7 +703,7 @@ crocus_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->base, &dst_res->valid_buffer_range, dstx, dstx + src_box->width);
+      util_range_add(&dst_res->base.b, &dst_res->valid_buffer_range, dstx, dstx + src_box->width);
 
    if (dst->target == PIPE_BUFFER && src->target == PIPE_BUFFER) {
       struct blorp_address src_addr = {
@@ -825,8 +825,8 @@ crocus_resource_copy_region(struct pipe_context *ctx,
       crocus_get_depth_stencil_resources(devinfo, p_src, &junk, &s_src_res);
       crocus_get_depth_stencil_resources(devinfo, p_dst, &junk, &s_dst_res);
 
-      crocus_copy_region(&ice->blorp, batch, &s_dst_res->base, dst_level, dstx,
-                         dsty, dstz, &s_src_res->base, src_level, src_box);
+      crocus_copy_region(&ice->blorp, batch, &s_dst_res->base.b, dst_level, dstx,
+                         dsty, dstz, &s_src_res->base.b, src_level, src_box);
    }
 
    crocus_flush_and_dirty_for_history(ice, batch, dst,
diff --git a/src/gallium/drivers/crocus/crocus_blt.c b/src/gallium/drivers/crocus/crocus_blt.c
index 96bb005983e..b6b8368d0fd 100644
--- a/src/gallium/drivers/crocus/crocus_blt.c
+++ b/src/gallium/drivers/crocus/crocus_blt.c
@@ -191,9 +191,9 @@ static bool crocus_emit_blt(struct crocus_batch *batch,
 
    crocus_resource_get_image_offset(src, src_level, src_box->z, &src_image_x,
                                     &src_image_y);
-   if (util_format_is_compressed(src->base.format)) {
-      int bw = util_format_get_blockwidth(src->base.format);
-      int bh = util_format_get_blockheight(src->base.format);
+   if (util_format_is_compressed(src->base.b.format)) {
+      int bw = util_format_get_blockwidth(src->base.b.format);
+      int bh = util_format_get_blockheight(src->base.b.format);
       assert(src_x % bw == 0);
       assert(src_y % bh == 0);
       src_x /= (int)bw;
@@ -204,9 +204,9 @@ static bool crocus_emit_blt(struct crocus_batch *batch,
 
    crocus_resource_get_image_offset(dst, dst_level, dst_z, &dst_image_x,
                                     &dst_image_y);
-   if (util_format_is_compressed(dst->base.format)) {
-      int bw = util_format_get_blockwidth(dst->base.format);
-      int bh = util_format_get_blockheight(dst->base.format);
+   if (util_format_is_compressed(dst->base.b.format)) {
+      int bw = util_format_get_blockwidth(dst->base.b.format);
+      int bh = util_format_get_blockheight(dst->base.b.format);
       assert(dst_x % bw == 0);
       assert(dst_y % bh == 0);
       dst_x /= (int)bw;
@@ -312,7 +312,7 @@ static bool crocus_copy_region_blt(struct crocus_batch *batch,
                                    unsigned src_level,
                                    const struct pipe_box *src_box)
 {
-   if (dst->base.target == PIPE_BUFFER || src->base.target == PIPE_BUFFER)
+   if (dst->base.b.target == PIPE_BUFFER || src->base.b.target == PIPE_BUFFER)
       return false;
    return crocus_emit_blt(batch,
                           src,
diff --git a/src/gallium/drivers/crocus/crocus_clear.c b/src/gallium/drivers/crocus/crocus_clear.c
index 8ea21d9d227..261f19ac9db 100644
--- a/src/gallium/drivers/crocus/crocus_clear.c
+++ b/src/gallium/drivers/crocus/crocus_clear.c
@@ -347,7 +347,7 @@ clear_color(struct crocus_context *ice,
    }
 
    if (p_res->target == PIPE_BUFFER)
-      util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
+      util_range_add(&res->base.b, &res->valid_buffer_range, box->x, box->x + box->width);
 
    crocus_batch_maybe_flush(batch, 1500);
 
@@ -430,7 +430,7 @@ can_fast_clear_depth(struct crocus_context *ice,
    if (!crocus_resource_level_has_hiz(res, level))
       return false;
 
-   if (res->base.format == PIPE_FORMAT_Z16_UNORM) {
+   if (res->base.b.format == PIPE_FORMAT_Z16_UNORM) {
       /* From the Sandy Bridge PRM, volume 2 part 1, page 314:
        *
        *     "[DevSNB+]: Several cases exist where Depth Buffer Clear cannot be
@@ -592,7 +592,7 @@ clear_depth_stencil(struct crocus_context *ice,
       crocus_resource_prepare_render(ice, z_res, level, box->z, box->depth,
                                      aux_usage);
       crocus_blorp_surf_for_resource(&screen->vtbl, &batch->screen->isl_dev,
-                                     &z_surf, &z_res->base, aux_usage,
+                                     &z_surf, &z_res->base.b, aux_usage,
                                      level, true);
    }
 
@@ -604,7 +604,7 @@ clear_depth_stencil(struct crocus_context *ice,
       crocus_resource_prepare_access(ice, stencil_res, level, 1, box->z,
                                      box->depth, stencil_res->aux.usage, false);
       crocus_blorp_surf_for_resource(&screen->vtbl, &batch->screen->isl_dev,
-                                     &stencil_surf, &stencil_res->base,
+                                     &stencil_surf, &stencil_res->base.b,
                                      stencil_res->aux.usage, level, true);
    }
 
diff --git a/src/gallium/drivers/crocus/crocus_query.c b/src/gallium/drivers/crocus/crocus_query.c
index 47114cc6e60..df3f3103647 100644
--- a/src/gallium/drivers/crocus/crocus_query.c
+++ b/src/gallium/drivers/crocus/crocus_query.c
@@ -74,6 +74,8 @@
 #endif
 
 struct crocus_query {
+   struct threaded_query b;
+
    enum pipe_query_type type;
    int index;
 
diff --git a/src/gallium/drivers/crocus/crocus_resolve.c b/src/gallium/drivers/crocus/crocus_resolve.c
index c0415d9a6df..3629785cd3a 100644
--- a/src/gallium/drivers/crocus/crocus_resolve.c
+++ b/src/gallium/drivers/crocus/crocus_resolve.c
@@ -98,7 +98,7 @@ resolve_sampler_views(struct crocus_context *ice,
       const int i = u_bit_scan(&views);
       struct crocus_sampler_view *isv = shs->textures[i];
 
-      if (isv->res->base.target != PIPE_BUFFER) {
+      if (isv->res->base.b.target != PIPE_BUFFER) {
          if (consider_framebuffer) {
             disable_rb_aux_buffer(ice, draw_aux_buffer_disabled, isv->res,
                                   isv->view.base_level, isv->view.levels,
@@ -140,7 +140,7 @@ resolve_image_views(struct crocus_context *ice,
       struct pipe_image_view *pview = &shs->image[i].base;
       struct crocus_resource *res = (void *) pview->resource;
 
-      if (res->base.target != PIPE_BUFFER) {
+      if (res->base.b.target != PIPE_BUFFER) {
          if (consider_framebuffer) {
             disable_rb_aux_buffer(ice, draw_aux_buffer_disabled,
                                   res, pview->u.tex.level, 1,
@@ -533,7 +533,7 @@ crocus_resolve_color(struct crocus_context *ice,
 
    struct blorp_surf surf;
    crocus_blorp_surf_for_resource(&screen->vtbl, &batch->screen->isl_dev, &surf,
-                                  &res->base, res->aux.usage, level, true);
+                                  &res->base.b, res->aux.usage, level, true);
 
    crocus_batch_maybe_flush(batch, 1500);
 
@@ -580,7 +580,7 @@ crocus_mcs_partial_resolve(struct crocus_context *ice,
 
    struct blorp_surf surf;
    crocus_blorp_surf_for_resource(&screen->vtbl, &batch->screen->isl_dev, &surf,
-                                  &res->base, res->aux.usage, 0, true);
+                                  &res->base.b, res->aux.usage, 0, true);
 
    struct blorp_batch blorp_batch;
    blorp_batch_init(&ice->blorp, &blorp_batch, batch, 0);
@@ -683,7 +683,7 @@ crocus_hiz_exec(struct crocus_context *ice,
 
    struct blorp_surf surf;
    crocus_blorp_surf_for_resource(&screen->vtbl, &batch->screen->isl_dev, &surf,
-                                  &res->base, res->aux.usage, level, true);
+                                  &res->base.b, res->aux.usage, level, true);
 
    struct blorp_batch blorp_batch;
    enum blorp_batch_flags flags = 0;
@@ -751,7 +751,7 @@ crocus_resource_check_level_layer(UNUSED const struct crocus_resource *res,
                                   UNUSED uint32_t level, UNUSED uint32_t layer)
 {
    assert(level < res->surf.levels);
-   assert(layer < util_num_layers(&res->base, level));
+   assert(layer < util_num_layers(&res->base.b, level));
 }
 
 static inline uint32_t
@@ -774,7 +774,7 @@ static inline uint32_t
 miptree_layer_range_length(const struct crocus_resource *res, uint32_t level,
                            uint32_t start_layer, uint32_t num_layers)
 {
-   assert(level <= res->base.last_level);
+   assert(level <= res->base.b.last_level);
 
    const uint32_t total_num_layers = crocus_get_num_logical_layers(res, level);
    assert(start_layer < total_num_layers);
@@ -881,7 +881,7 @@ crocus_resource_finish_write(struct crocus_context *ice,
                              uint32_t start_layer, uint32_t num_layers,
                              enum isl_aux_usage aux_usage)
 {
-   if (res->base.format == PIPE_FORMAT_S8_UINT)
+   if (res->base.b.format == PIPE_FORMAT_S8_UINT)
       res->shadow_needs_update = true;
 
    if (!crocus_resource_level_has_aux(res, level))
@@ -1048,18 +1048,18 @@ crocus_update_stencil_shadow(struct crocus_context *ice,
       return;
 
    struct pipe_box box;
-   for (unsigned level = 0; level <= res->base.last_level; level++) {
+   for (unsigned level = 0; level <= res->base.b.last_level; level++) {
       u_box_2d(0, 0,
-               u_minify(res->base.width0, level),
-               u_minify(res->base.height0, level), &box);
-      const unsigned depth = res->base.target == PIPE_TEXTURE_3D ?
-         u_minify(res->base.depth0, level) : res->base.array_size;
+               u_minify(res->base.b.width0, level),
+               u_minify(res->base.b.height0, level), &box);
+      const unsigned depth = res->base.b.target == PIPE_TEXTURE_3D ?
+         u_minify(res->base.b.depth0, level) : res->base.b.array_size;
 
       for (unsigned layer = 0; layer < depth; layer++) {
          box.z = layer;
          ice->ctx.resource_copy_region(&ice->ctx,
-                                       &res->shadow->base, level, 0, 0, layer,
-                                       &res->base, level, &box);
+                                       &res->shadow->base.b, level, 0, 0, layer,
+                                       &res->base.b, level, &box);
       }
    }
    res->shadow_needs_update = false;
diff --git a/src/gallium/drivers/crocus/crocus_resource.c b/src/gallium/drivers/crocus/crocus_resource.c
index 8854573ef9c..e3034268c7e 100644
--- a/src/gallium/drivers/crocus/crocus_resource.c
+++ b/src/gallium/drivers/crocus/crocus_resource.c
@@ -343,10 +343,10 @@ crocus_alloc_resource(struct pipe_screen *pscreen,
    if (!res)
       return NULL;
 
-   res->base = *templ;
-   res->base.screen = pscreen;
+   res->base.b = *templ;
+   res->base.b.screen = pscreen;
    res->orig_screen = crocus_pscreen_ref(pscreen);
-   pipe_reference_init(&res->base.reference, 1);
+   pipe_reference_init(&res->base.b.reference, 1);
 
    if (templ->target == PIPE_BUFFER)
       util_range_init(&res->valid_buffer_range);
@@ -608,7 +608,7 @@ crocus_resource_finish_aux_import(struct pipe_screen *pscreen,
    assert(crocus_resource_unfinished_aux_import(res));
    assert(!res->mod_info->supports_clear_color);
 
-   struct crocus_resource *aux_res = (void *) res->base.next;
+   struct crocus_resource *aux_res = (void *) res->base.b.next;
    assert(aux_res->aux.surf.row_pitch_B && aux_res->aux.offset &&
           aux_res->aux.bo);
 
@@ -621,8 +621,8 @@ crocus_resource_finish_aux_import(struct pipe_screen *pscreen,
    assert(res->bo->size >= (res->aux.offset + res->aux.surf.size_B));
    assert(aux_res->aux.surf.row_pitch_B == res->aux.surf.row_pitch_B);
 
-   crocus_resource_destroy(&screen->base, res->base.next);
-   res->base.next = NULL;
+   crocus_resource_destroy(&screen->base, res->base.b.next);
+   res->base.b.next = NULL;
 }
 
 static struct pipe_resource *
@@ -645,11 +645,11 @@ crocus_resource_create_for_buffer(struct pipe_screen *pscreen,
 
    res->bo = crocus_bo_alloc(screen->bufmgr, name, templ->width0);
    if (!res->bo) {
-      crocus_resource_destroy(pscreen, &res->base);
+      crocus_resource_destroy(pscreen, &res->base.b);
       return NULL;
    }
 
-   return &res->base;
+   return &res->base.b;
 }
 
 static struct pipe_resource *
@@ -721,25 +721,25 @@ crocus_resource_create_with_modifiers(struct pipe_screen *pscreen,
       struct pipe_resource templ_shadow = (struct pipe_resource) {
          .usage = 0,
          .bind = PIPE_BIND_SAMPLER_VIEW,
-         .width0 = res->base.width0,
-         .height0 = res->base.height0,
-         .depth0 = res->base.depth0,
-         .last_level = res->base.last_level,
-         .nr_samples = res->base.nr_samples,
-         .nr_storage_samples = res->base.nr_storage_samples,
-         .array_size = res->base.array_size,
+         .width0 = res->base.b.width0,
+         .height0 = res->base.b.height0,
+         .depth0 = res->base.b.depth0,
+         .last_level = res->base.b.last_level,
+         .nr_samples = res->base.b.nr_samples,
+         .nr_storage_samples = res->base.b.nr_storage_samples,
+         .array_size = res->base.b.array_size,
          .format = PIPE_FORMAT_R8_UINT,
-         .target = res->base.target,
+         .target = res->base.b.target,
       };
       res->shadow = (struct crocus_resource *)screen->base.resource_create(&screen->base, &templ_shadow);
       assert(res->shadow);
    }
 
-   return &res->base;
+   return &res->base.b;
 
 fail:
    fprintf(stderr, "XXX: resource creation failed\n");
-   crocus_resource_destroy(pscreen, &res->base);
+   crocus_resource_destroy(pscreen, &res->base.b);
    return NULL;
 
 }
@@ -789,9 +789,9 @@ crocus_resource_from_user_memory(struct pipe_screen *pscreen,
       return NULL;
    }
 
-   util_range_add(&res->base, &res->valid_buffer_range, 0, templ->width0);
+   util_range_add(&res->base.b, &res->valid_buffer_range, 0, templ->width0);
 
-   return &res->base;
+   return &res->base.b;
 }
 
 static struct pipe_resource *
@@ -869,10 +869,10 @@ crocus_resource_from_handle(struct pipe_screen *pscreen,
       res->bo = NULL;
    }
 
-   return &res->base;
+   return &res->base.b;
 
 fail:
-   crocus_resource_destroy(pscreen, &res->base);
+   crocus_resource_destroy(pscreen, &res->base.b);
    return NULL;
 }
 
@@ -899,7 +899,7 @@ crocus_resource_from_memobj(struct pipe_screen *pscreen,
    res->offset = offset;
    res->external_format = memobj->format;
 
-   return &res->base;
+   return &res->base.b;
 }
 
 static void
@@ -1174,7 +1174,7 @@ static void
 crocus_map_copy_region(struct crocus_transfer *map)
 {
    struct pipe_screen *pscreen = &map->batch->screen->base;
-   struct pipe_transfer *xfer = &map->base;
+   struct pipe_transfer *xfer = &map->base.b;
    struct pipe_box *box = &xfer->box;
    struct crocus_resource *res = (void *) xfer->resource;
 
@@ -1311,7 +1311,7 @@ s8_offset(uint32_t stride, uint32_t x, uint32_t y, bool swizzled)
 static void
 crocus_unmap_s8(struct crocus_transfer *map)
 {
-   struct pipe_transfer *xfer = &map->base;
+   struct pipe_transfer *xfer = &map->base.b;
    const struct pipe_box *box = &xfer->box;
    struct crocus_resource *res = (struct crocus_resource *) xfer->resource;
    struct isl_surf *surf = &res->surf;
@@ -1344,7 +1344,7 @@ crocus_unmap_s8(struct crocus_transfer *map)
 static void
 crocus_map_s8(struct crocus_transfer *map)
 {
-   struct pipe_transfer *xfer = &map->base;
+   struct pipe_transfer *xfer = &map->base.b;
    const struct pipe_box *box = &xfer->box;
    struct crocus_resource *res = (struct crocus_resource *) xfer->resource;
    struct isl_surf *surf = &res->surf;
@@ -1417,7 +1417,7 @@ tile_extents(const struct isl_surf *surf,
 static void
 crocus_unmap_tiled_memcpy(struct crocus_transfer *map)
 {
-   struct pipe_transfer *xfer = &map->base;
+   struct pipe_transfer *xfer = &map->base.b;
    const struct pipe_box *box = &xfer->box;
    struct crocus_resource *res = (struct crocus_resource *) xfer->resource;
    struct isl_surf *surf = &res->surf;
@@ -1445,7 +1445,7 @@ crocus_unmap_tiled_memcpy(struct crocus_transfer *map)
 static void
 crocus_map_tiled_memcpy(struct crocus_transfer *map)
 {
-   struct pipe_transfer *xfer = &map->base;
+   struct pipe_transfer *xfer = &map->base.b;
    const struct pipe_box *box = &xfer->box;
    struct crocus_resource *res = (struct crocus_resource *) xfer->resource;
    struct isl_surf *surf = &res->surf;
@@ -1493,13 +1493,13 @@ crocus_map_tiled_memcpy(struct crocus_transfer *map)
 static void
 crocus_map_direct(struct crocus_transfer *map)
 {
-   struct pipe_transfer *xfer = &map->base;
+   struct pipe_transfer *xfer = &map->base.b;
    struct pipe_box *box = &xfer->box;
    struct crocus_resource *res = (struct crocus_resource *) xfer->resource;
 
    void *ptr = crocus_bo_map(map->dbg, res->bo, xfer->usage & MAP_FLAGS);
 
-   if (res->base.target == PIPE_BUFFER) {
+   if (res->base.b.target == PIPE_BUFFER) {
       xfer->stride = 0;
       xfer->layer_stride = 0;
 
@@ -1529,7 +1529,7 @@ can_promote_to_async(const struct crocus_resource *res,
     * initialized with useful data, then we can safely promote this write
     * to be unsynchronized.  This helps the common pattern of appending data.
     */
-   return res->base.target == PIPE_BUFFER && (usage & PIPE_MAP_WRITE) &&
+   return res->base.b.target == PIPE_BUFFER && (usage & PIPE_MAP_WRITE) &&
           !(usage & TC_TRANSFER_MAP_NO_INFER_UNSYNCHRONIZED) &&
           !util_ranges_intersect(&res->valid_buffer_range, box->x,
                                  box->x + box->width);
@@ -1579,7 +1579,7 @@ crocus_transfer_map(struct pipe_context *ctx,
       return NULL;
 
    struct crocus_transfer *map = slab_alloc(&ice->transfer_pool);
-   struct pipe_transfer *xfer = &map->base;
+   struct pipe_transfer *xfer = &map->base.b;
 
    if (!map)
       return NULL;
@@ -1599,7 +1599,7 @@ crocus_transfer_map(struct pipe_context *ctx,
                             box->x + box->width);
 
    if (usage & PIPE_MAP_WRITE)
-      util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
+      util_range_add(&res->base.b, &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
@@ -1678,14 +1678,14 @@ crocus_transfer_flush_region(struct pipe_context *ctx,
 
    uint32_t history_flush = 0;
 
-   if (res->base.target == PIPE_BUFFER) {
+   if (res->base.b.target == PIPE_BUFFER) {
       if (map->staging)
          history_flush |= PIPE_CONTROL_RENDER_TARGET_FLUSH;
 
       if (map->dest_had_defined_contents)
          history_flush |= crocus_flush_bits_for_history(res);
 
-      util_range_add(&res->base, &res->valid_buffer_range, box->x, box->x + box->width);
+      util_range_add(&res->base.b, &res->valid_buffer_range, box->x, box->x + box->width);
    }
 
    if (history_flush & ~PIPE_CONTROL_CS_STALL) {
@@ -1730,6 +1730,10 @@ crocus_transfer_unmap(struct pipe_context *ctx, struct pipe_transfer *xfer)
       map->unmap(map);
 
    pipe_resource_reference(&xfer->resource, NULL);
+   /* transfer_unmap is always called from the driver thread, so we have to
+    * use transfer_pool, not transfer_pool_unsync.  Freeing an object into a
+    * different pool is allowed, however.
+    */
    slab_free(&ice->transfer_pool, map);
 }
 
@@ -1782,7 +1786,7 @@ crocus_flush_and_dirty_for_history(struct crocus_context *ice,
                                    uint32_t extra_flags,
                                    const char *reason)
 {
-   if (res->base.target != PIPE_BUFFER)
+   if (res->base.b.target != PIPE_BUFFER)
       return;
 
    uint32_t flush = crocus_flush_bits_for_history(res) | extra_flags;
diff --git a/src/gallium/drivers/crocus/crocus_resource.h b/src/gallium/drivers/crocus/crocus_resource.h
index b16a7184de0..6a165820207 100644
--- a/src/gallium/drivers/crocus/crocus_resource.h
+++ b/src/gallium/drivers/crocus/crocus_resource.h
@@ -26,6 +26,7 @@
 #include "pipe/p_state.h"
 #include "util/u_inlines.h"
 #include "util/u_range.h"
+#include "util/u_threaded_context.h"
 #include "intel/isl/isl.h"
 #include "intel/dev/intel_device_info.h"
 #include "crocus_bufmgr.h"
@@ -83,7 +84,7 @@ crocus_combine_swizzle(enum pipe_swizzle outswz[4],
  * They contain the storage (BO) and layout information (ISL surface).
  */
 struct crocus_resource {
-   struct pipe_resource base;
+   struct threaded_resource base;
    enum pipe_format internal_format;
 
    /**
@@ -259,7 +260,7 @@ struct crocus_surface {
  * Transfer object - information about a buffer mapping.
  */
 struct crocus_transfer {
-   struct pipe_transfer base;
+   struct threaded_transfer base;
    struct pipe_debug_callback *dbg;
    void *buffer;
    void *ptr;
@@ -497,7 +498,7 @@ void crocus_resource_prepare_texture(struct crocus_context *ice,
 static inline bool
 crocus_resource_unfinished_aux_import(struct crocus_resource *res)
 {
-   return res->base.next != NULL && res->mod_info &&
+   return res->base.b.next != NULL && res->mod_info &&
       res->mod_info->aux_usage != ISL_AUX_USAGE_NONE;
 }
 
diff --git a/src/gallium/drivers/crocus/crocus_state.c b/src/gallium/drivers/crocus/crocus_state.c
index e623ae62d4b..78b667d7e1a 100644
--- a/src/gallium/drivers/crocus/crocus_state.c
+++ b/src/gallium/drivers/crocus/crocus_state.c
@@ -2689,11 +2689,11 @@ crocus_create_sampler_view(struct pipe_context *ctx,
 
       crocus_get_depth_stencil_resources(devinfo, tex, &zres, &sres);
 
-      tex = util_format_has_depth(desc) ? &zres->base : &sres->base;
+      tex = util_format_has_depth(desc) ? &zres->base.b : &sres->base.b;
 
       if (tex->format == PIPE_FORMAT_S8_UINT)
          if (devinfo->ver == 7 && sres->shadow)
-            tex = &sres->shadow->base;
+            tex = &sres->shadow->base.b;
    }
 
    isv->res = (struct crocus_resource *) tex;
@@ -2907,8 +2907,8 @@ crocus_create_surface(struct pipe_context *ctx,
       uint32_t temp_offset, temp_x, temp_y;
 
       isl_surf_get_image_offset_B_tile_sa(&res->surf, tmpl->u.tex.level,
-                                          res->base.target == PIPE_TEXTURE_3D ? 0 : tmpl->u.tex.first_layer,
-                                          res->base.target == PIPE_TEXTURE_3D ? tmpl->u.tex.first_layer : 0,
+                                          res->base.b.target == PIPE_TEXTURE_3D ? 0 : tmpl->u.tex.first_layer,
+                                          res->base.b.target == PIPE_TEXTURE_3D ? tmpl->u.tex.first_layer : 0,
                                           &temp_offset, &temp_x, &temp_y);
       if (!devinfo->has_surface_tile_offset &&
           (temp_x || temp_y)) {
@@ -2917,11 +2917,11 @@ crocus_create_surface(struct pipe_context *ctx,
           */
          /* move to temp */
          struct pipe_resource wa_templ = (struct pipe_resource) {
-            .width0 = u_minify(res->base.width0, tmpl->u.tex.level),
-            .height0 = u_minify(res->base.height0, tmpl->u.tex.level),
+            .width0 = u_minify(res->base.b.width0, tmpl->u.tex.level),
+            .height0 = u_minify(res->base.b.height0, tmpl->u.tex.level),
             .depth0 = 1,
             .array_size = 1,
-            .format = res->base.format,
+            .format = res->base.b.format,
             .target = PIPE_TEXTURE_2D,
             .bind = (usage & ISL_SURF_USAGE_DEPTH_BIT ? PIPE_BIND_DEPTH_STENCIL : PIPE_BIND_RENDER_TARGET) | PIPE_BIND_SAMPLER_VIEW,
          };
@@ -3084,7 +3084,7 @@ crocus_set_shader_images(struct pipe_context *ctx,
                fmt.fmt = isl_lower_storage_image_format(devinfo, fmt.fmt);
          }
 
-         if (res->base.target != PIPE_BUFFER) {
+         if (res->base.b.target != PIPE_BUFFER) {
             struct isl_view view = {
                .format = fmt.fmt,
                .base_level = img->u.tex.level,
@@ -3108,7 +3108,7 @@ crocus_set_shader_images(struct pipe_context *ctx,
             };
             iv->view = view;
 
-            util_range_add(&res->base, &res->valid_buffer_range, img->u.buf.offset,
+            util_range_add(&res->base.b, &res->valid_buffer_range, img->u.buf.offset,
                            img->u.buf.offset + img->u.buf.size);
             fill_buffer_image_param(&image_params[start_slot + i],
                                     img->format, img->u.buf.size);
@@ -3602,7 +3602,7 @@ crocus_set_shader_buffers(struct pipe_context *ctx,
       if (buffers && buffers[i].buffer) {
          struct crocus_resource *res = (void *) buffers[i].buffer;
          struct pipe_shader_buffer *ssbo = &shs->ssbo[start_slot + i];
-         pipe_resource_reference(&ssbo->buffer, &res->base);
+         pipe_resource_reference(&ssbo->buffer, &res->base.b);
          ssbo->buffer_offset = buffers[i].buffer_offset;
          ssbo->buffer_size =
             MIN2(buffers[i].buffer_size, res->bo->size - ssbo->buffer_offset);
@@ -3612,7 +3612,7 @@ crocus_set_shader_buffers(struct pipe_context *ctx,
          res->bind_history |= PIPE_BIND_SHADER_BUFFER;
          res->bind_stages |= 1 << stage;
 
-         util_range_add(&res->base, &res->valid_buffer_range, ssbo->buffer_offset,
+         util_range_add(&res->base.b, &res->valid_buffer_range, ssbo->buffer_offset,
                         ssbo->buffer_offset + ssbo->buffer_size);
       } else {
          pipe_resource_reference(&shs->ssbo[start_slot + i].buffer, NULL);
@@ -3948,7 +3948,7 @@ crocus_get_so_offset(struct pipe_stream_output_target *so)
    struct pipe_box box;
    uint32_t result;
    u_box_1d(tgt->offset_offset, 4, &box);
-   void *val = so->context->buffer_map(so->context, &tgt->offset_res->base,
+   void *val = so->context->buffer_map(so->context, &tgt->offset_res->base.b,
                                        0, PIPE_MAP_DIRECTLY,
                                        &box, &transfer);
    assert(val);
@@ -4005,7 +4005,7 @@ crocus_create_stream_output_target(struct pipe_context *ctx,
    cso->base.buffer_size = buffer_size;
    cso->base.context = ctx;
 
-   util_range_add(&res->base, &res->valid_buffer_range, buffer_offset,
+   util_range_add(&res->base.b, &res->valid_buffer_range, buffer_offset,
                   buffer_offset + buffer_size);
 #if GFX_VER >= 7
    struct crocus_context *ice = (struct crocus_context *) ctx;
@@ -4953,7 +4953,7 @@ emit_surface_state(struct crocus_batch *batch,
 
    struct isl_surf surf = *in_surf;
    if (adjust_surf) {
-      if (res->base.target == PIPE_TEXTURE_3D && view->array_len == 1) {
+      if (res->base.b.target == PIPE_TEXTURE_3D && view->array_len == 1) {
          isl_surf_get_image_surf(isl_dev, in_surf,
                                  view->base_level, 0,
                                  view->base_array_layer,
@@ -4961,7 +4961,7 @@ emit_surface_state(struct crocus_batch *batch,
                                  &tile_x_sa, &tile_y_sa);
          view->base_array_layer = 0;
          view->base_level = 0;
-      } else if (res->base.target == PIPE_TEXTURE_CUBE && devinfo->ver == 4) {
+      } else if (res->base.b.target == PIPE_TEXTURE_CUBE && devinfo->ver == 4) {
          isl_surf_get_image_surf(isl_dev, in_surf,
                                  view->base_level, view->base_array_layer,
                                  0,
@@ -4969,7 +4969,7 @@ emit_surface_state(struct crocus_batch *batch,
                                  &tile_x_sa, &tile_y_sa);
          view->base_array_layer = 0;
          view->base_level = 0;
-      } else if (res->base.target == PIPE_TEXTURE_1D_ARRAY)
+      } else if (res->base.b.target == PIPE_TEXTURE_1D_ARRAY)
          surf.dim = ISL_SURF_DIM_2D;
    }
 
@@ -5044,7 +5044,7 @@ emit_surface(struct crocus_batch *batch,
    struct crocus_resource *res = (struct crocus_resource *)surf->base.texture;
    struct isl_view *view = &surf->view;
    uint32_t offset = 0;
-   enum pipe_texture_target target = res->base.target;
+   enum pipe_texture_target target = res->base.b.target;
    bool adjust_surf = false;
 
    if (devinfo->ver == 4 && target == PIPE_TEXTURE_CUBE)
@@ -5204,7 +5204,7 @@ emit_image_view(struct crocus_context *ice,
                                        isl_dev->ss.align, &offset);
    bool write = iv->base.shader_access & PIPE_IMAGE_ACCESS_WRITE;
    uint32_t reloc = RELOC_32BIT | (write ? RELOC_WRITE : 0);
-   if (res->base.target == PIPE_BUFFER) {
+   if (res->base.b.target == PIPE_BUFFER) {
       const struct isl_format_layout *fmtl = isl_format_get_layout(iv->view.format);
       const unsigned cpp = iv->view.format == ISL_FORMAT_RAW ? 1 : fmtl->bpb / 8;
       unsigned final_size =
@@ -5315,7 +5315,7 @@ emit_sol_surface(struct crocus_batch *batch,
                                        isl_dev->ss.align, &offset);
    isl_buffer_fill_state(isl_dev, surf_state,
                          .address = crocus_state_reloc(batch, offset + isl_dev->ss.addr_offset,
-                                                       crocus_resource_bo(&buf->base),
+                                                       crocus_resource_bo(&buf->base.b),
                                                        offset_dwords * 4, RELOC_32BIT|RELOC_WRITE),
                          .size_B = num_elements * 4,
                          .stride_B = stride_dwords * 4,
@@ -6546,7 +6546,7 @@ crocus_upload_dirty_render_state(struct crocus_context *ice,
 
                sob.SurfaceSize = MAX2(tgt->base.buffer_size / 4, 1) - 1;
                sob.StreamOutputBufferOffsetAddress =
-                  rw_bo(crocus_resource_bo(&tgt->offset_res->base), tgt->offset_offset);
+                  rw_bo(crocus_resource_bo(&tgt->offset_res->base.b), tgt->offset_offset);
                if (tgt->zero_offset) {
                   sob.StreamOffset = 0;
                   tgt->zero_offset = false;
@@ -7926,7 +7926,7 @@ crocus_upload_render_state(struct crocus_context *ice,
       mi_builder_init(&b, &batch->screen->devinfo, batch);
 
       struct crocus_address addr =
-         ro_bo(crocus_resource_bo(&so->offset_res->base), so->offset_offset);
+         ro_bo(crocus_resource_bo(&so->offset_res->base.b), so->offset_offset);
       struct mi_value offset =
          mi_iadd_imm(&b, mi_mem32(addr), -so->base.buffer_offset);
 
@@ -8253,7 +8253,7 @@ crocus_rebind_buffer(struct crocus_context *ice,
 {
    struct pipe_context *ctx = &ice->ctx;
 
-   assert(res->base.target == PIPE_BUFFER);
+   assert(res->base.b.target == PIPE_BUFFER);
 
    /* Buffers can't be framebuffer attachments, nor display related,
     * and we don't have upstream Clover support.
@@ -8272,7 +8272,7 @@ crocus_rebind_buffer(struct crocus_context *ice,
          const int i = u_bit_scan64(&bound_vbs);
          struct pipe_vertex_buffer *buffer = &ice->state.vertex_buffers[i];
 
-         if (!buffer->is_user_buffer && &res->base == buffer->buffer.resource)
+         if (!buffer->is_user_buffer && &res->base.b == buffer->buffer.resource)
             ice->state.dirty |= CROCUS_DIRTY_VERTEX_BUFFERS;
       }
    }
@@ -8329,7 +8329,7 @@ crocus_rebind_buffer(struct crocus_context *ice,
 
             if (res->bo == crocus_resource_bo(ssbo->buffer)) {
                struct pipe_shader_buffer buf = {
-                  .buffer = &res->base,
+                  .buffer = &res->base.b,
                   .buffer_offset = ssbo->buffer_offset,
                   .buffer_size = ssbo->buffer_size,
                };



More information about the mesa-commit mailing list