intel: Add field intel_mipmap_slice::has_hiz
authorChad Versace <chad.versace@linux.intel.com>
Thu, 21 Feb 2013 03:18:40 +0000 (19:18 -0800)
committerChad Versace <chad.versace@linux.intel.com>
Wed, 10 Apr 2013 17:55:10 +0000 (10:55 -0700)
On Haswell, HiZ will selectively be enabled on individual miptree slices
to workaround a hardware bug. The new field 'has_hiz' indicates if HiZ is
enabled for a given slice.

Also add two new accessor functions for this field.
  intel_miptree_slice_has_hiz
  intel_renderbuffer_has_hiz

The new field and accessor functions are not yet used. Also, this patch
introduces no behavioral change because, in this patch,
intel_miptree_alloc_hiz() sets has_hiz for all slices.

Reviewed-by: Eric Anholt <eric@anholt.net>
Signed-off-by: Chad Versace <chad.versace@linux.intel.com>
src/mesa/drivers/dri/intel/intel_fbo.c
src/mesa/drivers/dri/intel/intel_fbo.h
src/mesa/drivers/dri/intel/intel_mipmap_tree.c
src/mesa/drivers/dri/intel/intel_mipmap_tree.h

index 29775687cc9890cfc47530a151c24a193bc79d2f..23cd97c00b3287e30a38eae883ce2fb4164fe51d 100644 (file)
@@ -943,6 +943,15 @@ intel_renderbuffer_set_needs_downsample(struct intel_renderbuffer *irb)
       irb->mt->need_downsample = true;
 }
 
+/**
+ * Does the renderbuffer have hiz enabled?
+ */
+bool
+intel_renderbuffer_has_hiz(struct intel_renderbuffer *irb)
+{
+   return intel_miptree_slice_has_hiz(irb->mt, irb->mt_level, irb->mt_layer);
+}
+
 void
 intel_renderbuffer_set_needs_hiz_resolve(struct intel_renderbuffer *irb)
 {
index 9313c3506ebe9c8ad766eeea20ccacd63bd5786f..19edbe7b0b01cad4079f856cb6021ba071b3f720 100644 (file)
@@ -166,6 +166,9 @@ intel_get_rb_region(struct gl_framebuffer *fb, GLuint attIndex);
 void
 intel_renderbuffer_set_needs_downsample(struct intel_renderbuffer *irb);
 
+bool
+intel_renderbuffer_has_hiz(struct intel_renderbuffer *irb);
+
 void
 intel_renderbuffer_set_needs_hiz_resolve(struct intel_renderbuffer *irb);
 
index 19c9088791a6cd0b07f980d0fadef1a5ba394d8c..9c0a865c3cbebe28114dae892b8fc8bd307f83fd 100644 (file)
@@ -1010,6 +1010,8 @@ intel_miptree_alloc_hiz(struct intel_context *intel,
    struct intel_resolve_map *head = &mt->hiz_map;
    for (int level = mt->first_level; level <= mt->last_level; ++level) {
       for (int layer = 0; layer < mt->level[level].depth; ++layer) {
+         mt->level[level].slice[layer].has_hiz = true;
+
         head->next = malloc(sizeof(*head->next));
         head->next->prev = head;
         head->next->next = NULL;
@@ -1024,6 +1026,18 @@ intel_miptree_alloc_hiz(struct intel_context *intel,
    return true;
 }
 
+/**
+ * Does the miptree slice have hiz enabled?
+ */
+bool
+intel_miptree_slice_has_hiz(struct intel_mipmap_tree *mt,
+                            uint32_t level,
+                            uint32_t layer)
+{
+   intel_miptree_check_level_layer(mt, level, layer);
+   return mt->level[level].slice[layer].has_hiz;
+}
+
 void
 intel_miptree_slice_set_needs_hiz_resolve(struct intel_mipmap_tree *mt,
                                          uint32_t level,
index 3bdda07edceae4b873c0f97462d60a89215b93eb..29cd09d91940697c2d67f52ea64aef5599e9c28f 100644 (file)
@@ -152,6 +152,15 @@ struct intel_mipmap_level
        * intel_miptree_map/unmap on this slice.
        */
       struct intel_miptree_map *map;
+
+      /**
+       * \brief Is HiZ enabled for this slice?
+       *
+       * If \c mt->level[l].slice[s].has_hiz is set, then (1) \c mt->hiz_mt
+       * has been allocated and (2) the HiZ memory corresponding to this slice
+       * resides at \c mt->hiz_mt->level[l].slice[s].
+       */
+      bool has_hiz;
    } *slice;
 };
 
@@ -333,9 +342,11 @@ struct intel_mipmap_tree
    /**
     * \brief HiZ miptree
     *
-    * This is non-null only if HiZ is enabled for this miptree.
+    * The hiz miptree contains the miptree's hiz buffer. To allocate the hiz
+    * miptree, use intel_miptree_alloc_hiz().
     *
-    * \see intel_miptree_alloc_hiz()
+    * To determine if hiz is enabled, do not check this pointer. Instead, use
+    * intel_miptree_slice_has_hiz().
     */
    struct intel_mipmap_tree *hiz_mt;
 
@@ -532,6 +543,11 @@ intel_miptree_alloc_hiz(struct intel_context *intel,
                        struct intel_mipmap_tree *mt,
                         GLuint num_samples);
 
+bool
+intel_miptree_slice_has_hiz(struct intel_mipmap_tree *mt,
+                            uint32_t level,
+                            uint32_t layer);
+
 void
 intel_miptree_slice_set_needs_hiz_resolve(struct intel_mipmap_tree *mt,
                                           uint32_t level,