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