mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-30 20:50:09 +01:00
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:
parent
c639e82f18
commit
3e12cb9ad9
2 changed files with 22 additions and 6 deletions
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue