1444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca/**************************************************************************
2444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca *
3444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * All Rights Reserved.
5444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca *
6444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * Permission is hereby granted, free of charge, to any person obtaining a
7444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * copy of this software and associated documentation files (the
8444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * "Software"), to deal in the Software without restriction, including
9444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * without limitation the rights to use, copy, modify, merge, publish,
10444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * distribute, sub license, and/or sell copies of the Software, and to
11444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * permit persons to whom the Software is furnished to do so, subject to
12444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * the following conditions:
13444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca *
14444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * The above copyright notice and this permission notice (including the
15444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * next paragraph) shall be included in all copies or substantial portions
16444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * of the Software.
17444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca *
18444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca *
26444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca **************************************************************************/
27444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
28444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca/**
29444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * @file
30444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * A variation of malloc buffers which get transferred to real graphics memory
31444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * when there is an attempt to validate them.
32444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca *
33444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca * @author Jose Fonseca <jrfonseca@tungstengraphics.com>
34444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca */
35444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
36444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
37ea4bf267e4b023b08043f91ac44592fed1736e7fJosé Fonseca#include "util/u_debug.h"
38444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca#include "util/u_memory.h"
39444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca#include "pb_buffer.h"
40444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca#include "pb_bufmgr.h"
41444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
42444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
43444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastruct pb_ondemand_manager;
44444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
45444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
46444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastruct pb_ondemand_buffer
47444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
48444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_buffer base;
49444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
50444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_manager *mgr;
51444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
52444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   /** Regular malloc'ed memory */
53444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   void *data;
54444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   unsigned mapcount;
55444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
56444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   /** Real buffer */
57444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_buffer *buffer;
582af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca   pb_size size;
59444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_desc desc;
60444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca};
61444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
62444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
63444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastruct pb_ondemand_manager
64444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
65444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_manager base;
66444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
67444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_manager *provider;
68444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca};
69444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
70444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
71444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecaextern const struct pb_vtbl pb_ondemand_buffer_vtbl;
72444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
73444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic INLINE struct pb_ondemand_buffer *
74444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_buffer(struct pb_buffer *buf)
75444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
76444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   assert(buf);
775920b6b67988fc3977f43b39d8546cc20247bf31Zack Rusin   if (!buf)
785920b6b67988fc3977f43b39d8546cc20247bf31Zack Rusin      return NULL;
79444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   assert(buf->vtbl == &pb_ondemand_buffer_vtbl);
80444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   return (struct pb_ondemand_buffer *)buf;
81444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
82444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
83444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic INLINE struct pb_ondemand_manager *
84444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_manager(struct pb_manager *mgr)
85444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
86444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   assert(mgr);
87444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   return (struct pb_ondemand_manager *)mgr;
88444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
89444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
90444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
91444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic void
92444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_buffer_destroy(struct pb_buffer *_buf)
93444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
94444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_buffer *buf = pb_ondemand_buffer(_buf);
95444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
96444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   pb_reference(&buf->buffer, NULL);
97444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
98444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   align_free(buf->data);
99444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
100444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   FREE(buf);
101444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
102444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
103444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
104444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic void *
105444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_buffer_map(struct pb_buffer *_buf,
106b5fcf0c8e07e666523b007fab1d0fc18c2c89241Dave Airlie                       unsigned flags, void *flush_ctx)
107444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
108444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_buffer *buf = pb_ondemand_buffer(_buf);
109444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
110444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(buf->buffer) {
111444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      assert(!buf->data);
112b5fcf0c8e07e666523b007fab1d0fc18c2c89241Dave Airlie      return pb_map(buf->buffer, flags, flush_ctx);
113444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   }
114444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   else {
115444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      assert(buf->data);
116444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      ++buf->mapcount;
117444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      return buf->data;
118444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   }
119444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
120444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
121444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
122444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic void
123444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_buffer_unmap(struct pb_buffer *_buf)
124444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
125444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_buffer *buf = pb_ondemand_buffer(_buf);
126444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
127444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(buf->buffer) {
128444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      assert(!buf->data);
129444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      pb_unmap(buf->buffer);
130444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   }
131444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   else {
132444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      assert(buf->data);
133444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      assert(buf->mapcount);
134444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      if(buf->mapcount)
135444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca         --buf->mapcount;
136444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   }
137444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
138444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
139444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
140444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic enum pipe_error
141444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_buffer_instantiate(struct pb_ondemand_buffer *buf)
142444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
143444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(!buf->buffer) {
144444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      struct pb_manager *provider = buf->mgr->provider;
145444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      uint8_t *map;
146444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
147444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      assert(!buf->mapcount);
148444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
149444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      buf->buffer = provider->create_buffer(provider, buf->size, &buf->desc);
150444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      if(!buf->buffer)
151444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca         return PIPE_ERROR_OUT_OF_MEMORY;
152444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
153b5fcf0c8e07e666523b007fab1d0fc18c2c89241Dave Airlie      map = pb_map(buf->buffer, PB_USAGE_CPU_READ, NULL);
154444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      if(!map) {
155444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca         pb_reference(&buf->buffer, NULL);
156444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca         return PIPE_ERROR;
157444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      }
158444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
159444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      memcpy(map, buf->data, buf->size);
160444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
161444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      pb_unmap(buf->buffer);
162444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
163444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      if(!buf->mapcount) {
164444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca         FREE(buf->data);
165444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca         buf->data = NULL;
166444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      }
167444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   }
168444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
169444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   return PIPE_OK;
170444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
171444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
172444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic enum pipe_error
173444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_buffer_validate(struct pb_buffer *_buf,
174444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca                            struct pb_validate *vl,
175444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca                            unsigned flags)
176444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
177444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_buffer *buf = pb_ondemand_buffer(_buf);
178444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   enum pipe_error ret;
179444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
180444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   assert(!buf->mapcount);
181444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(buf->mapcount)
182444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      return PIPE_ERROR;
183444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
184444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   ret = pb_ondemand_buffer_instantiate(buf);
185444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(ret != PIPE_OK)
186444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      return ret;
187444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
188444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   return pb_validate(buf->buffer, vl, flags);
189444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
190444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
191444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
192444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic void
193444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_buffer_fence(struct pb_buffer *_buf,
194444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca                         struct pipe_fence_handle *fence)
195444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
196444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_buffer *buf = pb_ondemand_buffer(_buf);
197444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
198444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   assert(buf->buffer);
199444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(!buf->buffer)
200444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      return;
201444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
202444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   pb_fence(buf->buffer, fence);
203444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
204444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
205444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
206444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic void
207444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_buffer_get_base_buffer(struct pb_buffer *_buf,
208444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca                                   struct pb_buffer **base_buf,
2092af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                                   pb_size *offset)
210444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
211444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_buffer *buf = pb_ondemand_buffer(_buf);
212444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
213444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(pb_ondemand_buffer_instantiate(buf) != PIPE_OK) {
214444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      assert(0);
215444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      *base_buf = &buf->base;
216444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      *offset = 0;
217444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      return;
218444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   }
219444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
220444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   pb_get_base_buffer(buf->buffer, base_buf, offset);
221444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
222444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
223444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
224444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecaconst struct pb_vtbl
225444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_buffer_vtbl = {
226444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      pb_ondemand_buffer_destroy,
227444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      pb_ondemand_buffer_map,
228444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      pb_ondemand_buffer_unmap,
229444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      pb_ondemand_buffer_validate,
230444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      pb_ondemand_buffer_fence,
231444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      pb_ondemand_buffer_get_base_buffer
232444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca};
233444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
234444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
235444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic struct pb_buffer *
236444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_manager_create_buffer(struct pb_manager *_mgr,
2372af0173e9e4eefe910c6011038e7346091a9b2a4José Fonseca                                  pb_size size,
238444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca                                  const struct pb_desc *desc)
239444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
240444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_manager *mgr = pb_ondemand_manager(_mgr);
241444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_buffer *buf;
242444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
243444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   buf = CALLOC_STRUCT(pb_ondemand_buffer);
244444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(!buf)
245444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      return NULL;
246444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
2474682e706012fe26627a2f827db01b5068cc62814Marek Olšák   pipe_reference_init(&buf->base.reference, 1);
2484682e706012fe26627a2f827db01b5068cc62814Marek Olšák   buf->base.alignment = desc->alignment;
2494682e706012fe26627a2f827db01b5068cc62814Marek Olšák   buf->base.usage = desc->usage;
2504682e706012fe26627a2f827db01b5068cc62814Marek Olšák   buf->base.size = size;
251444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   buf->base.vtbl = &pb_ondemand_buffer_vtbl;
252444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
253444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   buf->mgr = mgr;
254444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
255444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   buf->data = align_malloc(size, desc->alignment < sizeof(void*) ? sizeof(void*) : desc->alignment);
256444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(!buf->data) {
257444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      FREE(buf);
258444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      return NULL;
259444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   }
260444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
261444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   buf->size = size;
262444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   buf->desc = *desc;
263444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
264444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   return &buf->base;
265444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
266444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
267444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
268444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic void
269444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_manager_flush(struct pb_manager *_mgr)
270444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
271444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_manager *mgr = pb_ondemand_manager(_mgr);
272444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
273444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   mgr->provider->flush(mgr->provider);
274444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
275444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
276444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
277444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastatic void
278444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_manager_destroy(struct pb_manager *_mgr)
279444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
280444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_manager *mgr = pb_ondemand_manager(_mgr);
281444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
282444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   FREE(mgr);
283444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
284444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
285444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
286444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecastruct pb_manager *
287444e98de31c5456008a4b3568373db02ddc5385fJosé Fonsecapb_ondemand_manager_create(struct pb_manager *provider)
288444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca{
289444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   struct pb_ondemand_manager *mgr;
290444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
291444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(!provider)
292444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      return NULL;
293444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
294444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   mgr = CALLOC_STRUCT(pb_ondemand_manager);
295444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   if(!mgr)
296444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca      return NULL;
297444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
298444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   mgr->base.destroy = pb_ondemand_manager_destroy;
299444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   mgr->base.create_buffer = pb_ondemand_manager_create_buffer;
300444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   mgr->base.flush = pb_ondemand_manager_flush;
301444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
302444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   mgr->provider = provider;
303444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca
304444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca   return &mgr->base;
305444e98de31c5456008a4b3568373db02ddc5385fJosé Fonseca}
306