Mesa (master): zink: use an explicit zink_buffer_view struct

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Tue Mar 16 14:57:41 UTC 2021


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

Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date:   Thu Nov  5 10:21:05 2020 -0500

zink: use an explicit zink_buffer_view struct

this gives us an object to work with similar to zink_surface

Reviewed-by: Dave Airlie <airlied at redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/9543>

---

 src/gallium/drivers/zink/zink_context.c | 54 +++++++++++++++++++++++++--------
 src/gallium/drivers/zink/zink_context.h | 29 ++++++++++++++++--
 src/gallium/drivers/zink/zink_draw.c    |  4 +--
 3 files changed, 69 insertions(+), 18 deletions(-)

diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c
index 6a9eec8f304..e194e7d919e 100644
--- a/src/gallium/drivers/zink/zink_context.c
+++ b/src/gallium/drivers/zink/zink_context.c
@@ -262,6 +262,12 @@ invalidate_descriptor_state(struct zink_context *ctx, enum pipe_shader_type shad
    ctx->descriptor_states[shader == PIPE_SHADER_COMPUTE].state[type] = 0;
 }
 
+void
+debug_describe_zink_buffer_view(char *buf, const struct zink_buffer_view *ptr)
+{
+   sprintf(buf, "zink_buffer_view");
+}
+
 static void
 destroy_batch(struct zink_context* ctx, struct zink_batch* batch)
 {
@@ -552,10 +558,11 @@ sampler_aspect_from_format(enum pipe_format fmt)
      return VK_IMAGE_ASPECT_COLOR_BIT;
 }
 
-static VkBufferView
-create_buffer_view(struct zink_screen *screen, struct zink_resource *res, enum pipe_format format, uint32_t offset, uint32_t range)
+static struct zink_buffer_view *
+get_buffer_view(struct zink_context *ctx, struct zink_resource *res, enum pipe_format format, uint32_t offset, uint32_t range)
 {
-   VkBufferView view = VK_NULL_HANDLE;
+   struct zink_screen *screen = zink_screen(ctx->base.screen);
+   struct zink_buffer_view *buffer_view;
    VkBufferViewCreateInfo bvci = {};
    bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
    bvci.buffer = res->obj->buffer;
@@ -564,9 +571,17 @@ create_buffer_view(struct zink_screen *screen, struct zink_resource *res, enum p
    bvci.offset = offset;
    bvci.range = range;
 
-   if (vkCreateBufferView(screen->dev, &bvci, NULL, &view) == VK_SUCCESS)
-      return view;
-   return VK_NULL_HANDLE;
+   VkBufferView view;
+   if (vkCreateBufferView(screen->dev, &bvci, NULL, &view) != VK_SUCCESS)
+      return NULL;
+   buffer_view = CALLOC_STRUCT(zink_buffer_view);
+   if (!buffer_view) {
+      vkDestroyBufferView(screen->dev, view, NULL);
+      return NULL;
+   }
+   pipe_reference_init(&buffer_view->reference, 1);
+   buffer_view->buffer_view = view;
+   return buffer_view;
 }
 
 static struct pipe_sampler_view *
@@ -576,7 +591,7 @@ zink_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *pres,
    struct zink_screen *screen = zink_screen(pctx->screen);
    struct zink_resource *res = zink_resource(pres);
    struct zink_sampler_view *sampler_view = CALLOC_STRUCT(zink_sampler_view);
-   VkResult err;
+   bool err;
 
    sampler_view->base = *state;
    sampler_view->base.texture = NULL;
@@ -604,16 +619,22 @@ zink_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *pres,
       assert(ivci.format);
 
       ivci.subresourceRange.baseMipLevel = state->u.tex.first_level;
+      ivci.subresourceRange.levelCount = 1;
       ivci.subresourceRange.baseArrayLayer = state->u.tex.first_layer;
       ivci.subresourceRange.levelCount = state->u.tex.last_level - state->u.tex.first_level + 1;
       ivci.subresourceRange.layerCount = state->u.tex.last_layer - state->u.tex.first_layer + 1;
+      if (pres->target == PIPE_TEXTURE_CUBE ||
+          pres->target == PIPE_TEXTURE_CUBE_ARRAY) {
+         if (ivci.subresourceRange.layerCount != 6)
+            ivci.subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS;
+      }
 
-      err = vkCreateImageView(screen->dev, &ivci, NULL, &sampler_view->image_view);
+      err = vkCreateImageView(screen->dev, &ivci, NULL, &sampler_view->image_view) != VK_SUCCESS;
    } else {
-      sampler_view->buffer_view = create_buffer_view(screen, res, state->format, state->u.buf.offset, state->u.buf.size);
+      sampler_view->buffer_view = get_buffer_view(zink_context(pctx), res, state->format, state->u.buf.offset, state->u.buf.size);
       err = !sampler_view->buffer_view;
    }
