isl: Add enum isl_tiling and a query func
authorChad Versace <chad.versace@intel.com>
Fri, 13 Nov 2015 17:45:55 +0000 (09:45 -0800)
committerChad Versace <chad.versace@intel.com>
Fri, 13 Nov 2015 18:44:07 +0000 (10:44 -0800)
The query func is isl_tiling_get_extent.

src/vulkan/isl.c
src/vulkan/isl.h

index b4de56536772c5323c8a2b5df7734c76ffe32c7e..ecfa96973ddb820cd2a99b5619ed202b1303c557 100644 (file)
 
 #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;
+   }
+}
index fde16d3bbf0d6f471c94e05cb0b595648fb0a9f4..4c38170fc72cddb0f4cafbda66f444b81fe15f2f 100644 (file)
 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