1b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/************************************************************************** 2b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 3b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas. 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 above copyright notice and this permission notice (including the 15b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * next paragraph) shall be included in all copies or substantial portions 16b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * of the Software. 17b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 18b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 26b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca **************************************************************************/ 27b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 28b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/** 29b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * \file 30b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Buffer manager using the old texture memory manager. 31b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 32e06474dbae6979177629fb6187331291ff230c65José Fonseca * \author Jose Fonseca <jrfonseca@tungstengraphics.com> 33b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */ 34b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 35b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 36687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_defines.h" 37ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h" 382aaca1df9df6980ec88180c8866c8987b31db91aJosé Fonseca#include "os/os_thread.h" 394f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 40b9da3791c934e05b82063a8c79c423a0a8e29a94José Fonseca#include "util/u_double_list.h" 4117158c2f00f5bee29ec8239367fd5498f22e4a91José Fonseca#include "util/u_mm.h" 42b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_buffer.h" 43b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_bufmgr.h" 44b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 45b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 46b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/** 47b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Convenience macro (type safe). 48b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */ 49b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#define SUPER(__derived) (&(__derived)->base) 50b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 51b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 521e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct mm_pb_manager 53b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 541e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_manager base; 55b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 560bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex mutex; 57b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 582af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size size; 59b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mem_block *heap; 60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 612af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size align2; 62b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 631e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer *buffer; 64b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca void *map; 65b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 66b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 67b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 6850d5f304ad9eba8fe95a6cedfc56cd7213b33feaJosé Fonsecastatic INLINE struct mm_pb_manager * 691e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_pb_manager(struct pb_manager *mgr) 70b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 71b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(mgr); 721e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell return (struct mm_pb_manager *)mgr; 73b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 74b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 75b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 76b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastruct mm_buffer 77b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 781e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer base; 79b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 801e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mgr; 81b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 82b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mem_block *block; 83b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 84b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 85b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 8650d5f304ad9eba8fe95a6cedfc56cd7213b33feaJosé Fonsecastatic INLINE struct mm_buffer * 871e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer(struct pb_buffer *buf) 88b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 89b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(buf); 90b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return (struct mm_buffer *)buf; 91b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 92b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 93b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 94b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 951e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_destroy(struct pb_buffer *buf) 96b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 97b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf = mm_buffer(buf); 981e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm = mm_buf->mgr; 99b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1004682e706012fe26627a2f827db01b5068cc62814Marek Olšák assert(!pipe_is_referenced(&mm_buf->base.reference)); 10193d727eea75812ecb21706804033a33d2e761eb8José Fonseca 1020bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(mm->mutex); 1033ad56968f09397a8dd417eae025b9506efaf8414Brian Paul u_mmFreeMem(mm_buf->block); 1045e27cd46c04a9e7b5904cc014bffd0f4daae31feMichel Dänzer FREE(mm_buf); 1050bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(mm->mutex); 106b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 107b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 108b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 109b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void * 1101e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_map(struct pb_buffer *buf, 11167763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca unsigned flags, 11267763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca void *flush_ctx) 113b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 114b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf = mm_buffer(buf); 1151e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm = mm_buf->mgr; 116b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 11767763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca /* XXX: it will be necessary to remap here to propagate flush_ctx */ 11867763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca 119b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return (unsigned char *) mm->map + mm_buf->block->ofs; 120b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 121b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 122b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 123b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1241e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_unmap(struct pb_buffer *buf) 125b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 126b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* No-op */ 127b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 128b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 129b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 130e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic enum pipe_error 131e06474dbae6979177629fb6187331291ff230c65José Fonsecamm_buffer_validate(struct pb_buffer *buf, 132e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pb_validate *vl, 133e06474dbae6979177629fb6187331291ff230c65José Fonseca unsigned flags) 134e06474dbae6979177629fb6187331291ff230c65José Fonseca{ 135e06474dbae6979177629fb6187331291ff230c65José Fonseca struct mm_buffer *mm_buf = mm_buffer(buf); 136e06474dbae6979177629fb6187331291ff230c65José Fonseca struct mm_pb_manager *mm = mm_buf->mgr; 137e06474dbae6979177629fb6187331291ff230c65José Fonseca return pb_validate(mm->buffer, vl, flags); 138e06474dbae6979177629fb6187331291ff230c65José Fonseca} 139e06474dbae6979177629fb6187331291ff230c65José Fonseca 140e06474dbae6979177629fb6187331291ff230c65José Fonseca 141e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic void 142e06474dbae6979177629fb6187331291ff230c65José Fonsecamm_buffer_fence(struct pb_buffer *buf, 143e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pipe_fence_handle *fence) 144e06474dbae6979177629fb6187331291ff230c65José Fonseca{ 145e06474dbae6979177629fb6187331291ff230c65José Fonseca struct mm_buffer *mm_buf = mm_buffer(buf); 146e06474dbae6979177629fb6187331291ff230c65José Fonseca struct mm_pb_manager *mm = mm_buf->mgr; 147e06474dbae6979177629fb6187331291ff230c65José Fonseca pb_fence(mm->buffer, fence); 148e06474dbae6979177629fb6187331291ff230c65José Fonseca} 149e06474dbae6979177629fb6187331291ff230c65José Fonseca 150e06474dbae6979177629fb6187331291ff230c65José Fonseca 151b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1521e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_get_base_buffer(struct pb_buffer *buf, 1531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer **base_buf, 1542af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size *offset) 155b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 156b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf = mm_buffer(buf); 1571e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm = mm_buf->mgr; 1581e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_get_base_buffer(mm->buffer, base_buf, offset); 159b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *offset += mm_buf->block->ofs; 160b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 161b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 162b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1631e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic const struct pb_vtbl 164b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_vtbl = { 1651e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell mm_buffer_destroy, 166b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_map, 167b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_unmap, 168e06474dbae6979177629fb6187331291ff230c65José Fonseca mm_buffer_validate, 169e06474dbae6979177629fb6187331291ff230c65José Fonseca mm_buffer_fence, 170b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_get_base_buffer 171b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 172b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 173b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1741e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic struct pb_buffer * 1751e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create_buffer(struct pb_manager *mgr, 1762af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size size, 17765df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 178b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 1791e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm = mm_pb_manager(mgr); 180b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf; 181b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 18265df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca /* We don't handle alignments larger then the one initially setup */ 1832af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca assert(pb_check_alignment(desc->alignment, (pb_size)1 << mm->align2)); 1842af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca if(!pb_check_alignment(desc->alignment, (pb_size)1 << mm->align2)) 18565df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca return NULL; 18665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca 1870bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(mm->mutex); 188b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 189ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca mm_buf = CALLOC_STRUCT(mm_buffer); 190b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!mm_buf) { 1910bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(mm->mutex); 192b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 193b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 194b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1954682e706012fe26627a2f827db01b5068cc62814Marek Olšák pipe_reference_init(&mm_buf->base.reference, 1); 1964682e706012fe26627a2f827db01b5068cc62814Marek Olšák mm_buf->base.alignment = desc->alignment; 1974682e706012fe26627a2f827db01b5068cc62814Marek Olšák mm_buf->base.usage = desc->usage; 1984682e706012fe26627a2f827db01b5068cc62814Marek Olšák mm_buf->base.size = size; 199dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 200b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buf->base.vtbl = &mm_buffer_vtbl; 201b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 202b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buf->mgr = mm; 203b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2042af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca mm_buf->block = u_mmAllocMem(mm->heap, (int)size, (int)mm->align2, 0); 205b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!mm_buf->block) { 206b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#if 0 20777c329a2773820c57e7b286858e80a596f89ef94Jakob Bornecrantz debug_printf("warning: heap full\n"); 208b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mmDumpMemInfo(mm->heap); 209b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#endif 210c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca FREE(mm_buf); 211c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca pipe_mutex_unlock(mm->mutex); 212c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca return NULL; 213b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 214b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 215b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* Some sanity checks */ 2162af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca assert(0 <= (pb_size)mm_buf->block->ofs && (pb_size)mm_buf->block->ofs < mm->size); 2172af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca assert(size <= (pb_size)mm_buf->block->size && (pb_size)mm_buf->block->ofs + (pb_size)mm_buf->block->size <= mm->size); 218b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2190bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(mm->mutex); 220b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(mm_buf); 221b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 222b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 223b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 224b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 2251672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecamm_bufmgr_flush(struct pb_manager *mgr) 2261672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca{ 2271672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca /* No-op */ 2281672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca} 2291672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 2301672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 2311672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecastatic void 2321e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_destroy(struct pb_manager *mgr) 233b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2341e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm = mm_pb_manager(mgr); 235b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2360bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(mm->mutex); 237b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2383ad56968f09397a8dd417eae025b9506efaf8414Brian Paul u_mmDestroy(mm->heap); 239b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2401e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(mm->buffer); 241dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&mm->buffer, NULL); 242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2430bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(mm->mutex); 244b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 245ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca FREE(mgr); 246b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 247b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 248b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2491e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager * 2501e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create_from_buffer(struct pb_buffer *buffer, 2512af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size size, pb_size align2) 252b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm; 254b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2553eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca if(!buffer) 2563eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca return NULL; 2573eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 258ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca mm = CALLOC_STRUCT(mm_pb_manager); 259b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!mm) 260b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 261b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 262b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->base.destroy = mm_bufmgr_destroy; 2631672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca mm->base.create_buffer = mm_bufmgr_create_buffer; 2641672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca mm->base.flush = mm_bufmgr_flush; 265b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 266b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->size = size; 267b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->align2 = align2; /* 64-byte alignment */ 268b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2690bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_init(mm->mutex); 270b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2713eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca mm->buffer = buffer; 272b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2731e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell mm->map = pb_map(mm->buffer, 274287c94ea4987033f9c99a2f91c5750c9083504caKeith Whitwell PB_USAGE_CPU_READ | 275b5fcf0c8e07e666523b007fab1d0fc18c2c89241Dave Airlie PB_USAGE_CPU_WRITE, NULL); 276b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!mm->map) 277b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 278b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2792af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca mm->heap = u_mmInit(0, (int)size); 280b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!mm->heap) 281b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 282b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 283b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(mm); 284b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 285b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure: 286b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecaif(mm->heap) 287cbce12b5404846520bb776f73885f0ea99a13124Brian Paul u_mmDestroy(mm->heap); 288b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(mm->map) 2891e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(mm->buffer); 290b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(mm) 291ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca FREE(mm); 292b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 293b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 2943eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 2953eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 2961e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager * 2971e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create(struct pb_manager *provider, 2982af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size size, pb_size align2) 2993eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca{ 3001e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer *buffer; 3011e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_manager *mgr; 30265df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca struct pb_desc desc; 3033eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 304ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca if(!provider) 305ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca return NULL; 30665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca 30765df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca memset(&desc, 0, sizeof(desc)); 30865df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca desc.alignment = 1 << align2; 30965df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca 31065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca buffer = provider->create_buffer(provider, size, &desc); 3113eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca if (!buffer) 3123eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca return NULL; 3133eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 3143eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca mgr = mm_bufmgr_create_from_buffer(buffer, size, align2); 3153eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca if (!mgr) { 316dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&buffer, NULL); 3173eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca return NULL; 3183eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca } 3193eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 3203eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca return mgr; 3213eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca} 322