Quoting Scott D Phillips (2018-01-10 07:16:59) > +/* Compute extent parameters for use with tiled_memcpy functions. > + * xs are in units of bytes and ys are in units of strides. */ > +static inline void > +tile_extents(struct intel_mipmap_tree *mt, struct intel_miptree_map *map, > + unsigned int level, unsigned int slice, unsigned int *x1, > + unsigned int *x2, unsigned int *y1, unsigned int *y2) > +{ > + unsigned int block_width, block_height, block_bytes; > + unsigned int x0_el, y0_el; > + > + _mesa_get_format_block_size(mt->format, &block_width, &block_height); > + block_bytes = _mesa_get_format_bytes(mt->format); > + > + assert(map->x % block_width == 0); > + assert(map->y % block_height == 0); > + > + intel_miptree_get_image_offset(mt, level, slice, &x0_el, &y0_el); > + *x1 = (map->x / block_width + x0_el) * block_bytes; > + *y1 = map->y / block_height + y0_el; > + *x2 = *x1 + DIV_ROUND_UP(map->w, block_width) * block_bytes; > + *y2 = *y1 + DIV_ROUND_UP(map->h, block_height); *x2 = (DIV_ROUND_UP(map->x + map->w, block_width) + x0_el) * block_bytes; *y2 = DIV_ROUND_UP(map->y + map->h, block_height) + y0_el;
Otherwise you may underestimate the aligned block extents. Consider the case where map->w == block_width, but map->x is misaligned. x1 is then truncated to the start of the block, and x2 is moved to the end of that block, but to the left of map->x + map->w. -Chris _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/mesa-dev