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