From 0967584549fa12c754e594dfaf5ac9d7671e7b18 Mon Sep 17 00:00:00 2001 From: Jason Ekstrand Date: Sat, 30 Oct 2021 15:47:38 -0500 Subject: [PATCH] anv: Add get/set_tiling helpers These are only required WSI cases and Android but still better to have them in a central place. Reviwed-by: Paulo Zanoni Part-of: --- src/intel/vulkan/anv_allocator.c | 32 ++++++++++++++++++++++++++++++++ src/intel/vulkan/anv_android.c | 27 ++++++--------------------- src/intel/vulkan/anv_device.c | 13 +++++-------- src/intel/vulkan/anv_image.c | 30 +++++++----------------------- src/intel/vulkan/anv_private.h | 7 +++++++ 5 files changed, 57 insertions(+), 52 deletions(-) diff --git a/src/intel/vulkan/anv_allocator.c b/src/intel/vulkan/anv_allocator.c index 02987e2..d43e562 100644 --- a/src/intel/vulkan/anv_allocator.c +++ b/src/intel/vulkan/anv_allocator.c @@ -2019,6 +2019,38 @@ anv_device_export_bo(struct anv_device *device, return VK_SUCCESS; } +VkResult +anv_device_get_bo_tiling(struct anv_device *device, + struct anv_bo *bo, + enum isl_tiling *tiling_out) +{ + int i915_tiling = anv_gem_get_tiling(device, bo->gem_handle); + if (i915_tiling < 0) { + return vk_errorf(device, VK_ERROR_INVALID_EXTERNAL_HANDLE, + "failed to get BO tiling: %m"); + } + + *tiling_out = isl_tiling_from_i915_tiling(i915_tiling); + + return VK_SUCCESS; +} + +VkResult +anv_device_set_bo_tiling(struct anv_device *device, + struct anv_bo *bo, + uint32_t row_pitch_B, + enum isl_tiling tiling) +{ + int ret = anv_gem_set_tiling(device, bo->gem_handle, row_pitch_B, + isl_tiling_to_i915_tiling(tiling)); + if (ret) { + return vk_errorf(device, VK_ERROR_OUT_OF_DEVICE_MEMORY, + "failed to set BO tiling: %m"); + } + + return VK_SUCCESS; +} + static bool atomic_dec_not_one(uint32_t *counter) { diff --git a/src/intel/vulkan/anv_android.c b/src/intel/vulkan/anv_android.c index eef859a..32a43fc 100644 --- a/src/intel/vulkan/anv_android.c +++ b/src/intel/vulkan/anv_android.c @@ -522,28 +522,13 @@ anv_image_init_from_gralloc(struct anv_device *device, "failed to import dma-buf from VkNativeBufferANDROID"); } - int i915_tiling = anv_gem_get_tiling(device, bo->gem_handle); - switch (i915_tiling) { - case I915_TILING_NONE: - anv_info.isl_tiling_flags = ISL_TILING_LINEAR_BIT; - break; - case I915_TILING_X: - anv_info.isl_tiling_flags = ISL_TILING_X_BIT; - break; - case I915_TILING_Y: - anv_info.isl_tiling_flags = ISL_TILING_Y0_BIT; - break; - case -1: - result = vk_errorf(device, VK_ERROR_INVALID_EXTERNAL_HANDLE, - "DRM_IOCTL_I915_GEM_GET_TILING failed for " - "VkNativeBufferANDROID"); - goto fail_tiling; - default: - result = vk_errorf(device, VK_ERROR_INVALID_EXTERNAL_HANDLE, - "DRM_IOCTL_I915_GEM_GET_TILING returned unknown " - "tiling %d for VkNativeBufferANDROID", i915_tiling); - goto fail_tiling; + enum isl_tiling tiling; + result = anv_device_get_bo_tiling(device, bo, &tiling); + if (result != VK_SUCCESS) { + return vk_errorf(device, result, + "failed to get tiling from VkNativeBufferANDROID"); } + anv_info.isl_tiling_flags = 1u << tiling; enum isl_format format = anv_get_isl_format(&device->info, base_info->format, diff --git a/src/intel/vulkan/anv_device.c b/src/intel/vulkan/anv_device.c index 65211db..ede7ddd 100644 --- a/src/intel/vulkan/anv_device.c +++ b/src/intel/vulkan/anv_device.c @@ -3866,15 +3866,12 @@ VkResult anv_AllocateMemory( * the BO. In this case, we have a dedicated allocation. */ if (image->vk.wsi_legacy_scanout) { - const uint32_t i915_tiling = - isl_tiling_to_i915_tiling(image->planes[0].primary_surface.isl.tiling); - int ret = anv_gem_set_tiling(device, mem->bo->gem_handle, - image->planes[0].primary_surface.isl.row_pitch_B, - i915_tiling); - if (ret) { + const struct isl_surf *surf = &image->planes[0].primary_surface.isl; + result = anv_device_set_bo_tiling(device, mem->bo, + surf->row_pitch_B, + surf->tiling); + if (result != VK_SUCCESS) { anv_device_release_bo(device, mem->bo); - result = vk_errorf(device, VK_ERROR_OUT_OF_DEVICE_MEMORY, - "failed to set BO tiling: %m"); goto fail; } } diff --git a/src/intel/vulkan/anv_image.c b/src/intel/vulkan/anv_image.c index f8f7cd1..bf63417 100644 --- a/src/intel/vulkan/anv_image.c +++ b/src/intel/vulkan/anv_image.c @@ -1569,30 +1569,14 @@ resolve_ahw_image(struct anv_device *device, VkResult result; /* Check tiling. */ - int i915_tiling = anv_gem_get_tiling(device, mem->bo->gem_handle); - VkImageTiling vk_tiling; - isl_tiling_flags_t isl_tiling_flags = 0; - - switch (i915_tiling) { - case I915_TILING_NONE: - vk_tiling = VK_IMAGE_TILING_LINEAR; - isl_tiling_flags = ISL_TILING_LINEAR_BIT; - break; - case I915_TILING_X: - vk_tiling = VK_IMAGE_TILING_OPTIMAL; - isl_tiling_flags = ISL_TILING_X_BIT; - break; - case I915_TILING_Y: - vk_tiling = VK_IMAGE_TILING_OPTIMAL; - isl_tiling_flags = ISL_TILING_Y0_BIT; - break; - case -1: - default: - unreachable("Invalid tiling flags."); - } + enum isl_tiling tiling; + result = anv_device_get_bo_tiling(device, mem->bo, &tiling); + assert(result == VK_SUCCESS); - assert(vk_tiling == VK_IMAGE_TILING_LINEAR || - vk_tiling == VK_IMAGE_TILING_OPTIMAL); + VkImageTiling vk_tiling = + tiling == ISL_TILING_LINEAR ? VK_IMAGE_TILING_LINEAR : + VK_IMAGE_TILING_OPTIMAL; + isl_tiling_flags_t isl_tiling_flags = (1u << tiling); /* Check format. */ VkFormat vk_format = vk_format_from_android(desc.format, desc.usage); diff --git a/src/intel/vulkan/anv_private.h b/src/intel/vulkan/anv_private.h index 86a8bc3..3fdbfce 100644 --- a/src/intel/vulkan/anv_private.h +++ b/src/intel/vulkan/anv_private.h @@ -1390,6 +1390,13 @@ VkResult anv_device_import_bo(struct anv_device *device, int fd, struct anv_bo **bo); VkResult anv_device_export_bo(struct anv_device *device, struct anv_bo *bo, int *fd_out); +VkResult anv_device_get_bo_tiling(struct anv_device *device, + struct anv_bo *bo, + enum isl_tiling *tiling_out); +VkResult anv_device_set_bo_tiling(struct anv_device *device, + struct anv_bo *bo, + uint32_t row_pitch_B, + enum isl_tiling tiling); void anv_device_release_bo(struct anv_device *device, struct anv_bo *bo); -- 2.7.4