summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mesa/main/formats.c27
-rw-r--r--src/mesa/main/formats.h4
2 files changed, 31 insertions, 0 deletions
diff --git a/src/mesa/main/formats.c b/src/mesa/main/formats.c
index dec3daee7c..82843a3291 100644
--- a/src/mesa/main/formats.c
+++ b/src/mesa/main/formats.c
@@ -594,6 +594,33 @@ _mesa_is_format_compressed(gl_format format)
/**
+ * Return number of bytes needed to store an image of the given size
+ * in the given format.
+ */
+GLuint
+_mesa_format_image_size(gl_format format, GLsizei width,
+ GLsizei height, GLsizei depth)
+{
+ const struct gl_format_info *info = _mesa_get_format_info(format);
+ if (info->BlockWidth > 1 || info->BlockHeight > 1) {
+ /* compressed format */
+ const GLuint bw = info->BlockWidth, bh = info->BlockHeight;
+ const GLuint wblocks = (width + bw - 1) / bw;
+ const GLuint hblocks = (height + bh - 1) / bh;
+ const GLuint sz = wblocks * hblocks * info->BytesPerBlock;
+ return sz;
+ }
+ else {
+ /* non-compressed */
+ const GLuint sz = width * height * depth * info->BytesPerBlock;
+ return sz;
+ }
+}
+
+
+
+
+/**
* Do sanity checking of the format info table.
*/
void
diff --git a/src/mesa/main/formats.h b/src/mesa/main/formats.h
index 99a6534ff1..b91682809f 100644
--- a/src/mesa/main/formats.h
+++ b/src/mesa/main/formats.h
@@ -202,6 +202,10 @@ extern void
_mesa_format_to_type_and_comps2(gl_format format,
GLenum *datatype, GLuint *comps);
+extern GLuint
+_mesa_format_image_size(gl_format format, GLsizei width,
+ GLsizei height, GLsizei depth);
+
extern void
_mesa_test_formats(void);