vl_winsys_xsp.c revision f9f7646fe64364f74cc8dd1a6d5ca3a6700f142f
1fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton/**************************************************************************
2fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton *
3fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Copyright 2009 Younes Manton.
4fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * All Rights Reserved.
5fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton *
6fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Permission is hereby granted, free of charge, to any person obtaining a
7fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * copy of this software and associated documentation files (the
8fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * "Software"), to deal in the Software without restriction, including
9fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * without limitation the rights to use, copy, modify, merge, publish,
10fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * distribute, sub license, and/or sell copies of the Software, and to
11fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * permit persons to whom the Software is furnished to do so, subject to
12fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * the following conditions:
13fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton *
14fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * The above copyright notice and this permission notice (including the
15fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * next paragraph) shall be included in all copies or substantial portions
16fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * of the Software.
17fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton *
18fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton *
26fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton **************************************************************************/
27fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton
28e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <vl_winsys.h>
29e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <X11/Xutil.h>
30e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <pipe/internal/p_winsys_screen.h>
31e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <pipe/p_state.h>
32e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <pipe/p_inlines.h>
33e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <util/u_memory.h>
34e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <util/u_math.h>
35e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <softpipe/sp_winsys.h>
36e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <softpipe/sp_video_context.h>
37e44c85637a3298918e292e9ddba812856cf92924Younes Manton#include <softpipe/sp_texture.h>
38e44c85637a3298918e292e9ddba812856cf92924Younes Manton
39e44c85637a3298918e292e9ddba812856cf92924Younes Manton/* pipe_winsys implementation */
40e44c85637a3298918e292e9ddba812856cf92924Younes Manton
41e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct xsp_pipe_winsys
42e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
43f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_winsys base;
44f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   Display *display;
45f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   int screen;
46f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   XImage *fbimage;
47e44c85637a3298918e292e9ddba812856cf92924Younes Manton};
48e44c85637a3298918e292e9ddba812856cf92924Younes Manton
49e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct xsp_context
50e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
51f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   Drawable drawable;
52e44c85637a3298918e292e9ddba812856cf92924Younes Manton
53f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   void (*pipe_destroy)(struct pipe_video_context *vpipe);
54e44c85637a3298918e292e9ddba812856cf92924Younes Manton};
55e44c85637a3298918e292e9ddba812856cf92924Younes Manton
56e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct xsp_buffer
57e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
58f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_buffer base;
59f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   boolean is_user_buffer;
60f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   void *data;
61f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   void *mapped_data;
62e44c85637a3298918e292e9ddba812856cf92924Younes Manton};
63e44c85637a3298918e292e9ddba812856cf92924Younes Manton
64e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic struct pipe_buffer* xsp_buffer_create(struct pipe_winsys *pws, unsigned alignment, unsigned usage, unsigned size)
65e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
66f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_buffer *buffer;
67e44c85637a3298918e292e9ddba812856cf92924Younes Manton
68f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
69e44c85637a3298918e292e9ddba812856cf92924Younes Manton
70f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer = calloc(1, sizeof(struct xsp_buffer));
71f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   pipe_reference_init(&buffer->base.reference, 1);
72f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->base.alignment = alignment;
73f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->base.usage = usage;
74f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->base.size = size;
75f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->data = align_malloc(size, alignment);
76e44c85637a3298918e292e9ddba812856cf92924Younes Manton
77f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return (struct pipe_buffer*)buffer;
78e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
79e44c85637a3298918e292e9ddba812856cf92924Younes Manton
80e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic struct pipe_buffer* xsp_user_buffer_create(struct pipe_winsys *pws, void *data, unsigned size)
81e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
82f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_buffer *buffer;
83e44c85637a3298918e292e9ddba812856cf92924Younes Manton
84f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
85e44c85637a3298918e292e9ddba812856cf92924Younes Manton
86f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer = calloc(1, sizeof(struct xsp_buffer));
87f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   pipe_reference_init(&buffer->base.reference, 1);
88f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->base.size = size;
89f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->is_user_buffer = TRUE;
90f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->data = data;
91e44c85637a3298918e292e9ddba812856cf92924Younes Manton
92f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return (struct pipe_buffer*)buffer;
93e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
94e44c85637a3298918e292e9ddba812856cf92924Younes Manton
95e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void* xsp_buffer_map(struct pipe_winsys *pws, struct pipe_buffer *buffer, unsigned flags)
96e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
97f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_buffer *xsp_buf = (struct xsp_buffer*)buffer;
98e44c85637a3298918e292e9ddba812856cf92924Younes Manton
99f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
100f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(buffer);
101e44c85637a3298918e292e9ddba812856cf92924Younes Manton
102f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_buf->mapped_data = xsp_buf->data;
103e44c85637a3298918e292e9ddba812856cf92924Younes Manton
104f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return xsp_buf->mapped_data;
105e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
106e44c85637a3298918e292e9ddba812856cf92924Younes Manton
107e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_buffer_unmap(struct pipe_winsys *pws, struct pipe_buffer *buffer)
108e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
109f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_buffer *xsp_buf = (struct xsp_buffer*)buffer;
110e44c85637a3298918e292e9ddba812856cf92924Younes Manton
111f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
112f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(buffer);
113e44c85637a3298918e292e9ddba812856cf92924Younes Manton
114f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_buf->mapped_data = NULL;
115e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
116e44c85637a3298918e292e9ddba812856cf92924Younes Manton
117e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_buffer_destroy(struct pipe_buffer *buffer)
118e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
119f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_buffer *xsp_buf = (struct xsp_buffer*)buffer;
120e44c85637a3298918e292e9ddba812856cf92924Younes Manton
121f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(buffer);
122e44c85637a3298918e292e9ddba812856cf92924Younes Manton
123f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   if (!xsp_buf->is_user_buffer)
124f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      align_free(xsp_buf->data);
125e44c85637a3298918e292e9ddba812856cf92924Younes Manton
126f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   free(xsp_buf);
127e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
128e44c85637a3298918e292e9ddba812856cf92924Younes Manton
129e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic struct pipe_buffer* xsp_surface_buffer_create
130e44c85637a3298918e292e9ddba812856cf92924Younes Manton(
131f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_winsys *pws,
132f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned width,
133f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned height,
134f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   enum pipe_format format,
135f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned usage,
136f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned tex_usage,
137f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned *stride
138e44c85637a3298918e292e9ddba812856cf92924Younes Manton)
139e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
140f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   const unsigned int ALIGNMENT = 1;
141f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_format_block block;
142f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned nblocksx, nblocksy;
143f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
144f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   pf_get_block(format, &block);
145f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   nblocksx = pf_get_nblocksx(&block, width);
146f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   nblocksy = pf_get_nblocksy(&block, height);
147f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   *stride = align(nblocksx * block.size, ALIGNMENT);
148f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
149f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return pws->buffer_create(pws, ALIGNMENT, usage,
150f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton                             *stride * nblocksy);
151e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
152e44c85637a3298918e292e9ddba812856cf92924Younes Manton
153e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_fence_reference(struct pipe_winsys *pws, struct pipe_fence_handle **ptr, struct pipe_fence_handle *fence)
154e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
155f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
156f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(ptr);
157f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(fence);
158e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
159e44c85637a3298918e292e9ddba812856cf92924Younes Manton
160e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic int xsp_fence_signalled(struct pipe_winsys *pws, struct pipe_fence_handle *fence, unsigned flag)
161e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
162f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
163f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(fence);
164e44c85637a3298918e292e9ddba812856cf92924Younes Manton
165f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return 0;
166e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
167e44c85637a3298918e292e9ddba812856cf92924Younes Manton
168e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic int xsp_fence_finish(struct pipe_winsys *pws, struct pipe_fence_handle *fence, unsigned flag)
169e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
170f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
171f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(fence);
172e44c85637a3298918e292e9ddba812856cf92924Younes Manton
173f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return 0;
174e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
175e44c85637a3298918e292e9ddba812856cf92924Younes Manton
176e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_flush_frontbuffer(struct pipe_winsys *pws, struct pipe_surface *surface, void *context_private)
177e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
178f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_pipe_winsys *xsp_winsys;
179f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_context *xsp_context;
180f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
181f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
182f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(surface);
183f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(context_private);
184f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
185f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys = (struct xsp_pipe_winsys*)pws;
186f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_context = (struct xsp_context*)context_private;
187f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage->width = surface->width;
188f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage->height = surface->height;
189f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage->bytes_per_line = surface->width * (xsp_winsys->fbimage->bits_per_pixel >> 3);
190f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage->data = (char*)((struct xsp_buffer *)softpipe_texture(surface->texture)->buffer)->data + surface->offset;
191f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
192f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   XPutImage
193f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   (
194f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      xsp_winsys->display, xsp_context->drawable,
195f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      XDefaultGC(xsp_winsys->display, xsp_winsys->screen),
196f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      xsp_winsys->fbimage, 0, 0, 0, 0,
197f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      surface->width, surface->height
198f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   );
199f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   XFlush(xsp_winsys->display);
200e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
201e44c85637a3298918e292e9ddba812856cf92924Younes Manton
202e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic const char* xsp_get_name(struct pipe_winsys *pws)
203e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
204f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
205f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return "X11 SoftPipe";
206e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
207e44c85637a3298918e292e9ddba812856cf92924Younes Manton
208e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_destroy(struct pipe_winsys *pws)
209e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
210f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_pipe_winsys *xsp_winsys = (struct xsp_pipe_winsys*)pws;
211e44c85637a3298918e292e9ddba812856cf92924Younes Manton
212f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
213e44c85637a3298918e292e9ddba812856cf92924Younes Manton
214f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   /* XDestroyImage() wants to free the data as well */
215f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage->data = NULL;
216e44c85637a3298918e292e9ddba812856cf92924Younes Manton
217f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   XDestroyImage(xsp_winsys->fbimage);
218f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   FREE(xsp_winsys);
219e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
220e44c85637a3298918e292e9ddba812856cf92924Younes Manton
221e44c85637a3298918e292e9ddba812856cf92924Younes Manton/* Called through pipe_video_context::destroy() */
222e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_pipe_destroy(struct pipe_video_context *vpipe)
223e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
224f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_context *xsp_context;
225e44c85637a3298918e292e9ddba812856cf92924Younes Manton
226f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(vpipe);
227e44c85637a3298918e292e9ddba812856cf92924Younes Manton
228f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_context = vpipe->priv;
229e44c85637a3298918e292e9ddba812856cf92924Younes Manton
230f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   /* Call the original destroy */
231f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_context->pipe_destroy(vpipe);
232e44c85637a3298918e292e9ddba812856cf92924Younes Manton
233f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   FREE(xsp_context);
234e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
235e44c85637a3298918e292e9ddba812856cf92924Younes Manton
236e44c85637a3298918e292e9ddba812856cf92924Younes Manton/* Show starts here */
237e44c85637a3298918e292e9ddba812856cf92924Younes Manton
238e44c85637a3298918e292e9ddba812856cf92924Younes MantonDrawable
239e44c85637a3298918e292e9ddba812856cf92924Younes Mantonvl_video_bind_drawable(struct pipe_video_context *vpipe, Drawable drawable)
240e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
241f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_context *xsp_context;
242f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   Drawable old_drawable;
243e44c85637a3298918e292e9ddba812856cf92924Younes Manton
244f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(vpipe);
245e44c85637a3298918e292e9ddba812856cf92924Younes Manton
246f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_context = vpipe->priv;
247f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   old_drawable = xsp_context->drawable;
248f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_context->drawable = drawable;
249e44c85637a3298918e292e9ddba812856cf92924Younes Manton
250f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return old_drawable;
251e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
252e44c85637a3298918e292e9ddba812856cf92924Younes Manton
253e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct pipe_screen*
254e44c85637a3298918e292e9ddba812856cf92924Younes Mantonvl_screen_create(Display *display, int screen)
255e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
256f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_pipe_winsys *xsp_winsys;
257f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
258f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(display);
259f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
260f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys = CALLOC_STRUCT(xsp_pipe_winsys);
261f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   if (!xsp_winsys)
262f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
263f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
264f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.buffer_create = xsp_buffer_create;
265f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.user_buffer_create = xsp_user_buffer_create;
266f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.buffer_map = xsp_buffer_map;
267f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.buffer_unmap = xsp_buffer_unmap;
268f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.buffer_destroy = xsp_buffer_destroy;
269f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.surface_buffer_create = xsp_surface_buffer_create;
270f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.fence_reference = xsp_fence_reference;
271f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.fence_signalled = xsp_fence_signalled;
272f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.fence_finish = xsp_fence_finish;
273f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.flush_frontbuffer = xsp_flush_frontbuffer;
274f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.get_name = xsp_get_name;
275f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.destroy = xsp_destroy;
276f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->display = display;
277f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->screen = screen;
278f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage = XCreateImage
279f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   (
280f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      display,
281f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      XDefaultVisual(display, screen),
282f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      XDefaultDepth(display, screen),
283f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      ZPixmap,
284f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      0,
285f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      NULL,
286f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      0, /* Don't know the width and height until flush_frontbuffer */
287f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      0,
288f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      32,
289f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      0
290f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   );
291f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
292f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   if (!xsp_winsys->fbimage) {
293f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      FREE(xsp_winsys);
294f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
295f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   }
296f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
297f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   XInitImage(xsp_winsys->fbimage);
298f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
299f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return softpipe_create_screen(&xsp_winsys->base);
300e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
301e44c85637a3298918e292e9ddba812856cf92924Younes Manton
302e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct pipe_video_context*
303e44c85637a3298918e292e9ddba812856cf92924Younes Mantonvl_video_create(struct pipe_screen *screen,
304e44c85637a3298918e292e9ddba812856cf92924Younes Manton                enum pipe_video_profile profile,
305e44c85637a3298918e292e9ddba812856cf92924Younes Manton                enum pipe_video_chroma_format chroma_format,
306e44c85637a3298918e292e9ddba812856cf92924Younes Manton                unsigned width, unsigned height)
307e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
308f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_video_context *vpipe;
309f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_context *xsp_context;
310e44c85637a3298918e292e9ddba812856cf92924Younes Manton
311f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(screen);
312f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(width && height);
313e44c85637a3298918e292e9ddba812856cf92924Younes Manton
314f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   vpipe = sp_video_create(screen, profile, chroma_format, width, height);
315f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   if (!vpipe)
316f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
317e44c85637a3298918e292e9ddba812856cf92924Younes Manton
318f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_context = CALLOC_STRUCT(xsp_context);
319f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   if (!xsp_context) {
320f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      vpipe->destroy(vpipe);
321f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
322f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   }
323e44c85637a3298918e292e9ddba812856cf92924Younes Manton
324f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   /* Override this so we can free our xsp_context when the pipe is freed */
325f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_context->pipe_destroy = vpipe->destroy;
326f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   vpipe->destroy = xsp_pipe_destroy;
327e44c85637a3298918e292e9ddba812856cf92924Younes Manton
328f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   vpipe->priv = xsp_context;
329e44c85637a3298918e292e9ddba812856cf92924Younes Manton
330f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return vpipe;
331e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
332