ilo: clarify valid and preferred tilings
authorChia-I Wu <olvaffe@gmail.com>
Fri, 6 Mar 2015 19:41:55 +0000 (12:41 -0700)
committerChia-I Wu <olvaffe@gmail.com>
Fri, 6 Mar 2015 20:32:39 +0000 (04:32 +0800)
We did it right until the switch to gen_surface_tiling, which has
GEN8_TILING_W.  Generally, GEN8_TILING_W may be valid but not preferred.

src/gallium/drivers/ilo/ilo_layout.c
src/gallium/drivers/ilo/ilo_resource.c

index 2c78dc61cb8f3fa5e2a54916db5c79b5068b615e..0444c5d2619b14b062aa474a963289d79f5cadf6 100644 (file)
@@ -460,8 +460,7 @@ layout_get_valid_tilings(const struct ilo_layout *layout,
 {
    const struct pipe_resource *templ = params->templ;
    const enum pipe_format format = layout->format;
-   /* W-tiling is too restrictive */
-   unsigned valid_tilings = LAYOUT_TILING_ALL & ~LAYOUT_TILING_W;
+   unsigned valid_tilings = LAYOUT_TILING_ALL;
 
    /*
     * From the Sandy Bridge PRM, volume 1 part 2, page 32:
@@ -496,8 +495,7 @@ layout_get_valid_tilings(const struct ilo_layout *layout,
    if (templ->bind & PIPE_BIND_DEPTH_STENCIL) {
       switch (format) {
       case PIPE_FORMAT_S8_UINT:
-         /* this is the only case LAYOUT_TILING_W is valid */
-         valid_tilings = LAYOUT_TILING_W;
+         valid_tilings &= LAYOUT_TILING_W;
          break;
       default:
          valid_tilings &= LAYOUT_TILING_Y;
@@ -532,6 +530,13 @@ layout_get_valid_tilings(const struct ilo_layout *layout,
           ilo_dev_gen(params->dev) <= ILO_GEN(7.5) &&
           layout->format == PIPE_FORMAT_R32G32B32_FLOAT)
          valid_tilings &= ~LAYOUT_TILING_Y;
+
+      valid_tilings &= ~LAYOUT_TILING_W;
+   }
+
+   if (templ->bind & PIPE_BIND_SAMPLER_VIEW) {
+      if (ilo_dev_gen(params->dev) < ILO_GEN(8))
+         valid_tilings &= ~LAYOUT_TILING_W;
    }
 
    /* no conflicting binding flags */
@@ -545,33 +550,39 @@ layout_init_tiling(struct ilo_layout *layout,
                    struct ilo_layout_params *params)
 {
    const struct pipe_resource *templ = params->templ;
-   unsigned valid_tilings = layout_get_valid_tilings(layout, params);
+   unsigned preferred_tilings;
 
-   layout->valid_tilings = valid_tilings;
+   layout->valid_tilings = layout_get_valid_tilings(layout, params);
+
+   preferred_tilings = layout->valid_tilings;
+
+   /* no fencing nor BLT support */
+   if (preferred_tilings & ~LAYOUT_TILING_W)
+      preferred_tilings &= ~LAYOUT_TILING_W;
 
    if (templ->bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) {
       /*
        * heuristically set a minimum width/height for enabling tiling
        */
-      if (layout->width0 < 64 && (valid_tilings & ~LAYOUT_TILING_X))
-         valid_tilings &= ~LAYOUT_TILING_X;
+      if (layout->width0 < 64 && (preferred_tilings & ~LAYOUT_TILING_X))
+         preferred_tilings &= ~LAYOUT_TILING_X;
 
       if ((layout->width0 < 32 || layout->height0 < 16) &&
           (layout->width0 < 16 || layout->height0 < 32) &&
-          (valid_tilings & ~LAYOUT_TILING_Y))
-         valid_tilings &= ~LAYOUT_TILING_Y;
+          (preferred_tilings & ~LAYOUT_TILING_Y))
+         preferred_tilings &= ~LAYOUT_TILING_Y;
    } else {
       /* force linear if we are not sure where the texture is bound to */
-      if (valid_tilings & LAYOUT_TILING_NONE)
-         valid_tilings &= LAYOUT_TILING_NONE;
+      if (preferred_tilings & LAYOUT_TILING_NONE)
+         preferred_tilings &= LAYOUT_TILING_NONE;
    }
 
    /* prefer tiled over linear */
-   if (valid_tilings & LAYOUT_TILING_Y)
+   if (preferred_tilings & LAYOUT_TILING_Y)
       layout->tiling = GEN6_TILING_Y;
-   else if (valid_tilings & LAYOUT_TILING_X)
+   else if (preferred_tilings & LAYOUT_TILING_X)
       layout->tiling = GEN6_TILING_X;
-   else if (valid_tilings & LAYOUT_TILING_W)
+   else if (preferred_tilings & LAYOUT_TILING_W)
       layout->tiling = GEN8_TILING_W;
    else
       layout->tiling = GEN6_TILING_NONE;
index 7815354be013824d85f8f852bd6f2d7fef92648b..18062d75622ff4c2eaa1335701cb77ecad827d95 100644 (file)
@@ -220,6 +220,9 @@ tex_create_separate_stencil(struct ilo_texture *tex)
     */
    templ.format = PIPE_FORMAT_S8_UINT;
 
+   /* no stencil texturing */
+   templ.bind &= ~PIPE_BIND_SAMPLER_VIEW;
+
    s8 = tex->base.screen->resource_create(tex->base.screen, &templ);
    if (!s8)
       return false;