06669917ff6a4c7fbb177b9a2b06e88fc120b9c4
[profile/ivi/mesa.git] / src / gallium / auxiliary / pipebuffer / pb_bufmgr.h
1 /**************************************************************************
2  *
3  * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
4  * All Rights Reserved.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a
7  * copy of this software and associated documentation files (the
8  * "Software"), to deal in the Software without restriction, including
9  * without limitation the rights to use, copy, modify, merge, publish,
10  * distribute, sub license, and/or sell copies of the Software, and to
11  * permit persons to whom the Software is furnished to do so, subject to
12  * the following conditions:
13  *
14  * The above copyright notice and this permission notice (including the
15  * next paragraph) shall be included in all copies or substantial portions
16  * of the Software.
17  *
18  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25  *
26  **************************************************************************/
27
28 /**
29  * \file
30  * Buffer management.
31  * 
32  * A buffer manager does only one basic thing: it creates buffers. Actually,
33  * "buffer factory" would probably a more accurate description.
34  * 
35  * You can chain buffer managers so that you can have a finer grained memory
36  * management and pooling.
37  * 
38  * For example, for a simple batch buffer manager you would chain:
39  * - the native buffer manager, which provides DMA memory from the graphics
40  * memory space;
41  * - the pool buffer manager, which keep around a pool of equally sized buffers
42  * to avoid latency associated with the native buffer manager; 
43  * - the fenced buffer manager, which will delay buffer destruction until the 
44  * the moment the card finishing processing it. 
45  * 
46  * \author Jose Fonseca <jrfonseca@tungstengraphics.com>
47  */
48
49 #ifndef PB_BUFMGR_H_
50 #define PB_BUFMGR_H_
51
52
53 #include "pipe/p_compiler.h"
54 #include "pipe/p_defines.h"
55
56
57 #ifdef __cplusplus
58 extern "C" {
59 #endif
60
61
62 struct pb_desc;
63 struct pipe_buffer;
64
65
66 /** 
67  * Abstract base class for all buffer managers.
68  */
69 struct pb_manager
70 {
71    void
72    (*destroy)( struct pb_manager *mgr );
73
74    struct pb_buffer *
75    (*create_buffer)( struct pb_manager *mgr, 
76                      pb_size size,
77                      const struct pb_desc *desc);
78
79    /**
80     * Flush all temporary-held buffers.
81     * 
82     * Used mostly to aid debugging memory issues or to clean up resources when 
83     * the drivers are long lived.
84     */
85    void
86    (*flush)( struct pb_manager *mgr );
87 };
88
89
90 /**
91  * Malloc buffer provider.
92  * 
93  * Simple wrapper around pb_malloc_buffer_create for convenience.
94  */
95 struct pb_manager *
96 pb_malloc_bufmgr_create(void);
97
98
99 /** 
100  * Static buffer pool sub-allocator.
101  * 
102  * Manages the allocation of equally sized buffers. It does so by allocating
103  * a single big buffer and divide it equally sized buffers. 
104  * 
105  * It is meant to manage the allocation of batch buffer pools.
106  */
107 struct pb_manager *
108 pool_bufmgr_create(struct pb_manager *provider, 
109                    pb_size n, pb_size size,
110                    const struct pb_desc *desc);
111
112
113 /** 
114  * Static sub-allocator based the old memory manager.
115  * 
116  * It managers buffers of different sizes. It does so by allocating a buffer
117  * with the size of the heap, and then using the old mm memory manager to manage
118  * that heap. 
119  */
120 struct pb_manager *
121 mm_bufmgr_create(struct pb_manager *provider, 
122                  pb_size size, pb_size align2);
123
124 /**
125  * Same as mm_bufmgr_create.
126  * 
127  * Buffer will be release when the manager is destroyed.
128  */
129 struct pb_manager *
130 mm_bufmgr_create_from_buffer(struct pb_buffer *buffer, 
131                              pb_size size, pb_size align2);
132
133
134 /**
135  * Slab sub-allocator.
136  */
137 struct pb_manager *
138 pb_slab_manager_create(struct pb_manager *provider,
139                        pb_size bufSize,
140                        pb_size slabSize,
141                        const struct pb_desc *desc);
142
143 /**
144  * Allow a range of buffer size, by aggregating multiple slabs sub-allocators 
145  * with different bucket sizes.
146  */
147 struct pb_manager *
148 pb_slab_range_manager_create(struct pb_manager *provider,
149                              pb_size minBufSize,
150                              pb_size maxBufSize,
151                              pb_size slabSize,
152                              const struct pb_desc *desc);
153
154
155 /** 
156  * Time-based buffer cache.
157  *
158  * This manager keeps a cache of destroyed buffers during a time interval. 
159  */
160 struct pb_manager *
161 pb_cache_manager_create(struct pb_manager *provider, 
162                         unsigned usecs); 
163
164
165 struct pb_fence_ops;
166
167 /** 
168  * Fenced buffer manager.
169  *
170  * This manager is just meant for convenience. It wraps the buffers returned
171  * by another manager in fenced buffers, so that  
172  * 
173  * NOTE: the buffer manager that provides the buffers will be destroyed
174  * at the same time.
175  */
176 struct pb_manager *
177 fenced_bufmgr_create(struct pb_manager *provider,
178                      struct pb_fence_ops *ops,
179                      pb_size max_buffer_size,
180                      pb_size max_cpu_total_size);
181
182
183 struct pb_manager *
184 pb_alt_manager_create(struct pb_manager *provider1, 
185                       struct pb_manager *provider2);
186
187
188 /** 
189  * Ondemand buffer manager.
190  * 
191  * Buffers are created in malloc'ed memory (fast and cached), and the constents
192  * is transfered to a buffer from the provider (typically in slow uncached 
193  * memory) when there is an attempt to validate the buffer.
194  * 
195  * Ideal for situations where one does not know before hand whether a given
196  * buffer will effectively be used by the hardware or not. 
197  */
198 struct pb_manager *
199 pb_ondemand_manager_create(struct pb_manager *provider); 
200
201
202 /** 
203  * Debug buffer manager to detect buffer under- and overflows.
204  *
205  * Under/overflow sizes should be a multiple of the largest alignment
206  */
207 struct pb_manager *
208 pb_debug_manager_create(struct pb_manager *provider,
209                         pb_size underflow_size, pb_size overflow_size); 
210
211
212 #ifdef __cplusplus
213 }
214 #endif
215
216 #endif /*PB_BUFMGR_H_*/