[Mesa-dev] [PATCH 1/7] i965: Pull 3D texture layout code out into a helper function.
Ian Romanick
idr at freedesktop.org
Tue Jul 2 14:56:37 PDT 2013
The series is
Reviewed-by: Ian Romanick <ian.d.romanick at intel.com>
On 07/02/2013 11:49 AM, Kenneth Graunke wrote:
> A bit cleaner than having it in one giant function.
>
> Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
> ---
> src/mesa/drivers/dri/i965/brw_tex_layout.c | 159 +++++++++++++++--------------
> 1 file changed, 82 insertions(+), 77 deletions(-)
>
> diff --git a/src/mesa/drivers/dri/i965/brw_tex_layout.c b/src/mesa/drivers/dri/i965/brw_tex_layout.c
> index f0736fa..fc929f8 100644
> --- a/src/mesa/drivers/dri/i965/brw_tex_layout.c
> +++ b/src/mesa/drivers/dri/i965/brw_tex_layout.c
> @@ -66,6 +66,86 @@ brw_miptree_layout_texture_array(struct intel_context *intel,
> mt->total_height = qpitch * mt->physical_depth0;
> }
>
> +static void
> +brw_miptree_layout_texture_3d(struct intel_context *intel,
> + struct intel_mipmap_tree *mt)
> +{
> + GLuint width = mt->physical_width0;
> + GLuint height = mt->physical_height0;
> + GLuint depth = mt->physical_depth0;
> + GLuint pack_x_pitch, pack_x_nr;
> + GLuint pack_y_pitch;
> + GLuint level;
> +
> + mt->total_height = 0;
> +
> + if (mt->compressed) {
> + mt->total_width = ALIGN(width, mt->align_w);
> + pack_y_pitch = (height + 3) / 4;
> + } else {
> + mt->total_width = mt->physical_width0;
> + pack_y_pitch = ALIGN(mt->physical_height0, mt->align_h);
> + }
> +
> + pack_x_pitch = width;
> + pack_x_nr = 1;
> +
> + for (level = mt->first_level ; level <= mt->last_level ; level++) {
> + GLint x = 0;
> + GLint y = 0;
> + GLint q, j;
> +
> + intel_miptree_set_level_info(mt, level,
> + 0, mt->total_height,
> + width, height, depth);
> +
> + for (q = 0; q < depth; /* empty */) {
> + for (j = 0; j < pack_x_nr && q < depth; j++, q++) {
> + intel_miptree_set_image_offset(mt, level, q, x, y);
> + x += pack_x_pitch;
> + }
> + if (x > mt->total_width)
> + mt->total_width = x;
> +
> + x = 0;
> + y += pack_y_pitch;
> + }
> +
> + mt->total_height += y;
> + width = minify(width, 1);
> + height = minify(height, 1);
> + if (mt->target == GL_TEXTURE_3D)
> + depth = minify(depth, 1);
> +
> + if (mt->compressed) {
> + pack_y_pitch = (height + 3) / 4;
> +
> + if (pack_x_pitch > ALIGN(width, mt->align_w)) {
> + pack_x_pitch = ALIGN(width, mt->align_w);
> + pack_x_nr <<= 1;
> + }
> + } else {
> + pack_x_nr <<= 1;
> + if (pack_x_pitch > 4) {
> + pack_x_pitch >>= 1;
> + }
> +
> + if (pack_y_pitch > 2) {
> + pack_y_pitch >>= 1;
> + pack_y_pitch = ALIGN(pack_y_pitch, mt->align_h);
> + }
> + }
> + }
> +
> + /* The 965's sampler lays cachelines out according to how accesses
> + * in the texture surfaces run, so they may be "vertical" through
> + * memory. As a result, the docs say in Surface Padding Requirements:
> + * Sampling Engine Surfaces that two extra rows of padding are required.
> + */
> + if (mt->target == GL_TEXTURE_CUBE_MAP)
> + mt->total_height += 2;
> +}
> +
> void
> brw_miptree_layout(struct intel_context *intel, struct intel_mipmap_tree *mt)
> {
> @@ -87,84 +167,9 @@ brw_miptree_layout(struct intel_context *intel, struct intel_mipmap_tree *mt)
> assert(mt->physical_depth0 == 6);
> /* FALLTHROUGH */
>
> - case GL_TEXTURE_3D: {
> - GLuint width = mt->physical_width0;
> - GLuint height = mt->physical_height0;
> - GLuint depth = mt->physical_depth0;
> - GLuint pack_x_pitch, pack_x_nr;
> - GLuint pack_y_pitch;
> - GLuint level;
> -
> - mt->total_height = 0;
> -
> - if (mt->compressed) {
> - mt->total_width = ALIGN(width, mt->align_w);
> - pack_y_pitch = (height + 3) / 4;
> - } else {
> - mt->total_width = mt->physical_width0;
> - pack_y_pitch = ALIGN(mt->physical_height0, mt->align_h);
> - }
> -
> - pack_x_pitch = width;
> - pack_x_nr = 1;
> -
> - for (level = mt->first_level ; level <= mt->last_level ; level++) {
> - GLint x = 0;
> - GLint y = 0;
> - GLint q, j;
> -
> - intel_miptree_set_level_info(mt, level,
> - 0, mt->total_height,
> - width, height, depth);
> -
> - for (q = 0; q < depth; /* empty */) {
> - for (j = 0; j < pack_x_nr && q < depth; j++, q++) {
> - intel_miptree_set_image_offset(mt, level, q, x, y);
> - x += pack_x_pitch;
> - }
> - if (x > mt->total_width)
> - mt->total_width = x;
> -
> - x = 0;
> - y += pack_y_pitch;
> - }
> -
> -
> - mt->total_height += y;
> - width = minify(width, 1);
> - height = minify(height, 1);
> - if (mt->target == GL_TEXTURE_3D)
> - depth = minify(depth, 1);
> -
> - if (mt->compressed) {
> - pack_y_pitch = (height + 3) / 4;
> -
> - if (pack_x_pitch > ALIGN(width, mt->align_w)) {
> - pack_x_pitch = ALIGN(width, mt->align_w);
> - pack_x_nr <<= 1;
> - }
> - } else {
> - pack_x_nr <<= 1;
> - if (pack_x_pitch > 4) {
> - pack_x_pitch >>= 1;
> - }
> -
> - if (pack_y_pitch > 2) {
> - pack_y_pitch >>= 1;
> - pack_y_pitch = ALIGN(pack_y_pitch, mt->align_h);
> - }
> - }
> -
> - }
> - /* The 965's sampler lays cachelines out according to how accesses
> - * in the texture surfaces run, so they may be "vertical" through
> - * memory. As a result, the docs say in Surface Padding Requirements:
> - * Sampling Engine Surfaces that two extra rows of padding are required.
> - */
> - if (mt->target == GL_TEXTURE_CUBE_MAP)
> - mt->total_height += 2;
> + case GL_TEXTURE_3D:
> + brw_miptree_layout_texture_3d(intel, mt);
> break;
> - }
>
> case GL_TEXTURE_2D_ARRAY:
> case GL_TEXTURE_1D_ARRAY:
>
More information about the mesa-dev
mailing list