ilo: improve readability of ilo_image
authorChia-I Wu <olvaffe@gmail.com>
Sat, 2 May 2015 04:04:26 +0000 (12:04 +0800)
committerChia-I Wu <olvaffe@gmail.com>
Sat, 2 May 2015 14:14:06 +0000 (22:14 +0800)
Improve docs, rename struct fields, and reorder walk types.  No real changes.

src/gallium/drivers/ilo/core/ilo_image.c
src/gallium/drivers/ilo/core/ilo_image.h
src/gallium/drivers/ilo/core/ilo_state_3d_bottom.c
src/gallium/drivers/ilo/core/ilo_state_3d_top.c
src/gallium/drivers/ilo/ilo_resource.c
src/gallium/drivers/ilo/ilo_resource.h

index daa2bae94120d469f09b3b75ebe5d00c3d7ed341..174e2e17138e484cc25d0837c3f8a22c505f9b11 100644 (file)
@@ -214,14 +214,14 @@ img_init_layer_height(struct ilo_image *img,
     * slices.  Since we use texel rows everywhere, we do not need to divide
     * QPitch by 4.
     */
-   img->layer_height = params->h0 + params->h1 +
+   img->walk_layer_height = params->h0 + params->h1 +
       ((ilo_dev_gen(params->dev) >= ILO_GEN(7)) ? 12 : 11) * img->align_j;
 
    if (ilo_dev_gen(params->dev) == ILO_GEN(6) && templ->nr_samples > 1 &&
        img->height0 % 4 == 1)
-      img->layer_height += 4;
+      img->walk_layer_height += 4;
 
-   params->max_y += img->layer_height * (num_layers - 1);
+   params->max_y += img->walk_layer_height * (num_layers - 1);
 }
 
 static void
