pb_bufmgr_pool.c revision b5fcf0c8e07e666523b007fab1d0fc18c2c89241
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 * 33e06474dbae6979177629fb6187331291ff230c65José Fonseca * \author Jose 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" 39ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h" 402aaca1df9df6980ec88180c8866c8987b31db91aJosé Fonseca#include "os/os_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 590bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex mutex; 60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 612af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size bufSize; 622af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size bufAlign; 63b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 642af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size numFree; 652af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size 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 922af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size 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 111e9d156e9e4f92ae1ce70bd563c251b34d238c4bcMichel Dänzer assert(!pipe_is_referenced(&pool_buf->base.base.reference)); 112dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 1130bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(pool->mutex); 114b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_ADD(&pool_buf->head, &pool->free); 115b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numFree++; 1160bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(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 1270bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(pool->mutex); 128b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca map = (unsigned char *) pool->map + pool_buf->start; 1290bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(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 141e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic enum pipe_error 142e06474dbae6979177629fb6187331291ff230c65José Fonsecapool_buffer_validate(struct pb_buffer *buf, 143e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pb_validate *vl, 144e06474dbae6979177629fb6187331291ff230c65José Fonseca unsigned flags) 145e06474dbae6979177629fb6187331291ff230c65José Fonseca{ 146e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 147e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pool_pb_manager *pool = pool_buf->mgr; 148e06474dbae6979177629fb6187331291ff230c65José Fonseca return pb_validate(pool->buffer, vl, flags); 149e06474dbae6979177629fb6187331291ff230c65José Fonseca} 150e06474dbae6979177629fb6187331291ff230c65José Fonseca 151e06474dbae6979177629fb6187331291ff230c65José Fonseca 152e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic void 153e06474dbae6979177629fb6187331291ff230c65José Fonsecapool_buffer_fence(struct pb_buffer *buf, 154e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pipe_fence_handle *fence) 155e06474dbae6979177629fb6187331291ff230c65José Fonseca{ 156e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 157e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pool_pb_manager *pool = pool_buf->mgr; 158e06474dbae6979177629fb6187331291ff230c65José Fonseca pb_fence(pool->buffer, fence); 159e06474dbae6979177629fb6187331291ff230c65José Fonseca} 160e06474dbae6979177629fb6187331291ff230c65José Fonseca 161e06474dbae6979177629fb6187331291ff230c65José Fonseca 162b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1631e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_get_base_buffer(struct pb_buffer *buf, 1641e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer **base_buf, 1652af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size *offset) 166b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 167b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 1681e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_buf->mgr; 1691e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_get_base_buffer(pool->buffer, base_buf, offset); 170b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *offset += pool_buf->start; 171b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 172b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 173b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1741e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic const struct pb_vtbl 175b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecapool_buffer_vtbl = { 1761e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pool_buffer_destroy, 177b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_map, 178b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_unmap, 179e06474dbae6979177629fb6187331291ff230c65José Fonseca pool_buffer_validate, 180e06474dbae6979177629fb6187331291ff230c65José Fonseca pool_buffer_fence, 181b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_get_base_buffer 182b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 183b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 184b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1851e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic struct pb_buffer * 18665df0241465b2dae4979d71cad17b83cfd1fda11José Fonsecapool_bufmgr_create_buffer(struct pb_manager *mgr, 1872af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size size, 18865df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 189b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 1901e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_pb_manager(mgr); 191b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf; 192b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct list_head *item; 193b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 194b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(size == pool->bufSize); 19528ecb986d958d52c9a996453e53418d1f98d7f75Michel Dänzer assert(pool->bufAlign % desc->alignment == 0); 196b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1970bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(pool->mutex); 198b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 199b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (pool->numFree == 0) { 2000bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(pool->mutex); 2019791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("warning: out of fixed size buffer objects\n"); 202b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 203b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 204b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 205b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca item = pool->free.next; 206b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 207b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (item == &pool->free) { 2080bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(pool->mutex); 2099791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("error: fixed size buffer pool corruption\n"); 210b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 211b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 212b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 213b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_DEL(item); 214b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca --pool->numFree; 215b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2160bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(pool->mutex); 217dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 218b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf = LIST_ENTRY(struct pool_buffer, item, head); 219e9d156e9e4f92ae1ce70bd563c251b34d238c4bcMichel Dänzer assert(!pipe_is_referenced(&pool_buf->base.base.reference)); 2205e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer pipe_reference_init(&pool_buf->base.base.reference, 1); 221dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.alignment = desc->alignment; 222dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.usage = desc->usage; 223dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 224b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(pool_buf); 225b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 226b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 227b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 228b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 2291672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecapool_bufmgr_flush(struct pb_manager *mgr) 2301672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca{ 2311672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca /* No-op */ 2321672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca} 2331672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 2341672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 2351672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecastatic void 2361e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_destroy(struct pb_manager *mgr) 237b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2381e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_pb_manager(mgr); 2390bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(pool->mutex); 240b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2410fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool->bufs); 242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2431e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(pool->buffer); 244dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&pool->buffer, NULL); 245b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2460bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(pool->mutex); 247b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2480fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(mgr); 249b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 250b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 251b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2521e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager * 2531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_create(struct pb_manager *provider, 2542af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size numBufs, 2552af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size bufSize, 25665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 257b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2581e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool; 259b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf; 2602af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size i; 261b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 262ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca if(!provider) 263ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca return NULL; 264ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca 265ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca pool = CALLOC_STRUCT(pool_pb_manager); 266b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool) 267b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 268b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 269b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->base.destroy = pool_bufmgr_destroy; 270b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->base.create_buffer = pool_bufmgr_create_buffer; 2711672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca pool->base.flush = pool_bufmgr_flush; 272b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 273b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_INITHEAD(&pool->free); 274b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 275b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numTot = numBufs; 276b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numFree = numBufs; 277b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->bufSize = bufSize; 27865df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca pool->bufAlign = desc->alignment; 279b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2800bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_init(pool->mutex); 281b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 28265df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca pool->buffer = provider->create_buffer(provider, numBufs*bufSize, desc); 283b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool->buffer) 284b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 285b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2861e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pool->map = pb_map(pool->buffer, 287287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PB_USAGE_CPU_READ | 288b5fcf0c8e07e666523b007fab1d0fc18c2c89241Dave Airlie PB_USAGE_CPU_WRITE, NULL); 289b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!pool->map) 290b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 291b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 29293d727eea75812ecb21706804033a33d2e761eb8José Fonseca pool->bufs = (struct pool_buffer *)CALLOC(numBufs, sizeof(*pool->bufs)); 293b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool->bufs) 294b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 295b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 296b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf = pool->bufs; 297b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca for (i = 0; i < numBufs; ++i) { 2985e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer pipe_reference_init(&pool_buf->base.base.reference, 0); 299dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.alignment = 0; 300dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.usage = 0; 301dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pool_buf->base.base.size = bufSize; 302b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->base.vtbl = &pool_buffer_vtbl; 303b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->mgr = pool; 304b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->start = i * bufSize; 305b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_ADDTAIL(&pool_buf->head, &pool->free); 306b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf++; 307b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 308b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 309b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(pool); 310b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 311b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure: 312b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->bufs) 3130fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool->bufs); 314b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->map) 3151e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(pool->buffer); 316b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->buffer) 317dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&pool->buffer, NULL); 318b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool) 3190fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool); 320b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 321b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 322