pb_bufmgr_pool.c revision 4f25420bdd834e81a3e22733304efc5261c2998a
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 * 33ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca * \author José Fonseca <jrfonseca-at-tungstengraphics-dot-com> 34ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca * \author Thomas Hellström <thomas-at-tungstengraphics-dot-com> 35b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */ 36b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 37b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 38687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_compiler.h" 39687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_debug.h" 40687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_thread.h" 41687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_defines.h" 424f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 43b9da3791c934e05b82063a8c79c423a0a8e29a94José Fonseca#include "util/u_double_list.h" 44b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 45b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_buffer.h" 46b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_bufmgr.h" 47b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 48b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 49b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/** 50b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Convenience macro (type safe). 51b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */ 52b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#define SUPER(__derived) (&(__derived)->base) 53b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 54b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 551e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pool_pb_manager 56b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 571e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_manager base; 58b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 59b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_Mutex mutex; 60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 61b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t bufSize; 6265df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca size_t bufAlign; 63b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 64b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t numFree; 65b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t numTot; 66b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 67b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct list_head free; 68b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 691e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer *buffer; 70b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca void *map; 71b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 72b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *bufs; 73b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 74b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 75b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 766c3d12e374939d36a23af7c9c502de18ce02f423Michal Krolstatic INLINE struct pool_pb_manager * 771e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_pb_manager(struct pb_manager *mgr) 78b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 79b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(mgr); 801e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell return (struct pool_pb_manager *)mgr; 81b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 82b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 83b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 84b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastruct pool_buffer 85b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 861e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer base; 87b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 881e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *mgr; 89b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 90b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct list_head head; 91b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 92b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t start; 93b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 94b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 95b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 966c3d12e374939d36a23af7c9c502de18ce02f423Michal Krolstatic INLINE struct pool_buffer * 971e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer(struct pb_buffer *buf) 98b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 99b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(buf); 100b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return (struct pool_buffer *)buf; 101b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 102b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 103b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 104b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 105b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1061e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_destroy(struct pb_buffer *buf) 107b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 108b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 1091e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_buf->mgr; 110b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 111dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca assert(pool_buf->base.base.refcount == 0); 112dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 113b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(pool->mutex); 114b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_ADD(&pool_buf->head, &pool->free); 115b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numFree++; 116b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 117b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 118b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 119b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 120b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void * 1211e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_map(struct pb_buffer *buf, unsigned flags) 122b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 123b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 1241e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_buf->mgr; 125b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca void *map; 126b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 127b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(pool->mutex); 128b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca map = (unsigned char *) pool->map + pool_buf->start; 129b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 130b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return map; 131b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 132b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 133b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 134b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1351e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_unmap(struct pb_buffer *buf) 136b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 137b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* No-op */ 138b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 139b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 140b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 141b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1421e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_get_base_buffer(struct pb_buffer *buf, 1431e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer **base_buf, 144b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca unsigned *offset) 145b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 146b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 1471e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_buf->mgr; 1481e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_get_base_buffer(pool->buffer, base_buf, offset); 149b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *offset += pool_buf->start; 150b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 151b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 152b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic const struct pb_vtbl 154b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecapool_buffer_vtbl = { 1551e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pool_buffer_destroy, 156b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_map, 157b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_unmap, 158b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_get_base_buffer 159b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 160b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 161b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1621e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic struct pb_buffer * 16365df0241465b2dae4979d71cad17b83cfd1fda11José Fonsecapool_bufmgr_create_buffer(struct pb_manager *mgr, 16465df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca size_t size, 16565df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 166b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 1671e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_pb_manager(mgr); 168b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf; 169b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct list_head *item; 170b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 171b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(size == pool->bufSize); 17228ecb986d958d52c9a996453e53418d1f98d7f75Michel Dänzer assert(pool->bufAlign % desc->alignment == 0); 173b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 174b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(pool->mutex); 175b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 176b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (pool->numFree == 0) { 177b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 1789791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("warning: out of fixed size buffer objects\n"); 179b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 180b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 181b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 182b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca item = pool->free.next; 183b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 184b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (item == &pool->free) { 185b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 1869791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("error: fixed size buffer pool corruption\n"); 187b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 188b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 189b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 190b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_DEL(item); 191b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca --pool->numFree; 192b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 193b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 194dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 195b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf = LIST_ENTRY(struct pool_buffer, item, head); 196dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca assert(pool_buf->base.base.refcount == 0); 197dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.refcount = 1; 198dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.alignment = desc->alignment; 199dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.usage = desc->usage; 200dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 201b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(pool_buf); 202b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 203b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 204b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 205b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 2061e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_destroy(struct pb_manager *mgr) 207b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2081e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_pb_manager(mgr); 209b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_LOCK_MUTEX(pool->mutex); 210b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2110fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool->bufs); 212b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2131e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(pool->buffer); 214dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&pool->buffer, NULL); 215b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 216b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_UNLOCK_MUTEX(pool->mutex); 217b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2180fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(mgr); 219b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 220b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 221b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2221e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager * 2231e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_create(struct pb_manager *provider, 224b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t numBufs, 22565df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca size_t bufSize, 22665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 227b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2281e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool; 229b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf; 2306c3d12e374939d36a23af7c9c502de18ce02f423Michal Krol size_t i; 231b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 232ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca if(!provider) 233ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca return NULL; 234ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca 235ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca pool = CALLOC_STRUCT(pool_pb_manager); 236b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool) 237b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 238b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 239b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->base.destroy = pool_bufmgr_destroy; 240b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->base.create_buffer = pool_bufmgr_create_buffer; 241b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_INITHEAD(&pool->free); 243b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 244b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numTot = numBufs; 245b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numFree = numBufs; 246b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->bufSize = bufSize; 24765df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca pool->bufAlign = desc->alignment; 248b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 249b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca _glthread_INIT_MUTEX(pool->mutex); 250b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 25165df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca pool->buffer = provider->create_buffer(provider, numBufs*bufSize, desc); 252b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool->buffer) 253b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 254b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2551e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pool->map = pb_map(pool->buffer, 256756d52ec12c41ee90ee9598dc9028cc134806bd2Michel Dänzer PIPE_BUFFER_USAGE_CPU_READ | 257756d52ec12c41ee90ee9598dc9028cc134806bd2Michel Dänzer PIPE_BUFFER_USAGE_CPU_WRITE); 258b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!pool->map) 259b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 260b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 26193d727eea75812ecb21706804033a33d2e761eb8José Fonseca pool->bufs = (struct pool_buffer *)CALLOC(numBufs, sizeof(*pool->bufs)); 262b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool->bufs) 263b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 264b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 265b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf = pool->bufs; 266b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca for (i = 0; i < numBufs; ++i) { 267dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.refcount = 0; 268dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.alignment = 0; 269dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.usage = 0; 270dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.size = bufSize; 271b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->base.vtbl = &pool_buffer_vtbl; 272b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->mgr = pool; 273b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->start = i * bufSize; 274b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_ADDTAIL(&pool_buf->head, &pool->free); 275b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf++; 276b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 277b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 278b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(pool); 279b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 280b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure: 281b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->bufs) 2820fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool->bufs); 283b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->map) 2841e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(pool->buffer); 285b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->buffer) 286dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&pool->buffer, NULL); 287b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool) 2880fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool); 289b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 290b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 291