pb_bufmgr_pool.c revision 4f25420bdd834e81a3e22733304efc5261c2998a
1b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**************************************************************************
2b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
3b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Copyright 2006 Tungsten Graphics, Inc., Bismarck, ND., USA
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 SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
17b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
18b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
19b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * USE OR OTHER DEALINGS IN THE SOFTWARE.
21b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
22b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * The above copyright notice and this permission notice (including the
23b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * next paragraph) shall be included in all copies or substantial portions
24b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * of the Software.
25b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
26b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
27b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca **************************************************************************/
28b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
29b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**
30b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * \file
31b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Batch buffer pool management.
32b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
33ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca * \author José Fonseca <jrfonseca-at-tungstengraphics-dot-com>
34ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca * \author Thomas Hellström <thomas-at-tungstengraphics-dot-com>
35b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */
36b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
37b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
38687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_compiler.h"
39687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_debug.h"
40687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_thread.h"
41687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_defines.h"
424f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h"
43b9da3791c934e05b82063a8c79c423a0a8e29a94José Fonseca#include "util/u_double_list.h"
44b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
45b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_buffer.h"
46b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_bufmgr.h"
47b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
48b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
49b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**
50b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Convenience macro (type safe).
51b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */
52b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#define SUPER(__derived) (&(__derived)->base)
53b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
54b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
551e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pool_pb_manager
56b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
571e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_manager base;
58b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
59b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   _glthread_Mutex mutex;
60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
61b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   size_t bufSize;
6265df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   size_t bufAlign;
63b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
64b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   size_t numFree;
65b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   size_t numTot;
66b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
67b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct list_head free;
68b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
691e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_buffer *buffer;
70b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   void *map;
71b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
72b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct pool_buffer *bufs;
73b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca};
74b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
75b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
766c3d12e374939d36a23af7c9c502de18ce02f423Michal Krolstatic INLINE struct pool_pb_manager *
771e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_pb_manager(struct pb_manager *mgr)
78b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
79b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   assert(mgr);
801e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   return (struct pool_pb_manager *)mgr;
81b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
82b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
83b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
84b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastruct pool_buffer
85b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
861e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_buffer base;
87b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
881e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *mgr;
89b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
90b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct list_head head;
91b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
92b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   size_t start;
93b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca};
94b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
95b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
966c3d12e374939d36a23af7c9c502de18ce02f423Michal Krolstatic INLINE struct pool_buffer *
971e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer(struct pb_buffer *buf)
98b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
99b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   assert(buf);
100b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return (struct pool_buffer *)buf;
101b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
102b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
103b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
104b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
105b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
1061e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_destroy(struct pb_buffer *buf)
107b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
108b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct pool_buffer *pool_buf = pool_buffer(buf);
1091e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *pool = pool_buf->mgr;
110b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
111dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   assert(pool_buf->base.base.refcount == 0);
112dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca
113b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   _glthread_LOCK_MUTEX(pool->mutex);
114b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   LIST_ADD(&pool_buf->head, &pool->free);
115b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->numFree++;
116b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   _glthread_UNLOCK_MUTEX(pool->mutex);
117b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
118b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
119b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
120b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void *
1211e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_map(struct pb_buffer *buf, unsigned flags)
122b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
123b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct pool_buffer *pool_buf = pool_buffer(buf);
1241e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *pool = pool_buf->mgr;
125b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   void *map;
126b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
127b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   _glthread_LOCK_MUTEX(pool->mutex);
128b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   map = (unsigned char *) pool->map + pool_buf->start;
129b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   _glthread_UNLOCK_MUTEX(pool->mutex);
130b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return map;
131b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
132b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
133b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
134b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
1351e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_unmap(struct pb_buffer *buf)
136b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
137b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   /* No-op */
138b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
139b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
140b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
141b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
1421e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_get_base_buffer(struct pb_buffer *buf,
1431e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell                            struct pb_buffer **base_buf,
144b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca                            unsigned *offset)
145b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
146b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct pool_buffer *pool_buf = pool_buffer(buf);
1471e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *pool = pool_buf->mgr;
1481e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   pb_get_base_buffer(pool->buffer, base_buf, offset);
149b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   *offset += pool_buf->start;
150b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
151b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
152b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic const struct pb_vtbl
154b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecapool_buffer_vtbl = {
1551e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell      pool_buffer_destroy,
156b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buffer_map,
157b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buffer_unmap,
158b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buffer_get_base_buffer
159b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca};
160b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
161b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1621e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic struct pb_buffer *
16365df0241465b2dae4979d71cad17b83cfd1fda11José Fonsecapool_bufmgr_create_buffer(struct pb_manager *mgr,
16465df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca                          size_t size,
16565df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca                          const struct pb_desc *desc)
166b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
1671e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *pool = pool_pb_manager(mgr);
168b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct pool_buffer *pool_buf;
169b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct list_head *item;
170b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
171b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   assert(size == pool->bufSize);
17228ecb986d958d52c9a996453e53418d1f98d7f75Michel Dänzer   assert(pool->bufAlign % desc->alignment == 0);
173b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
174b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   _glthread_LOCK_MUTEX(pool->mutex);
175b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
176b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (pool->numFree == 0) {
177b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      _glthread_UNLOCK_MUTEX(pool->mutex);
1789791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca      debug_printf("warning: out of fixed size buffer objects\n");
179b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      return NULL;
180b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   }
181b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
182b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   item = pool->free.next;
183b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
184b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (item == &pool->free) {
185b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      _glthread_UNLOCK_MUTEX(pool->mutex);
1869791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca      debug_printf("error: fixed size buffer pool corruption\n");
187b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      return NULL;
188b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   }
189b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
190b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   LIST_DEL(item);
191b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   --pool->numFree;
192b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
193b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   _glthread_UNLOCK_MUTEX(pool->mutex);
194dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca
195b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool_buf = LIST_ENTRY(struct pool_buffer, item, head);
196dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   assert(pool_buf->base.base.refcount == 0);
197dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   pool_buf->base.base.refcount = 1;
198dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   pool_buf->base.base.alignment = desc->alignment;
199dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   pool_buf->base.base.usage = desc->usage;
200dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca
201b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return SUPER(pool_buf);
202b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
203b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
204b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
205b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
2061e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_destroy(struct pb_manager *mgr)
207b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
2081e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *pool = pool_pb_manager(mgr);
209b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   _glthread_LOCK_MUTEX(pool->mutex);
210b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2110fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol   FREE(pool->bufs);
212b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2131e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   pb_unmap(pool->buffer);
214dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   pb_reference(&pool->buffer, NULL);
215b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
216b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   _glthread_UNLOCK_MUTEX(pool->mutex);
217b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2180fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol   FREE(mgr);
219b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
220b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
221b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2221e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager *
2231e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_create(struct pb_manager *provider,
224b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca                   size_t numBufs,
22565df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca                   size_t bufSize,
22665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca                   const struct pb_desc *desc)
227b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
2281e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *pool;
229b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct pool_buffer *pool_buf;
2306c3d12e374939d36a23af7c9c502de18ce02f423Michal Krol   size_t i;
231b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
232ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca   if(!provider)
233ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca      return NULL;
234ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca
235ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca   pool = CALLOC_STRUCT(pool_pb_manager);
236b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!pool)
237b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      return NULL;
238b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
239b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->base.destroy = pool_bufmgr_destroy;
240b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->base.create_buffer = pool_bufmgr_create_buffer;
241b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   LIST_INITHEAD(&pool->free);
243b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
244b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->numTot = numBufs;
245b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->numFree = numBufs;
246b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->bufSize = bufSize;
24765df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   pool->bufAlign = desc->alignment;
248b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
249b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   _glthread_INIT_MUTEX(pool->mutex);
250b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
25165df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   pool->buffer = provider->create_buffer(provider, numBufs*bufSize, desc);
252b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!pool->buffer)
253b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      goto failure;
254b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2551e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   pool->map = pb_map(pool->buffer,
256756d52ec12c41ee90ee9598dc9028cc134806bd2Michel Dänzer                          PIPE_BUFFER_USAGE_CPU_READ |
257756d52ec12c41ee90ee9598dc9028cc134806bd2Michel Dänzer                          PIPE_BUFFER_USAGE_CPU_WRITE);
258b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(!pool->map)
259b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      goto failure;
260b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
26193d727eea75812ecb21706804033a33d2e761eb8José Fonseca   pool->bufs = (struct pool_buffer *)CALLOC(numBufs, sizeof(*pool->bufs));
262b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!pool->bufs)
263b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      goto failure;
264b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
265b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool_buf = pool->bufs;
266b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   for (i = 0; i < numBufs; ++i) {
267dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca      pool_buf->base.base.refcount = 0;
268dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca      pool_buf->base.base.alignment = 0;
269dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca      pool_buf->base.base.usage = 0;
270dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca      pool_buf->base.base.size = bufSize;
271b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buf->base.vtbl = &pool_buffer_vtbl;
272b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buf->mgr = pool;
273b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buf->start = i * bufSize;
274b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      LIST_ADDTAIL(&pool_buf->head, &pool->free);
275b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buf++;
276b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   }
277b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
278b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return SUPER(pool);
279b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
280b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure:
281b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(pool->bufs)
2820fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol      FREE(pool->bufs);
283b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(pool->map)
2841e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell      pb_unmap(pool->buffer);
285b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(pool->buffer)
286dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca      pb_reference(&pool->buffer, NULL);
287b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(pool)
2880fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol      FREE(pool);
289b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return NULL;
290b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
291