1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/************************************************************************** 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright 2006 Tungsten Graphics, Inc., Cedar Park, Texas. 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "Software"), to deal in the Software without restriction, including 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * without limitation the rights to use, copy, modify, merge, publish, 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * distribute, sub license, and/or sell copies of the Software, and to 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * permit persons to whom the Software is furnished to do so, subject to 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice (including the 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * next paragraph) shall be included in all copies or substantial portions 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org **************************************************************************/ 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Buffer manager using the old texture memory manager. 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Jose Fonseca <jrfonseca@tungstengraphics.com> 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pipe/p_defines.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_debug.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "os/os_thread.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_memory.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_double_list.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "util/u_mm.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pb_buffer.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pb_bufmgr.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convenience macro (type safe). 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SUPER(__derived) (&(__derived)->base) 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct mm_pb_manager 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pb_manager base; 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex mutex; 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_size size; 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mem_block *heap; 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_size align2; 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pb_buffer *buffer; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *map; 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct mm_pb_manager * 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_pb_manager(struct pb_manager *mgr) 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(mgr); 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (struct mm_pb_manager *)mgr; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct mm_buffer 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pb_buffer base; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_pb_manager *mgr; 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mem_block *block; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic INLINE struct mm_buffer * 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_buffer(struct pb_buffer *buf) 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(buf); 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (struct mm_buffer *)buf; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_buffer_destroy(struct pb_buffer *buf) 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_buffer *mm_buf = mm_buffer(buf); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_pb_manager *mm = mm_buf->mgr; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(!pipe_is_referenced(&mm_buf->base.reference)); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(mm->mutex); 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_mmFreeMem(mm_buf->block); 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(mm_buf); 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(mm->mutex); 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void * 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_buffer_map(struct pb_buffer *buf, 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned flags, 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org void *flush_ctx) 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_buffer *mm_buf = mm_buffer(buf); 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_pb_manager *mm = mm_buf->mgr; 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: it will be necessary to remap here to propagate flush_ctx */ 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (unsigned char *) mm->map + mm_buf->block->ofs; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_buffer_unmap(struct pb_buffer *buf) 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No-op */ 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic enum pipe_error 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_buffer_validate(struct pb_buffer *buf, 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pb_validate *vl, 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned flags) 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_buffer *mm_buf = mm_buffer(buf); 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_pb_manager *mm = mm_buf->mgr; 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return pb_validate(mm->buffer, vl, flags); 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_buffer_fence(struct pb_buffer *buf, 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pipe_fence_handle *fence) 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_buffer *mm_buf = mm_buffer(buf); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_pb_manager *mm = mm_buf->mgr; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_fence(mm->buffer, fence); 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_buffer_get_base_buffer(struct pb_buffer *buf, 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pb_buffer **base_buf, 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_size *offset) 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_buffer *mm_buf = mm_buffer(buf); 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_pb_manager *mm = mm_buf->mgr; 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_get_base_buffer(mm->buffer, base_buf, offset); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *offset += mm_buf->block->ofs; 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct pb_vtbl 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_buffer_vtbl = { 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buffer_destroy, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buffer_map, 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buffer_unmap, 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buffer_validate, 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buffer_fence, 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buffer_get_base_buffer 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct pb_buffer * 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_bufmgr_create_buffer(struct pb_manager *mgr, 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_size size, 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct pb_desc *desc) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_pb_manager *mm = mm_pb_manager(mgr); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_buffer *mm_buf; 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We don't handle alignments larger then the one initially setup */ 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(pb_check_alignment(desc->alignment, (pb_size)1 << mm->align2)); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!pb_check_alignment(desc->alignment, (pb_size)1 << mm->align2)) 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(mm->mutex); 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buf = CALLOC_STRUCT(mm_buffer); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mm_buf) { 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(mm->mutex); 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_reference_init(&mm_buf->base.reference, 1); 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buf->base.alignment = desc->alignment; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buf->base.usage = desc->usage; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buf->base.size = size; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buf->base.vtbl = &mm_buffer_vtbl; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buf->mgr = mm; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm_buf->block = u_mmAllocMem(mm->heap, (int)size, (int)mm->align2, 0); 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!mm_buf->block) { 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org debug_printf("warning: heap full\n"); 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mmDumpMemInfo(mm->heap); 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(mm_buf); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(mm->mutex); 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Some sanity checks */ 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0 <= (pb_size)mm_buf->block->ofs && (pb_size)mm_buf->block->ofs < mm->size); 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(size <= (pb_size)mm_buf->block->size && (pb_size)mm_buf->block->ofs + (pb_size)mm_buf->block->size <= mm->size); 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(mm->mutex); 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SUPER(mm_buf); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_bufmgr_flush(struct pb_manager *mgr) 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No-op */ 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_bufmgr_destroy(struct pb_manager *mgr) 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_pb_manager *mm = mm_pb_manager(mgr); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_lock(mm->mutex); 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_mmDestroy(mm->heap); 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_unmap(mm->buffer); 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_reference(&mm->buffer, NULL); 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_unlock(mm->mutex); 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(mgr); 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pb_manager * 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_bufmgr_create_from_buffer(struct pb_buffer *buffer, 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_size size, pb_size align2) 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct mm_pb_manager *mm; 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!buffer) 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm = CALLOC_STRUCT(mm_pb_manager); 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mm) 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm->base.destroy = mm_bufmgr_destroy; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm->base.create_buffer = mm_bufmgr_create_buffer; 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm->base.flush = mm_bufmgr_flush; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm->size = size; 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm->align2 = align2; /* 64-byte alignment */ 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pipe_mutex_init(mm->mutex); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm->buffer = buffer; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm->map = pb_map(mm->buffer, 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PB_USAGE_CPU_READ | 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PB_USAGE_CPU_WRITE, NULL); 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!mm->map) 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto failure; 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mm->heap = u_mmInit(0, (int)size); 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mm->heap) 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto failure; 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return SUPER(mm); 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgfailure: 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgif(mm->heap) 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org u_mmDestroy(mm->heap); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(mm->map) 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_unmap(mm->buffer); 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(mm) 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FREE(mm); 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct pb_manager * 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmm_bufmgr_create(struct pb_manager *provider, 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_size size, pb_size align2) 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pb_buffer *buffer; 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pb_manager *mgr; 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct pb_desc desc; 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if(!provider) 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&desc, 0, sizeof(desc)); 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org desc.alignment = 1 << align2; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org buffer = provider->create_buffer(provider, size, &desc); 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!buffer) 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mgr = mm_bufmgr_create_from_buffer(buffer, size, align2); 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mgr) { 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org pb_reference(&buffer, NULL); 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mgr; 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 322