diff --git a/src/gallium/drivers/zink/zink_context.c b/src/gallium/drivers/zink/zink_context.c index aef55ae82e9..c9b9c61fd59 100644 --- a/src/gallium/drivers/zink/zink_context.c +++ b/src/gallium/drivers/zink/zink_context.c @@ -2187,11 +2187,13 @@ begin_render_pass(struct zink_context *ctx) if (ctx->fb_state.cbufs[i]) { struct zink_surface *surf = zink_csurface(ctx->fb_state.cbufs[i]); struct zink_surface *transient = zink_transient_surface(ctx->fb_state.cbufs[i]); - if (transient) { - assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage); - assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset].usage); - } else { - assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage); + if (surf->base.format == ctx->fb_state.cbufs[i]->format) { + if (transient) { + assert(zink_resource(transient->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage); + assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[cresolve_offset].usage); + } else { + assert(zink_resource(surf->base.texture)->obj->vkusage == ctx->framebuffer->state.infos[i].usage); + } } } } diff --git a/src/gallium/drivers/zink/zink_surface.c b/src/gallium/drivers/zink/zink_surface.c index dc1ddf05acd..8c95aacc218 100644 --- a/src/gallium/drivers/zink/zink_surface.c +++ b/src/gallium/drivers/zink/zink_surface.c @@ -106,8 +106,9 @@ create_ivci(struct zink_screen *screen, static void init_surface_info(struct zink_surface *surface, struct zink_resource *res, VkImageViewCreateInfo *ivci) { + VkImageViewUsageCreateInfo *usage_info = (VkImageViewUsageCreateInfo *)ivci->pNext; surface->info.flags = res->obj->vkflags; - surface->info.usage = res->obj->vkusage; + surface->info.usage = usage_info ? usage_info->usage : res->obj->vkusage; surface->info.width = surface->base.width; surface->info.height = surface->base.height; surface->info.layerCount = ivci->subresourceRange.layerCount; @@ -129,6 +130,19 @@ create_surface(struct pipe_context *pctx, if (!surface) return NULL; + VkImageViewUsageCreateInfo usage_info; + usage_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_USAGE_CREATE_INFO; + usage_info.pNext = NULL; + VkFormatFeatureFlags feats = res->optimal_tiling ? + screen->format_props[templ->format].optimalTilingFeatures : + screen->format_props[templ->format].linearTilingFeatures; + VkImageUsageFlags attachment = (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT); + usage_info.usage = res->obj->vkusage & ~attachment; + if ((res->obj->vkusage & attachment) && + !(feats & (VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT | VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT))) { + ivci->pNext = &usage_info; + } + pipe_resource_reference(&surface->base.texture, pres); pipe_reference_init(&surface->base.reference, 1); surface->base.context = pctx;