zink: factor out get_image_memory_requirement in resource_object_create

Signed-off-by: Gert Wollny <gert.wollny@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/27155>
This commit is contained in:
Gert Wollny
2024-01-18 20:24:50 +01:00
committed by Marge Bot
parent 55f3941076
commit a5fd408a74
+42 -32
View File
@@ -863,6 +863,47 @@ static const VkImageAspectFlags plane_aspects[] = {
VK_IMAGE_ASPECT_PLANE_1_BIT,
VK_IMAGE_ASPECT_PLANE_2_BIT,
};
static inline bool
get_image_memory_requirement(struct zink_screen *screen, struct zink_resource_object *obj,
unsigned num_planes, VkMemoryRequirements *reqs)
{
bool need_dedicated = false;
if (VKSCR(GetImageMemoryRequirements2)) {
VkMemoryRequirements2 req2;
req2.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
VkImageMemoryRequirementsInfo2 info2;
info2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2;
info2.pNext = NULL;
info2.image = obj->image;
VkMemoryDedicatedRequirements ded;
ded.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS;
ded.pNext = NULL;
req2.pNext = &ded;
VkImagePlaneMemoryRequirementsInfo plane;
plane.sType = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO;
plane.pNext = NULL;
if (num_planes > 1)
info2.pNext = &plane;
unsigned offset = 0;
for (unsigned i = 0; i < num_planes; i++) {
assert(i < ARRAY_SIZE(plane_aspects));
plane.planeAspect = plane_aspects[i];
VKSCR(GetImageMemoryRequirements2)(screen->dev, &info2, &req2);
if (!i)
reqs->alignment = req2.memoryRequirements.alignment;
obj->plane_offsets[i] = offset;
offset += req2.memoryRequirements.size;
reqs->size += req2.memoryRequirements.size;
reqs->memoryTypeBits |= req2.memoryRequirements.memoryTypeBits;
need_dedicated |= ded.prefersDedicatedAllocation || ded.requiresDedicatedAllocation;
}
} else {
VKSCR(GetImageMemoryRequirements)(screen->dev, obj->image, reqs);
}
return need_dedicated;
}
static inline VkFormatFeatureFlags
get_format_feature_flags(VkImageCreateInfo ici, struct zink_screen *screen, const struct pipe_resource *templ)
{
@@ -1141,38 +1182,7 @@ resource_object_create(struct zink_screen *screen, const struct pipe_resource *t
assert(num_dmabuf_planes <= 4);
}
if (VKSCR(GetImageMemoryRequirements2)) {
VkMemoryRequirements2 req2;
req2.sType = VK_STRUCTURE_TYPE_MEMORY_REQUIREMENTS_2;
VkImageMemoryRequirementsInfo2 info2;
info2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_REQUIREMENTS_INFO_2;
info2.pNext = NULL;
info2.image = obj->image;
VkMemoryDedicatedRequirements ded;
ded.sType = VK_STRUCTURE_TYPE_MEMORY_DEDICATED_REQUIREMENTS;
ded.pNext = NULL;
req2.pNext = &ded;
VkImagePlaneMemoryRequirementsInfo plane;
plane.sType = VK_STRUCTURE_TYPE_IMAGE_PLANE_MEMORY_REQUIREMENTS_INFO;
plane.pNext = NULL;
if (num_planes > 1)
info2.pNext = &plane;
unsigned offset = 0;
for (unsigned i = 0; i < num_planes; i++) {
assert(i < ARRAY_SIZE(plane_aspects));
plane.planeAspect = plane_aspects[i];
VKSCR(GetImageMemoryRequirements2)(screen->dev, &info2, &req2);
if (!i)
reqs.alignment = req2.memoryRequirements.alignment;
obj->plane_offsets[i] = offset;
offset += req2.memoryRequirements.size;
reqs.size += req2.memoryRequirements.size;
reqs.memoryTypeBits |= req2.memoryRequirements.memoryTypeBits;
need_dedicated |= ded.prefersDedicatedAllocation || ded.requiresDedicatedAllocation;
}
} else {
VKSCR(GetImageMemoryRequirements)(screen->dev, obj->image, &reqs);
}
need_dedicated = get_image_memory_requirement(screen, obj, num_planes, &reqs);
if (templ->usage == PIPE_USAGE_STAGING && ici.tiling == VK_IMAGE_TILING_LINEAR)
flags = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
else