vl_winsys_xsp.c revision e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9fe
1fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton/**************************************************************************
2e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton *
3fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * Copyright 2009 Younes Manton.
4fcb595c04f9ee275eae49b7bb7c61246671f5ce2Younes Manton * All Rights Reserved.
5e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes 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:
13e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes 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.
17e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes 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.
25e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes 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
39e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton/* TODO: Find a good way to calculate this */
40e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonstatic enum pipe_format VisualToPipe(Visual *visual)
41e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton{
42e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   assert(visual);
43e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   return PIPE_FORMAT_X8R8G8B8_UNORM;
44e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton}
45e44c85637a3298918e292e9ddba812856cf92924Younes Manton
46e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct xsp_pipe_winsys
47e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
48f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_winsys base;
49f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   Display *display;
50f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   int screen;
51f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   XImage *fbimage;
52e44c85637a3298918e292e9ddba812856cf92924Younes Manton};
53e44c85637a3298918e292e9ddba812856cf92924Younes Manton
54e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct xsp_context
55e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
56e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   struct vl_context base;
57e44c85637a3298918e292e9ddba812856cf92924Younes Manton
58e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   Drawable drawable;
59e44c85637a3298918e292e9ddba812856cf92924Younes Manton};
60e44c85637a3298918e292e9ddba812856cf92924Younes Manton
61e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstruct xsp_buffer
62e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
63f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_buffer base;
64f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   boolean is_user_buffer;
65f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   void *data;
66f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   void *mapped_data;
67e44c85637a3298918e292e9ddba812856cf92924Younes Manton};
68e44c85637a3298918e292e9ddba812856cf92924Younes Manton
69e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic struct pipe_buffer* xsp_buffer_create(struct pipe_winsys *pws, unsigned alignment, unsigned usage, unsigned size)
70e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
71f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_buffer *buffer;
72e44c85637a3298918e292e9ddba812856cf92924Younes Manton
73f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
74e44c85637a3298918e292e9ddba812856cf92924Younes Manton
75f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer = calloc(1, sizeof(struct xsp_buffer));
76f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   pipe_reference_init(&buffer->base.reference, 1);
77f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->base.alignment = alignment;
78f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->base.usage = usage;
79f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->base.size = size;
80f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->data = align_malloc(size, alignment);
81e44c85637a3298918e292e9ddba812856cf92924Younes Manton
82f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return (struct pipe_buffer*)buffer;
83e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
84e44c85637a3298918e292e9ddba812856cf92924Younes Manton
85e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic struct pipe_buffer* xsp_user_buffer_create(struct pipe_winsys *pws, void *data, unsigned size)
86e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
87f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_buffer *buffer;
88e44c85637a3298918e292e9ddba812856cf92924Younes Manton
89f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
90e44c85637a3298918e292e9ddba812856cf92924Younes Manton
91f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer = calloc(1, sizeof(struct xsp_buffer));
92f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   pipe_reference_init(&buffer->base.reference, 1);
93f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->base.size = size;
94f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->is_user_buffer = TRUE;
95f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   buffer->data = data;
96e44c85637a3298918e292e9ddba812856cf92924Younes Manton
97f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return (struct pipe_buffer*)buffer;
98e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
99e44c85637a3298918e292e9ddba812856cf92924Younes Manton
100e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void* xsp_buffer_map(struct pipe_winsys *pws, struct pipe_buffer *buffer, unsigned flags)
101e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
102f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_buffer *xsp_buf = (struct xsp_buffer*)buffer;
103e44c85637a3298918e292e9ddba812856cf92924Younes Manton
104f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
105f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(buffer);
106e44c85637a3298918e292e9ddba812856cf92924Younes Manton
107f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_buf->mapped_data = xsp_buf->data;
108e44c85637a3298918e292e9ddba812856cf92924Younes Manton
109f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return xsp_buf->mapped_data;
110e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
111e44c85637a3298918e292e9ddba812856cf92924Younes Manton
112e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_buffer_unmap(struct pipe_winsys *pws, struct pipe_buffer *buffer)
113e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
114f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_buffer *xsp_buf = (struct xsp_buffer*)buffer;
115e44c85637a3298918e292e9ddba812856cf92924Younes Manton
116f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
117f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(buffer);
118e44c85637a3298918e292e9ddba812856cf92924Younes Manton
119f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_buf->mapped_data = NULL;
120e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
121e44c85637a3298918e292e9ddba812856cf92924Younes Manton
122e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_buffer_destroy(struct pipe_buffer *buffer)
123e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
124f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_buffer *xsp_buf = (struct xsp_buffer*)buffer;
125e44c85637a3298918e292e9ddba812856cf92924Younes Manton
126f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(buffer);
127e44c85637a3298918e292e9ddba812856cf92924Younes Manton
128f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   if (!xsp_buf->is_user_buffer)
129f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      align_free(xsp_buf->data);
130e44c85637a3298918e292e9ddba812856cf92924Younes Manton
131f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   free(xsp_buf);
132e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
133e44c85637a3298918e292e9ddba812856cf92924Younes Manton
134e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic struct pipe_buffer* xsp_surface_buffer_create
135e44c85637a3298918e292e9ddba812856cf92924Younes Manton(
136f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_winsys *pws,
137f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned width,
138f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned height,
139f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   enum pipe_format format,
140f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned usage,
141f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned tex_usage,
142f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned *stride
143e44c85637a3298918e292e9ddba812856cf92924Younes Manton)
144e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
145f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   const unsigned int ALIGNMENT = 1;
146f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_format_block block;
147f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   unsigned nblocksx, nblocksy;
148f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
149f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   pf_get_block(format, &block);
150f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   nblocksx = pf_get_nblocksx(&block, width);
151f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   nblocksy = pf_get_nblocksy(&block, height);
152f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   *stride = align(nblocksx * block.size, ALIGNMENT);
153f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
154f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return pws->buffer_create(pws, ALIGNMENT, usage,
155f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton                             *stride * nblocksy);
156e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
157e44c85637a3298918e292e9ddba812856cf92924Younes Manton
158e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_fence_reference(struct pipe_winsys *pws, struct pipe_fence_handle **ptr, struct pipe_fence_handle *fence)
159e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
160f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
161f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(ptr);
162f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(fence);
163e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
164e44c85637a3298918e292e9ddba812856cf92924Younes Manton
165e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic int xsp_fence_signalled(struct pipe_winsys *pws, struct pipe_fence_handle *fence, unsigned flag)
166e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
167f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
168f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(fence);
169e44c85637a3298918e292e9ddba812856cf92924Younes Manton
170f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return 0;
171e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
172e44c85637a3298918e292e9ddba812856cf92924Younes Manton
173e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic int xsp_fence_finish(struct pipe_winsys *pws, struct pipe_fence_handle *fence, unsigned flag)
174e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
175f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
176f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(fence);
177e44c85637a3298918e292e9ddba812856cf92924Younes Manton
178f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return 0;
179e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
180e44c85637a3298918e292e9ddba812856cf92924Younes Manton
181e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_flush_frontbuffer(struct pipe_winsys *pws, struct pipe_surface *surface, void *context_private)
182e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
183f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_pipe_winsys *xsp_winsys;
184f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_context *xsp_context;
185f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
186f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
187f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(surface);
188f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(context_private);
189f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
190f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys = (struct xsp_pipe_winsys*)pws;
191f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_context = (struct xsp_context*)context_private;
192f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage->width = surface->width;
193f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage->height = surface->height;
194f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage->bytes_per_line = surface->width * (xsp_winsys->fbimage->bits_per_pixel >> 3);
195f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage->data = (char*)((struct xsp_buffer *)softpipe_texture(surface->texture)->buffer)->data + surface->offset;
196f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
197f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   XPutImage
198f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   (
199f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      xsp_winsys->display, xsp_context->drawable,
200f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      XDefaultGC(xsp_winsys->display, xsp_winsys->screen),
201f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      xsp_winsys->fbimage, 0, 0, 0, 0,
202f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      surface->width, surface->height
203f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   );
204f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   XFlush(xsp_winsys->display);
205e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
206e44c85637a3298918e292e9ddba812856cf92924Younes Manton
207e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic const char* xsp_get_name(struct pipe_winsys *pws)
208e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
209f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
210f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return "X11 SoftPipe";
211e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
212e44c85637a3298918e292e9ddba812856cf92924Younes Manton
213e44c85637a3298918e292e9ddba812856cf92924Younes Mantonstatic void xsp_destroy(struct pipe_winsys *pws)
214e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
215f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_pipe_winsys *xsp_winsys = (struct xsp_pipe_winsys*)pws;
216e44c85637a3298918e292e9ddba812856cf92924Younes Manton
217f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(pws);
218e44c85637a3298918e292e9ddba812856cf92924Younes Manton
219f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   /* XDestroyImage() wants to free the data as well */
220f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage->data = NULL;
221e44c85637a3298918e292e9ddba812856cf92924Younes Manton
222f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   XDestroyImage(xsp_winsys->fbimage);
223f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   FREE(xsp_winsys);
224e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
225e44c85637a3298918e292e9ddba812856cf92924Younes Manton
226e44c85637a3298918e292e9ddba812856cf92924Younes MantonDrawable
227e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonvl_video_bind_drawable(struct vl_context *vctx, Drawable drawable)
228e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
229e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   struct xsp_context *xsp_context = (struct xsp_context*)vctx;
230f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   Drawable old_drawable;
231e44c85637a3298918e292e9ddba812856cf92924Younes Manton
232e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   assert(vctx);
233e44c85637a3298918e292e9ddba812856cf92924Younes Manton
234f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   old_drawable = xsp_context->drawable;
235f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_context->drawable = drawable;
236e44c85637a3298918e292e9ddba812856cf92924Younes Manton
237f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   return old_drawable;
238e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
239e44c85637a3298918e292e9ddba812856cf92924Younes Manton
240e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonstruct vl_screen*
241e44c85637a3298918e292e9ddba812856cf92924Younes Mantonvl_screen_create(Display *display, int screen)
242e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
243e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   struct vl_screen *vscreen;
244f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_pipe_winsys *xsp_winsys;
245f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
246f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(display);
247f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
248e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   vscreen = CALLOC_STRUCT(vl_screen);
249e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   if (!vscreen)
250e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton      return NULL;
251e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
252f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys = CALLOC_STRUCT(xsp_pipe_winsys);
253e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   if (!xsp_winsys) {
254e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton      FREE(vscreen);
255f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
256e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   }
257f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
258f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.buffer_create = xsp_buffer_create;
259f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.user_buffer_create = xsp_user_buffer_create;
260f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.buffer_map = xsp_buffer_map;
261f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.buffer_unmap = xsp_buffer_unmap;
262f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.buffer_destroy = xsp_buffer_destroy;
263f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.surface_buffer_create = xsp_surface_buffer_create;
264f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.fence_reference = xsp_fence_reference;
265f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.fence_signalled = xsp_fence_signalled;
266f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.fence_finish = xsp_fence_finish;
267f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.flush_frontbuffer = xsp_flush_frontbuffer;
268f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.get_name = xsp_get_name;
269f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->base.destroy = xsp_destroy;
270f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->display = display;
271f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->screen = screen;
272f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_winsys->fbimage = XCreateImage
273f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   (
274f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      display,
275f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      XDefaultVisual(display, screen),
276f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      XDefaultDepth(display, screen),
277f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      ZPixmap,
278f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      0,
279f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      NULL,
280f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      0, /* Don't know the width and height until flush_frontbuffer */
281f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      0,
282f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      32,
283f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      0
284f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   );
285f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
286f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   if (!xsp_winsys->fbimage) {
287f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      FREE(xsp_winsys);
288e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton      FREE(vscreen);
289f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
290f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   }
291f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
292f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   XInitImage(xsp_winsys->fbimage);
293f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton
294e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   vscreen->pscreen = softpipe_create_screen(&xsp_winsys->base);
295e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
296e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   if (!vscreen->pscreen) {
297e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton      FREE(vscreen);
298e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton      XDestroyImage(xsp_winsys->fbimage);
299e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton      FREE(xsp_winsys);
300e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton      return NULL;
301e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   }
302e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
303e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   vscreen->format = VisualToPipe(XDefaultVisual(display, screen));
304e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
305e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   return vscreen;
306e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton}
307e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
308e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonvoid vl_screen_destroy(struct vl_screen *vscreen)
309e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton{
310e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   assert(vscreen);
311e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
312e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   vscreen->pscreen->destroy(vscreen->pscreen);
313e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   FREE(vscreen);
314e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
315e44c85637a3298918e292e9ddba812856cf92924Younes Manton
316e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonstruct vl_context*
317e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonvl_video_create(struct vl_screen *vscreen,
318e44c85637a3298918e292e9ddba812856cf92924Younes Manton                enum pipe_video_profile profile,
319e44c85637a3298918e292e9ddba812856cf92924Younes Manton                enum pipe_video_chroma_format chroma_format,
320e44c85637a3298918e292e9ddba812856cf92924Younes Manton                unsigned width, unsigned height)
321e44c85637a3298918e292e9ddba812856cf92924Younes Manton{
322f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct pipe_video_context *vpipe;
323f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   struct xsp_context *xsp_context;
324e44c85637a3298918e292e9ddba812856cf92924Younes Manton
325e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   assert(vscreen);
326f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   assert(width && height);
327e44c85637a3298918e292e9ddba812856cf92924Younes Manton
328e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   vpipe = sp_video_create(vscreen->pscreen, profile, chroma_format, width, height);
329f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   if (!vpipe)
330f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
331e44c85637a3298918e292e9ddba812856cf92924Younes Manton
332f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   xsp_context = CALLOC_STRUCT(xsp_context);
333f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   if (!xsp_context) {
334f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      vpipe->destroy(vpipe);
335f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton      return NULL;
336f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   }
337e44c85637a3298918e292e9ddba812856cf92924Younes Manton
338f9f7646fe64364f74cc8dd1a6d5ca3a6700f142fYounes Manton   vpipe->priv = xsp_context;
339e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   xsp_context->base.vpipe = vpipe;
340e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   xsp_context->base.vscreen = vscreen;
341e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
342e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   return &xsp_context->base;
343e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton}
344e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton
345e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Mantonvoid vl_video_destroy(struct vl_context *vctx)
346e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton{
347e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   assert(vctx);
348e44c85637a3298918e292e9ddba812856cf92924Younes Manton
349e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   vctx->vpipe->destroy(vctx->vpipe);
350e60a8e4fcf2b4073a5fc2d9ec1de5a6ca6c7b9feYounes Manton   FREE(vctx);
351e44c85637a3298918e292e9ddba812856cf92924Younes Manton}
352