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)
{
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;
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 *
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;
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;
}
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)
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);
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);
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);
ZINK_BLIT_SAVE_TEXTURES = 1 << 3,
};
-
struct zink_sampler_state {
VkSampler sampler;
uint32_t hash;
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;
struct zink_descriptor_refs desc_set_refs;
union {
struct zink_surface *surface;
- VkBufferView buffer_view;
+ struct zink_buffer_view *buffer_view;
};
};
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);
#endif