-   if (err != VK_SUCCESS) {
+   if (err) {
       FREE(sampler_view);
       return NULL;
    }
@@ -622,6 +643,13 @@ zink_create_sampler_view(struct pipe_context *pctx, struct pipe_resource *pres,
    return &sampler_view->base;
 }
 
+void
+zink_destroy_buffer_view(struct zink_context *ctx, struct zink_buffer_view *buffer_view)
+{
+   vkDestroyBufferView(zink_screen(ctx->base.screen)->dev, buffer_view->buffer_view, NULL);
+   FREE(buffer_view);
+}
+
 static void
 zink_sampler_view_destroy(struct pipe_context *pctx,
                           struct pipe_sampler_view *pview)
@@ -629,7 +657,7 @@ zink_sampler_view_destroy(struct pipe_context *pctx,
    struct zink_sampler_view *view = zink_sampler_view(pview);
    zink_descriptor_set_refs_clear(&view->desc_set_refs, view);
    if (pview->texture->target == PIPE_BUFFER)
-      vkDestroyBufferView(zink_screen(pctx->screen)->dev, view->buffer_view, NULL);
+      zink_buffer_view_reference(zink_context(pctx), &view->buffer_view, NULL);
    else
       vkDestroyImageView(zink_screen(pctx->screen)->dev, view->image_view, NULL);
    pipe_resource_reference(&pview->texture, NULL);
@@ -851,7 +879,7 @@ unbind_shader_image(struct zink_context *ctx, enum pipe_shader_type stage, unsig
 
    zink_descriptor_set_refs_clear(&image_view->desc_set_refs, image_view);
    if (image_view->base.resource->target == PIPE_BUFFER)
-      vkDestroyBufferView(zink_screen(ctx->base.screen)->dev, image_view->buffer_view, NULL);
+      zink_buffer_view_reference(ctx, &image_view->buffer_view, NULL);
    else
       pipe_surface_reference((struct pipe_surface**)&image_view->surface, NULL);
    pipe_resource_reference(&image_view->base.resource, NULL);
@@ -875,7 +903,7 @@ zink_set_shader_images(struct pipe_context *pctx,
          struct zink_resource *res = zink_resource(images[i].resource);
          util_copy_image_view(&image_view->base, images + i);
          if (images[i].resource->target == PIPE_BUFFER) {
-            image_view->buffer_view = create_buffer_view(zink_screen(pctx->screen), res, images[i].format, images[i].u.buf.offset, images[i].u.buf.size);
+            image_view->buffer_view = get_buffer_view(ctx, res, images[i].format, images[i].u.buf.offset, images[i].u.buf.size);
             assert(image_view->buffer_view);
             util_range_add(&res->base, &res->valid_buffer_range, images[i].u.buf.offset,
                            images[i].u.buf.offset + images[i].u.buf.size);
diff --git a/src/gallium/drivers/zink/zink_context.h b/src/gallium/drivers/zink/zink_context.h
index 9283c70b0e3..62af1a9cfc4 100644
--- a/src/gallium/drivers/zink/zink_context.h
+++ b/src/gallium/drivers/zink/zink_context.h
@@ -66,7 +66,6 @@ enum zink_blit_flags {
    ZINK_BLIT_SAVE_TEXTURES = 1 << 3,
 };
 
-
 struct zink_sampler_state {
    VkSampler sampler;
    uint32_t hash;
@@ -75,12 +74,17 @@ struct zink_sampler_state {
    bool custom_border_color;
 };
 
+struct zink_buffer_view {
+   struct pipe_reference reference;
+   VkBufferView buffer_view;
+};
+
 struct zink_sampler_view {
    struct pipe_sampler_view base;
    struct zink_descriptor_refs desc_set_refs;
    union {
       VkImageView image_view;
-      VkBufferView buffer_view;
+      struct zink_buffer_view *buffer_view;
    };
    uint32_t hash;
    uint32_t batch_uses;
@@ -91,7 +95,7 @@ struct zink_image_view {
    struct zink_descriptor_refs desc_set_refs;
    union {
       struct zink_surface *surface;
-      VkBufferView buffer_view;
+      struct zink_buffer_view *buffer_view;
    };
 };
 
@@ -336,6 +340,25 @@ zink_copy_image_buffer(struct zink_context *ctx, struct zink_batch *batch, struc
                        unsigned dst_level, unsigned dstx, unsigned dsty, unsigned dstz,
                        unsigned src_level, const struct pipe_box *src_box, enum pipe_map_flags map_flags);
 
+void
+zink_destroy_buffer_view(struct zink_context *ctx, struct zink_buffer_view *buffer_view);
+
+void
+debug_describe_zink_buffer_view(char *buf, const struct zink_buffer_view *ptr);
+
+static inline void
+zink_buffer_view_reference(struct zink_context *ctx,
+                             struct zink_buffer_view **dst,
+                             struct zink_buffer_view *src)
+{
+   struct zink_buffer_view *old_dst = dst ? *dst : NULL;
+
+   if (pipe_reference_described(old_dst ? &old_dst->reference : NULL, &src->reference,
+                                (debug_reference_descriptor)debug_describe_zink_buffer_view))
+      zink_destroy_buffer_view(ctx, old_dst);
+   if (dst) *dst = src;
+}
+
 void
 zink_context_update_descriptor_states(struct zink_context *ctx, bool is_compute);
 
diff --git a/src/gallium/drivers/zink/zink_draw.c b/src/gallium/drivers/zink/zink_draw.c
index 36c2b9d80f0..2d15fea9175 100644
--- a/src/gallium/drivers/zink/zink_draw.c
+++ b/src/gallium/drivers/zink/zink_draw.c
@@ -606,7 +606,7 @@ update_sampler_descriptors(struct zink_context *ctx, struct zink_descriptor_set
             struct zink_sampler_view *sampler_view = zink_sampler_view(psampler_view);
             res = psampler_view ? zink_resource(psampler_view->texture) : NULL;
             if (res && res->base.target == PIPE_BUFFER) {
-               bufferview = sampler_view->buffer_view;
+               bufferview = sampler_view->buffer_view->buffer_view;
             } else if (res) {
                imageview = sampler_view->image_view;
                layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
@@ -689,7 +689,7 @@ update_image_descriptors(struct zink_context *ctx, struct zink_descriptor_set *z
             res = zink_resource(image_view->base.resource);
 
             if (res && image_view->base.resource->target == PIPE_BUFFER) {
-               bufferview = image_view->buffer_view;
+               bufferview = image_view->buffer_view->buffer_view;
             } else if (res) {
                imageview = image_view->surface->image_view;
                layout = VK_IMAGE_LAYOUT_GENERAL;



More information about the mesa-commit mailing list