summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Blumenkrantz <michael.blumenkrantz@gmail.com>2022-04-20 13:29:52 -0400
committerMarge Bot <emma+marge@anholt.net>2022-05-18 02:29:18 +0000
commit7057a363591279c3f65a3c4af41687e6f8142649 (patch)
tree3224141cd84093c63b50acc63a47a9208427c393 /src
parentb6eec12327b65038dd56742dbe272c21c63a3844 (diff)
zink: add extended usage and retry if resource creation fails
this is one of those cases where some bizarro format is being created for sampling only, but gallium blasts out all the bind flags at once trust that we're not going to do anything too crazy and let surface usage pruning handle the rest cc: mesa-stable Reviewed-by: Dave Airlie <airlied@redhat.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/16563>
Diffstat (limited to 'src')
-rw-r--r--src/gallium/drivers/zink/zink_resource.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index 6e4b8076e9d..08238180c6f 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -268,8 +268,7 @@ get_image_usage_for_feats(struct zink_screen *screen, VkFormatFeatureFlags feats
usage |= VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
if ((bind & (PIPE_BIND_LINEAR | PIPE_BIND_SHARED)) != (PIPE_BIND_LINEAR | PIPE_BIND_SHARED))
usage |= VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT;
- } else if (templ->nr_samples || (bind == PIPE_BIND_RENDER_TARGET && !(feats & VK_FORMAT_FEATURE_BLIT_DST_BIT)))
- /* this can't be populated, so we can't do it */
+ } else
return 0;
}
@@ -346,6 +345,8 @@ get_image_usage(struct zink_screen *screen, VkImageCreateInfo *ici, const struct
{
VkFormatProperties props = screen->format_props[templ->format];
VkFormatFeatureFlags feats = tiling == VK_IMAGE_TILING_LINEAR ? props.linearTilingFeatures : props.optimalTilingFeatures;
+ if (ici->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT)
+ feats = UINT32_MAX;
VkImageUsageFlags usage = get_image_usage_for_feats(screen, feats, templ, bind);
if (usage) {
ici->usage = usage;
@@ -446,6 +447,7 @@ create_ici(struct zink_screen *screen, VkImageCreateInfo *ici, const struct pipe
bool first = true;
bool tried[2] = {0};
uint64_t mod = DRM_FORMAT_MOD_INVALID;
+retry:
while (!ici->usage) {
if (!first) {
switch (ici->tiling) {
@@ -467,8 +469,15 @@ create_ici(struct zink_screen *screen, VkImageCreateInfo *ici, const struct pipe
unreachable("unhandled tiling mode");
}
if (tried[ici->tiling]) {
- *success = false;
+ if (ici->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT) {
+ *success = false;
return DRM_FORMAT_MOD_INVALID;
+ }
+ ici->flags |= VK_IMAGE_CREATE_EXTENDED_USAGE_BIT;
+ tried[0] = false;
+ tried[1] = false;
+ first = true;
+ goto retry;
}
}
ici->usage = get_image_usage(screen, ici, templ, bind, modifiers_count, modifiers, &mod);