[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