diff options
Diffstat (limited to 'src/mesa')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_tex_layout.c | 66 |
1 files changed, 37 insertions, 29 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_tex_layout.c b/src/mesa/drivers/dri/i965/brw_tex_layout.c index 83690ef9b7b..e030ffcd21f 100644 --- a/src/mesa/drivers/dri/i965/brw_tex_layout.c +++ b/src/mesa/drivers/dri/i965/brw_tex_layout.c @@ -39,6 +39,35 @@ #define FILE_DEBUG_FLAG DEBUG_MIPTREE +static void +brw_miptree_layout_texture_array(struct intel_context *intel, + struct intel_mipmap_tree *mt, + int slices) +{ + GLuint align_w; + GLuint align_h; + GLuint level; + GLuint qpitch = 0; + int h0, h1, q; + + intel_get_texture_alignment_unit(mt->format, &align_w, &align_h); + + h0 = ALIGN(mt->height0, align_h); + h1 = ALIGN(minify(mt->height0), align_h); + qpitch = (h0 + h1 + (intel->gen >= 7 ? 12 : 11) * align_h); + if (mt->compressed) + qpitch /= 4; + + i945_miptree_layout_2d(mt, slices); + + for (level = mt->first_level; level <= mt->last_level; level++) { + for (q = 0; q < slices; q++) { + intel_miptree_set_image_offset(mt, level, q, 0, q * qpitch); + } + } + mt->total_height = qpitch * slices; +} + void brw_miptree_layout(struct intel_context *intel, struct intel_mipmap_tree *mt) { @@ -48,36 +77,15 @@ brw_miptree_layout(struct intel_context *intel, struct intel_mipmap_tree *mt) switch (mt->target) { case GL_TEXTURE_CUBE_MAP: if (intel->gen >= 5) { - GLuint align_w; - GLuint align_h; - GLuint level; - GLuint qpitch = 0; - int h0, h1, q; - - intel_get_texture_alignment_unit(mt->format, &align_w, &align_h); - - /* On Ironlake, cube maps are finally represented as just a series - * of MIPLAYOUT_BELOW 2D textures (like 2D texture arrays), separated - * by a pitch of qpitch rows, where qpitch is defined by the equation - * given in Volume 1 of the BSpec. - */ - h0 = ALIGN(mt->height0, align_h); - h1 = ALIGN(minify(mt->height0), align_h); - qpitch = (h0 + h1 + (intel->gen >= 7 ? 12 : 11) * align_h); - if (mt->compressed) - qpitch /= 4; - - i945_miptree_layout_2d(mt, 6); - - for (level = mt->first_level; level <= mt->last_level; level++) { - for (q = 0; q < 6; q++) { - intel_miptree_set_image_offset(mt, level, q, 0, q * qpitch); - } - } - mt->total_height = qpitch * 6; - - break; + /* On Ironlake, cube maps are finally represented as just a series of + * MIPLAYOUT_BELOW 2D textures (like 2D texture arrays), separated by a + * pitch of qpitch rows, where qpitch is defined by the equation given + * in Volume 1 of the BSpec. + */ + brw_miptree_layout_texture_array(intel, mt, 6); + break; } + /* FALLTHROUGH */ case GL_TEXTURE_3D: { GLuint width = mt->width0; |