diff options
Diffstat (limited to 'src/mesa/pipe/xlib')
-rw-r--r-- | src/mesa/pipe/xlib/xm_api.c | 4 | ||||
-rw-r--r-- | src/mesa/pipe/xlib/xm_winsys.c | 82 |
2 files changed, 56 insertions, 30 deletions
diff --git a/src/mesa/pipe/xlib/xm_api.c b/src/mesa/pipe/xlib/xm_api.c index a05ff358c0..a4874d3f8f 100644 --- a/src/mesa/pipe/xlib/xm_api.c +++ b/src/mesa/pipe/xlib/xm_api.c @@ -317,6 +317,10 @@ create_xmesa_buffer(XMesaDrawable d, BufferType type, b->mesa_buffer.Delete = xmesa_delete_framebuffer; /* + * XXX we want to create surfaces for pipe, not renderbuffers for Mesa. + */ + + /* * Front renderbuffer */ b->frontxrb = xmesa_create_renderbuffer(NULL, 0, &vis->mesa_visual, GL_FALSE); diff --git a/src/mesa/pipe/xlib/xm_winsys.c b/src/mesa/pipe/xlib/xm_winsys.c index 3dd15e198d..ef8e78f441 100644 --- a/src/mesa/pipe/xlib/xm_winsys.c +++ b/src/mesa/pipe/xlib/xm_winsys.c @@ -296,40 +296,53 @@ xm_surface_alloc(struct pipe_winsys *ws, GLuint pipeFormat) /** - * Create a winsys layer. + * Return pointer to a pipe_winsys object. + * For Xlib, this is a singleton object. * Nothing special for the Xlib driver so no subclassing or anything. */ static struct pipe_winsys * -xmesa_create_pipe_winsys(void) +xmesa_get_pipe_winsys(void) { - struct pipe_winsys *ws = CALLOC_STRUCT(pipe_winsys); - - /* Fill in this struct with callbacks that pipe will need to - * communicate with the window system, buffer manager, etc. - */ - ws->buffer_create = xm_buffer_create; - ws->user_buffer_create = xm_user_buffer_create; - ws->buffer_map = xm_buffer_map; - ws->buffer_unmap = xm_buffer_unmap; - ws->buffer_reference = xm_buffer_reference; - ws->buffer_data = xm_buffer_data; - ws->buffer_subdata = xm_buffer_subdata; - ws->buffer_get_subdata = xm_buffer_get_subdata; - - ws->region_alloc = xm_region_alloc; - ws->region_release = xm_region_release; - - ws->surface_alloc = xm_surface_alloc; + static struct pipe_winsys *ws = NULL; - ws->flush_frontbuffer = xm_flush_frontbuffer; - ws->wait_idle = xm_wait_idle; - ws->printf = xm_printf; - ws->get_name = xm_get_name; + if (!ws) { + ws = CALLOC_STRUCT(pipe_winsys); + + /* Fill in this struct with callbacks that pipe will need to + * communicate with the window system, buffer manager, etc. + */ + ws->buffer_create = xm_buffer_create; + ws->user_buffer_create = xm_user_buffer_create; + ws->buffer_map = xm_buffer_map; + ws->buffer_unmap = xm_buffer_unmap; + ws->buffer_reference = xm_buffer_reference; + ws->buffer_data = xm_buffer_data; + ws->buffer_subdata = xm_buffer_subdata; + ws->buffer_get_subdata = xm_buffer_get_subdata; + + ws->region_alloc = xm_region_alloc; + ws->region_release = xm_region_release; + + ws->surface_alloc = xm_surface_alloc; + + ws->flush_frontbuffer = xm_flush_frontbuffer; + ws->wait_idle = xm_wait_idle; + ws->printf = xm_printf; + ws->get_name = xm_get_name; + } return ws; } +/** + * XXX this depends on the depths supported by the screen (8/16/32/etc). + * Maybe when we're about to create a context/drawable we create a new + * softpipe_winsys object that corresponds to the specified screen... + * + * Also, this query only really matters for on-screen drawables. + * For textures and FBOs we (softpipe) can support any format. + */ static boolean xmesa_is_format_supported(struct softpipe_winsys *sws, uint format) { @@ -344,13 +357,22 @@ xmesa_is_format_supported(struct softpipe_winsys *sws, uint format) } +/** + * Return pointer to a softpipe_winsys object. + * For Xlib, this is a singleton object. + */ static struct softpipe_winsys * -xmesa_create_softpipe_winsys(void) +xmesa_get_softpipe_winsys(void) { - struct softpipe_winsys *spws = CALLOC_STRUCT(softpipe_winsys); - if (spws) { - spws->is_format_supported = xmesa_is_format_supported; + static struct softpipe_winsys *spws = NULL; + + if (!spws) { + spws = CALLOC_STRUCT(softpipe_winsys); + if (spws) { + spws->is_format_supported = xmesa_is_format_supported; + } } + return spws; } @@ -358,8 +380,8 @@ xmesa_create_softpipe_winsys(void) struct pipe_context * xmesa_create_softpipe(XMesaContext xmesa) { - struct pipe_winsys *pws = xmesa_create_pipe_winsys(); - struct softpipe_winsys *spws = xmesa_create_softpipe_winsys(); + struct pipe_winsys *pws = xmesa_get_pipe_winsys(); + struct softpipe_winsys *spws = xmesa_get_softpipe_winsys(); return softpipe_create( pws, spws ); } |