mesa: added _mesa_format_image_size64()
authorBrian Paul <brianp@vmware.com>
Wed, 24 Nov 2010 19:00:16 +0000 (12:00 -0700)
committerBrian Paul <brianp@vmware.com>
Wed, 24 Nov 2010 19:11:23 +0000 (12:11 -0700)
src/mesa/main/formats.c
src/mesa/main/formats.h

index f689d99df8ee090273dd2c1887430282c3ee505e..cd9eb81852fbae6526e6cf7cf115dd5357c8e75f 100644 (file)
@@ -1073,6 +1073,36 @@ _mesa_format_image_size(gl_format format, GLsizei width,
 }
 
 
+/**
+ * Same as _mesa_format_image_size() but returns a 64-bit value to
+ * accomodate very large textures.
+ */
+uint64_t
+_mesa_format_image_size64(gl_format format, GLsizei width,
+                          GLsizei height, GLsizei depth)
+{
+   const struct gl_format_info *info = _mesa_get_format_info(format);
+   /* Strictly speaking, a conditional isn't needed here */
+   if (info->BlockWidth > 1 || info->BlockHeight > 1) {
+      /* compressed format (2D only for now) */
+      const uint64_t bw = info->BlockWidth, bh = info->BlockHeight;
+      const uint64_t wblocks = (width + bw - 1) / bw;
+      const uint64_t hblocks = (height + bh - 1) / bh;
+      const uint64_t sz = wblocks * hblocks * info->BytesPerBlock;
+      assert(depth == 1);
+      return sz;
+   }
+   else {
+      /* non-compressed */
+      const uint64_t sz = ((uint64_t) width *
+                           (uint64_t) height *
+                           (uint64_t) depth *
+                           info->BytesPerBlock);
+      return sz;
+   }
+}
+
+
 
 GLint
 _mesa_format_row_stride(gl_format format, GLsizei width)
index eeb460dabe70fbc8fa4c172fdb26d744f215396a..997229bf9f4e271b12ff78f13a3d630b64843c78 100644 (file)
@@ -209,6 +209,10 @@ extern GLuint
 _mesa_format_image_size(gl_format format, GLsizei width,
                         GLsizei height, GLsizei depth);
 
+extern uint64_t
+_mesa_format_image_size64(gl_format format, GLsizei width,
+                          GLsizei height, GLsizei depth);
+
 extern GLint
 _mesa_format_row_stride(gl_format format, GLsizei width);