pb_bufmgr_pool.c revision 687a8b96ef13658bbe779d0011ce1144844f1972
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 * 33b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * \author Jos� Fonseca <jrfonseca-at-tungstengraphics-dot-com> 34b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * \author Thomas Hellstr�m <thomas-at-tungstengraphics-dot-com> 35b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */ 36b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 37b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 38b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "linked_list.h" 39b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 40687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_compiler.h" 41687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_debug.h" 42687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_thread.h" 43687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_defines.h" 44687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_util.h" 45b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 46b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_buffer.h" 47b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_bufmgr.h" 48b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 49b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 50b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/** 51b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Convenience macro (type safe). 52b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */ 53b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#define SUPER(__derived) (&(__derived)->base) 54b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 55b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 561e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pool_pb_manager 57b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 581e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_manager base; 59b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_Mutex mutex; 61b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 62b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t bufSize; 6365df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca size_t bufAlign; 64b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 65b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t numFree; 66b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t numTot; 67b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 68b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct list_head free; 69b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 701e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer *buffer; 71b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca void *map; 72b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 73b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *bufs; 74b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 75b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 76b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 776c3d12e374939d36a23af7c9c502de18ce02f423Michal Krolstatic INLINE struct pool_pb_manager * 781e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_pb_manager(struct pb_manager *mgr) 79b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 80b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(mgr); 811e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell return (struct pool_pb_manager *)mgr; 82b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 83b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 84b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 85b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastruct pool_buffer 86b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 871e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer base; 88b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 891e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *mgr; 90b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 91b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct list_head head; 92b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 93b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t start; 94b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 95b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 96b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 976c3d12e374939d36a23af7c9c502de18ce02f423Michal Krolstatic INLINE struct pool_buffer * 981e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer(struct pb_buffer *buf) 99b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 100b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(buf); 101b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return (struct pool_buffer *)buf; 102b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 103b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 104b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 105b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 106b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1071e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_destroy(struct pb_buffer *buf) 108b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 109b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 1101e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_buf->mgr; 111b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 112dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca assert(pool_buf->base.base.refcount == 0); 113dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 114b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(pool->mutex); 115b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_ADD(&pool_buf->head, &pool->free); 116b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numFree++; 117b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 118b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 119b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 120b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 121b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void * 1221e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_map(struct pb_buffer *buf, unsigned flags) 123b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 124b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 1251e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_buf->mgr; 126b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca void *map; 127b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 128b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(pool->mutex); 129b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca map = (unsigned char *) pool->map + pool_buf->start; 130b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 131b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return map; 132b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 133b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 134b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 135b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1361e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_unmap(struct pb_buffer *buf) 137b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 138b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* No-op */ 139b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 140b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 141b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 142b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1431e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_get_base_buffer(struct pb_buffer *buf, 1441e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer **base_buf, 145b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca unsigned *offset) 146b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 147b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 1481e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_buf->mgr; 1491e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_get_base_buffer(pool->buffer, base_buf, offset); 150b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *offset += pool_buf->start; 151b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 152b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 153b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1541e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic const struct pb_vtbl 155b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecapool_buffer_vtbl = { 1561e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pool_buffer_destroy, 157b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_map, 158b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_unmap, 159b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_get_base_buffer 160b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 161b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 162b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1631e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic struct pb_buffer * 16465df0241465b2dae4979d71cad17b83cfd1fda11José Fonsecapool_bufmgr_create_buffer(struct pb_manager *mgr, 16565df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca size_t size, 16665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 167b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 1681e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_pb_manager(mgr); 169b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf; 170b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct list_head *item; 171b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 172b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(size == pool->bufSize); 17328ecb986d958d52c9a996453e53418d1f98d7f75Michel Dänzer assert(pool->bufAlign % desc->alignment == 0); 174b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 175b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(pool->mutex); 176b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 177b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (pool->numFree == 0) { 178b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 1799791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("warning: out of fixed size buffer objects\n"); 180b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 181b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 182b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 183b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca item = pool->free.next; 184b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 185b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (item == &pool->free) { 186b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 1879791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("error: fixed size buffer pool corruption\n"); 188b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 189b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 190b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 191b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_DEL(item); 192b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca --pool->numFree; 193b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 194b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 195dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 196b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf = LIST_ENTRY(struct pool_buffer, item, head); 197dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca assert(pool_buf->base.base.refcount == 0); 198dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.refcount = 1; 199dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.alignment = desc->alignment; 200dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.usage = desc->usage; 201dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 202b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(pool_buf); 203b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 204b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 205b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 206b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 2071e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_destroy(struct pb_manager *mgr) 208b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2091e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_pb_manager(mgr); 210b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(pool->mutex); 211b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2120fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool->bufs); 213b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2141e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(pool->buffer); 215dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&pool->buffer, NULL); 216b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 217b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 218b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2190fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(mgr); 220b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 221b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 222b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2231e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager * 2241e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_create(struct pb_manager *provider, 225b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t numBufs, 22665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca size_t bufSize, 22765df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 228b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2291e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool; 230b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf; 2316c3d12e374939d36a23af7c9c502de18ce02f423Michal Krol size_t i; 232b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2330fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol pool = (struct pool_pb_manager *)CALLOC(1, sizeof(*pool)); 234b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool) 235b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 236b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 237b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->base.destroy = pool_bufmgr_destroy; 238b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->base.create_buffer = pool_bufmgr_create_buffer; 239b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 240b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_INITHEAD(&pool->free); 241b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numTot = numBufs; 243b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numFree = numBufs; 244b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->bufSize = bufSize; 24565df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca pool->bufAlign = desc->alignment; 246b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 247b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_INIT_MUTEX(pool->mutex); 248b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 24965df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca pool->buffer = provider->create_buffer(provider, numBufs*bufSize, desc); 250b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool->buffer) 251b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 252b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pool->map = pb_map(pool->buffer, 254756d52ec12c41ee90ee9598dc9028cc134806bd2Michel Dänzer PIPE_BUFFER_USAGE_CPU_READ | 255756d52ec12c41ee90ee9598dc9028cc134806bd2Michel Dänzer PIPE_BUFFER_USAGE_CPU_WRITE); 256b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!pool->map) 257b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 258b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 25993d727eea75812ecb21706804033a33d2e761eb8José Fonseca pool->bufs = (struct pool_buffer *)CALLOC(numBufs, sizeof(*pool->bufs)); 260b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool->bufs) 261b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 262b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 263b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf = pool->bufs; 264b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca for (i = 0; i < numBufs; ++i) { 265dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.refcount = 0; 266dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.alignment = 0; 267dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.usage = 0; 268dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.size = bufSize; 269b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->base.vtbl = &pool_buffer_vtbl; 270b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->mgr = pool; 271b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->start = i * bufSize; 272b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_ADDTAIL(&pool_buf->head, &pool->free); 273b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf++; 274b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 275b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 276b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(pool); 277b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 278b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure: 279b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->bufs) 2800fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool->bufs); 281b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->map) 2821e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(pool->buffer); 283b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->buffer) 284dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&pool->buffer, NULL); 285b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool) 2860fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool); 287b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 288b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 289