From 63a7a9d115ce5f961d536838e289f585676b771a Mon Sep 17 00:00:00 2001 From: Anuj Phogat Date: Thu, 11 Feb 2016 10:08:49 -0800 Subject: [PATCH] mesa: Account for block depth in _mesa_format_image_size() Signed-off-by: Anuj Phogat Reviewed-by: Brian Paul --- src/mesa/main/formats.c | 44 +++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c index 999e627c752..9d9830f8bf4 100644 --- a/src/mesa/main/formats.c +++ b/src/mesa/main/formats.c @@ -861,20 +861,22 @@ _mesa_format_image_size(mesa_format format, GLsizei width, GLsizei height, GLsizei depth) { const struct gl_format_info *info = _mesa_get_format_info(format); + GLuint sz; /* Strictly speaking, a conditional isn't needed here */ - if (info->BlockWidth > 1 || info->BlockHeight > 1) { + if (info->BlockWidth > 1 || info->BlockHeight > 1 || info->BlockDepth > 1) { /* compressed format (2D only for now) */ - const GLuint bw = info->BlockWidth, bh = info->BlockHeight; + const GLuint bw = info->BlockWidth; + const GLuint bh = info->BlockHeight; + const GLuint bd = info->BlockDepth; const GLuint wblocks = (width + bw - 1) / bw; const GLuint hblocks = (height + bh - 1) / bh; - const GLuint sz = wblocks * hblocks * info->BytesPerBlock; - return sz * depth; - } - else { + const GLuint dblocks = (depth + bd - 1) / bd; + sz = wblocks * hblocks * dblocks * info->BytesPerBlock; + } else /* non-compressed */ - const GLuint sz = width * height * depth * info->BytesPerBlock; - return sz; - } + sz = width * height * depth * info->BytesPerBlock; + + return sz; } @@ -887,23 +889,23 @@ _mesa_format_image_size64(mesa_format format, GLsizei width, GLsizei height, GLsizei depth) { const struct gl_format_info *info = _mesa_get_format_info(format); + uint64_t sz; /* Strictly speaking, a conditional isn't needed here */ - if (info->BlockWidth > 1 || info->BlockHeight > 1) { + if (info->BlockWidth > 1 || info->BlockHeight > 1 || info->BlockDepth > 1) { /* compressed format (2D only for now) */ - const uint64_t bw = info->BlockWidth, bh = info->BlockHeight; + const uint64_t bw = info->BlockWidth; + const uint64_t bh = info->BlockHeight; + const uint64_t bd = info->BlockDepth; const uint64_t wblocks = (width + bw - 1) / bw; const uint64_t hblocks = (height + bh - 1) / bh; - const uint64_t sz = wblocks * hblocks * info->BytesPerBlock; - return sz * depth; - } - else { + const uint64_t dblocks = (depth + bd - 1) / bd; + sz = wblocks * hblocks * dblocks * info->BytesPerBlock; + } else /* non-compressed */ - const uint64_t sz = ((uint64_t) width * - (uint64_t) height * - (uint64_t) depth * - info->BytesPerBlock); - return sz; - } + sz = ((uint64_t) width * (uint64_t) height * + (uint64_t) depth * info->BytesPerBlock); + + return sz; } -- 2.30.2