| From 769af5bee24c6f1420ccc423165aaf77f97c6beb Mon Sep 17 00:00:00 2001 |
| From: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> |
| Date: Mon, 6 May 2019 15:44:04 +0200 |
| Subject: [PATCH] radv: Use given stride for images imported from Android. |
| |
| Handled similarly as radeonsi. I checked the offsets are actually used. |
| |
| Acked-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> |
| (cherry picked from commit 8139efbbbd2f07cd4d88488ca5c34c2c19ef10d4) |
| |
| Change-Id: I7357e651abf838d15166564800d4894c8db430d7 |
| --- |
| src/amd/vulkan/radv_android.c | 2 ++ |
| src/amd/vulkan/radv_image.c | 28 ++++++++++++++++++++++++++++ |
| src/amd/vulkan/radv_private.h | 5 +++++ |
| 3 files changed, 35 insertions(+) |
| |
| diff --git a/src/amd/vulkan/radv_android.c b/src/amd/vulkan/radv_android.c |
| index 9613eabbe87..a0a35e23e76 100644 |
| --- a/src/amd/vulkan/radv_android.c |
| +++ b/src/amd/vulkan/radv_android.c |
| @@ -191,6 +191,8 @@ radv_image_from_gralloc(VkDevice device_h, |
| |
| image = radv_image_from_handle(image_h); |
| |
| + radv_image_override_offset_stride(device, image, 0, gralloc_info->stride); |
| + |
| radv_BindImageMemory(device_h, image_h, memory_h, 0); |
| |
| image->owned_memory = memory_h; |
| diff --git a/src/amd/vulkan/radv_image.c b/src/amd/vulkan/radv_image.c |
| index fc8c6a2ebfe..e3eafdd5fbe 100644 |
| --- a/src/amd/vulkan/radv_image.c |
| +++ b/src/amd/vulkan/radv_image.c |
| @@ -749,6 +749,34 @@ radv_init_metadata(struct radv_device *device, |
| radv_query_opaque_metadata(device, image, metadata); |
| } |
| |
| +void |
| +radv_image_override_offset_stride(struct radv_device *device, |
| + struct radv_image *image, |
| + uint64_t offset, uint32_t stride) |
| +{ |
| + struct radeon_surf *surface = &image->surface; |
| + unsigned bpe = vk_format_get_blocksizebits(image->vk_format) / 8; |
| + |
| + if (device->physical_device->rad_info.chip_class >= GFX9) { |
| + if (stride) { |
| + surface->u.gfx9.surf_pitch = stride; |
| + surface->u.gfx9.surf_slice_size = |
| + (uint64_t)stride * surface->u.gfx9.surf_height * bpe; |
| + } |
| + surface->u.gfx9.surf_offset = offset; |
| + } else { |
| + surface->u.legacy.level[0].nblk_x = stride; |
| + surface->u.legacy.level[0].slice_size_dw = |
| + ((uint64_t)stride * surface->u.legacy.level[0].nblk_y * bpe) / 4; |
| + |
| + if (offset) { |
| + for (unsigned i = 0; i < ARRAY_SIZE(surface->u.legacy.level); ++i) |
| + surface->u.legacy.level[i].offset += offset; |
| + } |
| + |
| + } |
| +} |
| + |
| /* The number of samples can be specified independently of the texture. */ |
| static void |
| radv_image_get_fmask_info(struct radv_device *device, |
| diff --git a/src/amd/vulkan/radv_private.h b/src/amd/vulkan/radv_private.h |
| index 8714052e4a0..632038dd6b9 100644 |
| --- a/src/amd/vulkan/radv_private.h |
| +++ b/src/amd/vulkan/radv_private.h |
| @@ -1652,6 +1652,11 @@ radv_init_metadata(struct radv_device *device, |
| struct radv_image *image, |
| struct radeon_bo_metadata *metadata); |
| |
| +void |
| +radv_image_override_offset_stride(struct radv_device *device, |
| + struct radv_image *image, |
| + uint64_t offset, uint32_t stride); |
| + |
| struct radv_image_view { |
| struct radv_image *image; /**< VkImageViewCreateInfo::image */ |
| struct radeon_winsys_bo *bo; |
| -- |
| 2.21.0.1020.gf2820cf01a-goog |
| |