zink: use VkImageViewUsageCreateInfo to remove attachment bits

this avoids issues where the driver may not support attachment bits
for texture views

Reviewed-by: Dave Airlie <airlied@redhat.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14719>
This commit is contained in:
Mike Blumenkrantz 2022-01-25 13:07:17 -05:00 committed by Marge Bot
parent c639e82f18
commit 3e12cb9ad9
2 changed files with 22 additions and 6 deletions

View file

@ -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);
}
}
}
}

View file

@ -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;