@@ -245,6 +245,13 @@ img_init_lods(struct ilo_image *img,
       img->lods[lv].slice_height = lod_h;
 
       switch (img->walk) {
+      case ILO_IMAGE_WALK_LAYER:
+         /* MIPLAYOUT_BELOW */
+         if (lv == 1)
+            cur_x += lod_w;
+         else
+            cur_y += lod_h;
+         break;
       case ILO_IMAGE_WALK_LOD:
          lod_h *= img_get_num_layers(img, params);
          if (lv == 1)
@@ -259,13 +266,6 @@ img_init_lods(struct ilo_image *img,
             cur_y = align(cur_y, 64);
          }
          break;
-      case ILO_IMAGE_WALK_LAYER:
-         /* MIPLAYOUT_BELOW */
-         if (lv == 1)
-            cur_x += lod_w;
-         else
-            cur_y += lod_h;
-         break;
       case ILO_IMAGE_WALK_3D:
          {
             const unsigned num_slices = u_minify(templ->depth0, lv);
@@ -693,7 +693,7 @@ img_init_size_and_format(struct ilo_image *img,
       if (ilo_dev_gen(params->dev) >= ILO_GEN(7))
          require_separate_stencil = true;
       else
-         require_separate_stencil = (img->aux == ILO_IMAGE_AUX_HIZ);
+         require_separate_stencil = (img->aux.type == ILO_IMAGE_AUX_HIZ);
    }
 
    switch (format) {
@@ -824,9 +824,9 @@ img_init_aux(struct ilo_image *img,
              struct ilo_image_params *params)
 {
    if (img_want_hiz(img, params))
-      img->aux = ILO_IMAGE_AUX_HIZ;
+      img->aux.type = ILO_IMAGE_AUX_HIZ;
    else if (img_want_mcs(img, params))
-      img->aux = ILO_IMAGE_AUX_MCS;
+      img->aux.type = ILO_IMAGE_AUX_MCS;
 }
 
 static void
@@ -882,7 +882,7 @@ img_align(struct ilo_image *img, struct ilo_image_params *params)
     * ilo_texture_can_enable_hiz(), we always return true for the first slice.
     * To avoid out-of-bound access, we have to pad.
     */
-   if (img->aux == ILO_IMAGE_AUX_HIZ &&
+   if (img->aux.type == ILO_IMAGE_AUX_HIZ &&
        templ->last_level == 0 &&
        templ->array_size == 1 &&
        templ->depth0 == 1) {
@@ -901,7 +901,7 @@ img_calculate_bo_size(struct ilo_image *img,
 {
    assert(params->max_x % img->block_width == 0);
    assert(params->max_y % img->block_height == 0);
-   assert(img->layer_height % img->block_height == 0);
+   assert(img->walk_layer_height % img->block_height == 0);
 
    img->bo_stride =
       (params->max_x / img->block_width) * img->block_size;
@@ -987,9 +987,9 @@ img_calculate_bo_size(struct ilo_image *img,
             if (img->valid_tilings & IMAGE_TILING_NONE) {
                img->tiling = GEN6_TILING_NONE;
                /* MCS support for non-MSRTs is limited to tiled RTs */
-               if (img->aux == ILO_IMAGE_AUX_MCS &&
+               if (img->aux.type == ILO_IMAGE_AUX_MCS &&
                    params->templ->nr_samples <= 1)
-                  img->aux = ILO_IMAGE_AUX_NONE;
+                  img->aux.type = ILO_IMAGE_AUX_NONE;
 
                continue;
             } else {
@@ -1014,7 +1014,7 @@ img_calculate_hiz_size(struct ilo_image *img,
    unsigned hz_width, hz_height, lv;
    unsigned hz_clear_w, hz_clear_h;
 
-   assert(img->aux == ILO_IMAGE_AUX_HIZ);
+   assert(img->aux.type == ILO_IMAGE_AUX_HIZ);
 
    assert(img->walk == ILO_IMAGE_WALK_LAYER ||
           img->walk == ILO_IMAGE_WALK_3D);
@@ -1043,6 +1043,23 @@ img_calculate_hiz_size(struct ilo_image *img,
     * memory row.
     */
    switch (hz_walk) {
+   case ILO_IMAGE_WALK_LAYER:
+      {
+         const unsigned h0 = align(params->h0, hz_align_j);
+         const unsigned h1 = align(params->h1, hz_align_j);
+         const unsigned htail =
+            ((ilo_dev_gen(params->dev) >= ILO_GEN(7)) ? 12 : 11) * hz_align_j;
+         const unsigned hz_qpitch = h0 + h1 + htail;
+
+         hz_width = align(img->lods[0].slice_width, 16);
+
+         hz_height = hz_qpitch * templ->array_size / 2;
+         if (ilo_dev_gen(params->dev) >= ILO_GEN(7))
+            hz_height = align(hz_height, 8);
+
+         img->aux.walk_layer_height = hz_qpitch;
+      }
+      break;
    case ILO_IMAGE_WALK_LOD:
       {
          unsigned lod_tx[PIPE_MAX_TEXTURE_LEVELS];
@@ -1080,30 +1097,13 @@ img_calculate_hiz_size(struct ilo_image *img,
 
          /* convert tile offsets to memory offsets */
          for (lv = 0; lv <= templ->last_level; lv++) {
-            img->aux_offsets[lv] =
+            img->aux.walk_lod_offsets[lv] =
                (lod_ty[lv] * hz_width + lod_tx[lv]) * 4096;
          }
          hz_width *= 128;
          hz_height *= 32;
       }
       break;
-   case ILO_IMAGE_WALK_LAYER:
-      {
-         const unsigned h0 = align(params->h0, hz_align_j);
-         const unsigned h1 = align(params->h1, hz_align_j);
-         const unsigned htail =
-            ((ilo_dev_gen(params->dev) >= ILO_GEN(7)) ? 12 : 11) * hz_align_j;
-         const unsigned hz_qpitch = h0 + h1 + htail;
-
-         hz_width = align(img->lods[0].slice_width, 16);
-
-         hz_height = hz_qpitch * templ->array_size / 2;
-         if (ilo_dev_gen(params->dev) >= ILO_GEN(7))
-            hz_height = align(hz_height, 8);
-
-         img->aux_layer_height = hz_qpitch;
-      }
-      break;
    case ILO_IMAGE_WALK_3D:
       hz_width = align(img->lods[0].slice_width, 16);
 
@@ -1156,16 +1156,16 @@ img_calculate_hiz_size(struct ilo_image *img,
       if (u_minify(img->width0, lv) % hz_clear_w ||
           u_minify(img->height0, lv) % hz_clear_h)
          break;
-      img->aux_enables |= 1 << lv;
+      img->aux.enables |= 1 << lv;
    }
 
    /* we padded to allow this in img_align() */
    if (templ->last_level == 0 && templ->array_size == 1 && templ->depth0 == 1)
-      img->aux_enables |= 0x1;
+      img->aux.enables |= 0x1;
 
    /* align to Y-tile */
-   img->aux_stride = align(hz_width, 128);
-   img->aux_height = align(hz_height, 32);
+   img->aux.bo_stride = align(hz_width, 128);
+   img->aux.bo_height = align(hz_height, 32);
 }
 
 static void
@@ -1176,7 +1176,7 @@ img_calculate_mcs_size(struct ilo_image *img,
    int mcs_width, mcs_height, mcs_cpp;
    int downscale_x, downscale_y;
 
-   assert(img->aux == ILO_IMAGE_AUX_MCS);
+   assert(img->aux.type == ILO_IMAGE_AUX_MCS);
 
    if (templ->nr_samples > 1) {
       /*
@@ -1289,10 +1289,10 @@ img_calculate_mcs_size(struct ilo_image *img,
       mcs_cpp = 16; /* an OWord */
    }
 
-   img->aux_enables = (1 << (templ->last_level + 1)) - 1;
+   img->aux.enables = (1 << (templ->last_level + 1)) - 1;
    /* align to Y-tile */
-   img->aux_stride = align(mcs_width * mcs_cpp, 128);
-   img->aux_height = align(mcs_height, 32);
+   img->aux.bo_stride = align(mcs_width * mcs_cpp, 128);
+   img->aux.bo_height = align(mcs_height, 32);
 }
 
 /**
@@ -1311,7 +1311,7 @@ img_init_for_transfer(struct ilo_image *img,
    assert(templ->last_level == 0);
    assert(templ->nr_samples <= 1);
 
-   img->aux = ILO_IMAGE_AUX_NONE;
+   img->aux.type = ILO_IMAGE_AUX_NONE;
    img->width0 = templ->width0;
    img->height0 = templ->height0;
    img->format = templ->format;
@@ -1376,7 +1376,7 @@ void ilo_image_init(struct ilo_image *img,
    img_align(img, &params);
    img_calculate_bo_size(img, &params);
 
-   switch (img->aux) {
+   switch (img->aux.type) {
    case ILO_IMAGE_AUX_HIZ:
       img_calculate_hiz_size(img, &params);
       break;
index 2ca48b7960f05d444ceceefbe7b26b6b0dacd091..50a7803757539ef395bbf98a7fe7b5af550e5094 100644 (file)
 #include "ilo_core.h"
 #include "ilo_dev.h"
 
-struct pipe_resource;
+enum ilo_image_aux_type {
+   ILO_IMAGE_AUX_NONE,
+   ILO_IMAGE_AUX_HIZ,
+   ILO_IMAGE_AUX_MCS,
+};
 
 enum ilo_image_walk_type {
    /*
-    * Array layers of an LOD are packed together vertically.  This maps to
-    * ARYSPC_LOD0 for non-mipmapped 2D textures, and is extended to support
-    * mipmapped stencil textures and HiZ on GEN6.
+    * LODs of each array layer are first packed together in MIPLAYOUT_BELOW.
+    * Array layers are then stacked together vertically.
+    *
+    * This can be used for mipmapped 2D textures.
     */
-   ILO_IMAGE_WALK_LOD,
+   ILO_IMAGE_WALK_LAYER,
 
    /*
-    * LODs of an array layer are packed together.  This maps to ARYSPC_FULL
-    * and is used for mipmapped 2D textures.
+    * Array layers of each LOD are first stacked together vertically and
+    * tightly.  LODs are then packed together in MIPLAYOUT_BELOW with each LOD
+    * starting at page boundaries.
+    *
+    * This is usually used for non-mipmapped 2D textures, as multiple LODs are
+    * not supported natively.
     */
-   ILO_IMAGE_WALK_LAYER,
+   ILO_IMAGE_WALK_LOD,
 
    /*
-    * 3D slices of an LOD are packed together, horizontally with wrapping.
-    * Used for 3D textures.
+    * 3D slices of each LOD are first packed together horizontally and tightly
+    * with wrapping.  LODs are then stacked together vertically and tightly.
+    *
+    * This is used for 3D textures.
     */
    ILO_IMAGE_WALK_3D,
 };
 
-enum ilo_image_aux_type {
-   ILO_IMAGE_AUX_NONE,
  ILO_IMAGE_AUX_HIZ,
-   ILO_IMAGE_AUX_MCS,
-};
-
+/*
+ * When the walk type is ILO_IMAGE_WALK_LAYER, there is only a slice in each
* LOD and this is used to describe LODs in the first array layer.  Otherwise,
+ * there can be multiple slices in each LOD and this is used to describe the
+ * first slice in each LOD.
+ */
 struct ilo_image_lod {
-   /* physical position */
+   /* physical position in pixels */
    unsigned x;
    unsigned y;
 
-   /*
-    * Physical size of an LOD slice.  There may be multiple slices when the
-    * walk type is not ILO_IMAGE_WALK_LAYER.
-    */
+   /* physical size of a slice in pixels */
    unsigned slice_width;
    unsigned slice_height;
 };
@@ -80,17 +88,15 @@ struct ilo_image_lod {
  * Texture layout.
  */
 struct ilo_image {
-   enum ilo_image_aux_type aux;
-
-   /* physical width0, height0, and format */
+   /* size and format for programming hardware states */
    unsigned width0;
    unsigned height0;
    enum pipe_format format;
    bool separate_stencil;
 
    /*
-    * width, height, and size of pixel blocks, for conversion between 2D
-    * coordinates and memory offsets
+    * width, height, and size of pixel blocks for conversion between pixel
+    * positions and memory offsets
     */
    unsigned block_width;
    unsigned block_height;
@@ -99,35 +105,45 @@ struct ilo_image {
    enum ilo_image_walk_type walk;
    bool interleaved_samples;
 
-   /* bitmask of valid tiling modes */
+   /* bitmask of valid tilings */
    unsigned valid_tilings;
    enum gen_surface_tiling tiling;
 
-   /* mipmap alignments */
+   /* physical LOD slice alignments */
    unsigned align_i;
    unsigned align_j;
 
    struct ilo_image_lod lods[PIPE_MAX_TEXTURE_LEVELS];
 
-   /* physical height of layers for ILO_IMAGE_WALK_LAYER */
-   unsigned layer_height;
+   /* physical layer height for ILO_IMAGE_WALK_LAYER */
+   unsigned walk_layer_height;
 
    /* distance in bytes between two pixel block rows */
    unsigned bo_stride;
    /* number of pixel block rows */
    unsigned bo_height;
 
-   /* bitmask of levels that can use aux */
-   unsigned aux_enables;
-   unsigned aux_offsets[PIPE_MAX_TEXTURE_LEVELS];
-   unsigned aux_layer_height;
-   unsigned aux_stride;
-   unsigned aux_height;
-
    struct intel_bo *bo;
-   struct intel_bo *aux_bo;
+
+   struct {
+      enum ilo_image_aux_type type;
+
+      /* bitmask of levels that can use aux */
+      unsigned enables;
+
+      /* LOD offsets for ILO_IMAGE_WALK_LOD */
+      unsigned walk_lod_offsets[PIPE_MAX_TEXTURE_LEVELS];
+
+      unsigned walk_layer_height;
+      unsigned bo_stride;
+      unsigned bo_height;
+
+      struct intel_bo *bo;
+   } aux;
 };
 
+struct pipe_resource;
+
 void
 ilo_image_init(struct ilo_image *img,
                const struct ilo_dev *dev,
@@ -142,7 +158,7 @@ static inline void
 ilo_image_cleanup(struct ilo_image *img)
 {
    intel_bo_unref(img->bo);
-   intel_bo_unref(img->aux_bo);
+   intel_bo_unref(img->aux.bo);
 }
 
 static inline void
@@ -155,8 +171,8 @@ ilo_image_set_bo(struct ilo_image *img, struct intel_bo *bo)
 static inline void
 ilo_image_set_aux_bo(struct ilo_image *img, struct intel_bo *bo)
 {
-   intel_bo_unref(img->aux_bo);
-   img->aux_bo = intel_bo_ref(bo);
+   intel_bo_unref(img->aux.bo);
+   img->aux.bo = intel_bo_ref(bo);
 }
 
 /**
@@ -232,12 +248,12 @@ ilo_image_get_slice_stride(const struct ilo_image *img, unsigned level)
    unsigned h;
 
    switch (img->walk) {
+   case ILO_IMAGE_WALK_LAYER:
+      h = img->walk_layer_height;
+      break;
    case ILO_IMAGE_WALK_LOD:
       h = img->lods[level].slice_height;
       break;
-   case ILO_IMAGE_WALK_LAYER:
-      h = img->layer_height;
-      break;
    case ILO_IMAGE_WALK_3D:
       if (level == 0) {
          h = img->lods[0].slice_height;
@@ -280,13 +296,13 @@ ilo_image_get_slice_pos(const struct ilo_image *img,
                         unsigned *x, unsigned *y)
 {
    switch (img->walk) {
-   case ILO_IMAGE_WALK_LOD:
+   case ILO_IMAGE_WALK_LAYER:
       *x = img->lods[level].x;
-      *y = img->lods[level].y + img->lods[level].slice_height * slice;
+      *y = img->lods[level].y + img->walk_layer_height * slice;
       break;
-   case ILO_IMAGE_WALK_LAYER:
+   case ILO_IMAGE_WALK_LOD:
       *x = img->lods[level].x;
-      *y = img->lods[level].y + img->layer_height * slice;
+      *y = img->lods[level].y + img->lods[level].slice_height * slice;
       break;
    case ILO_IMAGE_WALK_3D:
       {
index 291c86b34069457360788cb41e740e0c20b58b53..91c9bd2197da76eca245d3e50bfd2bcef36621b2 100644 (file)
@@ -1032,8 +1032,8 @@ zs_init_info(const struct ilo_dev *dev,
       info->zs.bo = tex->image.bo;
       info->zs.stride = tex->image.bo_stride;
 
-      assert(tex->image.layer_height % 4 == 0);
-      info->zs.qpitch = tex->image.layer_height / 4;
+      assert(tex->image.walk_layer_height % 4 == 0);
+      info->zs.qpitch = tex->image.walk_layer_height / 4;
 
       info->zs.tiling = tex->image.tiling;
       info->zs.offset = 0;
@@ -1056,8 +1056,8 @@ zs_init_info(const struct ilo_dev *dev,
        */
       info->stencil.stride = s8_tex->image.bo_stride * 2;
 
-      assert(s8_tex->image.layer_height % 4 == 0);
-      info->stencil.qpitch = s8_tex->image.layer_height / 4;
+      assert(s8_tex->image.walk_layer_height % 4 == 0);
+      info->stencil.qpitch = s8_tex->image.walk_layer_height / 4;
 
       info->stencil.tiling = s8_tex->image.tiling;
 
@@ -1074,17 +1074,17 @@ zs_init_info(const struct ilo_dev *dev,
    }
 
    if (ilo_texture_can_enable_hiz(tex, level, first_layer, num_layers)) {
-      info->hiz.bo = tex->image.aux_bo;
-      info->hiz.stride = tex->image.aux_stride;
+      info->hiz.bo = tex->image.aux.bo;
+      info->hiz.stride = tex->image.aux.bo_stride;
 
-      assert(tex->image.aux_layer_height % 4 == 0);
-      info->hiz.qpitch = tex->image.aux_layer_height / 4;
+      assert(tex->image.aux.walk_layer_height % 4 == 0);
+      info->hiz.qpitch = tex->image.aux.walk_layer_height / 4;
 
       info->hiz.tiling = GEN6_TILING_Y;
 
       /* offset to the level */
       if (ilo_dev_gen(dev) == ILO_GEN(6))
-         info->hiz.offset = tex->image.aux_offsets[level];
+         info->hiz.offset = tex->image.aux.walk_lod_offsets[level];
    }
 
    info->width = tex->image.width0;
index 004656f846162ba7408f97e5e87cd6c6610dde9b..5772ec084b1eca76bdf1ddede215b5d347c4afa8 100644 (file)
@@ -1117,8 +1117,8 @@ view_init_for_texture_gen7(const struct ilo_dev *dev,
       dw[0] |= GEN7_SURFACE_DW0_CUBE_FACE_ENABLES__MASK;
 
    if (ilo_dev_gen(dev) >= ILO_GEN(8)) {
-      assert(tex->image.layer_height % 4 == 0);
-      dw[1] = tex->image.layer_height / 4;
+      assert(tex->image.walk_layer_height % 4 == 0);
+      dw[1] = tex->image.walk_layer_height / 4;
    } else {
       dw[1] = 0;
    }
index ae4ae59f7ef579fab6ed5b4a98e2a38f1df7cf00..aafa37c4f2634145a23850fbe6b2553904b5d5ea 100644 (file)
@@ -248,14 +248,14 @@ tex_create_hiz(struct ilo_texture *tex)
    unsigned lv;
 
    bo = intel_winsys_alloc_bo(is->dev.winsys, "hiz texture",
-         tex->image.aux_stride * tex->image.aux_height, false);
+         tex->image.aux.bo_stride * tex->image.aux.bo_height, false);
    if (!bo)
       return false;
 
    ilo_image_set_aux_bo(&tex->image, bo);
 
    for (lv = 0; lv <= templ->last_level; lv++) {
-      if (tex->image.aux_enables & (1 << lv)) {
+      if (tex->image.aux.enables & (1 << lv)) {
          const unsigned num_slices = (templ->target == PIPE_TEXTURE_3D) ?
             u_minify(templ->depth0, lv) : templ->array_size;
          unsigned flags = ILO_TEXTURE_HIZ;
@@ -277,10 +277,10 @@ tex_create_mcs(struct ilo_texture *tex)
    struct ilo_screen *is = ilo_screen(tex->base.screen);
    struct intel_bo *bo;
 
-   assert(tex->image.aux_enables == (1 << (tex->base.last_level + 1)) - 1);
+   assert(tex->image.aux.enables == (1 << (tex->base.last_level + 1)) - 1);
 
    bo = intel_winsys_alloc_bo(is->dev.winsys, "mcs texture",
-         tex->image.aux_stride * tex->image.aux_height, false);
+         tex->image.aux.bo_stride * tex->image.aux.bo_height, false);
    if (!bo)
       return false;
 
@@ -319,7 +319,7 @@ tex_alloc_bos(struct ilo_texture *tex,
    if (tex->image.separate_stencil && !tex_create_separate_stencil(tex))
       return false;
 
-   switch (tex->image.aux) {
+   switch (tex->image.aux.type) {
    case ILO_IMAGE_AUX_HIZ:
       if (!tex_create_hiz(tex)) {
          /* Separate Stencil Buffer requires HiZ to be enabled */
index f78f9495233a251b5d440636577942fe0799737a..0a835d99210ee02d2fba2d0e07a8259d6c6285b9 100644 (file)
@@ -200,7 +200,7 @@ ilo_texture_can_enable_hiz(const struct ilo_texture *tex, unsigned level,
    const struct ilo_texture_slice *slice =
       ilo_texture_get_slice(tex, level, 0);
 
-   return (tex->image.aux_bo && (slice->flags & ILO_TEXTURE_HIZ));
+   return (tex->image.aux.bo && (slice->flags & ILO_TEXTURE_HIZ));
 }
 
 #endif /* ILO_RESOURCE_H */