[Mesa-dev] [RFC v2 04/23] intel/isl: Add ISL <-> GEM tiling conversion
Louis-Francis Ratté-Boulianne
lfrb at collabora.com
Thu Aug 31 04:24:00 UTC 2017
From: Daniel Stone <daniels at collabora.com>
Add a simple conversion from ISL tiling to GEM BO tiling flags, and use
that instead of hardcoding I915_TILING_X in the ANV WSI.
Signed-off-by: Daniel Stone <daniels at collabora.com>
---
src/intel/isl/isl.c | 28 ++++++++++++++++++++++++++++
src/intel/isl/isl.h | 8 ++++++++
src/intel/vulkan/anv_wsi.c | 6 +++---
3 files changed, 39 insertions(+), 3 deletions(-)
diff --git a/src/intel/isl/isl.c b/src/intel/isl/isl.c
index fd8fcf5e93..8ebe8538fa 100644
--- a/src/intel/isl/isl.c
+++ b/src/intel/isl/isl.c
@@ -27,6 +27,7 @@
#include "genxml/genX_bits.h"
#include <drm_fourcc.h>
+#include <i915_drm.h>
#include "isl.h"
#include "isl_gen4.h"
@@ -107,6 +108,33 @@ isl_tiling_to_drm_format_mod(enum isl_tiling tiling,
unreachable("unknown tiling in isl_tiling_to_drm_format_mod");
}
+bool
+isl_tiling_to_gem_tiling(enum isl_tiling isl, enum isl_aux_usage aux_usage,
+ uint32_t *gem)
+{
+ switch (isl) {
+ case ISL_TILING_LINEAR:
+ *gem = I915_TILING_NONE;
+ return true;
+ case ISL_TILING_X:
+ *gem = I915_TILING_X;
+ return true;
+ case ISL_TILING_Y0:
+ if (aux_usage != ISL_AUX_USAGE_NONE && aux_usage != ISL_AUX_USAGE_CCS_E)
+ return false;
+ *gem = I915_TILING_Y;
+ return true;
+ case ISL_TILING_Yf:
+ case ISL_TILING_Ys:
+ case ISL_TILING_W:
+ case ISL_TILING_HIZ:
+ case ISL_TILING_CCS:
+ return false;
+ }
+
+ unreachable("unknown tiling in isl_tiling_to_gem_tiling");
+}
+
void
isl_device_init(struct isl_device *dev,
const struct gen_device_info *info,
diff --git a/src/intel/isl/isl.h b/src/intel/isl/isl.h
index 09b3850ca4..d216b05168 100644
--- a/src/intel/isl/isl.h
+++ b/src/intel/isl/isl.h
@@ -1547,6 +1547,14 @@ bool isl_tiling_from_drm_format_mod(uint64_t mod,
uint64_t isl_tiling_to_drm_format_mod(enum isl_tiling tiling,
enum isl_aux_usage aux_usage);
+/**
+ * Map an ISL tiling/aux pair to a GEM tiling enum. If the ISL tiling/aux mode
+ * is not exportable, return false. The output parameters are only written on
+ * success.
+ */
+bool isl_tiling_to_gem_tiling(enum isl_tiling isl, enum isl_aux_usage aux_usage,
+ uint32_t *gem_tiling);
+
static inline bool
isl_tiling_is_any_y(enum isl_tiling tiling)
{
diff --git a/src/intel/vulkan/anv_wsi.c b/src/intel/vulkan/anv_wsi.c
index 00edb220b2..b86e4f1b4a 100644
--- a/src/intel/vulkan/anv_wsi.c
+++ b/src/intel/vulkan/anv_wsi.c
@@ -241,11 +241,11 @@ anv_wsi_image_create(VkDevice device_h,
anv_BindImageMemory(device_h, image_h, memory_h, 0);
struct anv_surface *surface = &image->color_surface;
- assert(surface->isl.tiling == ISL_TILING_X);
-
+ uint32_t gem_tiling = I915_TILING_NONE;
+ isl_tiling_to_gem_tiling(surface->isl.tiling, image->aux_usage, &gem_tiling);
*row_pitch = surface->isl.row_pitch;
int ret = anv_gem_set_tiling(device, memory->bo->gem_handle,
- surface->isl.row_pitch, I915_TILING_X);
+ surface->isl.row_pitch, gem_tiling);
if (ret) {
/* FINISHME: Choose a better error. */
result = vk_errorf(VK_ERROR_OUT_OF_DEVICE_MEMORY,
--
2.13.0
More information about the mesa-dev
mailing list