From: Mike Blumenkrantz Date: Thu, 10 Aug 2023 12:50:18 +0000 (-0400) Subject: zink: split create_ici to init and eval X-Git-Tag: upstream/23.3.3~3277 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=d19e8fc1fb62aa7c0da2c7c60acfb8cbc6c6c211;p=platform%2Fupstream%2Fmesa.git zink: split create_ici to init and eval no functional changes Part-of: --- diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c index 17dd040..b74c9e0 100644 --- a/src/gallium/drivers/zink/zink_resource.c +++ b/src/gallium/drivers/zink/zink_resource.c @@ -565,7 +565,74 @@ get_image_usage(struct zink_screen *screen, VkImageCreateInfo *ici, const struct } static uint64_t -create_ici(struct zink_screen *screen, VkImageCreateInfo *ici, const struct pipe_resource *templ, unsigned bind, unsigned modifiers_count, uint64_t *modifiers, bool *success) +eval_ici(struct zink_screen *screen, VkImageCreateInfo *ici, const struct pipe_resource *templ, unsigned bind, unsigned modifiers_count, uint64_t *modifiers, bool *success) +{ + /* sampleCounts will be set to VK_SAMPLE_COUNT_1_BIT if at least one of the following conditions is true: + * - flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT + * + * 44.1.1. Supported Sample Counts + */ + bool want_cube = ici->samples == 1 && + (templ->target == PIPE_TEXTURE_CUBE || + templ->target == PIPE_TEXTURE_CUBE_ARRAY || + (templ->target == PIPE_TEXTURE_2D_ARRAY && ici->extent.width == ici->extent.height && ici->arrayLayers >= 6)); + + if (ici->tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) + modifiers_count = 0; + + bool first = true; + bool tried[2] = {0}; + uint64_t mod = DRM_FORMAT_MOD_INVALID; +retry: + while (!ici->usage) { + if (!first) { + switch (ici->tiling) { + case VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT: + ici->tiling = VK_IMAGE_TILING_OPTIMAL; + modifiers_count = 0; + break; + case VK_IMAGE_TILING_OPTIMAL: + ici->tiling = VK_IMAGE_TILING_LINEAR; + break; + case VK_IMAGE_TILING_LINEAR: + if (bind & PIPE_BIND_LINEAR) { + *success = false; + return DRM_FORMAT_MOD_INVALID; + } + ici->tiling = VK_IMAGE_TILING_OPTIMAL; + break; + default: + unreachable("unhandled tiling mode"); + } + if (tried[ici->tiling]) { + if (ici->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT) { + *success = false; + return DRM_FORMAT_MOD_INVALID; + } + ici->flags |= VK_IMAGE_CREATE_EXTENDED_USAGE_BIT | VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; + tried[0] = false; + tried[1] = false; + first = true; + goto retry; + } + } + ici->usage = get_image_usage(screen, ici, templ, bind, modifiers_count, modifiers, &mod); + first = false; + if (ici->tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) + tried[ici->tiling] = true; + } + if (want_cube) { + ici->flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; + if (get_image_usage(screen, ici, templ, bind, modifiers_count, modifiers, &mod) != ici->usage) + ici->flags &= ~VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; + } + + *success = true; + return mod; +} + +static void +init_ici(struct zink_screen *screen, VkImageCreateInfo *ici, const struct pipe_resource *templ, unsigned bind, unsigned modifiers_count) { ici->sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; /* pNext may already be set */ @@ -648,71 +715,8 @@ create_ici(struct zink_screen *screen, VkImageCreateInfo *ici, const struct pipe ici->sharingMode = VK_SHARING_MODE_EXCLUSIVE; ici->initialLayout = VK_IMAGE_LAYOUT_UNDEFINED; - /* sampleCounts will be set to VK_SAMPLE_COUNT_1_BIT if at least one of the following conditions is true: - * - flags contains VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT - * - * 44.1.1. Supported Sample Counts - */ - bool want_cube = ici->samples == 1 && - (templ->target == PIPE_TEXTURE_CUBE || - templ->target == PIPE_TEXTURE_CUBE_ARRAY || - (templ->target == PIPE_TEXTURE_2D_ARRAY && ici->extent.width == ici->extent.height && ici->arrayLayers >= 6)); - if (templ->target == PIPE_TEXTURE_CUBE) ici->arrayLayers *= 6; - - if (ici->tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) - modifiers_count = 0; - - bool first = true; - bool tried[2] = {0}; - uint64_t mod = DRM_FORMAT_MOD_INVALID; -retry: - while (!ici->usage) { - if (!first) { - switch (ici->tiling) { - case VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT: - ici->tiling = VK_IMAGE_TILING_OPTIMAL; - modifiers_count = 0; - break; - case VK_IMAGE_TILING_OPTIMAL: - ici->tiling = VK_IMAGE_TILING_LINEAR; - break; - case VK_IMAGE_TILING_LINEAR: - if (bind & PIPE_BIND_LINEAR) { - *success = false; - return DRM_FORMAT_MOD_INVALID; - } - ici->tiling = VK_IMAGE_TILING_OPTIMAL; - break; - default: - unreachable("unhandled tiling mode"); - } - if (tried[ici->tiling]) { - if (ici->flags & VK_IMAGE_CREATE_EXTENDED_USAGE_BIT) { - *success = false; - return DRM_FORMAT_MOD_INVALID; - } - ici->flags |= VK_IMAGE_CREATE_EXTENDED_USAGE_BIT | VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT; - tried[0] = false; - tried[1] = false; - first = true; - goto retry; - } - } - ici->usage = get_image_usage(screen, ici, templ, bind, modifiers_count, modifiers, &mod); - first = false; - if (ici->tiling != VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) - tried[ici->tiling] = true; - } - if (want_cube) { - ici->flags |= VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; - if (get_image_usage(screen, ici, templ, bind, modifiers_count, modifiers, &mod) != ici->usage) - ici->flags &= ~VK_IMAGE_CREATE_CUBE_COMPATIBLE_BIT; - } - - *success = true; - return mod; } static struct zink_resource_object * @@ -878,8 +882,8 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t } else { ici.pNext = NULL; } - uint64_t mod = create_ici(screen, &ici, templ, - templ->bind, ici_modifier_count, ici_modifiers, &success); + init_ici(screen, &ici, templ, templ->bind, ici_modifier_count); + uint64_t mod = eval_ici(screen, &ici, templ, templ->bind, ici_modifier_count, ici_modifiers, &success); if (ici.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT && srgb && util_format_get_nr_components(srgb) == 4 && !(ici.flags & VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT)) {