1b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**************************************************************************
2b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
3b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas.
4b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * All Rights Reserved.
5b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
6b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * copy of this software and associated documentation files (the
8b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * "Software"), to deal in the Software without restriction, including
9b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * permit persons to whom the Software is furnished to do so, subject to
12b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * the following conditions:
13b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
14b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * The above copyright notice and this permission notice (including the
15b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * next paragraph) shall be included in all copies or substantial portions
16b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * of the Software.
17b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
18b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
26b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca **************************************************************************/
27b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
28b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**
29b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * \file
30b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Buffer manager using the old texture memory manager.
31b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
32e06474dbae6979177629fb6187331291ff230c65José Fonseca * \author Jose Fonseca <jrfonseca@tungstengraphics.com>
33b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */
34b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
35b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
36687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_defines.h"
37ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h"
382aaca1df9df6980ec88180c8866c8987b31db91aJosé Fonseca#include "os/os_thread.h"
394f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
40b9da3791c934e05b82063a8c79c423a0a8e29a94José Fonseca#include "util/u_double_list.h"
4117158c2f00f5bee29ec8239367fd5498f22e4a91José Fonseca#include "util/u_mm.h"
42b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_buffer.h"
43b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_bufmgr.h"
44b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
45b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
46b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**
47b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Convenience macro (type safe).
48b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */
49b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#define SUPER(__derived) (&(__derived)->base)
50b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
51b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
521e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct mm_pb_manager
53b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
541e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_manager base;
55b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
560bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex mutex;
57b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
582af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   pb_size size;
59b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct mem_block *heap;
60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
612af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   pb_size align2;
62b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
631e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_buffer *buffer;
64b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   void *map;
65b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca};
66b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
67b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
6850d5f304ad9eba8fe95a6cedfc56cd7213b33feaJosé Fonsecastatic INLINE struct mm_pb_manager *
691e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_pb_manager(struct pb_manager *mgr)
70b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
71b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   assert(mgr);
721e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   return (struct mm_pb_manager *)mgr;
73b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
74b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
75b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
76b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastruct mm_buffer
77b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
781e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_buffer base;
79b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
801e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mgr;
81b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
82b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct mem_block *block;
83b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca};
84b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
85b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
8650d5f304ad9eba8fe95a6cedfc56cd7213b33feaJosé Fonsecastatic INLINE struct mm_buffer *
871e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer(struct pb_buffer *buf)
88b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
89b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   assert(buf);
90b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return (struct mm_buffer *)buf;
91b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
92b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
93b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
94b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
951e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_destroy(struct pb_buffer *buf)
96b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
97b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct mm_buffer *mm_buf = mm_buffer(buf);
981e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm = mm_buf->mgr;
99b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1004682e706012fe26627a2f827db01b5068cc62814Marek Olšák   assert(!pipe_is_referenced(&mm_buf->base.reference));
10193d727eea75812ecb21706804033a33d2e761eb8José Fonseca
1020bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_lock(mm->mutex);
1033ad56968f09397a8dd417eae025b9506efaf8414Brian Paul   u_mmFreeMem(mm_buf->block);
1045e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer   FREE(mm_buf);
1050bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_unlock(mm->mutex);
106b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
107b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
108b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
109b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void *
1101e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_map(struct pb_buffer *buf,
11167763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca              unsigned flags,
11267763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca              void *flush_ctx)
113b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
114b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct mm_buffer *mm_buf = mm_buffer(buf);
1151e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm = mm_buf->mgr;
116b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
11767763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca   /* XXX: it will be necessary to remap here to propagate flush_ctx */
11867763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca
119b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return (unsigned char *) mm->map + mm_buf->block->ofs;
120b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
121b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
122b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
123b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
1241e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_unmap(struct pb_buffer *buf)
125b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
126b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   /* No-op */
127b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
128b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
129b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
130e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic enum pipe_error
131e06474dbae6979177629fb6187331291ff230c65José Fonsecamm_buffer_validate(struct pb_buffer *buf,
132e06474dbae6979177629fb6187331291ff230c65José Fonseca                   struct pb_validate *vl,
133e06474dbae6979177629fb6187331291ff230c65José Fonseca                   unsigned flags)
134e06474dbae6979177629fb6187331291ff230c65José Fonseca{
135e06474dbae6979177629fb6187331291ff230c65José Fonseca   struct mm_buffer *mm_buf = mm_buffer(buf);
136e06474dbae6979177629fb6187331291ff230c65José Fonseca   struct mm_pb_manager *mm = mm_buf->mgr;
137e06474dbae6979177629fb6187331291ff230c65José Fonseca   return pb_validate(mm->buffer, vl, flags);
138e06474dbae6979177629fb6187331291ff230c65José Fonseca}
139e06474dbae6979177629fb6187331291ff230c65José Fonseca
140e06474dbae6979177629fb6187331291ff230c65José Fonseca
141e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic void
142e06474dbae6979177629fb6187331291ff230c65José Fonsecamm_buffer_fence(struct pb_buffer *buf,
143e06474dbae6979177629fb6187331291ff230c65José Fonseca                struct pipe_fence_handle *fence)
144e06474dbae6979177629fb6187331291ff230c65José Fonseca{
145e06474dbae6979177629fb6187331291ff230c65José Fonseca   struct mm_buffer *mm_buf = mm_buffer(buf);
146e06474dbae6979177629fb6187331291ff230c65José Fonseca   struct mm_pb_manager *mm = mm_buf->mgr;
147e06474dbae6979177629fb6187331291ff230c65José Fonseca   pb_fence(mm->buffer, fence);
148e06474dbae6979177629fb6187331291ff230c65José Fonseca}
149e06474dbae6979177629fb6187331291ff230c65José Fonseca
150e06474dbae6979177629fb6187331291ff230c65José Fonseca
151b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
1521e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_get_base_buffer(struct pb_buffer *buf,
1531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell                          struct pb_buffer **base_buf,
1542af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                          pb_size *offset)
155b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
156b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct mm_buffer *mm_buf = mm_buffer(buf);
1571e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm = mm_buf->mgr;
1581e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   pb_get_base_buffer(mm->buffer, base_buf, offset);
159b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   *offset += mm_buf->block->ofs;
160b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
161b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
162b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1631e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic const struct pb_vtbl
164b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_vtbl = {
1651e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell      mm_buffer_destroy,
166b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      mm_buffer_map,
167b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      mm_buffer_unmap,
168e06474dbae6979177629fb6187331291ff230c65José Fonseca      mm_buffer_validate,
169e06474dbae6979177629fb6187331291ff230c65José Fonseca      mm_buffer_fence,
170b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      mm_buffer_get_base_buffer
171b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca};
172b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
173b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1741e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic struct pb_buffer *
1751e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create_buffer(struct pb_manager *mgr,
1762af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                        pb_size size,
17765df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca                        const struct pb_desc *desc)
178b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
1791e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm = mm_pb_manager(mgr);
180b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct mm_buffer *mm_buf;
181b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
18265df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   /* We don't handle alignments larger then the one initially setup */
1832af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   assert(pb_check_alignment(desc->alignment, (pb_size)1 << mm->align2));
1842af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   if(!pb_check_alignment(desc->alignment, (pb_size)1 << mm->align2))
18565df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca      return NULL;
18665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca
1870bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_lock(mm->mutex);
188b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
189ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca   mm_buf = CALLOC_STRUCT(mm_buffer);
190b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!mm_buf) {
1910bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul      pipe_mutex_unlock(mm->mutex);
192b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      return NULL;
193b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   }
194b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1954682e706012fe26627a2f827db01b5068cc62814Marek Olšák   pipe_reference_init(&mm_buf->base.reference, 1);
1964682e706012fe26627a2f827db01b5068cc62814Marek Olšák   mm_buf->base.alignment = desc->alignment;
1974682e706012fe26627a2f827db01b5068cc62814Marek Olšák   mm_buf->base.usage = desc->usage;
1984682e706012fe26627a2f827db01b5068cc62814Marek Olšák   mm_buf->base.size = size;
199dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca
200b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm_buf->base.vtbl = &mm_buffer_vtbl;
201b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
202b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm_buf->mgr = mm;
203b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2042af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   mm_buf->block = u_mmAllocMem(mm->heap, (int)size, (int)mm->align2, 0);
205b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(!mm_buf->block) {
206b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#if 0
20777c329a2773820c57e7b286858e80a596f89ef94Jakob Bornecrantz      debug_printf("warning: heap full\n");
208b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      mmDumpMemInfo(mm->heap);
209b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#endif
210c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca      FREE(mm_buf);
211c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca      pipe_mutex_unlock(mm->mutex);
212c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca      return NULL;
213b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   }
214b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
215b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   /* Some sanity checks */
2162af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   assert(0 <= (pb_size)mm_buf->block->ofs && (pb_size)mm_buf->block->ofs < mm->size);
2172af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   assert(size <= (pb_size)mm_buf->block->size && (pb_size)mm_buf->block->ofs + (pb_size)mm_buf->block->size <= mm->size);
218b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2190bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_unlock(mm->mutex);
220b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return SUPER(mm_buf);
221b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
222b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
223b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
224b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
2251672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecamm_bufmgr_flush(struct pb_manager *mgr)
2261672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca{
2271672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   /* No-op */
2281672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca}
2291672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca
2301672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca
2311672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecastatic void
2321e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_destroy(struct pb_manager *mgr)
233b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
2341e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm = mm_pb_manager(mgr);
235b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2360bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_lock(mm->mutex);
237b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2383ad56968f09397a8dd417eae025b9506efaf8414Brian Paul   u_mmDestroy(mm->heap);
239b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2401e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   pb_unmap(mm->buffer);
241dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   pb_reference(&mm->buffer, NULL);
242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2430bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_unlock(mm->mutex);
244b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
245ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca   FREE(mgr);
246b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
247b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
248b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2491e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager *
2501e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create_from_buffer(struct pb_buffer *buffer,
2512af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                             pb_size size, pb_size align2)
252b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
2531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm;
254b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2553eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   if(!buffer)
2563eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca      return NULL;
2573eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
258ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca   mm = CALLOC_STRUCT(mm_pb_manager);
259b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!mm)
260b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      return NULL;
261b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
262b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm->base.destroy = mm_bufmgr_destroy;
2631672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   mm->base.create_buffer = mm_bufmgr_create_buffer;
2641672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   mm->base.flush = mm_bufmgr_flush;
265b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
266b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm->size = size;
267b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm->align2 = align2; /* 64-byte alignment */
268b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2690bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_init(mm->mutex);
270b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2713eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   mm->buffer = buffer;
272b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2731e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   mm->map = pb_map(mm->buffer,
274287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell		    PB_USAGE_CPU_READ |
275b5fcf0c8e07e666523b007fab1d0fc18c2c89241Dave Airlie		    PB_USAGE_CPU_WRITE, NULL);
276b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(!mm->map)
277b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      goto failure;
278b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2792af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   mm->heap = u_mmInit(0, (int)size);
280b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!mm->heap)
281b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      goto failure;
282b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
283b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return SUPER(mm);
284b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
285b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure:
286b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecaif(mm->heap)
287cbce12b5404846520bb776f73885f0ea99a13124Brian Paul   u_mmDestroy(mm->heap);
288b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(mm->map)
2891e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell      pb_unmap(mm->buffer);
290b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(mm)
291ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca      FREE(mm);
292b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return NULL;
293b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
2943eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
2953eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
2961e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager *
2971e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create(struct pb_manager *provider,
2982af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                 pb_size size, pb_size align2)
2993eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca{
3001e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_buffer *buffer;
3011e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_manager *mgr;
30265df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   struct pb_desc desc;
3033eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
304ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca   if(!provider)
305ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca      return NULL;
30665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca
30765df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   memset(&desc, 0, sizeof(desc));
30865df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   desc.alignment = 1 << align2;
30965df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca
31065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   buffer = provider->create_buffer(provider, size, &desc);
3113eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   if (!buffer)
3123eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca      return NULL;
3133eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
3143eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   mgr = mm_bufmgr_create_from_buffer(buffer, size, align2);
3153eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   if (!mgr) {
316dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca      pb_reference(&buffer, NULL);
3173eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca      return NULL;
3183eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   }
3193eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
3203eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca  return mgr;
3213eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca}
322