Mesa (main): zink: implement multiplanar modifier handling
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Nov 17 19:47:46 UTC 2021
Module: Mesa
Branch: main
Commit: b1a32d1432f67706d856a7a5398d0d6fd5a37fe3
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b1a32d1432f67706d856a7a5398d0d6fd5a37fe3
Author: Mike Blumenkrantz <michael.blumenkrantz at gmail.com>
Date: Thu Nov 11 11:57:49 2021 -0500
zink: implement multiplanar modifier handling
it turns out this is trivial as long as dri gives usable resource templates
Reviewed-by: Erik Faye-Lund <erik.faye-lund at collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13799>
---
src/gallium/drivers/zink/zink_resource.c | 79 +++++++++++++++++++-------------
src/gallium/drivers/zink/zink_resource.h | 3 +-
2 files changed, 49 insertions(+), 33 deletions(-)
diff --git a/src/gallium/drivers/zink/zink_resource.c b/src/gallium/drivers/zink/zink_resource.c
index 237e0cfd2bc..a8cd4f5e058 100644
--- a/src/gallium/drivers/zink/zink_resource.c
+++ b/src/gallium/drivers/zink/zink_resource.c
@@ -550,9 +550,6 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
if (ici.usage & VK_IMAGE_USAGE_TRANSFER_DST_BIT)
obj->transfer_dst = true;
- if (ici.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT)
- obj->modifier_aspect = VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT;
-
struct wsi_image_create_info image_wsi_info = {
VK_STRUCTURE_TYPE_WSI_IMAGE_CREATE_INFO_MESA,
NULL,
@@ -571,6 +568,26 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
goto fail1;
}
+ if (ici.tiling == VK_IMAGE_TILING_DRM_FORMAT_MODIFIER_EXT) {
+ VkImageDrmFormatModifierPropertiesEXT modprops = {0};
+ modprops.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT;
+ result = VKSCR(GetImageDrmFormatModifierPropertiesEXT)(screen->dev, obj->image, &modprops);
+ if (result != VK_SUCCESS) {
+ debug_printf("GetImageDrmFormatModifierPropertiesEXT failed\n");
+ goto fail1;
+ }
+ obj->modifier = modprops.drmFormatModifier;
+ unsigned num_planes = screen->base.get_dmabuf_modifier_planes(&screen->base, obj->modifier, templ->format);
+ obj->modifier_aspect = VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT;
+ if (num_planes > 1)
+ obj->modifier_aspect |= VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
+ if (num_planes > 2)
+ obj->modifier_aspect |= VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
+ if (num_planes > 3)
+ obj->modifier_aspect |= VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT;
+ assert(num_planes <= 4);
+ }
+
if (VKSCR(GetImageMemoryRequirements2)) {
VkMemoryRequirements2 req2;
req2.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
@@ -741,17 +758,6 @@ resource_create(struct pipe_screen *pscreen,
FREE_CL(res);
return NULL;
}
- /* TODO: remove this when multi-plane modifiers are supported */
- const struct zink_modifier_prop *prop = &screen->modifier_props[templ->format];
- for (unsigned i = 0; i < modifiers_count; i++) {
- for (unsigned j = 0; j < prop->drmFormatModifierCount; j++) {
- if (prop->pDrmFormatModifierProperties[j].drmFormatModifier == modifiers[i]) {
- if (prop->pDrmFormatModifierProperties[j].drmFormatModifierPlaneCount != 1)
- res->modifiers[i] = DRM_FORMAT_MOD_INVALID;
- break;
- }
- }
- }
}
res->base.b = *templ;
@@ -851,12 +857,31 @@ zink_resource_get_param(struct pipe_screen *pscreen, struct pipe_context *pctx,
struct zink_resource *res = zink_resource(pres);
//TODO: remove for wsi
struct zink_resource_object *obj = res->scanout_obj ? res->scanout_obj : res->obj;
- VkImageAspectFlags aspect = obj->modifier_aspect ? obj->modifier_aspect : res->aspect;
struct winsys_handle whandle;
+ VkImageAspectFlags aspect;
+ if (res->modifiers) {
+ switch (plane) {
+ case 0:
+ aspect = VK_IMAGE_ASPECT_MEMORY_PLANE_0_BIT_EXT;
+ break;
+ case 1:
+ aspect = VK_IMAGE_ASPECT_MEMORY_PLANE_1_BIT_EXT;
+ break;
+ case 2:
+ aspect = VK_IMAGE_ASPECT_MEMORY_PLANE_2_BIT_EXT;
+ break;
+ case 3:
+ aspect = VK_IMAGE_ASPECT_MEMORY_PLANE_3_BIT_EXT;
+ break;
+ default:
+ unreachable("how many planes you got in this thing?");
+ }
+ } else
+ aspect = res->aspect;
switch (param) {
case PIPE_RESOURCE_PARAM_NPLANES:
/* not yet implemented */
- *value = 1;
+ *value = pscreen->get_dmabuf_modifier_planes(pscreen, res->obj->modifier, pres->format);
break;
case PIPE_RESOURCE_PARAM_STRIDE: {
@@ -884,16 +909,7 @@ zink_resource_get_param(struct pipe_screen *pscreen, struct pipe_context *pctx,
}
case PIPE_RESOURCE_PARAM_MODIFIER: {
- *value = DRM_FORMAT_MOD_INVALID;
- if (!screen->info.have_EXT_image_drm_format_modifier)
- return false;
- if (!res->modifiers)
- return false;
- VkImageDrmFormatModifierPropertiesEXT prop;
- prop.sType = VK_STRUCTURE_TYPE_IMAGE_DRM_FORMAT_MODIFIER_PROPERTIES_EXT;
- prop.pNext = NULL;
- if (VKSCR(GetImageDrmFormatModifierPropertiesEXT)(screen->dev, obj->image, &prop) == VK_SUCCESS)
- *value = prop.drmFormatModifier;
+ *value = res->obj->modifier;
break;
}
@@ -993,10 +1009,9 @@ zink_resource_from_handle(struct pipe_screen *pscreen,
!zink_screen(pscreen)->info.have_EXT_image_drm_format_modifier)
return NULL;
- /* ignore any AUX planes, as well as planar formats */
- if (templ->format == PIPE_FORMAT_NONE ||
- util_format_get_num_planes(templ->format) != 1)
- return NULL;
+ struct pipe_resource templ2 = *templ;
+ if (templ->format == PIPE_FORMAT_NONE)
+ templ2.format = whandle->format;
uint64_t modifier = DRM_FORMAT_MOD_INVALID;
int modifier_count = 0;
@@ -1004,7 +1019,7 @@ zink_resource_from_handle(struct pipe_screen *pscreen,
modifier = whandle->modifier;
modifier_count = 1;
}
- return resource_create(pscreen, templ, whandle, usage, &modifier, modifier_count);
+ return resource_create(pscreen, &templ2, whandle, usage, &modifier, modifier_count);
#else
return NULL;
#endif
@@ -1401,7 +1416,7 @@ zink_image_map(struct pipe_context *pctx,
zink_resource_usage_wait(ctx, res, ZINK_RESOURCE_ACCESS_WRITE);
}
VkImageSubresource isr = {
- res->obj->modifier_aspect ? res->obj->modifier_aspect : res->aspect,
+ res->modifiers ? res->obj->modifier_aspect : res->aspect,
level,
0
};
diff --git a/src/gallium/drivers/zink/zink_resource.h b/src/gallium/drivers/zink/zink_resource.h
index 7dd07c72b5b..f52bb019ea4 100644
--- a/src/gallium/drivers/zink/zink_resource.h
+++ b/src/gallium/drivers/zink/zink_resource.h
@@ -76,12 +76,13 @@ struct zink_resource_object {
bool storage_init; //layout was set for image
bool transfer_dst;
bool is_buffer;
- VkImageAspectFlags modifier_aspect;
struct zink_bo *bo;
VkDeviceSize offset, size, alignment;
VkImageCreateFlags vkflags;
VkImageUsageFlags vkusage;
+ uint64_t modifier;
+ VkImageAspectFlags modifier_aspect;
bool host_visible;
bool coherent;
More information about the mesa-commit
mailing list