From a4a2ea3f79153627b631a2b1a7f3c4ac38430817 Mon Sep 17 00:00:00 2001 From: Chad Versace Date: Fri, 13 Nov 2015 09:45:55 -0800 Subject: [PATCH] isl: Add enum isl_tiling and a query func The query func is isl_tiling_get_extent. --- src/vulkan/isl.c | 58 ++++++++++++++++++++++++++++++++++++++++++++++++ src/vulkan/isl.h | 19 ++++++++++++++++ 2 files changed, 77 insertions(+) diff --git a/src/vulkan/isl.c b/src/vulkan/isl.c index b4de5653677..ecfa96973dd 100644 --- a/src/vulkan/isl.c +++ b/src/vulkan/isl.c @@ -23,11 +23,69 @@ #include +#include "mesa/main/imports.h" + #include "isl.h" +/** + * Log base 2, rounding towards zero. + */ +static inline uint32_t +isl_log2u(uint32_t n) +{ + assert(n != 0); + return 31 - __builtin_clz(n); +} + void isl_device_init(struct isl_device *dev, uint8_t gen10x) { assert(gen10x % 5 == 0); dev->gen = gen10x; } + +/** + * The returned extent's units are (width=bytes, height=rows). + */ +void +isl_tiling_get_extent(const struct isl_device *dev, + enum isl_tiling tiling, + uint32_t cpp, + struct isl_extent2d *e) +{ + static const struct isl_extent2d legacy_extents[] = { + [ISL_TILING_LINEAR] = { 1, 1 }, + [ISL_TILING_X] = { 512, 8 }, + [ISL_TILING_Y] = { 128, 32 }, + [ISL_TILING_W] = { 128, 32 }, + }; + + static const struct isl_extent2d yf_extents[] = { + /*cpp*/ + /* 1*/ [0] = { 64, 64 }, + /* 2*/ [1] = { 128, 32 }, + /* 4*/ [2] = { 128, 32 }, + /* 8*/ [3] = { 256, 16 }, + /*16*/ [4] = { 256, 16 }, + }; + + assert(cpp > 0); + + switch (tiling) { + case ISL_TILING_LINEAR: + case ISL_TILING_X: + case ISL_TILING_Y: + case ISL_TILING_W: + *e = legacy_extents[tiling]; + return; + case ISL_TILING_Yf: + case ISL_TILING_Ys: + assert(_mesa_is_pow_two(cpp)); + *e = yf_extents[isl_log2u(cpp)]; + if (tiling == ISL_TILING_Ys) { + e->width *= 4; + e->height *= 4; + } + return; + } +} diff --git a/src/vulkan/isl.h b/src/vulkan/isl.h index fde16d3bbf0..4c38170fc72 100644 --- a/src/vulkan/isl.h +++ b/src/vulkan/isl.h @@ -35,6 +35,19 @@ extern "C" { #endif +/** + * WARNING: These values differ from the hardware enum values, which are + * unstable across hardware generations. + */ +enum isl_tiling { + ISL_TILING_LINEAR, + ISL_TILING_W, + ISL_TILING_X, + ISL_TILING_Y, /**< Legacy Y tiling */ + ISL_TILING_Yf, + ISL_TILING_Ys, +}; + /** * Hardware enumeration SURFACE_FORMAT. * @@ -358,6 +371,12 @@ struct isl_format_layout { void isl_device_init(struct isl_device *dev, uint8_t gen10x); +void +isl_tiling_get_extent(const struct isl_device *dev, + enum isl_tiling tiling, + uint32_t cpp, + struct isl_extent2d *e); + extern const struct isl_format_layout isl_format_layouts[]; #ifdef __cplusplus -- 2.30.2