1b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**************************************************************************
2b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
3b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Copyright 2007 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 management.
31b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
32b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * A buffer manager does only one basic thing: it creates buffers. Actually,
33b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * "buffer factory" would probably a more accurate description.
34b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
35b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * You can chain buffer managers so that you can have a finer grained memory
36b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * management and pooling.
37b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
38b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * For example, for a simple batch buffer manager you would chain:
39b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * - the native buffer manager, which provides DMA memory from the graphics
40b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * memory space;
41b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * - the pool buffer manager, which keep around a pool of equally sized buffers
42b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * to avoid latency associated with the native buffer manager;
43b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * - the fenced buffer manager, which will delay buffer destruction until the
44b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * the moment the card finishing processing it.
45b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
46e06474dbae6979177629fb6187331291ff230c65José Fonseca * \author Jose Fonseca <jrfonseca@tungstengraphics.com>
47b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */
48b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
49b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#ifndef PB_BUFMGR_H_
50b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#define PB_BUFMGR_H_
51b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
52b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
537822f99193cd26558bff29ff8d6d23db2d3a1048Vinson Lee#include "pb_buffer.h"
54b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
55b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
56d6229d7f1fda03d3c73998505b0facf6e3d5b882José Fonseca#ifdef __cplusplus
57d6229d7f1fda03d3c73998505b0facf6e3d5b882José Fonsecaextern "C" {
58d6229d7f1fda03d3c73998505b0facf6e3d5b882José Fonseca#endif
59d6229d7f1fda03d3c73998505b0facf6e3d5b882José Fonseca
60d6229d7f1fda03d3c73998505b0facf6e3d5b882José Fonseca
6165df0241465b2dae4979d71cad17b83cfd1fda11José Fonsecastruct pb_desc;
62b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
63b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
64b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**
65b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Abstract base class for all buffer managers.
66b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */
671e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager
68b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{
691672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   void
701672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   (*destroy)( struct pb_manager *mgr );
711672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca
721e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   struct pb_buffer *
731e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell   (*create_buffer)( struct pb_manager *mgr,
742af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca	             pb_size size,
7565df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca	             const struct pb_desc *desc);
76b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
771672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   /**
781672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca    * Flush all temporary-held buffers.
791672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca    *
801672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca    * Used mostly to aid debugging memory issues or to clean up resources when
811672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca    * the drivers are long lived.
821672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca    */
83b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca   void
841672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca   (*flush)( struct pb_manager *mgr );
8549579a4df8f9f85139a02c95ae59ea0a5dec663cMarek Olšák
8649579a4df8f9f85139a02c95ae59ea0a5dec663cMarek Olšák   boolean
8749579a4df8f9f85139a02c95ae59ea0a5dec663cMarek Olšák   (*is_buffer_busy)( struct pb_manager *mgr,
8849579a4df8f9f85139a02c95ae59ea0a5dec663cMarek Olšák                      struct pb_buffer *buf );
89b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca};
90b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
91b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
9235cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca/**
9335cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca * Malloc buffer provider.
9435cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca *
9535cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca * Simple wrapper around pb_malloc_buffer_create for convenience.
9635cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca */
9735cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonsecastruct pb_manager *
9835cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonsecapb_malloc_bufmgr_create(void);
9935cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca
10035cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca
101b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**
102fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca * Static buffer pool sub-allocator.
103b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
104b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Manages the allocation of equally sized buffers. It does so by allocating
105b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * a single big buffer and divide it equally sized buffers.
106b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
107b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * It is meant to manage the allocation of batch buffer pools.
108b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */
1091e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager *
1101e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_create(struct pb_manager *provider,
1112af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                   pb_size n, pb_size size,
11265df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca                   const struct pb_desc *desc);
113b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
114b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
115b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**
116fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca * Static sub-allocator based the old memory manager.
117b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
118b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * It managers buffers of different sizes. It does so by allocating a buffer
119b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * with the size of the heap, and then using the old mm memory manager to manage
120b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * that heap.
121b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */
1221e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager *
1231e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create(struct pb_manager *provider,
1242af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                 pb_size size, pb_size align2);
125b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1263eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca/**
1273eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca * Same as mm_bufmgr_create.
1283eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca *
1293eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca * Buffer will be release when the manager is destroyed.
1303eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca */
1311e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager *
1321e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create_from_buffer(struct pb_buffer *buffer,
1332af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                             pb_size size, pb_size align2);
1343eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca
135b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
136fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca/**
137fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca * Slab sub-allocator.
138fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca */
13921c302b0ec39480a7eaab7827cce5b609d196606José Fonsecastruct pb_manager *
140a175e15f20b2a231cc9d09099e7b6d8aea6c624eJosé Fonsecapb_slab_manager_create(struct pb_manager *provider,
1412af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                       pb_size bufSize,
1422af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                       pb_size slabSize,
143a175e15f20b2a231cc9d09099e7b6d8aea6c624eJosé Fonseca                       const struct pb_desc *desc);
144a175e15f20b2a231cc9d09099e7b6d8aea6c624eJosé Fonseca
145a175e15f20b2a231cc9d09099e7b6d8aea6c624eJosé Fonseca/**
146a175e15f20b2a231cc9d09099e7b6d8aea6c624eJosé Fonseca * Allow a range of buffer size, by aggregating multiple slabs sub-allocators
147a175e15f20b2a231cc9d09099e7b6d8aea6c624eJosé Fonseca * with different bucket sizes.
148a175e15f20b2a231cc9d09099e7b6d8aea6c624eJosé Fonseca */
149a175e15f20b2a231cc9d09099e7b6d8aea6c624eJosé Fonsecastruct pb_manager *
150a175e15f20b2a231cc9d09099e7b6d8aea6c624eJosé Fonsecapb_slab_range_manager_create(struct pb_manager *provider,
1512af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                             pb_size minBufSize,
1522af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                             pb_size maxBufSize,
1532af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                             pb_size slabSize,
154a175e15f20b2a231cc9d09099e7b6d8aea6c624eJosé Fonseca                             const struct pb_desc *desc);
155fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca
156fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca
157fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca/**
158fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca * Time-based buffer cache.
159fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca *
160fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca * This manager keeps a cache of destroyed buffers during a time interval.
161fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca */
162fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonsecastruct pb_manager *
163fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonsecapb_cache_manager_create(struct pb_manager *provider,
164fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca                     	unsigned usecs);
165fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca
166fb2b5f7a4ac411a5bb5cde12ba15265b30c032e8José Fonseca
16700ee308ab3e7da2a2939845e0f0a24b8a0925025José Fonsecastruct pb_fence_ops;
16800ee308ab3e7da2a2939845e0f0a24b8a0925025José Fonseca
169b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/**
170b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Fenced buffer manager.
171b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
172b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * This manager is just meant for convenience. It wraps the buffers returned
173b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * by another manager in fenced buffers, so that
174b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *
175b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * NOTE: the buffer manager that provides the buffers will be destroyed
176b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * at the same time.
177b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */
1781e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager *
1791e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellfenced_bufmgr_create(struct pb_manager *provider,
1803498616b03f4b1da7a2a74ed83e95aee77204a2fJosé Fonseca                     struct pb_fence_ops *ops,
1813498616b03f4b1da7a2a74ed83e95aee77204a2fJosé Fonseca                     pb_size max_buffer_size,
1823498616b03f4b1da7a2a74ed83e95aee77204a2fJosé Fonseca                     pb_size max_cpu_total_size);
183b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
184b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca
1850c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecastruct pb_manager *
1860c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonsecapb_alt_manager_create(struct pb_manager *provider1,
1870c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca                      struct pb_manager *provider2);
1880c5b1a8ffb21f72fcde64a7daa13d5dab5b90425José Fonseca
189d16fcd07f876fe7fb29f5f4e3df4e83ff7de3422José Fonseca
190d16fcd07f876fe7fb29f5f4e3df4e83ff7de3422José Fonseca/**
191444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * Ondemand buffer manager.
192444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca *
193444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * Buffers are created in malloc'ed memory (fast and cached), and the constents
194444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * is transfered to a buffer from the provider (typically in slow uncached
195444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * memory) when there is an attempt to validate the buffer.
196444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca *
197444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * Ideal for situations where one does not know before hand whether a given
198444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * buffer will effectively be used by the hardware or not.
199444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca */
200444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastruct pb_manager *
201444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_manager_create(struct pb_manager *provider);
202444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
203444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
204444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca/**
205d16fcd07f876fe7fb29f5f4e3df4e83ff7de3422José Fonseca * Debug buffer manager to detect buffer under- and overflows.
206d16fcd07f876fe7fb29f5f4e3df4e83ff7de3422José Fonseca *
2070be216c526c29726a73a26a37dcd5a00cfbefc86José Fonseca * Under/overflow sizes should be a multiple of the largest alignment
208d16fcd07f876fe7fb29f5f4e3df4e83ff7de3422José Fonseca */
209d16fcd07f876fe7fb29f5f4e3df4e83ff7de3422José Fonsecastruct pb_manager *
2100be216c526c29726a73a26a37dcd5a00cfbefc86José Fonsecapb_debug_manager_create(struct pb_manager *provider,
2112af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                        pb_size underflow_size, pb_size overflow_size);
212d16fcd07f876fe7fb29f5f4e3df4e83ff7de3422José Fonseca
213d16fcd07f876fe7fb29f5f4e3df4e83ff7de3422José Fonseca
214d6229d7f1fda03d3c73998505b0facf6e3d5b882José Fonseca#ifdef __cplusplus
215d6229d7f1fda03d3c73998505b0facf6e3d5b882José Fonseca}
216d6229d7f1fda03d3c73998505b0facf6e3d5b882José Fonseca#endif
217d6229d7f1fda03d3c73998505b0facf6e3d5b882José Fonseca
218b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#endif /*PB_BUFMGR_H_*/
219