1a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul/*
2a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * Copyright 2013 VMware, Inc.
3a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * All Rights Reserved.
4a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul *
5a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
6a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * copy of this software and associated documentation files (the
7a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * "Software"), to deal in the Software without restriction, including
8a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * without limitation the rights to use, copy, modify, merge, publish,
9a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * distribute, sub license, and/or sell copies of the Software, and to
10a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * permit persons to whom the Software is furnished to do so, subject to
11a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * the following conditions:
12a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul *
13a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * The above copyright notice and this permission notice (including the
14a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * next paragraph) shall be included in all copies or substantial portions
15a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * of the Software.
16a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul *
17a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
20a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * IN NO EVENT SHALL THE AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR
21a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
22a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
23a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul */
25287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell
26a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul
27a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul#include "pipe/p_defines.h"
28a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul#include "pipe/p_state.h"
29a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul#include "util/u_format.h"
30a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul#include "util/u_math.h"
31a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul#include "util/u_resource.h"
32a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul
33a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul
34a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul/**
35a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul * Return the size of the resource in bytes.
36a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul */
37a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paulunsigned
38a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paulutil_resource_size(const struct pipe_resource *res)
39a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul{
40a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul   unsigned width = res->width0;
41a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul   unsigned height = res->height0;
42a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul   unsigned depth = res->depth0;
43a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul   unsigned size = 0;
44a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul   unsigned level;
45a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul
46a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul   for (level = 0; level <= res->last_level; level++) {
47a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul      unsigned slices;
48a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul
49a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul      if (res->target == PIPE_TEXTURE_CUBE)
50a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul         slices = 6;
51a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul      else if (res->target == PIPE_TEXTURE_3D)
52a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul         slices = depth;
53a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul      else
54a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul         slices = res->array_size;
55a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul
56a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul      size += (util_format_get_nblocksy(res->format, height) *
57a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul               util_format_get_stride(res->format, width) * slices);
58a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul
59a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul      width  = u_minify(width, 1);
60a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul      height = u_minify(height, 1);
61a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul      depth = u_minify(depth, 1);
62a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul   }
63a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul
64a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul   return size;
65a69efa9482d7d4dee476a50b3788544ba9b14a50Brian Paul}
66