pb_bufmgr_mm.c revision c7431552c0ff203cd4b3ae37751b10e6111e4167
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 *
32aef455c4a7bbd7df97a6444ae332cb5fb976e627Keith Whitwell * \author José Fonseca <jrfonseca@tungstengraphics.com>
33b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */
34b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
35b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
36687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_defines.h"
37687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_debug.h"
38687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_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
58b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   size_t size;
59b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct mem_block *heap;
60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
61b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   size_t 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
10093d727eea75812ecb21706804033a33d2e761eb8José Fonseca   assert(buf->base.refcount == 0);
10193d727eea75812ecb21706804033a33d2e761eb8José Fonseca
1020bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_lock(mm->mutex);
103b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mmFreeMem(mm_buf->block);
104ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca   FREE(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,
111b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca              unsigned flags)
112b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
113b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct mm_buffer *mm_buf = mm_buffer(buf);
1141e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm = mm_buf->mgr;
115b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
116b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return (unsigned char *) mm->map + mm_buf->block->ofs;
117b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
118b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
119b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
120b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
1211e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_unmap(struct pb_buffer *buf)
122b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
123b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   /* No-op */
124b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
125b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
126b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
127b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
1281e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_get_base_buffer(struct pb_buffer *buf,
1291e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell                          struct pb_buffer **base_buf,
130b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca                          unsigned *offset)
131b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
132b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct mm_buffer *mm_buf = mm_buffer(buf);
1331e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm = mm_buf->mgr;
1341e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   pb_get_base_buffer(mm->buffer, base_buf, offset);
135b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   *offset += mm_buf->block->ofs;
136b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
137b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
138b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1391e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic const struct pb_vtbl
140b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_vtbl = {
1411e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell      mm_buffer_destroy,
142b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      mm_buffer_map,
143b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      mm_buffer_unmap,
144b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      mm_buffer_get_base_buffer
145b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca};
146b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
147b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1481e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic struct pb_buffer *
1491e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create_buffer(struct pb_manager *mgr,
15065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca                        size_t size,
15165df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca                        const struct pb_desc *desc)
152b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
1531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm = mm_pb_manager(mgr);
154b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct mm_buffer *mm_buf;
155b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
15665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   /* We don't handle alignments larger then the one initially setup */
15765df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   assert(desc->alignment % (1 << mm->align2) == 0);
15865df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   if(desc->alignment % (1 << mm->align2))
15965df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca      return NULL;
16065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca
1610bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_lock(mm->mutex);
162b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
163ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca   mm_buf = CALLOC_STRUCT(mm_buffer);
164b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!mm_buf) {
1650bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul      pipe_mutex_unlock(mm->mutex);
166b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      return NULL;
167b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   }
168b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
169dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   mm_buf->base.base.refcount = 1;
170dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   mm_buf->base.base.alignment = desc->alignment;
171dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   mm_buf->base.base.usage = desc->usage;
172dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   mm_buf->base.base.size = size;
173dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca
174b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm_buf->base.vtbl = &mm_buffer_vtbl;
175b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
176b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm_buf->mgr = mm;
177b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
178b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm_buf->block = mmAllocMem(mm->heap, size, mm->align2, 0);
179b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(!mm_buf->block) {
1809791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca      debug_printf("warning: heap full\n");
181b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#if 0
182b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      mmDumpMemInfo(mm->heap);
183b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#endif
184c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca      FREE(mm_buf);
185c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca      pipe_mutex_unlock(mm->mutex);
186c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca      return NULL;
187b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   }
188b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
189b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   /* Some sanity checks */
190e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca   assert(0 <= (unsigned)mm_buf->block->ofs && (unsigned)mm_buf->block->ofs < mm->size);
191e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca   assert(size <= (unsigned)mm_buf->block->size && (unsigned)mm_buf->block->ofs + (unsigned)mm_buf->block->size <= mm->size);
192b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1930bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_unlock(mm->mutex);
194b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return SUPER(mm_buf);
195b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
196b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
197b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
198b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
1991672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecamm_bufmgr_flush(struct pb_manager *mgr)
2001672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca{
2011672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   /* No-op */
2021672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca}
2031672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca
2041672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca
2051672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecastatic void
2061e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_destroy(struct pb_manager *mgr)
207b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
2081e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm = mm_pb_manager(mgr);
209b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2100bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_lock(mm->mutex);
211b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
212b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mmDestroy(mm->heap);
213b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2141e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   pb_unmap(mm->buffer);
215dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   pb_reference(&mm->buffer, NULL);
216b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2170bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_unlock(mm->mutex);
218b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
219ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca   FREE(mgr);
220b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
221b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
222b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2231e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager *
2241e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create_from_buffer(struct pb_buffer *buffer,
2253eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca                             size_t size, size_t align2)
226b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
2271e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct mm_pb_manager *mm;
228b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2293eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   if(!buffer)
2303eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca      return NULL;
2313eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
232ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca   mm = CALLOC_STRUCT(mm_pb_manager);
233b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!mm)
234b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      return NULL;
235b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
236b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm->base.destroy = mm_bufmgr_destroy;
2371672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   mm->base.create_buffer = mm_bufmgr_create_buffer;
2381672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   mm->base.flush = mm_bufmgr_flush;
239b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
240b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm->size = size;
241b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm->align2 = align2; /* 64-byte alignment */
242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2430bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_init(mm->mutex);
244b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2453eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   mm->buffer = buffer;
246b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2471e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   mm->map = pb_map(mm->buffer,
2481e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell		    PIPE_BUFFER_USAGE_CPU_READ |
2491e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell		    PIPE_BUFFER_USAGE_CPU_WRITE);
250b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(!mm->map)
251b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      goto failure;
252b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
253b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mm->heap = mmInit(0, size);
254b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!mm->heap)
255b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      goto failure;
256b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
257b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return SUPER(mm);
258b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
259b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure:
260b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecaif(mm->heap)
261b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   mmDestroy(mm->heap);
262b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(mm->map)
2631e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell      pb_unmap(mm->buffer);
264b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(mm)
265ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca      FREE(mm);
266b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return NULL;
267b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
2683eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
2693eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
2701e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager *
2711e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create(struct pb_manager *provider,
2723eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca                 size_t size, size_t align2)
2733eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca{
2741e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_buffer *buffer;
2751e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_manager *mgr;
27665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   struct pb_desc desc;
2773eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
278ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca   if(!provider)
279ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca      return NULL;
28065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca
28165df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   memset(&desc, 0, sizeof(desc));
28265df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   desc.alignment = 1 << align2;
28365df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca
28465df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   buffer = provider->create_buffer(provider, size, &desc);
2853eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   if (!buffer)
2863eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca      return NULL;
2873eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
2883eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   mgr = mm_bufmgr_create_from_buffer(buffer, size, align2);
2893eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   if (!mgr) {
290dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca      pb_reference(&buffer, NULL);
2913eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca      return NULL;
2923eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca   }
2933eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
2943eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca  return mgr;
2953eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca}
296