Mesa (main): zink: add fallback for linear modifier use
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Jul 13 00:32:41 UTC 2021
Module: Mesa
Branch: main
Commit: 452ffddbff6cf9b9ff568a7f54f5295028625470
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=452ffddbff6cf9b9ff568a7f54f5295028625470
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Tue Jun 22 08:33:04 2021 -0400
zink: add fallback for linear modifier use
Acked-by: Dave Airlie <airlied at redhat.com>
Reviewed-by: Emil Velikov <emil.l.velikov at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10782>
---
src/gallium/drivers/zink/zink_resource.c | 36 +++++++++++++++++++++++++-------
1 file changed, 28 insertions(+), 8 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index cea0f815ebb..6076f4d9844 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -323,6 +323,18 @@ get_image_usage_for_feats(struct zink_screen *screen, VkFormatFeatureFlags feats
return usage;
}
+static VkFormatFeatureFlags
+find_modifier_feats(const struct zink_modifier_prop *prop, uint64_t modifier, uint64_t *mod)
+{
+ for (unsigned j = 0; j < prop->drmFormatModifierCount; j++) {
+ if (prop->pDrmFormatModifierProperties[j].drmFormatModifier == modifier) {
+ *mod = modifier;
+ return prop->pDrmFormatModifierProperties[j].drmFormatModifierTilingFeatures;
+ }
+ }
+ return 0;
+}
+
static VkImageUsageFlags
get_image_usage(struct zink_screen *screen, VkImageCreateInfo *ici, const struct pipe_resource *templ, unsigned bind, unsigned modifiers_count, const uint64_t *modifiers, uint64_t *mod)
{
@@ -330,19 +342,27 @@ get_image_usage(struct zink_screen *screen, VkImageCreateInfo *ici, const struct
#ifdef ZINK_USE_DMABUF
*mod = DRM_FORMAT_MOD_INVALID;
if (modifiers_count) {
+ bool have_linear = false;
+ const struct zink_modifier_prop *prop = &screen->modifier_props[templ->format];
assert(tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT);
for (unsigned i = 0; i < modifiers_count; i++) {
- if (modifiers[i] == DRM_FORMAT_MOD_LINEAR)
+ if (modifiers[i] == DRM_FORMAT_MOD_LINEAR) {
+ have_linear = true;
continue;
- VkFormatFeatureFlags feats = 0;
- struct zink_modifier_prop *prop = &screen->modifier_props[templ->format];
- for (unsigned j = 0; j < prop->drmFormatModifierCount; j++) {
- if (prop->pDrmFormatModifierProperties[j].drmFormatModifier == modifiers[i]) {
- feats = prop->pDrmFormatModifierProperties[j].drmFormatModifierTilingFeatures;
- *mod = modifiers[i];
- break;
+ }
+ VkFormatFeatureFlags feats = find_modifier_feats(prop, modifiers[i], mod);
+ if (feats) {
+ VkImageUsageFlags usage = get_image_usage_for_feats(screen, feats, templ, bind);
+ if (usage) {
+ ici->usage = usage;
+ if (check_ici(screen, ici, *mod))
+ return usage;
}
}
+ }
+ /* only try linear if no other options available */
+ if (have_linear) {
+ VkFormatFeatureFlags feats = find_modifier_feats(prop, DRM_FORMAT_MOD_LINEAR, mod);
if (feats) {
VkImageUsageFlags usage = get_image_usage_for_feats(screen, feats, templ, bind);
if (usage) {
More information about the mesa-commit
mailing list