diff options
Diffstat (limited to 'src/mesa/drivers/x11/xm_softpipe.c')
-rw-r--r-- | src/mesa/drivers/x11/xm_softpipe.c | 127 |
1 files changed, 95 insertions, 32 deletions
diff --git a/src/mesa/drivers/x11/xm_softpipe.c b/src/mesa/drivers/x11/xm_softpipe.c index 6e8ef21b50..2f93ff3309 100644 --- a/src/mesa/drivers/x11/xm_softpipe.c +++ b/src/mesa/drivers/x11/xm_softpipe.c @@ -37,6 +37,7 @@ #include "xmesaP.h" #include "main/macros.h" +#include "pipe/p_winsys.h" #include "pipe/softpipe/sp_winsys.h" @@ -62,36 +63,37 @@ struct xm_buffer static inline struct xm_buffer * xm_bo( struct pipe_buffer_handle *bo ) { - return (struct xm_buffer *)bo; + return (struct xm_buffer *) bo; } static inline struct pipe_buffer_handle * pipe_bo( struct xm_buffer *bo ) { - return (struct pipe_buffer_handle *)bo; + return (struct pipe_buffer_handle *) bo; } /* Turn a softpipe winsys into an xm/softpipe winsys: */ static inline struct xm_softpipe_winsys * -xm_softpipe_winsys( struct softpipe_winsys *sws ) +xm_softpipe_winsys(struct softpipe_winsys *sws) { - return (struct xm_softpipe_winsys *)sws; + return (struct xm_softpipe_winsys *) sws; } /* Most callbacks map direcly onto dri_bufmgr operations: */ -static void *xm_buffer_map(struct softpipe_winsys *sws, - struct pipe_buffer_handle *buf ) +static void * +xm_buffer_map(struct pipe_winsys *pws, struct pipe_buffer_handle *buf, + unsigned flags) { struct xm_buffer *xm_buf = xm_bo(buf); xm_buf->mapped = xm_buf->data; return xm_buf->mapped; } -static void xm_buffer_unmap(struct softpipe_winsys *sws, - struct pipe_buffer_handle *buf) +static void +xm_buffer_unmap(struct pipe_winsys *pws, struct pipe_buffer_handle *buf) { struct xm_buffer *xm_buf = xm_bo(buf); xm_buf->mapped = NULL; @@ -99,16 +101,15 @@ static void xm_buffer_unmap(struct softpipe_winsys *sws, static struct pipe_buffer_handle * -xm_buffer_reference(struct softpipe_winsys *sws, - struct pipe_buffer_handle *buf) +xm_buffer_reference(struct pipe_winsys *pws, struct pipe_buffer_handle *buf) { struct xm_buffer *xm_buf = xm_bo(buf); xm_buf->refcount++; return buf; } -static void xm_buffer_unreference(struct softpipe_winsys *sws, - struct pipe_buffer_handle **buf) +static void +xm_buffer_unreference(struct pipe_winsys *pws, struct pipe_buffer_handle **buf) { struct xm_buffer *xm_buf = xm_bo(*buf); xm_buf->refcount--; @@ -122,21 +123,18 @@ static void xm_buffer_unreference(struct softpipe_winsys *sws, *buf = NULL; } - -static void xm_buffer_data(struct softpipe_winsys *sws, - struct pipe_buffer_handle *buf, - unsigned size, const void *data ) +static void +xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf, + unsigned size, const void *data ) { struct xm_buffer *xm_buf = xm_bo(buf); assert(!xm_buf->data); xm_buf->data = malloc(size); } -static void xm_buffer_subdata(struct softpipe_winsys *sws, - struct pipe_buffer_handle *buf, - unsigned long offset, - unsigned long size, - const void *data) +static void +xm_buffer_subdata(struct pipe_winsys *pws, struct pipe_buffer_handle *buf, + unsigned long offset, unsigned long size, const void *data) { struct xm_buffer *xm_buf = xm_bo(buf); GLubyte *b = (GLubyte *) xm_buf->data; @@ -144,11 +142,9 @@ static void xm_buffer_subdata(struct softpipe_winsys *sws, memcpy(b + offset, data, size); } -static void xm_buffer_get_subdata(struct softpipe_winsys *sws, - struct pipe_buffer_handle *buf, - unsigned long offset, - unsigned long size, - void *data) +static void +xm_buffer_get_subdata(struct pipe_winsys *pws, struct pipe_buffer_handle *buf, + unsigned long offset, unsigned long size, void *data) { const struct xm_buffer *xm_buf = xm_bo(buf); const GLubyte *b = (GLubyte *) xm_buf->data; @@ -156,21 +152,86 @@ static void xm_buffer_get_subdata(struct softpipe_winsys *sws, memcpy(data, b + offset, size); } +static void +xm_flush_frontbuffer(struct pipe_winsys *pws) +{ + /* + struct intel_context *intel = intel_pipe_winsys(sws)->intel; + __DRIdrawablePrivate *dPriv = intel->driDrawable; + + intelCopyBuffer(dPriv, NULL); + */ +} + +static void +xm_wait_idle(struct pipe_winsys *pws) +{ + /* no-op */ +} + +static void +xm_printf(struct pipe_winsys *pws, const char *fmtString, ...) +{ + va_list args; + va_start( args, fmtString ); + vfprintf(stderr, fmtString, args); + va_end( args ); +} + +static const char * +xm_get_name(struct pipe_winsys *pws) +{ + return "Xlib"; +} + /* Softpipe has no concept of pools. We choose the tex/region pool * for all buffers. */ static struct pipe_buffer_handle * -xm_create_buffer(struct softpipe_winsys *sws, - unsigned alignment) +xm_buffer_create(struct pipe_winsys *pws, unsigned alignment) { - struct xm_buffer *buffer; - - buffer = CALLOC_STRUCT(xm_buffer); + struct xm_buffer *buffer = CALLOC_STRUCT(xm_buffer); return pipe_bo(buffer); } +struct xmesa_pipe_winsys +{ + struct pipe_winsys winsys; + XMesaContext xmesa; +}; + +static struct pipe_winsys * +xmesa_create_pipe_winsys( XMesaContext xmesa ) +{ + struct xmesa_pipe_winsys *xws = CALLOC_STRUCT(xmesa_pipe_winsys); + + /* Fill in this struct with callbacks that pipe will need to + * communicate with the window system, buffer manager, etc. + * + * Pipe would be happy with a malloc based memory manager, but + * the SwapBuffers implementation in this winsys driver requires + * that rendering be done to an appropriate _DriBufferObject. + */ + xws->winsys.buffer_create = xm_buffer_create; + xws->winsys.buffer_map = xm_buffer_map; + xws->winsys.buffer_unmap = xm_buffer_unmap; + xws->winsys.buffer_reference = xm_buffer_reference; + xws->winsys.buffer_unreference = xm_buffer_unreference; + xws->winsys.buffer_data = xm_buffer_data; + xws->winsys.buffer_subdata = xm_buffer_subdata; + xws->winsys.buffer_get_subdata = xm_buffer_get_subdata; + xws->winsys.flush_frontbuffer = xm_flush_frontbuffer; + xws->winsys.wait_idle = xm_wait_idle; + xws->winsys.printf = xm_printf; + xws->winsys.get_name = xm_get_name; + xws->xmesa = xmesa; + + return &xws->winsys; +} + + struct pipe_context * xmesa_create_softpipe(XMesaContext xmesa) { @@ -183,6 +244,7 @@ xmesa_create_softpipe(XMesaContext xmesa) * the SwapBuffers implementation in this winsys driver requires * that rendering be done to an appropriate xm_buffer. */ +#if 0 isws->sws.create_buffer = xm_create_buffer; isws->sws.buffer_map = xm_buffer_map; isws->sws.buffer_unmap = xm_buffer_unmap; @@ -191,8 +253,9 @@ xmesa_create_softpipe(XMesaContext xmesa) isws->sws.buffer_data = xm_buffer_data; isws->sws.buffer_subdata = xm_buffer_subdata; isws->sws.buffer_get_subdata = xm_buffer_get_subdata; +#endif /* Create the softpipe context: */ - return softpipe_create( &isws->sws ); + return softpipe_create( xmesa_create_pipe_winsys(xmesa), &isws->sws ); } |