Module: Mesa Branch: master Commit: 054f53e3d04f9ab18cbf27b94cb70c9a6f1eef6a URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=054f53e3d04f9ab18cbf27b94cb70c9a6f1eef6a
Author: Mike Blumenkrantz <[email protected]> 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 <[email protected]> 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; _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
