pb_bufmgr_mm.c revision c7431552c0ff203cd4b3ae37751b10e6111e4167
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 * 32aef455c4a7bbd7df97a6444ae332cb5fb976e627Keith Whitwell * \author José Fonseca <jrfonseca@tungstengraphics.com> 33b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */ 34b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 35b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 36687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_defines.h" 37687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_debug.h" 38687a8b96ef13658bbe779d0011ce1144844f1972José Fonseca#include "pipe/p_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 58b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t size; 59b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mem_block *heap; 60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 61b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca size_t 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 10093d727eea75812ecb21706804033a33d2e761eb8José Fonseca assert(buf->base.refcount == 0); 10193d727eea75812ecb21706804033a33d2e761eb8José Fonseca 1020bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(mm->mutex); 103b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mmFreeMem(mm_buf->block); 104ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca FREE(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, 111b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca unsigned flags) 112b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 113b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf = mm_buffer(buf); 1141e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm = mm_buf->mgr; 115b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 116b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return (unsigned char *) mm->map + mm_buf->block->ofs; 117b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 118b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 119b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 120b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1211e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_unmap(struct pb_buffer *buf) 122b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 123b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* No-op */ 124b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 125b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 126b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 127b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1281e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_buffer_get_base_buffer(struct pb_buffer *buf, 1291e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer **base_buf, 130b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca unsigned *offset) 131b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 132b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf = mm_buffer(buf); 1331e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm = mm_buf->mgr; 1341e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_get_base_buffer(mm->buffer, base_buf, offset); 135b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *offset += mm_buf->block->ofs; 136b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 137b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 138b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1391e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic const struct pb_vtbl 140b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamm_buffer_vtbl = { 1411e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell mm_buffer_destroy, 142b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_map, 143b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_unmap, 144b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buffer_get_base_buffer 145b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 146b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 147b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1481e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic struct pb_buffer * 1491e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create_buffer(struct pb_manager *mgr, 15065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca size_t size, 15165df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 152b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 1531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm = mm_pb_manager(mgr); 154b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct mm_buffer *mm_buf; 155b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 15665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca /* We don't handle alignments larger then the one initially setup */ 15765df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca assert(desc->alignment % (1 << mm->align2) == 0); 15865df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca if(desc->alignment % (1 << mm->align2)) 15965df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca return NULL; 16065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca 1610bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(mm->mutex); 162b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 163ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca mm_buf = CALLOC_STRUCT(mm_buffer); 164b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!mm_buf) { 1650bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(mm->mutex); 166b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 167b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 168b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 169dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca mm_buf->base.base.refcount = 1; 170dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca mm_buf->base.base.alignment = desc->alignment; 171dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca mm_buf->base.base.usage = desc->usage; 172dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca mm_buf->base.base.size = size; 173dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca 174b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buf->base.vtbl = &mm_buffer_vtbl; 175b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 176b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buf->mgr = mm; 177b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 178b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm_buf->block = mmAllocMem(mm->heap, size, mm->align2, 0); 179b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!mm_buf->block) { 1809791d7f64c5a58b9c1bf32d00c71e0e031f54f70José Fonseca debug_printf("warning: heap full\n"); 181b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#if 0 182b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mmDumpMemInfo(mm->heap); 183b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#endif 184c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca FREE(mm_buf); 185c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca pipe_mutex_unlock(mm->mutex); 186c7431552c0ff203cd4b3ae37751b10e6111e4167José Fonseca return NULL; 187b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 188b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 189b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* Some sanity checks */ 190e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca assert(0 <= (unsigned)mm_buf->block->ofs && (unsigned)mm_buf->block->ofs < mm->size); 191e8de5c70e3370e9112a5facc870075eea60c4c46José Fonseca assert(size <= (unsigned)mm_buf->block->size && (unsigned)mm_buf->block->ofs + (unsigned)mm_buf->block->size <= mm->size); 192b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1930bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(mm->mutex); 194b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(mm_buf); 195b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 196b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 197b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 198b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1991672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecamm_bufmgr_flush(struct pb_manager *mgr) 2001672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca{ 2011672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca /* No-op */ 2021672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca} 2031672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 2041672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 2051672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecastatic void 2061e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_destroy(struct pb_manager *mgr) 207b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2081e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm = mm_pb_manager(mgr); 209b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2100bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_lock(mm->mutex); 211b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 212b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mmDestroy(mm->heap); 213b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2141e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(mm->buffer); 215dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&mm->buffer, NULL); 216b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2170bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_unlock(mm->mutex); 218b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 219ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca FREE(mgr); 220b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 221b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 222b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2231e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager * 2241e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create_from_buffer(struct pb_buffer *buffer, 2253eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca size_t size, size_t align2) 226b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 2271e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct mm_pb_manager *mm; 228b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2293eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca if(!buffer) 2303eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca return NULL; 2313eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 232ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca mm = CALLOC_STRUCT(mm_pb_manager); 233b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!mm) 234b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 235b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 236b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->base.destroy = mm_bufmgr_destroy; 2371672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca mm->base.create_buffer = mm_bufmgr_create_buffer; 2381672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca mm->base.flush = mm_bufmgr_flush; 239b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 240b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->size = size; 241b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->align2 = align2; /* 64-byte alignment */ 242b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2430bb852fa49e7f9a31036089ea4f5dfbd312a4a3aBrian Paul pipe_mutex_init(mm->mutex); 244b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2453eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca mm->buffer = buffer; 246b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 2471e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell mm->map = pb_map(mm->buffer, 2481e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell PIPE_BUFFER_USAGE_CPU_READ | 2491e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell PIPE_BUFFER_USAGE_CPU_WRITE); 250b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!mm->map) 251b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 252b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 253b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mm->heap = mmInit(0, size); 254b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if (!mm->heap) 255b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca goto failure; 256b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 257b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return SUPER(mm); 258b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 259b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecafailure: 260b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecaif(mm->heap) 261b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca mmDestroy(mm->heap); 262b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(mm->map) 2631e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell pb_unmap(mm->buffer); 264b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(mm) 265ca01ed45e8dee7970c6eefb528b7576ce6717459José Fonseca FREE(mm); 266b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 267b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 2683eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 2693eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 2701e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_manager * 2711e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmm_bufmgr_create(struct pb_manager *provider, 2723eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca size_t size, size_t align2) 2733eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca{ 2741e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer *buffer; 2751e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_manager *mgr; 27665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca struct pb_desc desc; 2773eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 278ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca if(!provider) 279ea4ca10b1bec67c8a60db0e4e5581318ce9f62f9José Fonseca return NULL; 28065df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca 28165df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca memset(&desc, 0, sizeof(desc)); 28265df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca desc.alignment = 1 << align2; 28365df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca 28465df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca buffer = provider->create_buffer(provider, size, &desc); 2853eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca if (!buffer) 2863eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca return NULL; 2873eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 2883eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca mgr = mm_bufmgr_create_from_buffer(buffer, size, align2); 2893eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca if (!mgr) { 290dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca pb_reference(&buffer, NULL); 2913eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca return NULL; 2923eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca } 2933eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca 2943eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca return mgr; 2953eaf882a662f719845ead1017e28a121cbce86fbJosé Fonseca} 296