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