[Mesa-dev] [PATCH 4/4] mesa: handle numLevels, numSamples in _mesa_test_proxy_teximage()
Anuj Phogat
anuj.phogat at gmail.com
Fri Jul 15 19:19:37 UTC 2016
On Fri, Jul 15, 2016 at 10:14 AM, Brian Paul <brianp at vmware.com> wrote:
> If numSamples > 0, we can compute the size of the whole mipmapped texture.
> That's the case for glTexStorage(GL_PROXY_TEXTURE_x).
>
> Also, multiply the texture size by numSamples for MSAA textures.
> ---
> src/mesa/main/teximage.c | 48 +++++++++++++++++++++++++++++++++++++++++++++---
> 1 file changed, 45 insertions(+), 3 deletions(-)
>
> diff --git a/src/mesa/main/teximage.c b/src/mesa/main/teximage.c
> index c75f605..0f13d61 100644
> --- a/src/mesa/main/teximage.c
> +++ b/src/mesa/main/teximage.c
> @@ -40,6 +40,7 @@
> #include "image.h"
> #include "imports.h"
> #include "macros.h"
> +#include "mipmap.h"
> #include "multisample.h"
> #include "pixelstore.h"
> #include "state.h"
> @@ -1268,12 +1269,53 @@ _mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target,
> mesa_format format, GLuint numSamples,
> GLint width, GLint height, GLint depth)
> {
> + uint64_t bytes, mbytes;
> +
> + assert(numSamples > 0);
> +
> + if (numLevels > 0) {
> + /* Compute total memory for a whole mipmap. This is the path
> + * taken for glTexStorage(GL_PROXY_TEXTURE_x).
> + */
> + unsigned l;
> +
> + assert(level == 0);
> +
> + bytes = 0;
> +
> + for (l = 0; l < numLevels; l++) {
> + GLint nextWidth, nextHeight, nextDepth;
> +
> + /* XXX this doesn't yet account for multisampling */
> + bytes += _mesa_format_image_size64(format, width, height, depth);
> +
> + if (_mesa_next_mipmap_level_size(target, 0, width, height, depth,
> + &nextWidth, &nextHeight,
> + &nextDepth)) {
> + width = nextWidth;
> + height = nextHeight;
> + depth = nextDepth;
> + }
> + else {
> + break;
> + }
> + }
> + }
> + else {
nitpick. Use } else {
> + /* We just compute the size of one mipmap level. This is the path
> + * taken for glTexImage(GL_PROXY_TEXTURE_x).
> + */
> + bytes = _mesa_format_image_size64(format, width, height, depth);
Don't we need to multiply bytes by _mesa_num_tex_faces() here too?
> + }
> +
> + bytes *= _mesa_num_tex_faces(target);
> + bytes *= numSamples;
> +
> + mbytes = bytes / (1024 * 1024); /* convert to MB */
> +
> /* We just check if the image size is less than MaxTextureMbytes.
> * Some drivers may do more specific checks.
> */
> - uint64_t bytes = _mesa_format_image_size64(format, width, height, depth);
> - uint64_t mbytes = bytes / (1024 * 1024); /* convert to MB */
> - mbytes *= _mesa_num_tex_faces(target);
> return mbytes <= (uint64_t) ctx->Const.MaxTextureMbytes;
> }
>
> --
> 1.9.1
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/mesa-dev
More information about the mesa-dev
mailing list