1b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca/************************************************************************** 2b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 3b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * Copyright 2007 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 * Implementation of malloc-based buffers to store data that can't be processed 31b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * by the hardware. 32b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca * 3335cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca * \author Jose Fonseca <jrfonseca@tungstengraphics.com> 34b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca */ 35b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 36b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 37ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h" 384f25420bdd834e81a3e22733304efc5261c2998aBrian Paul#include "util/u_memory.h" 39b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca#include "pb_buffer.h" 4035cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca#include "pb_bufmgr.h" 41b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 42b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 43b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastruct malloc_buffer 44b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 451e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer base; 46b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca void *data; 47b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 48b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 49b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 501e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellextern const struct pb_vtbl malloc_buffer_vtbl; 51b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 521e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstatic INLINE struct malloc_buffer * 531e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmalloc_buffer(struct pb_buffer *buf) 54b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 55b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(buf); 565920b6b67988fc3977f43b39d8546cc20247bf31Zack Rusin if (!buf) 575920b6b67988fc3977f43b39d8546cc20247bf31Zack Rusin return NULL; 58b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca assert(buf->vtbl == &malloc_buffer_vtbl); 59b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return (struct malloc_buffer *)buf; 60b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 61b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 62b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 63b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 641e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmalloc_buffer_destroy(struct pb_buffer *buf) 65b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 6665df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca align_free(malloc_buffer(buf)->data); 67b8dc2956df0f534924fc45287cccc04499e70959Michal Krol FREE(buf); 68b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 69b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 70b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 71b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void * 721e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmalloc_buffer_map(struct pb_buffer *buf, 7367763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca unsigned flags, 7467763488b1fea01d6eb1c7d9e05ecb175918c3afJosé Fonseca void *flush_ctx) 75b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 76b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return malloc_buffer(buf)->data; 77b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 78b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 79b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 80b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 811e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmalloc_buffer_unmap(struct pb_buffer *buf) 82b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 83b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* No-op */ 84b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 85b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 86b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 87e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic enum pipe_error 88e06474dbae6979177629fb6187331291ff230c65José Fonsecamalloc_buffer_validate(struct pb_buffer *buf, 89e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pb_validate *vl, 90e06474dbae6979177629fb6187331291ff230c65José Fonseca unsigned flags) 91e06474dbae6979177629fb6187331291ff230c65José Fonseca{ 92e06474dbae6979177629fb6187331291ff230c65José Fonseca assert(0); 93e06474dbae6979177629fb6187331291ff230c65José Fonseca return PIPE_ERROR; 94e06474dbae6979177629fb6187331291ff230c65José Fonseca} 95e06474dbae6979177629fb6187331291ff230c65José Fonseca 96e06474dbae6979177629fb6187331291ff230c65José Fonseca 97e06474dbae6979177629fb6187331291ff230c65José Fonsecastatic void 98e06474dbae6979177629fb6187331291ff230c65José Fonsecamalloc_buffer_fence(struct pb_buffer *buf, 99e06474dbae6979177629fb6187331291ff230c65José Fonseca struct pipe_fence_handle *fence) 100e06474dbae6979177629fb6187331291ff230c65José Fonseca{ 101e06474dbae6979177629fb6187331291ff230c65José Fonseca assert(0); 102e06474dbae6979177629fb6187331291ff230c65José Fonseca} 103e06474dbae6979177629fb6187331291ff230c65José Fonseca 104e06474dbae6979177629fb6187331291ff230c65José Fonseca 105b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecastatic void 1061e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellmalloc_buffer_get_base_buffer(struct pb_buffer *buf, 1071e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell struct pb_buffer **base_buf, 1082af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size *offset) 109b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 110b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *base_buf = buf; 111b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca *offset = 0; 112b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 113b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 114b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1151e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellconst struct pb_vtbl 116b47836225185c8d2e2ccf3e191230304709d0a57José Fonsecamalloc_buffer_vtbl = { 1171e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell malloc_buffer_destroy, 118b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca malloc_buffer_map, 119b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca malloc_buffer_unmap, 120e06474dbae6979177629fb6187331291ff230c65José Fonseca malloc_buffer_validate, 121e06474dbae6979177629fb6187331291ff230c65José Fonseca malloc_buffer_fence, 122b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca malloc_buffer_get_base_buffer 123b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca}; 124b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 125b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 1261e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwellstruct pb_buffer * 1272af0173e9e4eefe910c6011038e7346091a9b2a4José Fonsecapb_malloc_buffer_create(pb_size size, 12865df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca const struct pb_desc *desc) 129b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca{ 130b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca struct malloc_buffer *buf; 131b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 132b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca /* TODO: do a single allocation */ 133b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 13493d727eea75812ecb21706804033a33d2e761eb8José Fonseca buf = CALLOC_STRUCT(malloc_buffer); 135b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!buf) 136b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 1376a7820d31f9b697888ce9f9b193bacc86e646fe1Michal Krol 1384682e706012fe26627a2f827db01b5068cc62814Marek Olšák pipe_reference_init(&buf->base.reference, 1); 1394682e706012fe26627a2f827db01b5068cc62814Marek Olšák buf->base.usage = desc->usage; 1404682e706012fe26627a2f827db01b5068cc62814Marek Olšák buf->base.size = size; 1414682e706012fe26627a2f827db01b5068cc62814Marek Olšák buf->base.alignment = desc->alignment; 142dac124081d4bbc9d7527661e4a96aa78077b9f52José Fonseca buf->base.vtbl = &malloc_buffer_vtbl; 1431e0d30a515e4cac891b6c590f12a33e0e8a8e295Keith Whitwell 14465df0241465b2dae4979d71cad17b83cfd1fda11José Fonseca buf->data = align_malloc(size, desc->alignment < sizeof(void*) ? sizeof(void*) : desc->alignment); 145b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca if(!buf->data) { 1460f552f500c05d041eda751867c779a8ecc11849cJosé Fonseca FREE(buf); 147b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return NULL; 148b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca } 149b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca 150b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca return &buf->base; 151b47836225185c8d2e2ccf3e191230304709d0a57José Fonseca} 15235cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca 15335cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca 15435cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonsecastatic struct pb_buffer * 1551672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecapb_malloc_bufmgr_create_buffer(struct pb_manager *mgr, 1562af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca pb_size size, 15735cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca const struct pb_desc *desc) 15835cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca{ 15935cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca return pb_malloc_buffer_create(size, desc); 16035cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca} 16135cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca 16235cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca 16335cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonsecastatic void 1641672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecapb_malloc_bufmgr_flush(struct pb_manager *mgr) 1651672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca{ 1661672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca /* No-op */ 1671672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca} 1681672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 1691672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca 1701672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonsecastatic void 17135cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonsecapb_malloc_bufmgr_destroy(struct pb_manager *mgr) 17235cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca{ 17335cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca /* No-op */ 17435cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca} 17535cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca 17635cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca 1777cb17862c6a5690fbe88508cbb772ba92373292fJosé Fonsecastatic boolean 1787cb17862c6a5690fbe88508cbb772ba92373292fJosé Fonsecapb_malloc_bufmgr_is_buffer_busy( struct pb_manager *mgr, 1797cb17862c6a5690fbe88508cbb772ba92373292fJosé Fonseca struct pb_buffer *buf ) 1807cb17862c6a5690fbe88508cbb772ba92373292fJosé Fonseca{ 1817cb17862c6a5690fbe88508cbb772ba92373292fJosé Fonseca return FALSE; 1827cb17862c6a5690fbe88508cbb772ba92373292fJosé Fonseca} 1837cb17862c6a5690fbe88508cbb772ba92373292fJosé Fonseca 1847cb17862c6a5690fbe88508cbb772ba92373292fJosé Fonseca 18535cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonsecastatic struct pb_manager 18635cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonsecapb_malloc_bufmgr = { 1871672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca pb_malloc_bufmgr_destroy, 1881672e8e05996d48e51a1998bd7e9b08b78e012f5José Fonseca pb_malloc_bufmgr_create_buffer, 1897cb17862c6a5690fbe88508cbb772ba92373292fJosé Fonseca pb_malloc_bufmgr_flush, 1907cb17862c6a5690fbe88508cbb772ba92373292fJosé Fonseca pb_malloc_bufmgr_is_buffer_busy 19135cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca}; 19235cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca 19335cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca 19435cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonsecastruct pb_manager * 19535cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonsecapb_malloc_bufmgr_create(void) 19635cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca{ 19735cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca return &pb_malloc_bufmgr; 19835cfd0a4900750f67cba4f64929ff3347f0bd46fJosé Fonseca} 199