ilo: check the tilings of imported handles
authorChia-I Wu <olvaffe@gmail.com>
Thu, 24 Jul 2014 05:21:41 +0000 (13:21 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Thu, 24 Jul 2014 05:38:51 +0000 (13:38 +0800)
Just to be cautious.

src/gallium/drivers/ilo/ilo_resource.c

index 20393ee3098e8d5b992264caebe0ea9483fd48ee..182bb60d3014d132c292acf75ee718995326f34a 100644 (file)
@@ -43,7 +43,7 @@ struct tex_layout {
    bool compressed;
 
    enum intel_tiling_mode tiling;
-   bool can_be_linear;
+   unsigned valid_tilings; /* bitmask of valid tiling modes */
 
    bool array_spacing_full;
    bool interleaved;
@@ -561,32 +561,36 @@ tex_layout_init_tiling(struct tex_layout *layout)
       }
    }
 
-   if (templ->bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) {
-      if (templ->bind & PIPE_BIND_RENDER_TARGET) {
-         /*
-          * From the Sandy Bridge PRM, volume 1 part 2, page 32:
-          *
-          *     "NOTE: 128BPE Format Color buffer ( render target ) MUST be
-          *      either TileX or Linear."
-          */
-         if (layout->block_size == 16)
-            valid_tilings &= ~tile_y;
+   if (templ->bind & PIPE_BIND_RENDER_TARGET) {
+      /*
+       * From the Sandy Bridge PRM, volume 1 part 2, page 32:
+       *
+       *     "NOTE: 128BPE Format Color buffer ( render target ) MUST be
+       *      either TileX or Linear."
+       */
+      if (layout->block_size == 16)
+         valid_tilings &= ~tile_y;
 
-         /*
-          * From the Ivy Bridge PRM, volume 4 part 1, page 63:
-          *
-          *     "This field (Surface Vertical Aligment) must be set to
-          *      VALIGN_4 for all tiled Y Render Target surfaces."
-          *
-          *     "VALIGN_4 is not supported for surface format
-          *      R32G32B32_FLOAT."
-          */
-         if (layout->dev->gen >= ILO_GEN(7) && layout->block_size == 12)
-            valid_tilings &= ~tile_y;
-      }
+      /*
+       * From the Ivy Bridge PRM, volume 4 part 1, page 63:
+       *
+       *     "This field (Surface Vertical Aligment) must be set to VALIGN_4
+       *      for all tiled Y Render Target surfaces."
+       *
+       *     "VALIGN_4 is not supported for surface format R32G32B32_FLOAT."
+       */
+      if (layout->dev->gen >= ILO_GEN(7) && layout->block_size == 12)
+         valid_tilings &= ~tile_y;
+   }
+
+   /* no conflicting binding flags */
+   assert(valid_tilings);
 
+   layout->valid_tilings = valid_tilings;
+
+   if (templ->bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) {
       /*
-       * Also, heuristically set a minimum width/height for enabling tiling.
+       * heuristically set a minimum width/height for enabling tiling
        */
       if (templ->width0 < 64 && (valid_tilings & ~tile_x))
          valid_tilings &= ~tile_x;
@@ -602,9 +606,6 @@ tex_layout_init_tiling(struct tex_layout *layout)
          valid_tilings &= tile_none;
    }
 
-   /* no conflicting binding flags */
-   assert(valid_tilings);
-
    /* prefer tiled over linear */
    if (valid_tilings & tile_y)
       layout->tiling = INTEL_TILING_Y;
@@ -612,8 +613,6 @@ tex_layout_init_tiling(struct tex_layout *layout)
       layout->tiling = INTEL_TILING_X;
    else
       layout->tiling = INTEL_TILING_NONE;
-
-   layout->can_be_linear = valid_tilings & tile_none;
 }
 
 static void
@@ -996,7 +995,7 @@ tex_layout_calculate_bo_size(struct tex_layout *layout)
           * VALIGN_2 if the layout was Y-tiled, but let's keep it simple.
           */
          if (mappable_gtt_size / w / 4 < h) {
-            if (layout->can_be_linear) {
+            if (layout->valid_tilings & (1 << INTEL_TILING_NONE)) {
                layout->tiling = INTEL_TILING_NONE;
                continue;
             }
@@ -1122,6 +1121,13 @@ tex_import_handle(struct ilo_texture *tex,
    if (!tex->bo)
       return false;
 
+   if (!(layout->valid_tilings & (1 << tiling))) {
+      ilo_err("imported handle has incompatible tiling\n");
+      intel_bo_unreference(tex->bo);
+      tex->bo = NULL;
+      return false;
+   }
+
    tex->tiling = tiling;
    tex->bo_stride = pitch;