diff options
author | Chad Versace <[email protected]> | 2015-11-13 09:45:55 -0800 |
---|---|---|
committer | Chad Versace <[email protected]> | 2015-11-13 10:44:07 -0800 |
commit | a4a2ea3f79153627b631a2b1a7f3c4ac38430817 (patch) | |
tree | 7d5e67e681bba7abddd736cb77b13149ae2a587f /src/vulkan | |
parent | 652727b0295d40d181c6a6420e19bdf0db005784 (diff) |
isl: Add enum isl_tiling and a query func
The query func is isl_tiling_get_extent.
Diffstat (limited to 'src/vulkan')
-rw-r--r-- | src/vulkan/isl.c | 58 | ||||
-rw-r--r-- | src/vulkan/isl.h | 19 |
2 files changed, 77 insertions, 0 deletions
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 <assert.h> +#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 @@ -36,6 +36,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. * * For the official list, see Broadwell PRM: Volume 2b: Command Reference: @@ -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 |