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 1114682e706012fe26627a2f827db01b5068cc62814Marek Olšák assert(!pipe_is_referenced(&pool_buf->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 * 12167763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonsecapool_buffer_map(struct pb_buffer *buf, unsigned flags, void *flush_ctx) 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 12767763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca /* XXX: it will be necessary to remap here to propagate flush_ctx */ 12867763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca 1290bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(pool->mutex); 130b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca map = (unsigned char *) pool->map + pool_buf->start; 1310bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(pool->mutex); 132b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return map; 133b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 134b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 135b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 136b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1371e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_unmap(struct pb_buffer *buf) 138b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 139b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* No-op */ 140b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 141b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 142b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 143e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic enum pipe_error 144e06474dbae6979177629fb6187331291ff230c65José Fonsecapool_buffer_validate(struct pb_buffer *buf, 145e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pb_validate *vl, 146e06474dbae6979177629fb6187331291ff230c65José Fonseca unsigned flags) 147e06474dbae6979177629fb6187331291ff230c65José Fonseca{ 148e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 149e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pool_pb_manager *pool = pool_buf->mgr; 150e06474dbae6979177629fb6187331291ff230c65José Fonseca return pb_validate(pool->buffer, vl, flags); 151e06474dbae6979177629fb6187331291ff230c65José Fonseca} 152e06474dbae6979177629fb6187331291ff230c65José Fonseca 153e06474dbae6979177629fb6187331291ff230c65José Fonseca 154e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic void 155e06474dbae6979177629fb6187331291ff230c65José Fonsecapool_buffer_fence(struct pb_buffer *buf, 156e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pipe_fence_handle *fence) 157e06474dbae6979177629fb6187331291ff230c65José Fonseca{ 158e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 159e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pool_pb_manager *pool = pool_buf->mgr; 160e06474dbae6979177629fb6187331291ff230c65José Fonseca pb_fence(pool->buffer, fence); 161e06474dbae6979177629fb6187331291ff230c65José Fonseca} 162e06474dbae6979177629fb6187331291ff230c65José Fonseca 163e06474dbae6979177629fb6187331291ff230c65José Fonseca 164b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1651e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_buffer_get_base_buffer(struct pb_buffer *buf, 1661e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer **base_buf, 1672af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size *offset) 168b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 169b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf = pool_buffer(buf); 1701e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_buf->mgr; 1711e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_get_base_buffer(pool->buffer, base_buf, offset); 172b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *offset += pool_buf->start; 173b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 174b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 175b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1761e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic const struct pb_vtbl 177b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecapool_buffer_vtbl = { 1781e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pool_buffer_destroy, 179b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_map, 180b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_unmap, 181e06474dbae6979177629fb6187331291ff230c65José Fonseca pool_buffer_validate, 182e06474dbae6979177629fb6187331291ff230c65José Fonseca pool_buffer_fence, 183b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buffer_get_base_buffer 184b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 185b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 186b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1871e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic struct pb_buffer * 18865df0241465b2dae4979d71cad17b83cfd1fda11José Fonsecapool_bufmgr_create_buffer(struct pb_manager *mgr, 1892af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size size, 19065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 191b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 1921e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_pb_manager(mgr); 193b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf; 194b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct list_head *item; 195b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 196b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(size == pool->bufSize); 19728ecb986d958d52c9a996453e53418d1f98d7f75Michel Dänzer assert(pool->bufAlign % desc->alignment == 0); 198b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1990bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(pool->mutex); 200b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 201b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (pool->numFree == 0) { 2020bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(pool->mutex); 2039791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("warning: out of fixed size buffer objects\n"); 204b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 205b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 206b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 207b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca item = pool->free.next; 208b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 209b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (item == &pool->free) { 2100bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(pool->mutex); 2119791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("error: fixed size buffer pool corruption\n"); 212b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 213b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 214b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 215b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_DEL(item); 216b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca --pool->numFree; 217b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2180bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(pool->mutex); 219dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 220b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf = LIST_ENTRY(struct pool_buffer, item, head); 2214682e706012fe26627a2f827db01b5068cc62814Marek Olšák assert(!pipe_is_referenced(&pool_buf->base.reference)); 2224682e706012fe26627a2f827db01b5068cc62814Marek Olšák pipe_reference_init(&pool_buf->base.reference, 1); 2234682e706012fe26627a2f827db01b5068cc62814Marek Olšák pool_buf->base.alignment = desc->alignment; 2244682e706012fe26627a2f827db01b5068cc62814Marek Olšák pool_buf->base.usage = desc->usage; 225dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 226b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(pool_buf); 227b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 228b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 229b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 230b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 2311672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecapool_bufmgr_flush(struct pb_manager *mgr) 2321672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca{ 2331672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca /* No-op */ 2341672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca} 2351672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 2361672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 2371672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecastatic void 2381e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_destroy(struct pb_manager *mgr) 239b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2401e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool = pool_pb_manager(mgr); 2410bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(pool->mutex); 242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2430fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool->bufs); 244b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2451e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(pool->buffer); 246dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&pool->buffer, NULL); 247b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2480bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(pool->mutex); 249b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2500fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(mgr); 251b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 252b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 253b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2541e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager * 2551e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellpool_bufmgr_create(struct pb_manager *provider, 2562af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size numBufs, 2572af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size bufSize, 25865df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 259b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2601e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pool_pb_manager *pool; 261b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct pool_buffer *pool_buf; 2622af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size i; 263b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 264ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca if(!provider) 265ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca return NULL; 266ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca 267ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca pool = CALLOC_STRUCT(pool_pb_manager); 268b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool) 269b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 270b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 271b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->base.destroy = pool_bufmgr_destroy; 272b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->base.create_buffer = pool_bufmgr_create_buffer; 2731672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca pool->base.flush = pool_bufmgr_flush; 274b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 275b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_INITHEAD(&pool->free); 276b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 277b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numTot = numBufs; 278b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->numFree = numBufs; 279b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool->bufSize = bufSize; 28065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca pool->bufAlign = desc->alignment; 281b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2820bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_init(pool->mutex); 283b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 28465df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca pool->buffer = provider->create_buffer(provider, numBufs*bufSize, desc); 285b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool->buffer) 286b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 287b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2881e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pool->map = pb_map(pool->buffer, 289287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PB_USAGE_CPU_READ | 290b5fcf0c8e07e666523b007fab1d0fc18c2c89241Dave Airlie PB_USAGE_CPU_WRITE, NULL); 291b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!pool->map) 292b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 293b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 29493d727eea75812ecb21706804033a33d2e761eb8José Fonseca pool->bufs = (struct pool_buffer *)CALLOC(numBufs, sizeof(*pool->bufs)); 295b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!pool->bufs) 296b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 297b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 298b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf = pool->bufs; 299b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca for (i = 0; i < numBufs; ++i) { 3004682e706012fe26627a2f827db01b5068cc62814Marek Olšák pipe_reference_init(&pool_buf->base.reference, 0); 3014682e706012fe26627a2f827db01b5068cc62814Marek Olšák pool_buf->base.alignment = 0; 3024682e706012fe26627a2f827db01b5068cc62814Marek Olšák pool_buf->base.usage = 0; 3034682e706012fe26627a2f827db01b5068cc62814Marek Olšák pool_buf->base.size = bufSize; 304b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->base.vtbl = &pool_buffer_vtbl; 305b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->mgr = pool; 306b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf->start = i * bufSize; 307b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca LIST_ADDTAIL(&pool_buf->head, &pool->free); 308b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca pool_buf++; 309b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 310b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 311b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(pool); 312b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 313b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure: 314b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->bufs) 3150fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool->bufs); 316b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->map) 3171e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(pool->buffer); 318b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool->buffer) 319dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&pool->buffer, NULL); 320b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(pool) 3210fe428f1dfafe6bfb8896e0a08cbe12d569497d7Michal Krol FREE(pool); 322b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 323b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 324