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 *
33e06474dbae6979177629fb6187331291ff230c65José Fonseca * \author Jose 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"
39ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h"
402aaca1df9df6980ec88180c8866c8987b31db91aJosé Fonseca#include "os/os_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
590bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex mutex;
60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
612af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   pb_size bufSize;
622af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   pb_size bufAlign;
63b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
642af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   pb_size numFree;
652af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   pb_size 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
922af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   pb_size 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
1114682e706012fe26627a2f827db01b5068cc62814Marek Olšák   assert(!pipe_is_referenced(&pool_buf->base.reference));
112dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca
1130bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_lock(pool->mutex);
114b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   LIST_ADD(&pool_buf->head, &pool->free);
115b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->numFree++;
1160bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_unlock(pool->mutex);
117b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
118b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
119b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
120b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void *
12167763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonsecapool_buffer_map(struct pb_buffer *buf, unsigned flags, void *flush_ctx)
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
12767763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca   /* XXX: it will be necessary to remap here to propagate flush_ctx */
12867763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca
1290bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_lock(pool->mutex);
130b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   map = (unsigned char *) pool->map + pool_buf->start;
1310bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_unlock(pool->mutex);
132b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return map;
133b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
134b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
135b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
136b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
1371e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_unmap(struct pb_buffer *buf)
138b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
139b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   /* No-op */
140b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
141b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
142b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
143e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic enum pipe_error
144e06474dbae6979177629fb6187331291ff230c65José Fonsecapool_buffer_validate(struct pb_buffer *buf,
145e06474dbae6979177629fb6187331291ff230c65José Fonseca                     struct pb_validate *vl,
146e06474dbae6979177629fb6187331291ff230c65José Fonseca                     unsigned flags)
147e06474dbae6979177629fb6187331291ff230c65José Fonseca{
148e06474dbae6979177629fb6187331291ff230c65José Fonseca   struct pool_buffer *pool_buf = pool_buffer(buf);
149e06474dbae6979177629fb6187331291ff230c65José Fonseca   struct pool_pb_manager *pool = pool_buf->mgr;
150e06474dbae6979177629fb6187331291ff230c65José Fonseca   return pb_validate(pool->buffer, vl, flags);
151e06474dbae6979177629fb6187331291ff230c65José Fonseca}
152e06474dbae6979177629fb6187331291ff230c65José Fonseca
153e06474dbae6979177629fb6187331291ff230c65José Fonseca
154e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic void
155e06474dbae6979177629fb6187331291ff230c65José Fonsecapool_buffer_fence(struct pb_buffer *buf,
156e06474dbae6979177629fb6187331291ff230c65José Fonseca                  struct pipe_fence_handle *fence)
157e06474dbae6979177629fb6187331291ff230c65José Fonseca{
158e06474dbae6979177629fb6187331291ff230c65José Fonseca   struct pool_buffer *pool_buf = pool_buffer(buf);
159e06474dbae6979177629fb6187331291ff230c65José Fonseca   struct pool_pb_manager *pool = pool_buf->mgr;
160e06474dbae6979177629fb6187331291ff230c65José Fonseca   pb_fence(pool->buffer, fence);
161e06474dbae6979177629fb6187331291ff230c65José Fonseca}
162e06474dbae6979177629fb6187331291ff230c65José Fonseca
163e06474dbae6979177629fb6187331291ff230c65José Fonseca
164b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
1651e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_get_base_buffer(struct pb_buffer *buf,
1661e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell                            struct pb_buffer **base_buf,
1672af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                            pb_size *offset)
168b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
169b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct pool_buffer *pool_buf = pool_buffer(buf);
1701e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *pool = pool_buf->mgr;
1711e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   pb_get_base_buffer(pool->buffer, base_buf, offset);
172b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   *offset += pool_buf->start;
173b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
174b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
175b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1761e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic const struct pb_vtbl
177b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecapool_buffer_vtbl = {
1781e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell      pool_buffer_destroy,
179b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buffer_map,
180b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buffer_unmap,
181e06474dbae6979177629fb6187331291ff230c65José Fonseca      pool_buffer_validate,
182e06474dbae6979177629fb6187331291ff230c65José Fonseca      pool_buffer_fence,
183b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buffer_get_base_buffer
184b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca};
185b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
186b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1871e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic struct pb_buffer *
18865df0241465b2dae4979d71cad17b83cfd1fda11José Fonsecapool_bufmgr_create_buffer(struct pb_manager *mgr,
1892af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                          pb_size size,
19065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca                          const struct pb_desc *desc)
191b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
1921e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *pool = pool_pb_manager(mgr);
193b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct pool_buffer *pool_buf;
194b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct list_head *item;
195b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
196b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   assert(size == pool->bufSize);
19728ecb986d958d52c9a996453e53418d1f98d7f75Michel Dänzer   assert(pool->bufAlign % desc->alignment == 0);
198b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1990bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_lock(pool->mutex);
200b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
201b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (pool->numFree == 0) {
2020bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul      pipe_mutex_unlock(pool->mutex);
2039791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca      debug_printf("warning: out of fixed size buffer objects\n");
204b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      return NULL;
205b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   }
206b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
207b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   item = pool->free.next;
208b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
209b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (item == &pool->free) {
2100bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul      pipe_mutex_unlock(pool->mutex);
2119791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca      debug_printf("error: fixed size buffer pool corruption\n");
212b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      return NULL;
213b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   }
214b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
215b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   LIST_DEL(item);
216b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   --pool->numFree;
217b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2180bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_unlock(pool->mutex);
219dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca
220b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool_buf = LIST_ENTRY(struct pool_buffer, item, head);
2214682e706012fe26627a2f827db01b5068cc62814Marek Olšák   assert(!pipe_is_referenced(&pool_buf->base.reference));
2224682e706012fe26627a2f827db01b5068cc62814Marek Olšák   pipe_reference_init(&pool_buf->base.reference, 1);
2234682e706012fe26627a2f827db01b5068cc62814Marek Olšák   pool_buf->base.alignment = desc->alignment;
2244682e706012fe26627a2f827db01b5068cc62814Marek Olšák   pool_buf->base.usage = desc->usage;
225dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca
226b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return SUPER(pool_buf);
227b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
228b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
229b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
230b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void
2311672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecapool_bufmgr_flush(struct pb_manager *mgr)
2321672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca{
2331672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   /* No-op */
2341672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca}
2351672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca
2361672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca
2371672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecastatic void
2381e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_destroy(struct pb_manager *mgr)
239b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
2401e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *pool = pool_pb_manager(mgr);
2410bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_lock(pool->mutex);
242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2430fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol   FREE(pool->bufs);
244b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2451e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   pb_unmap(pool->buffer);
246dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca   pb_reference(&pool->buffer, NULL);
247b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2480bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_unlock(pool->mutex);
249b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2500fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol   FREE(mgr);
251b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
252b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
253b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2541e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager *
2551e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_create(struct pb_manager *provider,
2562af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                   pb_size numBufs,
2572af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                   pb_size bufSize,
25865df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca                   const struct pb_desc *desc)
259b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
2601e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pool_pb_manager *pool;
261b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   struct pool_buffer *pool_buf;
2622af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   pb_size i;
263b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
264ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca   if(!provider)
265ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca      return NULL;
266ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca
267ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca   pool = CALLOC_STRUCT(pool_pb_manager);
268b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!pool)
269b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      return NULL;
270b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
271b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->base.destroy = pool_bufmgr_destroy;
272b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->base.create_buffer = pool_bufmgr_create_buffer;
2731672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   pool->base.flush = pool_bufmgr_flush;
274b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
275b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   LIST_INITHEAD(&pool->free);
276b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
277b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->numTot = numBufs;
278b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->numFree = numBufs;
279b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool->bufSize = bufSize;
28065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   pool->bufAlign = desc->alignment;
281b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2820bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul   pipe_mutex_init(pool->mutex);
283b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
28465df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca   pool->buffer = provider->create_buffer(provider, numBufs*bufSize, desc);
285b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!pool->buffer)
286b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      goto failure;
287b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
2881e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   pool->map = pb_map(pool->buffer,
289287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell                          PB_USAGE_CPU_READ |
290b5fcf0c8e07e666523b007fab1d0fc18c2c89241Dave Airlie                          PB_USAGE_CPU_WRITE, NULL);
291b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(!pool->map)
292b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      goto failure;
293b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
29493d727eea75812ecb21706804033a33d2e761eb8José Fonseca   pool->bufs = (struct pool_buffer *)CALLOC(numBufs, sizeof(*pool->bufs));
295b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if (!pool->bufs)
296b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      goto failure;
297b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
298b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   pool_buf = pool->bufs;
299b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   for (i = 0; i < numBufs; ++i) {
3004682e706012fe26627a2f827db01b5068cc62814Marek Olšák      pipe_reference_init(&pool_buf->base.reference, 0);
3014682e706012fe26627a2f827db01b5068cc62814Marek Olšák      pool_buf->base.alignment = 0;
3024682e706012fe26627a2f827db01b5068cc62814Marek Olšák      pool_buf->base.usage = 0;
3034682e706012fe26627a2f827db01b5068cc62814Marek Olšák      pool_buf->base.size = bufSize;
304b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buf->base.vtbl = &pool_buffer_vtbl;
305b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buf->mgr = pool;
306b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buf->start = i * bufSize;
307b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      LIST_ADDTAIL(&pool_buf->head, &pool->free);
308b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca      pool_buf++;
309b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   }
310b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
311b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return SUPER(pool);
312b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
313b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure:
314b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(pool->bufs)
3150fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol      FREE(pool->bufs);
316b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(pool->map)
3171e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell      pb_unmap(pool->buffer);
318b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(pool->buffer)
319dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca      pb_reference(&pool->buffer, NULL);
320b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   if(pool)
3210fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol      FREE(pool);
322b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   return NULL;
323b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}
324