From 8139efbbbd2f07cd4d88488ca5c34c2c19ef10d4 Mon Sep 17 00:00:00 2001 From: Bas Nieuwenhuizen 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 --- 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 92409d147f1..7c9a72c93c1 100644 --- a/src/amd/vulkan/radv_image.c +++ b/src/amd/vulkan/radv_image.c @@ -760,6 +760,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->planes[0].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 df85d0cf889..7fa0b39f2b0 100644 --- a/src/amd/vulkan/radv_private.h +++ b/src/amd/vulkan/radv_private.h @@ -1672,6 +1672,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); + union radv_descriptor { struct { uint32_t plane0_descriptor[8]; -- 2.30.2