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