vl_winsys_xsp.c revision e44c85637a3298918e292e9ddba812856cf92924
1e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <vl_winsys.h>
2e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <X11/Xutil.h>
3e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <pipe/internal/p_winsys_screen.h>
4e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <pipe/p_state.h>
5e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <pipe/p_inlines.h>
6e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <util/u_memory.h>
7e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <util/u_math.h>
8e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <softpipe/sp_winsys.h>
9e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <softpipe/sp_video_context.h>
10e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <softpipe/sp_texture.h>
11e44c85637a3298918e292e9ddba812856cf92924Younes Manton
12e44c85637a3298918e292e9ddba812856cf92924Younes Manton/* pipe_winsys implementation */
13e44c85637a3298918e292e9ddba812856cf92924Younes Manton
14e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct xsp_pipe_winsys
15e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
16e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct pipe_winsys	base;
17e44c85637a3298918e292e9ddba812856cf92924Younes Manton	Display			*display;
18e44c85637a3298918e292e9ddba812856cf92924Younes Manton	int			screen;
19e44c85637a3298918e292e9ddba812856cf92924Younes Manton	XImage			*fbimage;
20e44c85637a3298918e292e9ddba812856cf92924Younes Manton};
21e44c85637a3298918e292e9ddba812856cf92924Younes Manton
22e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct xsp_context
23e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
24e44c85637a3298918e292e9ddba812856cf92924Younes Manton	Drawable		drawable;
25e44c85637a3298918e292e9ddba812856cf92924Younes Manton
26e44c85637a3298918e292e9ddba812856cf92924Younes Manton	void (*pipe_destroy)(struct pipe_video_context *vpipe);
27e44c85637a3298918e292e9ddba812856cf92924Younes Manton};
28e44c85637a3298918e292e9ddba812856cf92924Younes Manton
29e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct xsp_buffer
30e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
31e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct pipe_buffer	base;
32e44c85637a3298918e292e9ddba812856cf92924Younes Manton	boolean			is_user_buffer;
33e44c85637a3298918e292e9ddba812856cf92924Younes Manton	void			*data;
34e44c85637a3298918e292e9ddba812856cf92924Younes Manton	void			*mapped_data;
35e44c85637a3298918e292e9ddba812856cf92924Younes Manton};
36e44c85637a3298918e292e9ddba812856cf92924Younes Manton
37e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic struct pipe_buffer* xsp_buffer_create(struct pipe_winsys *pws, unsigned alignment, unsigned usage, unsigned size)
38e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
39e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_buffer *buffer;
40e44c85637a3298918e292e9ddba812856cf92924Younes Manton
41e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(pws);
42e44c85637a3298918e292e9ddba812856cf92924Younes Manton
43e44c85637a3298918e292e9ddba812856cf92924Younes Manton	buffer = calloc(1, sizeof(struct xsp_buffer));
44e44c85637a3298918e292e9ddba812856cf92924Younes Manton	pipe_reference_init(&buffer->base.reference, 1);
45e44c85637a3298918e292e9ddba812856cf92924Younes Manton	buffer->base.alignment = alignment;
46e44c85637a3298918e292e9ddba812856cf92924Younes Manton	buffer->base.usage = usage;
47e44c85637a3298918e292e9ddba812856cf92924Younes Manton	buffer->base.size = size;
48e44c85637a3298918e292e9ddba812856cf92924Younes Manton	buffer->data = align_malloc(size, alignment);
49e44c85637a3298918e292e9ddba812856cf92924Younes Manton
50e44c85637a3298918e292e9ddba812856cf92924Younes Manton	return (struct pipe_buffer*)buffer;
51e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
52e44c85637a3298918e292e9ddba812856cf92924Younes Manton
53e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic struct pipe_buffer* xsp_user_buffer_create(struct pipe_winsys *pws, void *data, unsigned size)
54e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
55e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_buffer *buffer;
56e44c85637a3298918e292e9ddba812856cf92924Younes Manton
57e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(pws);
58e44c85637a3298918e292e9ddba812856cf92924Younes Manton
59e44c85637a3298918e292e9ddba812856cf92924Younes Manton	buffer = calloc(1, sizeof(struct xsp_buffer));
60e44c85637a3298918e292e9ddba812856cf92924Younes Manton	pipe_reference_init(&buffer->base.reference, 1);
61e44c85637a3298918e292e9ddba812856cf92924Younes Manton	buffer->base.size = size;
62e44c85637a3298918e292e9ddba812856cf92924Younes Manton	buffer->is_user_buffer = TRUE;
63e44c85637a3298918e292e9ddba812856cf92924Younes Manton	buffer->data = data;
64e44c85637a3298918e292e9ddba812856cf92924Younes Manton
65e44c85637a3298918e292e9ddba812856cf92924Younes Manton	return (struct pipe_buffer*)buffer;
66e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
67e44c85637a3298918e292e9ddba812856cf92924Younes Manton
68e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void* xsp_buffer_map(struct pipe_winsys *pws, struct pipe_buffer *buffer, unsigned flags)
69e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
70e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_buffer *xsp_buf = (struct xsp_buffer*)buffer;
71e44c85637a3298918e292e9ddba812856cf92924Younes Manton
72e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(pws);
73e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(buffer);
74e44c85637a3298918e292e9ddba812856cf92924Younes Manton
75e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_buf->mapped_data = xsp_buf->data;
76e44c85637a3298918e292e9ddba812856cf92924Younes Manton
77e44c85637a3298918e292e9ddba812856cf92924Younes Manton	return xsp_buf->mapped_data;
78e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
79e44c85637a3298918e292e9ddba812856cf92924Younes Manton
80e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_buffer_unmap(struct pipe_winsys *pws, struct pipe_buffer *buffer)
81e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
82e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_buffer *xsp_buf = (struct xsp_buffer*)buffer;
83e44c85637a3298918e292e9ddba812856cf92924Younes Manton
84e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(pws);
85e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(buffer);
86e44c85637a3298918e292e9ddba812856cf92924Younes Manton
87e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_buf->mapped_data = NULL;
88e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
89e44c85637a3298918e292e9ddba812856cf92924Younes Manton
90e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_buffer_destroy(struct pipe_buffer *buffer)
91e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
92e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_buffer *xsp_buf = (struct xsp_buffer*)buffer;
93e44c85637a3298918e292e9ddba812856cf92924Younes Manton
94e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(buffer);
95e44c85637a3298918e292e9ddba812856cf92924Younes Manton
96e44c85637a3298918e292e9ddba812856cf92924Younes Manton	if (!xsp_buf->is_user_buffer)
97e44c85637a3298918e292e9ddba812856cf92924Younes Manton		align_free(xsp_buf->data);
98e44c85637a3298918e292e9ddba812856cf92924Younes Manton
99e44c85637a3298918e292e9ddba812856cf92924Younes Manton	free(xsp_buf);
100e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
101e44c85637a3298918e292e9ddba812856cf92924Younes Manton
102e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic struct pipe_buffer* xsp_surface_buffer_create
103e44c85637a3298918e292e9ddba812856cf92924Younes Manton(
104e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct pipe_winsys *pws,
105e44c85637a3298918e292e9ddba812856cf92924Younes Manton	unsigned width,
106e44c85637a3298918e292e9ddba812856cf92924Younes Manton	unsigned height,
107e44c85637a3298918e292e9ddba812856cf92924Younes Manton	enum pipe_format format,
108e44c85637a3298918e292e9ddba812856cf92924Younes Manton	unsigned usage,
109e44c85637a3298918e292e9ddba812856cf92924Younes Manton	unsigned tex_usage,
110e44c85637a3298918e292e9ddba812856cf92924Younes Manton	unsigned *stride
111e44c85637a3298918e292e9ddba812856cf92924Younes Manton)
112e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
113e44c85637a3298918e292e9ddba812856cf92924Younes Manton	const unsigned int ALIGNMENT = 1;
114e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct pipe_format_block block;
115e44c85637a3298918e292e9ddba812856cf92924Younes Manton	unsigned nblocksx, nblocksy;
116e44c85637a3298918e292e9ddba812856cf92924Younes Manton
117e44c85637a3298918e292e9ddba812856cf92924Younes Manton	pf_get_block(format, &block);
118e44c85637a3298918e292e9ddba812856cf92924Younes Manton	nblocksx = pf_get_nblocksx(&block, width);
119e44c85637a3298918e292e9ddba812856cf92924Younes Manton	nblocksy = pf_get_nblocksy(&block, height);
120e44c85637a3298918e292e9ddba812856cf92924Younes Manton	*stride = align(nblocksx * block.size, ALIGNMENT);
121e44c85637a3298918e292e9ddba812856cf92924Younes Manton
122e44c85637a3298918e292e9ddba812856cf92924Younes Manton	return pws->buffer_create(pws, ALIGNMENT,
123e44c85637a3298918e292e9ddba812856cf92924Younes Manton				  usage,
124e44c85637a3298918e292e9ddba812856cf92924Younes Manton				  *stride * nblocksy);
125e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
126e44c85637a3298918e292e9ddba812856cf92924Younes Manton
127e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_fence_reference(struct pipe_winsys *pws, struct pipe_fence_handle **ptr, struct pipe_fence_handle *fence)
128e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
129e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(pws);
130e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(ptr);
131e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(fence);
132e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
133e44c85637a3298918e292e9ddba812856cf92924Younes Manton
134e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic int xsp_fence_signalled(struct pipe_winsys *pws, struct pipe_fence_handle *fence, unsigned flag)
135e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
136e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(pws);
137e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(fence);
138e44c85637a3298918e292e9ddba812856cf92924Younes Manton
139e44c85637a3298918e292e9ddba812856cf92924Younes Manton	return 0;
140e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
141e44c85637a3298918e292e9ddba812856cf92924Younes Manton
142e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic int xsp_fence_finish(struct pipe_winsys *pws, struct pipe_fence_handle *fence, unsigned flag)
143e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
144e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(pws);
145e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(fence);
146e44c85637a3298918e292e9ddba812856cf92924Younes Manton
147e44c85637a3298918e292e9ddba812856cf92924Younes Manton	return 0;
148e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
149e44c85637a3298918e292e9ddba812856cf92924Younes Manton
150e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_flush_frontbuffer(struct pipe_winsys *pws, struct pipe_surface *surface, void *context_private)
151e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
152e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_pipe_winsys	*xsp_winsys;
153e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_context	*xsp_context;
154e44c85637a3298918e292e9ddba812856cf92924Younes Manton
155e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(pws);
156e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(surface);
157e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(context_private);
158e44c85637a3298918e292e9ddba812856cf92924Younes Manton
159e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys = (struct xsp_pipe_winsys*)pws;
160e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_context = (struct xsp_context*)context_private;
161e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->fbimage->width = surface->width;
162e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->fbimage->height = surface->height;
163e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->fbimage->bytes_per_line = surface->width * (xsp_winsys->fbimage->bits_per_pixel >> 3);
164e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->fbimage->data = (char*)((struct xsp_buffer *)softpipe_texture(surface->texture)->buffer)->data + surface->offset;
165e44c85637a3298918e292e9ddba812856cf92924Younes Manton
166e44c85637a3298918e292e9ddba812856cf92924Younes Manton	XPutImage
167e44c85637a3298918e292e9ddba812856cf92924Younes Manton	(
168e44c85637a3298918e292e9ddba812856cf92924Younes Manton		xsp_winsys->display, xsp_context->drawable,
169e44c85637a3298918e292e9ddba812856cf92924Younes Manton		XDefaultGC(xsp_winsys->display, xsp_winsys->screen),
170e44c85637a3298918e292e9ddba812856cf92924Younes Manton		xsp_winsys->fbimage, 0, 0, 0, 0,
171e44c85637a3298918e292e9ddba812856cf92924Younes Manton		surface->width, surface->height
172e44c85637a3298918e292e9ddba812856cf92924Younes Manton	);
173e44c85637a3298918e292e9ddba812856cf92924Younes Manton	XFlush(xsp_winsys->display);
174e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
175e44c85637a3298918e292e9ddba812856cf92924Younes Manton
176e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic const char* xsp_get_name(struct pipe_winsys *pws)
177e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
178e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(pws);
179e44c85637a3298918e292e9ddba812856cf92924Younes Manton	return "X11 SoftPipe";
180e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
181e44c85637a3298918e292e9ddba812856cf92924Younes Manton
182e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_destroy(struct pipe_winsys *pws)
183e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
184e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_pipe_winsys *xsp_winsys = (struct xsp_pipe_winsys*)pws;
185e44c85637a3298918e292e9ddba812856cf92924Younes Manton
186e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(pws);
187e44c85637a3298918e292e9ddba812856cf92924Younes Manton
188e44c85637a3298918e292e9ddba812856cf92924Younes Manton	/* XDestroyImage() wants to free the data as well */
189e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->fbimage->data = NULL;
190e44c85637a3298918e292e9ddba812856cf92924Younes Manton
191e44c85637a3298918e292e9ddba812856cf92924Younes Manton	XDestroyImage(xsp_winsys->fbimage);
192e44c85637a3298918e292e9ddba812856cf92924Younes Manton	FREE(xsp_winsys);
193e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
194e44c85637a3298918e292e9ddba812856cf92924Younes Manton
195e44c85637a3298918e292e9ddba812856cf92924Younes Manton/* Called through pipe_video_context::destroy() */
196e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_pipe_destroy(struct pipe_video_context *vpipe)
197e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
198e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_context *xsp_context;
199e44c85637a3298918e292e9ddba812856cf92924Younes Manton
200e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(vpipe);
201e44c85637a3298918e292e9ddba812856cf92924Younes Manton
202e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_context = vpipe->priv;
203e44c85637a3298918e292e9ddba812856cf92924Younes Manton
204e44c85637a3298918e292e9ddba812856cf92924Younes Manton	/* Call the original destroy */
205e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_context->pipe_destroy(vpipe);
206e44c85637a3298918e292e9ddba812856cf92924Younes Manton
207e44c85637a3298918e292e9ddba812856cf92924Younes Manton	FREE(xsp_context);
208e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
209e44c85637a3298918e292e9ddba812856cf92924Younes Manton
210e44c85637a3298918e292e9ddba812856cf92924Younes Manton/* Show starts here */
211e44c85637a3298918e292e9ddba812856cf92924Younes Manton
212e44c85637a3298918e292e9ddba812856cf92924Younes MantonDrawable
213e44c85637a3298918e292e9ddba812856cf92924Younes Mantonvl_video_bind_drawable(struct pipe_video_context *vpipe, Drawable drawable)
214e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
215e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_context *xsp_context;
216e44c85637a3298918e292e9ddba812856cf92924Younes Manton	Drawable old_drawable;
217e44c85637a3298918e292e9ddba812856cf92924Younes Manton
218e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(vpipe);
219e44c85637a3298918e292e9ddba812856cf92924Younes Manton
220e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_context = vpipe->priv;
221e44c85637a3298918e292e9ddba812856cf92924Younes Manton	old_drawable = xsp_context->drawable;
222e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_context->drawable = drawable;
223e44c85637a3298918e292e9ddba812856cf92924Younes Manton
224e44c85637a3298918e292e9ddba812856cf92924Younes Manton	return old_drawable;
225e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
226e44c85637a3298918e292e9ddba812856cf92924Younes Manton
227e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct pipe_screen*
228e44c85637a3298918e292e9ddba812856cf92924Younes Mantonvl_screen_create(Display *display, int screen)
229e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
230e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_pipe_winsys *xsp_winsys;
231e44c85637a3298918e292e9ddba812856cf92924Younes Manton
232e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(display);
233e44c85637a3298918e292e9ddba812856cf92924Younes Manton
234e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys = CALLOC_STRUCT(xsp_pipe_winsys);
235e44c85637a3298918e292e9ddba812856cf92924Younes Manton	if (!xsp_winsys)
236e44c85637a3298918e292e9ddba812856cf92924Younes Manton		return NULL;
237e44c85637a3298918e292e9ddba812856cf92924Younes Manton
238e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.buffer_create = xsp_buffer_create;
239e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.user_buffer_create = xsp_user_buffer_create;
240e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.buffer_map = xsp_buffer_map;
241e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.buffer_unmap = xsp_buffer_unmap;
242e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.buffer_destroy = xsp_buffer_destroy;
243e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.surface_buffer_create = xsp_surface_buffer_create;
244e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.fence_reference = xsp_fence_reference;
245e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.fence_signalled = xsp_fence_signalled;
246e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.fence_finish = xsp_fence_finish;
247e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.flush_frontbuffer = xsp_flush_frontbuffer;
248e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.get_name = xsp_get_name;
249e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->base.destroy = xsp_destroy;
250e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->display = display;
251e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->screen = screen;
252e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_winsys->fbimage = XCreateImage
253e44c85637a3298918e292e9ddba812856cf92924Younes Manton	(
254e44c85637a3298918e292e9ddba812856cf92924Younes Manton		display,
255e44c85637a3298918e292e9ddba812856cf92924Younes Manton		XDefaultVisual(display, screen),
256e44c85637a3298918e292e9ddba812856cf92924Younes Manton		XDefaultDepth(display, screen),
257e44c85637a3298918e292e9ddba812856cf92924Younes Manton		ZPixmap,
258e44c85637a3298918e292e9ddba812856cf92924Younes Manton		0,
259e44c85637a3298918e292e9ddba812856cf92924Younes Manton		NULL,
260e44c85637a3298918e292e9ddba812856cf92924Younes Manton		0,	/* Don't know the width and height until flush_frontbuffer */
261e44c85637a3298918e292e9ddba812856cf92924Younes Manton		0,
262e44c85637a3298918e292e9ddba812856cf92924Younes Manton		32,
263e44c85637a3298918e292e9ddba812856cf92924Younes Manton		0
264e44c85637a3298918e292e9ddba812856cf92924Younes Manton	);
265e44c85637a3298918e292e9ddba812856cf92924Younes Manton
266e44c85637a3298918e292e9ddba812856cf92924Younes Manton	if (!xsp_winsys->fbimage)
267e44c85637a3298918e292e9ddba812856cf92924Younes Manton	{
268e44c85637a3298918e292e9ddba812856cf92924Younes Manton		FREE(xsp_winsys);
269e44c85637a3298918e292e9ddba812856cf92924Younes Manton		return NULL;
270e44c85637a3298918e292e9ddba812856cf92924Younes Manton	}
271e44c85637a3298918e292e9ddba812856cf92924Younes Manton
272e44c85637a3298918e292e9ddba812856cf92924Younes Manton	XInitImage(xsp_winsys->fbimage);
273e44c85637a3298918e292e9ddba812856cf92924Younes Manton
274e44c85637a3298918e292e9ddba812856cf92924Younes Manton	return softpipe_create_screen(&xsp_winsys->base);
275e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
276e44c85637a3298918e292e9ddba812856cf92924Younes Manton
277e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct pipe_video_context*
278e44c85637a3298918e292e9ddba812856cf92924Younes Mantonvl_video_create(struct pipe_screen *screen,
279e44c85637a3298918e292e9ddba812856cf92924Younes Manton                enum pipe_video_profile profile,
280e44c85637a3298918e292e9ddba812856cf92924Younes Manton                enum pipe_video_chroma_format chroma_format,
281e44c85637a3298918e292e9ddba812856cf92924Younes Manton                unsigned width, unsigned height)
282e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
283e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct pipe_video_context	*vpipe;
284e44c85637a3298918e292e9ddba812856cf92924Younes Manton	struct xsp_context		*xsp_context;
285e44c85637a3298918e292e9ddba812856cf92924Younes Manton
286e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(screen);
287e44c85637a3298918e292e9ddba812856cf92924Younes Manton	assert(width && height);
288e44c85637a3298918e292e9ddba812856cf92924Younes Manton
289e44c85637a3298918e292e9ddba812856cf92924Younes Manton	vpipe = sp_video_create(screen, profile, chroma_format, width, height);
290e44c85637a3298918e292e9ddba812856cf92924Younes Manton	if (!vpipe)
291e44c85637a3298918e292e9ddba812856cf92924Younes Manton		return NULL;
292e44c85637a3298918e292e9ddba812856cf92924Younes Manton
293e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_context = CALLOC_STRUCT(xsp_context);
294e44c85637a3298918e292e9ddba812856cf92924Younes Manton	if (!xsp_context)
295e44c85637a3298918e292e9ddba812856cf92924Younes Manton	{
296e44c85637a3298918e292e9ddba812856cf92924Younes Manton		vpipe->destroy(vpipe);
297e44c85637a3298918e292e9ddba812856cf92924Younes Manton		return NULL;
298e44c85637a3298918e292e9ddba812856cf92924Younes Manton	}
299e44c85637a3298918e292e9ddba812856cf92924Younes Manton
300e44c85637a3298918e292e9ddba812856cf92924Younes Manton	/* Override this so we can free our xsp_context when the pipe is freed */
301e44c85637a3298918e292e9ddba812856cf92924Younes Manton	xsp_context->pipe_destroy = vpipe->destroy;
302e44c85637a3298918e292e9ddba812856cf92924Younes Manton	vpipe->destroy = xsp_pipe_destroy;
303e44c85637a3298918e292e9ddba812856cf92924Younes Manton
304e44c85637a3298918e292e9ddba812856cf92924Younes Manton	vpipe->priv = xsp_context;
305e44c85637a3298918e292e9ddba812856cf92924Younes Manton
306e44c85637a3298918e292e9ddba812856cf92924Younes Manton	return vpipe;
307e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
308