Module: Mesa
Branch: master
Commit: 46bbc835c1006cc38010a07b7465c18515c22614
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=46bbc835c1006cc38010a07b7465c18515c22614

Author: Mike Blumenkrantz <[email protected]>
Date:   Tue Oct 27 11:38:16 2020 -0400

zink: move resource internals to a separate struct

this starts the path towards being able to replace the backing objects for
a resource

Reviewed-by: Dave Airlie <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9544>

---

 src/gallium/drivers/zink/zink_batch.c    | 12 ++---
 src/gallium/drivers/zink/zink_blit.c     |  8 +--
 src/gallium/drivers/zink/zink_clear.c    |  4 +-
 src/gallium/drivers/zink/zink_context.c  | 24 ++++-----
 src/gallium/drivers/zink/zink_draw.c     | 36 ++++++-------
 src/gallium/drivers/zink/zink_query.c    |  4 +-
 src/gallium/drivers/zink/zink_resource.c | 91 ++++++++++++++++++--------------
 src/gallium/drivers/zink/zink_resource.h | 27 ++++++----
 src/gallium/drivers/zink/zink_surface.c  |  2 +-
 9 files changed, 112 insertions(+), 96 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_batch.c 
b/src/gallium/drivers/zink/zink_batch.c
index f6cf4f22453..17ca72d9402 100644
--- a/src/gallium/drivers/zink/zink_batch.c
+++ b/src/gallium/drivers/zink/zink_batch.c
@@ -123,12 +123,12 @@ zink_end_batch(struct zink_context *ctx, struct 
zink_batch *batch)
 
    util_dynarray_foreach(&batch->persistent_resources, struct zink_resource*, 
res) {
        struct zink_screen *screen = zink_screen(ctx->base.screen);
-       assert(!(*res)->offset);
+       assert(!(*res)->obj->offset);
        VkMappedMemoryRange range = {
           VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE,
           NULL,
-          (*res)->mem,
-          (*res)->offset,
+          (*res)->obj->mem,
+          (*res)->obj->offset,
           VK_WHOLE_SIZE,
        };
        vkFlushMappedMemoryRanges(screen->dev, 1, &range);
@@ -150,7 +150,7 @@ zink_end_batch(struct zink_context *ctx, struct zink_batch 
*batch)
    };
 
    if (batch->flush_res) {
-      mem_signal.memory = batch->flush_res->mem;
+      mem_signal.memory = batch->flush_res->obj->mem;
       si.pNext = &mem_signal;
    }
 
@@ -202,10 +202,10 @@ zink_batch_reference_resource_rw(struct zink_batch 
*batch, struct zink_resource
       _mesa_set_search_and_add(batch->resources, res, &found);
       if (!found) {
          pipe_reference(NULL, &res->base.reference);
-         batch->resource_size += res->size;
+         batch->resource_size += res->obj->size;
          if (stencil) {
             pipe_reference(NULL, &stencil->base.reference);
-            batch->resource_size += stencil->size;
+            batch->resource_size += stencil->obj->size;
          }
       }
    }
diff --git a/src/gallium/drivers/zink/zink_blit.c 
b/src/gallium/drivers/zink/zink_blit.c
index cdcda6f2e4a..1ef54b8a946 100644
--- a/src/gallium/drivers/zink/zink_blit.c
+++ b/src/gallium/drivers/zink/zink_blit.c
@@ -84,8 +84,8 @@ blit_resolve(struct zink_context *ctx, const struct 
pipe_blit_info *info)
    region.extent.width = info->dst.box.width;
    region.extent.height = info->dst.box.height;
    region.extent.depth = info->dst.box.depth;
-   vkCmdResolveImage(batch->cmdbuf, src->image, src->layout,
-                     dst->image, dst->layout,
+   vkCmdResolveImage(batch->cmdbuf, src->obj->image, src->layout,
+                     dst->obj->image, dst->layout,
                      1, &region);
 
    return true;
@@ -169,8 +169,8 @@ blit_native(struct zink_context *ctx, const struct 
pipe_blit_info *info)
       region.dstSubresource.layerCount = 1;
    }
 
-   vkCmdBlitImage(batch->cmdbuf, src->image, src->layout,
-                  dst->image, dst->layout,
+   vkCmdBlitImage(batch->cmdbuf, src->obj->image, src->layout,
+                  dst->obj->image, dst->layout,
                   1, &region,
                   zink_filter(info->filter));
 
diff --git a/src/gallium/drivers/zink/zink_clear.c 
b/src/gallium/drivers/zink/zink_clear.c
index f2db6c9bfab..fee325da610 100644
--- a/src/gallium/drivers/zink/zink_clear.c
+++ b/src/gallium/drivers/zink/zink_clear.c
@@ -139,7 +139,7 @@ clear_color_no_rp(struct zink_context *ctx, struct 
zink_resource *res, const uni
        zink_resource_image_needs_barrier(res, 
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0))
       zink_resource_image_barrier(ctx, NULL, res, 
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0);
    zink_batch_reference_resource_rw(batch, res, true);
-   vkCmdClearColorImage(batch->cmdbuf, res->image, res->layout, &color, 1, 
&range);
+   vkCmdClearColorImage(batch->cmdbuf, res->obj->image, res->layout, &color, 
1, &range);
 }
 
 static void
