anv: wrap binding address setting

Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com>
Reviewed-by: Nanley Chery <nanley.g.chery@intel.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24276>
This commit is contained in:
Lionel Landwerlin
2023-07-16 12:55:59 +03:00
committed by Marge Bot
parent f33fbb215b
commit 6e4d527158
3 changed files with 41 additions and 31 deletions

View File

@@ -57,7 +57,7 @@ memory_range_end(struct anv_image_memory_range memory_range)
* Get binding for VkImagePlaneMemoryRequirementsInfo,
* VkBindImagePlaneMemoryInfo and VkDeviceImageMemoryRequirements.
*/
struct anv_image_binding *
enum anv_image_memory_binding
anv_image_aspect_to_binding(struct anv_image *image,
VkImageAspectFlags aspect)
{
@@ -87,7 +87,7 @@ anv_image_aspect_to_binding(struct anv_image *image,
plane = anv_image_aspect_to_plane(image, aspect);
}
return &image->bindings[ANV_IMAGE_MEMORY_BINDING_PLANE_0 + plane];
return ANV_IMAGE_MEMORY_BINDING_PLANE_0 + plane;
}
/**
@@ -2179,19 +2179,19 @@ anv_image_get_memory_requirements(struct anv_device *device,
* and only if the image is disjoint (that is, multi-planar format and
* VK_IMAGE_CREATE_DISJOINT_BIT).
*/
const struct anv_image_binding *binding;
enum anv_image_memory_binding binding;
if (image->disjoint) {
assert(util_bitcount(aspects) == 1);
assert(aspects & image->vk.aspects);
binding = anv_image_aspect_to_binding(image, aspects);
} else {
assert(aspects == image->vk.aspects);
binding = &image->bindings[ANV_IMAGE_MEMORY_BINDING_MAIN];
binding = ANV_IMAGE_MEMORY_BINDING_MAIN;
}
pMemoryRequirements->memoryRequirements = (VkMemoryRequirements) {
.size = binding->memory_range.size,
.alignment = binding->memory_range.alignment,
.size = image->bindings[binding].memory_range.size,
.alignment = image->bindings[binding].memory_range.alignment,
.memoryTypeBits = memory_types,
};
}
@@ -2484,6 +2484,19 @@ anv_image_map_aux_tt(struct anv_device *device,
}
static VkResult
anv_image_bind_address(struct anv_device *device,
struct anv_image *image,
enum anv_image_memory_binding binding,
struct anv_address address)
{
image->bindings[binding].address = address;
ANV_RMV(image_bind, device, image, binding);
return VK_SUCCESS;
}
static VkResult
anv_bind_image_memory(struct anv_device *device,
const VkBindImageMemoryInfo *bind_info)
@@ -2491,6 +2504,7 @@ anv_bind_image_memory(struct anv_device *device,
ANV_FROM_HANDLE(anv_device_memory, mem, bind_info->memory);
ANV_FROM_HANDLE(anv_image, image, bind_info->image);
bool did_bind = false;
VkResult result = VK_SUCCESS;
const VkBindMemoryStatusKHR *bind_status =
vk_find_struct_const(bind_info->pNext, BIND_MEMORY_STATUS_KHR);
@@ -2520,16 +2534,14 @@ anv_bind_image_memory(struct anv_device *device,
if (!image->disjoint)
break;
struct anv_image_binding *binding =
enum anv_image_memory_binding binding =
anv_image_aspect_to_binding(image, plane_info->planeAspect);
binding->address = (struct anv_address) {
.bo = mem->bo,
.offset = bind_info->memoryOffset,
};
ANV_RMV(image_bind, device, image,
binding - image->bindings);
anv_image_bind_address(device, image, binding,
(struct anv_address) {
.bo = mem->bo,
.offset = bind_info->memoryOffset,
});
did_bind = true;
break;
@@ -2551,7 +2563,10 @@ anv_bind_image_memory(struct anv_device *device,
for (int j = 0; j < ARRAY_SIZE(image->bindings); ++j) {
assert(memory_ranges_equal(image->bindings[j].memory_range,
swapchain_image->bindings[j].memory_range));
image->bindings[j].address = swapchain_image->bindings[j].address;
if (image->bindings[j].memory_range.size != 0) {
anv_image_bind_address(device, image, j,
swapchain_image->bindings[j].address);
}
}
/* We must bump the private binding's bo's refcount because, unlike the other
@@ -2571,8 +2586,7 @@ anv_bind_image_memory(struct anv_device *device,
case VK_STRUCTURE_TYPE_NATIVE_BUFFER_ANDROID: {
const VkNativeBufferANDROID *gralloc_info =
(const VkNativeBufferANDROID *)s;
VkResult result = anv_image_bind_from_gralloc(device, image,
gralloc_info);
result = anv_image_bind_from_gralloc(device, image, gralloc_info);
if (result != VK_SUCCESS)
return result;
@@ -2589,16 +2603,12 @@ anv_bind_image_memory(struct anv_device *device,
if (!did_bind) {
assert(!image->disjoint);
image->bindings[ANV_IMAGE_MEMORY_BINDING_MAIN].address =
(struct anv_address) {
.bo = mem->bo,
.offset = bind_info->memoryOffset,
};
ANV_RMV(image_bind, device, image,
ANV_IMAGE_MEMORY_BINDING_MAIN);
result = anv_image_bind_address(device, image,
ANV_IMAGE_MEMORY_BINDING_MAIN,
(struct anv_address) {
.bo = mem->bo,
.offset = bind_info->memoryOffset,
});
did_bind = true;
}
@@ -2650,9 +2660,9 @@ anv_bind_image_memory(struct anv_device *device,
}
if (bind_status)
*bind_status->pResult = VK_SUCCESS;
*bind_status->pResult = result;
return VK_SUCCESS;
return result;
}
VkResult anv_BindImageMemory2(

View File

@@ -5708,7 +5708,7 @@ anv_cmd_buffer_load_clear_color_from_image(struct anv_cmd_buffer *cmd_buffer,
struct anv_state state,
const struct anv_image *image);
struct anv_image_binding *
enum anv_image_memory_binding
anv_image_aspect_to_binding(struct anv_image *image,
VkImageAspectFlags aspect);

View File

@@ -1376,7 +1376,7 @@ anv_sparse_bind_image_memory(struct anv_queue *queue,
assert(!(bind->flags & VK_SPARSE_MEMORY_BIND_METADATA_BIT));
struct anv_image_binding *img_binding = image->disjoint ?
anv_image_aspect_to_binding(image, aspect) :
&image->bindings[anv_image_aspect_to_binding(image, aspect)] :
&image->bindings[ANV_IMAGE_MEMORY_BINDING_MAIN];
struct anv_sparse_binding_data *sparse_data = &img_binding->sparse_data;