diff options
Diffstat (limited to 'src/mesa/drivers/dri/intel/intel_mipmap_tree.c')
-rw-r--r-- | src/mesa/drivers/dri/intel/intel_mipmap_tree.c | 71 |
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, |