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