@@ -159,7 +159,7 @@ clear_zs_no_rp(struct zink_context *ctx, struct 
zink_resource *res, VkImageAspec
        zink_resource_image_needs_barrier(res, 
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0))
       zink_resource_image_barrier(ctx, NULL, res, 
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, 0);
    zink_batch_reference_resource_rw(batch, res, true);
-   vkCmdClearDepthStencilImage(batch->cmdbuf, res->image, res->layout, 
&zs_value, 1, &range);
+   vkCmdClearDepthStencilImage(batch->cmdbuf, res->obj->image, res->layout, 
&zs_value, 1, &range);
 }
 
 
diff --git a/src/gallium/drivers/zink/zink_context.c 
b/src/gallium/drivers/zink/zink_context.c
index 390a411eb0e..ad1f45a40a1 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -550,7 +550,7 @@ create_buffer_view(struct zink_screen *screen, struct 
zink_resource *res, enum p
    VkBufferView view = VK_NULL_HANDLE;
    VkBufferViewCreateInfo bvci = {};
    bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
-   bvci.buffer = res->buffer;
+   bvci.buffer = res->obj->buffer;
    bvci.format = zink_get_format(screen, format);
    assert(bvci.format);
    bvci.offset = offset;
@@ -579,7 +579,7 @@ zink_create_sampler_view(struct pipe_context *pctx, struct 
pipe_resource *pres,
    if (state->target != PIPE_BUFFER) {
       VkImageViewCreateInfo ivci = {};
       ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
-      ivci.image = res->image;
+      ivci.image = res->obj->image;
       ivci.viewType = image_view_type(state->target);
 
       ivci.components.r = component_mapping(state->swizzle_r);
@@ -771,7 +771,7 @@ zink_set_constant_buffer(struct pipe_context *pctx,
       }
       struct zink_resource *res = 
zink_resource(ctx->ubos[shader][index].buffer);
       update |= (index && ctx->ubos[shader][index].buffer_offset != offset) ||
-                !!res != !!buffer || (res && res->buffer != 
zink_resource(buffer)->buffer) ||
+                !!res != !!buffer || (res && res->obj->buffer != 
zink_resource(buffer)->obj->buffer) ||
                 ctx->ubos[shader][index].buffer_size != cb->buffer_size;
 
       if (take_ownership) {
@@ -818,7 +818,7 @@ zink_set_shader_buffers(struct pipe_context *pctx,
          struct zink_resource *res = zink_resource(buffers[i].buffer);
          pipe_resource_reference(&ssbo->buffer, &res->base);
          ssbo->buffer_offset = buffers[i].buffer_offset;
-         ssbo->buffer_size = MIN2(buffers[i].buffer_size, res->size - 
ssbo->buffer_offset);
+         ssbo->buffer_size = MIN2(buffers[i].buffer_size, res->obj->size - 
ssbo->buffer_offset);
          util_range_add(&res->base, &res->valid_buffer_range, 
ssbo->buffer_offset,
                         ssbo->buffer_offset + ssbo->buffer_size);
          update = true;
@@ -1452,7 +1452,7 @@ zink_resource_image_barrier(struct zink_context *ctx, 
struct zink_batch *batch,
       new_layout,
       VK_QUEUE_FAMILY_IGNORED,
       VK_QUEUE_FAMILY_IGNORED,
-      res->image,
+      res->obj->image,
       isr
    };
    vkCmdPipelineBarrier(
@@ -1541,8 +1541,8 @@ zink_resource_buffer_barrier(struct zink_context *ctx, 
struct zink_batch *batch,
       flags,
       VK_QUEUE_FAMILY_IGNORED,
       VK_QUEUE_FAMILY_IGNORED,
-      res->buffer,
-      res->offset,
+      res->obj->buffer,
+      res->obj->offset,
       res->base.width0
    };
 
@@ -1841,7 +1841,7 @@ zink_copy_buffer(struct zink_context *ctx, struct 
zink_batch *batch, struct zink
    util_range_add(&dst->base, &dst->valid_buffer_range, dst_offset, dst_offset 
+ size);
    zink_resource_buffer_barrier(ctx, batch, src, VK_ACCESS_TRANSFER_READ_BIT, 
0);
    zink_resource_buffer_barrier(ctx, batch, dst, VK_ACCESS_TRANSFER_WRITE_BIT, 
0);
-   vkCmdCopyBuffer(batch->cmdbuf, src->buffer, dst->buffer, 1, &region);
+   vkCmdCopyBuffer(batch->cmdbuf, src->obj->buffer, dst->obj->buffer, 1, 
&region);
 }
 
 void
@@ -1916,9 +1916,9 @@ zink_copy_image_buffer(struct zink_context *ctx, struct 
zink_batch *batch, struc
        * - vkCmdCopyBufferToImage spec
        */
       if (buf2img)
-         vkCmdCopyBufferToImage(batch->cmdbuf, buf->buffer, img->image, 
img->layout, 1, &region);
+         vkCmdCopyBufferToImage(batch->cmdbuf, buf->obj->buffer, 
img->obj->image, img->layout, 1, &region);
       else
-         vkCmdCopyImageToBuffer(batch->cmdbuf, img->image, img->layout, 
buf->buffer, 1, &region);
+         vkCmdCopyImageToBuffer(batch->cmdbuf, img->obj->image, img->layout, 
buf->obj->buffer, 1, &region);
    }
 }
 
@@ -1985,8 +1985,8 @@ zink_resource_copy_region(struct pipe_context *pctx,
       zink_batch_reference_resource_rw(batch, dst, true);
 
       zink_resource_setup_transfer_layouts(ctx, src, dst);
-      vkCmdCopyImage(batch->cmdbuf, src->image, src->layout,
-                     dst->image, dst->layout,
+      vkCmdCopyImage(batch->cmdbuf, src->obj->image, src->layout,
+                     dst->obj->image, dst->layout,
                      1, &region);
    } else if (dst->base.target == PIPE_BUFFER &&
               src->base.target == PIPE_BUFFER) {
diff --git a/src/gallium/drivers/zink/zink_draw.c 
b/src/gallium/drivers/zink/zink_draw.c
index 03b5a0be608..c53fb3a8b93 100644
--- a/src/gallium/drivers/zink/zink_draw.c
+++ b/src/gallium/drivers/zink/zink_draw.c
@@ -117,12 +117,12 @@ zink_emit_stream_output_targets(struct pipe_context *pctx)
       struct zink_so_target *t = (struct zink_so_target *)ctx->so_targets[i];
       if (!t) {
          /* no need to reference this or anything */
-         buffers[i] = zink_resource(ctx->dummy_xfb_buffer)->buffer;
+         buffers[i] = zink_resource(ctx->dummy_xfb_buffer)->obj->buffer;
          buffer_offsets[i] = 0;
          buffer_sizes[i] = sizeof(uint8_t);
          continue;
       }
-      buffers[i] = zink_resource(t->base.buffer)->buffer;
+      buffers[i] = zink_resource(t->base.buffer)->obj->buffer;
       zink_resource_buffer_barrier(ctx, NULL, zink_resource(t->base.buffer),
                                    VK_ACCESS_TRANSFORM_FEEDBACK_WRITE_BIT_EXT, 
VK_PIPELINE_STAGE_TRANSFORM_FEEDBACK_BIT_EXT);
       zink_batch_reference_resource_rw(batch, zink_resource(t->base.buffer), 
true);
@@ -190,12 +190,12 @@ zink_bind_vertex_buffers(struct zink_batch *batch, struct 
zink_context *ctx)
       assert(vb);
       if (vb->buffer.resource) {
          struct zink_resource *res = zink_resource(vb->buffer.resource);
-         buffers[i] = res->buffer;
+         buffers[i] = res->obj->buffer;
          buffer_offsets[i] = vb->buffer_offset;
          buffer_strides[i] = vb->stride;
          zink_batch_reference_resource_rw(batch, res, false);
       } else {
-         buffers[i] = zink_resource(ctx->dummy_vertex_buffer)->buffer;
+         buffers[i] = zink_resource(ctx->dummy_vertex_buffer)->obj->buffer;
          buffer_offsets[i] = 0;
          buffer_strides[i] = 0;
       }
@@ -404,10 +404,10 @@ update_ubo_descriptors(struct zink_context *ctx, struct 
zink_descriptor_set *zds
          assert(num_resources < num_bindings);
          desc_set_res_add(zds, res, num_resources++, cache_hit);
          assert(num_buffer_info < num_bindings);
-         buffer_infos[num_buffer_info].buffer = res ? res->buffer :
+         buffer_infos[num_buffer_info].buffer = res ? res->obj->buffer :
                                                 
(screen->info.rb2_feats.nullDescriptor ?
                                                  VK_NULL_HANDLE :
-                                                 
zink_resource(ctx->dummy_vertex_buffer)->buffer);
+                                                 
zink_resource(ctx->dummy_vertex_buffer)->obj->buffer);
          if (shader->bindings[zds->pool->type][j].type == 
VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC) {
             buffer_infos[num_buffer_info].offset = 0;
             /* we're storing this to qsort later */
@@ -488,7 +488,7 @@ update_ssbo_descriptors(struct zink_context *ctx, struct 
zink_descriptor_set *zd
                flag |= VK_ACCESS_SHADER_WRITE_BIT;
             if (!cache_hit)
                add_barrier(res, 0, flag, stage, &zds->barriers, ht);
-            buffer_infos[num_buffer_info].buffer = res->buffer;
+            buffer_infos[num_buffer_info].buffer = res->obj->buffer;
             buffer_infos[num_buffer_info].offset = 
ctx->ssbos[stage][index].buffer_offset;
             buffer_infos[num_buffer_info].range  = 
ctx->ssbos[stage][index].buffer_size;
          } else {
@@ -1066,7 +1066,7 @@ zink_draw_vbo(struct pipe_context *pctx,
             struct zink_resource *res = zink_resource(t->counter_buffer);
             zink_batch_reference_resource_rw(batch, res, true);
             if (t->counter_buffer_valid) {
-               counter_buffers[i] = res->buffer;
+               counter_buffers[i] = res->obj->buffer;
                counter_buffer_offsets[i] = t->counter_buffer_offset;
             }
          }
@@ -1095,7 +1095,7 @@ zink_draw_vbo(struct pipe_context *pctx,
          unreachable("unknown index size!");
       }
       struct zink_resource *res = zink_resource(index_buffer);
-      vkCmdBindIndexBuffer(batch->cmdbuf, res->buffer, index_offset, 
index_type);
+      vkCmdBindIndexBuffer(batch->cmdbuf, res->obj->buffer, index_offset, 
index_type);
       zink_batch_reference_resource_rw(batch, res, false);
       if (dindirect && dindirect->buffer) {
          struct zink_resource *indirect = zink_resource(dindirect->buffer);
@@ -1103,11 +1103,11 @@ zink_draw_vbo(struct pipe_context *pctx,
          if (dindirect->indirect_draw_count) {
              struct zink_resource *indirect_draw_count = 
zink_resource(dindirect->indirect_draw_count);
              zink_batch_reference_resource_rw(batch, indirect_draw_count, 
false);
-             screen->vk_CmdDrawIndexedIndirectCount(batch->cmdbuf, 
indirect->buffer, dindirect->offset,
-                                           indirect_draw_count->buffer, 
dindirect->indirect_draw_count_offset,
+             screen->vk_CmdDrawIndexedIndirectCount(batch->cmdbuf, 
indirect->obj->buffer, dindirect->offset,
+                                           indirect_draw_count->obj->buffer, 
dindirect->indirect_draw_count_offset,
                                            dindirect->draw_count, 
dindirect->stride);
          } else
-            vkCmdDrawIndexedIndirect(batch->cmdbuf, indirect->buffer, 
dindirect->offset, dindirect->draw_count, dindirect->stride);
+            vkCmdDrawIndexedIndirect(batch->cmdbuf, indirect->obj->buffer, 
dindirect->offset, dindirect->draw_count, dindirect->stride);
       } else
          vkCmdDrawIndexed(batch->cmdbuf,
             draws[0].count, dinfo->instance_count,
@@ -1117,7 +1117,7 @@ zink_draw_vbo(struct pipe_context *pctx,
          zink_batch_reference_resource_rw(batch, 
zink_resource(so_target->base.buffer), false);
          zink_batch_reference_resource_rw(batch, 
zink_resource(so_target->counter_buffer), true);
          screen->vk_CmdDrawIndirectByteCountEXT(batch->cmdbuf, 
dinfo->instance_count, dinfo->start_instance,
-                                       
zink_resource(so_target->counter_buffer)->buffer, 
so_target->counter_buffer_offset, 0,
+                                       
zink_resource(so_target->counter_buffer)->obj->buffer, 
so_target->counter_buffer_offset, 0,
                                        MIN2(so_target->stride, 
screen->info.tf_props.maxTransformFeedbackBufferDataStride));
       } else if (dindirect && dindirect->buffer) {
          struct zink_resource *indirect = zink_resource(dindirect->buffer);
@@ -1125,11 +1125,11 @@ zink_draw_vbo(struct pipe_context *pctx,
          if (dindirect->indirect_draw_count) {
              struct zink_resource *indirect_draw_count = 
zink_resource(dindirect->indirect_draw_count);
              zink_batch_reference_resource_rw(batch, indirect_draw_count, 
false);
-             screen->vk_CmdDrawIndirectCount(batch->cmdbuf, indirect->buffer, 
dindirect->offset,
-                                           indirect_draw_count->buffer, 
dindirect->indirect_draw_count_offset,
+             screen->vk_CmdDrawIndirectCount(batch->cmdbuf, 
indirect->obj->buffer, dindirect->offset,
+                                           indirect_draw_count->obj->buffer, 
dindirect->indirect_draw_count_offset,
                                            dindirect->draw_count, 
dindirect->stride);
          } else
-            vkCmdDrawIndirect(batch->cmdbuf, indirect->buffer, 
dindirect->offset, dindirect->draw_count, dindirect->stride);
+            vkCmdDrawIndirect(batch->cmdbuf, indirect->obj->buffer, 
dindirect->offset, dindirect->draw_count, dindirect->stride);
       } else
          vkCmdDraw(batch->cmdbuf, draws[0].count, dinfo->instance_count, 
draws[0].start, dinfo->start_instance);
    }
@@ -1141,7 +1141,7 @@ zink_draw_vbo(struct pipe_context *pctx,
       for (unsigned i = 0; i < ctx->num_so_targets; i++) {
          struct zink_so_target *t = zink_so_target(ctx->so_targets[i]);
          if (t) {
-            counter_buffers[i] = zink_resource(t->counter_buffer)->buffer;
+            counter_buffers[i] = zink_resource(t->counter_buffer)->obj->buffer;
             counter_buffer_offsets[i] = t->counter_buffer_offset;
             t->counter_buffer_valid = true;
          }
@@ -1179,7 +1179,7 @@ zink_launch_grid(struct pipe_context *pctx, const struct 
pipe_grid_info *info)
    vkCmdBindPipeline(batch->cmdbuf, VK_PIPELINE_BIND_POINT_COMPUTE, pipeline);
 
    if (info->indirect) {
-      vkCmdDispatchIndirect(batch->cmdbuf, 
zink_resource(info->indirect)->buffer, info->indirect_offset);
+      vkCmdDispatchIndirect(batch->cmdbuf, 
zink_resource(info->indirect)->obj->buffer, info->indirect_offset);
       zink_batch_reference_resource_rw(batch, zink_resource(info->indirect), 
false);
    } else
       vkCmdDispatch(batch->cmdbuf, info->grid[0], info->grid[1], 
info->grid[2]);
diff --git a/src/gallium/drivers/zink/zink_query.c 
b/src/gallium/drivers/zink/zink_query.c
index 1860beb9b1d..dbc960fb528 100644
--- a/src/gallium/drivers/zink/zink_query.c
+++ b/src/gallium/drivers/zink/zink_query.c
@@ -464,7 +464,7 @@ copy_results_to_buffer(struct zink_context *ctx, struct 
zink_query *query, struc
    zink_batch_reference_resource_rw(batch, res, true);
    zink_resource_buffer_barrier(ctx, batch, res, VK_ACCESS_TRANSFER_WRITE_BIT, 
0);
    util_range_add(&res->base, &res->valid_buffer_range, offset, offset + 
result_size);
-   vkCmdCopyQueryPoolResults(batch->cmdbuf, query->query_pool, query_id, 
num_results, res->buffer,
+   vkCmdCopyQueryPoolResults(batch->cmdbuf, query->query_pool, query_id, 
num_results, res->obj->buffer,
                              offset, 0, flags);
    /* this is required for compute batch sync and will be removed later */
    if (is_cs_query(query))
@@ -747,7 +747,7 @@ zink_render_condition(struct pipe_context *pctx,
       begin_flags = VK_CONDITIONAL_RENDERING_INVERTED_BIT_EXT;
    VkConditionalRenderingBeginInfoEXT begin_info = {};
    begin_info.sType = VK_STRUCTURE_TYPE_CONDITIONAL_RENDERING_BEGIN_INFO_EXT;
-   begin_info.buffer = res->buffer;
+   begin_info.buffer = res->obj->buffer;
    begin_info.flags = begin_flags;
    screen->vk_CmdBeginConditionalRenderingEXT(batch->cmdbuf, &begin_info);
    ctx->render_condition_active = true;
diff --git a/src/gallium/drivers/zink/zink_resource.c 
b/src/gallium/drivers/zink/zink_resource.c
index a7ce6e4cc36..d326c258af6 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -99,25 +99,25 @@ mem_equals(const void *a, const void *b)
 static void
 cache_or_free_mem(struct zink_screen *screen, struct zink_resource *res)
 {
-   if (res->mkey.flags) {
+   if (res->obj->mkey.flags) {
       simple_mtx_lock(&screen->mem_cache_mtx);
-      struct hash_entry *he = 
_mesa_hash_table_search_pre_hashed(screen->resource_mem_cache, res->mem_hash, 
&res->mkey);
+      struct hash_entry *he = 
_mesa_hash_table_search_pre_hashed(screen->resource_mem_cache, 
res->obj->mem_hash, &res->obj->mkey);
       struct util_dynarray *array = he ? (void*)he->data : NULL;
       if (!array) {
          struct mem_key *mkey = rzalloc(screen->resource_mem_cache, struct 
mem_key);
-         memcpy(mkey, &res->mkey, sizeof(struct mem_key));
+         memcpy(mkey, &res->obj->mkey, sizeof(struct mem_key));
          array = rzalloc(screen->resource_mem_cache, struct util_dynarray);
          util_dynarray_init(array, screen->resource_mem_cache);
-         _mesa_hash_table_insert_pre_hashed(screen->resource_mem_cache, 
res->mem_hash, mkey, array);
+         _mesa_hash_table_insert_pre_hashed(screen->resource_mem_cache, 
res->obj->mem_hash, mkey, array);
       }
       if (util_dynarray_num_elements(array, VkDeviceMemory) < 5) {
-         util_dynarray_append(array, VkDeviceMemory, res->mem);
+         util_dynarray_append(array, VkDeviceMemory, res->obj->mem);
          simple_mtx_unlock(&screen->mem_cache_mtx);
          return;
       }
       simple_mtx_unlock(&screen->mem_cache_mtx);
    }
-   vkFreeMemory(screen->dev, res->mem, NULL);
+   vkFreeMemory(screen->dev, res->obj->mem, NULL);
 }
 
 static void
@@ -127,15 +127,15 @@ zink_resource_destroy(struct pipe_screen *pscreen,
    struct zink_screen *screen = zink_screen(pscreen);
    struct zink_resource *res = zink_resource(pres);
    if (pres->target == PIPE_BUFFER) {
-      vkDestroyBuffer(screen->dev, res->buffer, NULL);
+      vkDestroyBuffer(screen->dev, res->obj->buffer, NULL);
       util_range_destroy(&res->valid_buffer_range);
    } else
-      vkDestroyImage(screen->dev, res->image, NULL);
+      vkDestroyImage(screen->dev, res->obj->image, NULL);
 
    zink_descriptor_set_refs_clear(&res->desc_set_refs, res);
 
    cache_or_free_mem(screen, res);
-
+   FREE(res->obj);
    FREE(res);
 }
 
@@ -185,6 +185,11 @@ resource_create(struct pipe_screen *pscreen,
 
    pipe_reference_init(&res->base.reference, 1);
    res->base.screen = pscreen;
+   res->obj = CALLOC_STRUCT(zink_resource_object);
+   if (!res->obj) {
+      FREE(res);
+      return NULL;
+   }
 
    VkMemoryRequirements reqs = {};
    VkMemoryPropertyFlags flags;
@@ -243,14 +248,15 @@ resource_create(struct pipe_screen *pscreen,
                       VK_BUFFER_USAGE_TRANSFORM_FEEDBACK_BUFFER_BIT_EXT;
       }
 
-      if (vkCreateBuffer(screen->dev, &bci, NULL, &res->buffer) !=
+      if (vkCreateBuffer(screen->dev, &bci, NULL, &res->obj->buffer) !=
           VK_SUCCESS) {
          debug_printf("vkCreateBuffer failed\n");
+         FREE(res->obj);
          FREE(res);
          return NULL;
       }
 
-      vkGetBufferMemoryRequirements(screen->dev, res->buffer, &reqs);
+      vkGetBufferMemoryRequirements(screen->dev, res->obj->buffer, &reqs);
       flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
    } else {
       res->format = zink_get_format(screen, templ->format);
@@ -356,9 +362,10 @@ resource_create(struct pipe_screen *pscreen,
       if (screen->needs_mesa_wsi && (templ->bind & PIPE_BIND_SCANOUT))
          ici.pNext = &image_wsi_info;
 
-      VkResult result = vkCreateImage(screen->dev, &ici, NULL, &res->image);
+      VkResult result = vkCreateImage(screen->dev, &ici, NULL, 
&res->obj->image);
       if (result != VK_SUCCESS) {
          debug_printf("vkCreateImage failed\n");
+         FREE(res->obj);
          FREE(res);
          return NULL;
       }
@@ -366,7 +373,7 @@ resource_create(struct pipe_screen *pscreen,
       res->optimal_tiling = ici.tiling != VK_IMAGE_TILING_LINEAR;
       res->aspect = aspect_from_format(templ->format);
 
-      vkGetImageMemoryRequirements(screen->dev, res->image, &reqs);
+      vkGetImageMemoryRequirements(screen->dev, res->obj->image, &reqs);
       if (templ->usage == PIPE_USAGE_STAGING)
         flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
       else
@@ -384,9 +391,10 @@ resource_create(struct pipe_screen *pscreen,
    if (templ->target != PIPE_BUFFER) {
       VkMemoryType mem_type =
          screen->info.mem_props.memoryTypes[mai.memoryTypeIndex];
-      res->host_visible = mem_type.propertyFlags &
+      res->obj->host_visible = mem_type.propertyFlags &
                           VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
-   }
+   } else
+      res->obj->host_visible = true;
 
    VkExportMemoryAllocateInfo emai = {};
    if (templ->bind & PIPE_BIND_SHARED) {
@@ -424,32 +432,33 @@ resource_create(struct pipe_screen *pscreen,
    }
 
    if (!mai.pNext && !(templ->flags & PIPE_RESOURCE_FLAG_MAP_COHERENT)) {
-      res->mkey.reqs = reqs;
-      res->mkey.flags = flags;
-      res->mem_hash = mem_hash(&res->mkey);
+      res->obj->mkey.reqs = reqs;
+      res->obj->mkey.flags = flags;
+      res->obj->mem_hash = mem_hash(&res->obj->mkey);
       simple_mtx_lock(&screen->mem_cache_mtx);
 
-      struct hash_entry *he = 
_mesa_hash_table_search_pre_hashed(screen->resource_mem_cache, res->mem_hash, 
&res->mkey);
+      struct hash_entry *he = 
_mesa_hash_table_search_pre_hashed(screen->resource_mem_cache, 
res->obj->mem_hash, &res->obj->mkey);
+
       struct util_dynarray *array = he ? (void*)he->data : NULL;
       if (array && util_dynarray_num_elements(array, VkDeviceMemory)) {
-         res->mem = util_dynarray_pop(array, VkDeviceMemory);
+         res->obj->mem = util_dynarray_pop(array, VkDeviceMemory);
       }
       simple_mtx_unlock(&screen->mem_cache_mtx);
    }
 
-   if (!res->mem && vkAllocateMemory(screen->dev, &mai, NULL, &res->mem) != 
VK_SUCCESS) {
+   if (!res->obj->mem && vkAllocateMemory(screen->dev, &mai, NULL, 
&res->obj->mem) != VK_SUCCESS) {
       debug_printf("vkAllocateMemory failed\n");
       goto fail;
    }
 
-   res->offset = 0;
-   res->size = reqs.size;
+   res->obj->offset = 0;
+   res->obj->size = reqs.size;
 
    if (templ->target == PIPE_BUFFER) {
-      vkBindBufferMemory(screen->dev, res->buffer, res->mem, res->offset);
+      vkBindBufferMemory(screen->dev, res->obj->buffer, res->obj->mem, 
res->obj->offset);
       util_range_init(&res->valid_buffer_range);
    } else
-      vkBindImageMemory(screen->dev, res->image, res->mem, res->offset);
+      vkBindImageMemory(screen->dev, res->obj->image, res->obj->mem, 
res->obj->offset);
 
    if (screen->winsys && (templ->bind & PIPE_BIND_DISPLAY_TARGET)) {
       struct sw_winsys *winsys = screen->winsys;
@@ -467,10 +476,10 @@ resource_create(struct pipe_screen *pscreen,
 
 fail:
    if (templ->target == PIPE_BUFFER)
-      vkDestroyBuffer(screen->dev, res->buffer, NULL);
+      vkDestroyBuffer(screen->dev, res->obj->buffer, NULL);
    else
-      vkDestroyImage(screen->dev, res->image, NULL);
-
+      vkDestroyImage(screen->dev, res->obj->image, NULL);
+   FREE(res->obj);
    FREE(res);
 
    return NULL;
@@ -499,7 +508,7 @@ zink_resource_get_handle(struct pipe_screen *pscreen,
 
       sub_res.aspectMask = res->aspect;
 
-      vkGetImageSubresourceLayout(screen->dev, res->image, &sub_res, 
&sub_res_layout);
+      vkGetImageSubresourceLayout(screen->dev, res->obj->image, &sub_res, 
&sub_res_layout);
 
       whandle->stride = sub_res_layout.rowPitch;
    }
@@ -509,7 +518,7 @@ zink_resource_get_handle(struct pipe_screen *pscreen,
       VkMemoryGetFdInfoKHR fd_info = {};
       int fd;
       fd_info.sType = VK_STRUCTURE_TYPE_MEMORY_GET_FD_INFO_KHR;
-      fd_info.memory = res->mem;
+      fd_info.memory = res->obj->mem;
       fd_info.handleType = VK_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD_BIT;
       VkResult result = (*screen->vk_GetMemoryFdKHR)(screen->dev, &fd_info, 
&fd);
       if (result != VK_SUCCESS)
@@ -553,9 +562,9 @@ zink_transfer_copy_bufimage(struct zink_context *ctx,
    struct pipe_box box = trans->base.box;
    int x = box.x;
    if (buf2img)
-      box.x = src->offset;
+      box.x = src->obj->offset;
 
-   zink_copy_image_buffer(ctx, NULL, dst, src, trans->base.level, buf2img ? x 
: dst->offset,
+   zink_copy_image_buffer(ctx, NULL, dst, src, trans->base.level, buf2img ? x 
: dst->obj->offset,
                            box.y, box.z, trans->base.level, &box, 
trans->base.usage);
 }
 
@@ -618,7 +627,7 @@ zink_transfer_map(struct pipe_context *pctx,
       }
 
 
-      VkResult result = vkMapMemory(screen->dev, res->mem, res->offset, 
res->size, 0, &ptr);
+      VkResult result = vkMapMemory(screen->dev, res->obj->mem, 
res->obj->offset, res->obj->size, 0, &ptr);
       if (result != VK_SUCCESS)
          return NULL;
 
@@ -653,7 +662,7 @@ zink_transfer_map(struct pipe_context *pctx,
       else if (usage & PIPE_MAP_READ)
          /* if the map region intersects with any clears then we have to apply 
them */
          zink_fb_clears_apply_region(ctx, pres, zink_rect_from_box(box));
-      if (res->optimal_tiling || !res->host_visible) {
+      if (res->optimal_tiling || !res->obj->host_visible) {
          enum pipe_format format = pres->format;
          if (usage & PIPE_MAP_DEPTH_ONLY)
             format = util_format_get_depth_only(pres->format);
@@ -692,9 +701,9 @@ zink_transfer_map(struct pipe_context *pctx,
             zink_fence_wait(pctx);
          }
 
-         VkResult result = vkMapMemory(screen->dev, staging_res->mem,
-                                       staging_res->offset,
-                                       staging_res->size, 0, &ptr);
+         VkResult result = vkMapMemory(screen->dev, staging_res->obj->mem,
+                                       staging_res->obj->offset,
+                                       staging_res->obj->size, 0, &ptr);
          if (result != VK_SUCCESS)
             return NULL;
 
@@ -710,7 +719,7 @@ zink_transfer_map(struct pipe_context *pctx,
             else
                zink_fence_wait(pctx);
          }
-         VkResult result = vkMapMemory(screen->dev, res->mem, res->offset, 
res->size, 0, &ptr);
+         VkResult result = vkMapMemory(screen->dev, res->obj->mem, 
res->obj->offset, res->obj->size, 0, &ptr);
          if (result != VK_SUCCESS)
             return NULL;
          VkImageSubresource isr = {
@@ -719,7 +728,7 @@ zink_transfer_map(struct pipe_context *pctx,
             0
          };
          VkSubresourceLayout srl;
-         vkGetImageSubresourceLayout(screen->dev, res->image, &isr, &srl);
+         vkGetImageSubresourceLayout(screen->dev, res->obj->image, &isr, &srl);
          trans->base.stride = srl.rowPitch;
          trans->base.layer_stride = srl.arrayPitch;
          const struct util_format_description *desc = 
util_format_description(res->base.format);
@@ -775,9 +784,9 @@ zink_transfer_unmap(struct pipe_context *pctx,
    struct zink_transfer *trans = (struct zink_transfer *)ptrans;
    if (trans->staging_res) {
       struct zink_resource *staging_res = zink_resource(trans->staging_res);
-      vkUnmapMemory(screen->dev, staging_res->mem);
+      vkUnmapMemory(screen->dev, staging_res->obj->mem);
    } else
-      vkUnmapMemory(screen->dev, res->mem);
+      vkUnmapMemory(screen->dev, res->obj->mem);
    if ((trans->base.usage & PIPE_MAP_PERSISTENT) && !(trans->base.usage & 
PIPE_MAP_COHERENT))
       res->persistent_maps--;
    if (!(trans->base.usage & (PIPE_MAP_FLUSH_EXPLICIT | PIPE_MAP_COHERENT))) {
diff --git a/src/gallium/drivers/zink/zink_resource.h 
b/src/gallium/drivers/zink/zink_resource.h
index 36d35b1574f..cad908d7b4d 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -45,6 +45,20 @@ struct mem_key {
    VkMemoryPropertyFlags flags;
 };
 
+struct zink_resource_object {
+   struct pipe_reference reference;
+   union {
+      VkBuffer buffer;
+      VkImage image;
+   };
+   VkDeviceMemory mem;
+   uint32_t mem_hash;
+   struct mem_key mkey;
+   VkDeviceSize offset, size;
+
+   bool host_visible;
+};
+
 struct zink_resource {
    struct pipe_resource base;
 
@@ -52,24 +66,17 @@ struct zink_resource {
 
    VkPipelineStageFlagBits access_stage;
    VkAccessFlags access;
+
+   struct zink_resource_object *obj;
    union {
-      struct {
-         VkBuffer buffer;
-         struct util_range valid_buffer_range;
-      };
+      struct util_range valid_buffer_range;
       struct {
          VkFormat format;
-         VkImage image;
          VkImageLayout layout;
          VkImageAspectFlags aspect;
          bool optimal_tiling;
-         bool host_visible;
       };
    };
-   VkDeviceMemory mem;
-   uint32_t mem_hash;
-   struct mem_key mkey;
-   VkDeviceSize offset, size;
 
    struct sw_displaytarget *dt;
    unsigned dt_stride;
diff --git a/src/gallium/drivers/zink/zink_surface.c 
b/src/gallium/drivers/zink/zink_surface.c
index eaaa28879cc..02dd85152c2 100644
--- a/src/gallium/drivers/zink/zink_surface.c
+++ b/src/gallium/drivers/zink/zink_surface.c
@@ -37,7 +37,7 @@ create_ivci(struct zink_screen *screen,
 {
    VkImageViewCreateInfo ivci = {};
    ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
-   ivci.image = res->image;
+   ivci.image = res->obj->image;
 
    switch (res->base.target) {
    case PIPE_TEXTURE_1D:

_______________________________________________
mesa-commit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/mesa-commit

Reply via email to