1 /**********************************************************
2 * Copyright 2009 VMware, Inc. All rights reserved.
4 * Permission is hereby granted, free of charge, to any person
5 * obtaining a copy of this software and associated documentation
6 * files (the "Software"), to deal in the Software without
7 * restriction, including without limitation the rights to use, copy,
8 * modify, merge, publish, distribute, sublicense, and/or sell copies
9 * of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice shall be
13 * included in all copies or substantial portions of the Software.
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24 **********************************************************/
28 * SVGA buffer manager for Guest Memory Regions (GMRs).
30 * GMRs are used for pixel and vertex data upload/download to/from the virtual
31 * SVGA hardware. There is a limited number of GMRs available, and
32 * creating/destroying them is also a slow operation so we must suballocate
35 * This file implements a pipebuffer library's buffer manager, so that we can
36 * use pipepbuffer's suballocation, fencing, and debugging facilities with GMRs.
38 * @author Jose Fonseca <jfonseca@vmware.com>
44 #include "util/u_inlines.h"
45 #include "util/u_memory.h"
46 #include "pipebuffer/pb_buffer.h"
47 #include "pipebuffer/pb_bufmgr.h"
49 #include "svga_winsys.h"
51 #include "vmw_screen.h"
52 #include "vmw_buffer.h"
55 struct vmw_gmr_bufmgr
;
60 struct pb_buffer base
;
62 struct vmw_gmr_bufmgr
*mgr
;
64 struct vmw_region
*region
;
69 extern const struct pb_vtbl vmw_gmr_buffer_vtbl
;
72 static INLINE
struct vmw_gmr_buffer
*
73 vmw_gmr_buffer(struct pb_buffer
*buf
)
76 assert(buf
->vtbl
== &vmw_gmr_buffer_vtbl
);
77 return (struct vmw_gmr_buffer
*)buf
;
83 struct pb_manager base
;
85 struct vmw_winsys_screen
*vws
;
89 static INLINE
struct vmw_gmr_bufmgr
*
90 vmw_gmr_bufmgr(struct pb_manager
*mgr
)
93 return (struct vmw_gmr_bufmgr
*)mgr
;
98 vmw_gmr_buffer_destroy(struct pb_buffer
*_buf
)
100 struct vmw_gmr_buffer
*buf
= vmw_gmr_buffer(_buf
);
102 vmw_ioctl_region_unmap(buf
->region
);
104 vmw_ioctl_region_destroy(buf
->region
);
111 vmw_gmr_buffer_map(struct pb_buffer
*_buf
,
115 struct vmw_gmr_buffer
*buf
= vmw_gmr_buffer(_buf
);
121 vmw_gmr_buffer_unmap(struct pb_buffer
*_buf
)
129 vmw_gmr_buffer_get_base_buffer(struct pb_buffer
*buf
,
130 struct pb_buffer
**base_buf
,
138 static enum pipe_error
139 vmw_gmr_buffer_validate( struct pb_buffer
*_buf
,
140 struct pb_validate
*vl
,
149 vmw_gmr_buffer_fence( struct pb_buffer
*_buf
,
150 struct pipe_fence_handle
*fence
)
152 /* We don't need to do anything, as the pipebuffer library
153 * will take care of delaying the destruction of fenced buffers */
157 const struct pb_vtbl vmw_gmr_buffer_vtbl
= {
158 vmw_gmr_buffer_destroy
,
160 vmw_gmr_buffer_unmap
,
161 vmw_gmr_buffer_validate
,
162 vmw_gmr_buffer_fence
,
163 vmw_gmr_buffer_get_base_buffer
167 static struct pb_buffer
*
168 vmw_gmr_bufmgr_create_buffer(struct pb_manager
*_mgr
,
170 const struct pb_desc
*desc
)
172 struct vmw_gmr_bufmgr
*mgr
= vmw_gmr_bufmgr(_mgr
);
173 struct vmw_winsys_screen
*vws
= mgr
->vws
;
174 struct vmw_gmr_buffer
*buf
;
176 buf
= CALLOC_STRUCT(vmw_gmr_buffer
);
180 pipe_reference_init(&buf
->base
.reference
, 1);
181 buf
->base
.alignment
= desc
->alignment
;
182 buf
->base
.usage
= desc
->usage
;
183 buf
->base
.size
= size
;
184 buf
->base
.vtbl
= &vmw_gmr_buffer_vtbl
;
187 buf
->region
= vmw_ioctl_region_create(vws
, size
);
191 buf
->map
= vmw_ioctl_region_map(buf
->region
);
198 vmw_ioctl_region_destroy(buf
->region
);
207 vmw_gmr_bufmgr_flush(struct pb_manager
*mgr
)
214 vmw_gmr_bufmgr_destroy(struct pb_manager
*_mgr
)
216 struct vmw_gmr_bufmgr
*mgr
= vmw_gmr_bufmgr(_mgr
);
222 vmw_gmr_bufmgr_create(struct vmw_winsys_screen
*vws
)
224 struct vmw_gmr_bufmgr
*mgr
;
226 mgr
= CALLOC_STRUCT(vmw_gmr_bufmgr
);
230 mgr
->base
.destroy
= vmw_gmr_bufmgr_destroy
;
231 mgr
->base
.create_buffer
= vmw_gmr_bufmgr_create_buffer
;
232 mgr
->base
.flush
= vmw_gmr_bufmgr_flush
;
241 vmw_gmr_bufmgr_region_ptr(struct pb_buffer
*buf
,
242 struct SVGAGuestPtr
*ptr
)
244 struct pb_buffer
*base_buf
;
246 struct vmw_gmr_buffer
*gmr_buf
;
248 pb_get_base_buffer( buf
, &base_buf
, &offset
);
250 gmr_buf
= vmw_gmr_buffer(base_buf
);
254 *ptr
= vmw_ioctl_region_ptr(gmr_buf
->region
);
256 ptr
->offset
+= offset
;