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