summaryrefslogtreecommitdiff
path: root/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa/drivers/dri/intel/intel_mipmap_tree.c')
-rw-r--r--src/mesa/drivers/dri/intel/intel_mipmap_tree.c71
1 files changed, 67 insertions, 4 deletions
diff --git a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
index 7018c3732b..fd7c9414af 100644
--- a/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
+++ b/src/mesa/drivers/dri/intel/intel_mipmap_tree.c
@@ -242,18 +242,24 @@ intel_miptree_create(struct intel_context *intel,
return mt;
}
-
+/**
+ * Create miptree for region based on offset and size
+ */
struct intel_mipmap_tree *
-intel_miptree_create_for_region(struct intel_context *intel,
+intel_miptree_create_for_offset(struct intel_context *intel,
GLenum target,
gl_format format,
- struct intel_region *region)
+ struct intel_region *region,
+ GLuint width,
+ GLuint height,
+ GLuint offset_x,
+ GLuint offset_y)
{
struct intel_mipmap_tree *mt;
mt = intel_miptree_create_internal(intel, target, format,
0, 0,
- region->width, region->height, 1,
+ width, height, 1,
true, 0 /* num_samples */,
false /* msaa_is_interleaved */);
if (!mt)
@@ -261,10 +267,34 @@ intel_miptree_create_for_region(struct intel_context *intel,
intel_region_reference(&mt->region, region);
+ /* Fixup tree to include correct offsets */
+ mt->total_width = mt->region->width;
+ mt->total_height = mt->region->height;
+ mt->level[0].level_x = offset_x;
+ mt->level[0].level_y = offset_y;
+ mt->level[0].slice[0].x_offset = offset_x;
+ mt->level[0].slice[0].y_offset = offset_y;
+
return mt;
}
/**
+ * Convince for common case where we use whole region.
+ *
+ * See also \c intel_miptree_create_for_region_offset
+ */
+struct intel_mipmap_tree *
+intel_miptree_create_for_region(struct intel_context *intel,
+ GLenum target,
+ gl_format format,
+ struct intel_region *region)
+{
+ return intel_miptree_create_for_offset(intel, target, format, region,
+ 0, 0,
+ 0, 0);
+}
+
+/**
* Determine whether the MSAA surface being created should use an interleaved
* layout or a sliced layout, based on the chip generation and the surface
* type.
@@ -428,6 +458,23 @@ intel_miptree_get_dimensions_for_image(struct gl_texture_image *image,
}
}
+uint32_t
+intel_miptree_tile_offsets(struct intel_mipmap_tree *mt,
+ uint32_t *tile_x,
+ uint32_t *tile_y)
+{
+ struct intel_region *region = mt->region;
+ uint32_t mask_x, mask_y;
+
+ intel_region_get_tile_masks(region, &mask_x, &mask_y);
+
+ *tile_x = mt->level[0].level_x & mask_x;
+ *tile_y = mt->level[0].level_y & mask_y;
+ return intel_region_get_aligned_offset(region,
+ mt->level[0].level_x & ~mask_x,
+ mt->level[0].level_y & ~mask_y);
+}
+
/**
* Can the image be pulled into a unified mipmap tree? This mirrors
* the completeness test in a lot of ways.
@@ -629,6 +676,22 @@ intel_miptree_copy_teximage(struct intel_context *intel,
intel_miptree_reference(&intelImage->mt, dst_mt);
}
+/**
+ * Copies all image data in from src miptree to dst miptree.
+ */
+void
+intel_miptree_copy(struct intel_context *intel,
+ struct intel_mipmap_tree *dst_mt,
+ struct intel_mipmap_tree *src_mt)
+{
+ for (GLuint level = src_mt->first_level; level < src_mt->last_level; level++) {
+ GLuint depth = src_mt->level[level].depth;
+ for (GLuint slice = 0; slice < depth; slice++) {
+ intel_miptree_copy_slice(intel, dst_mt, src_mt, level, 0, slice);
+ }
+ }
+}
+
bool
intel_miptree_alloc_hiz(struct intel_context *intel,
struct intel_mipmap_tree *mt,