X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fpipe%2Fxlib%2Fxm_winsys.c;h=295174d4bbacf58103198abbd563edc6471fecee;hb=b859cdf6f191b4d8b56537c8dc30082a7e2d94b3;hp=5de811a66fa886595a19767354fc9e9c0bcec92f;hpb=d8e66aca8443c6802ecd8f1a353024ed1d0f32c3;p=mesa.git diff --git a/src/mesa/pipe/xlib/xm_winsys.c b/src/mesa/pipe/xlib/xm_winsys.c index 5de811a66fa..295174d4bba 100644 --- a/src/mesa/pipe/xlib/xm_winsys.c +++ b/src/mesa/pipe/xlib/xm_winsys.c @@ -120,7 +120,7 @@ xm_buffer_reference(struct pipe_winsys *pws, static void xm_buffer_data(struct pipe_winsys *pws, struct pipe_buffer_handle *buf, - unsigned size, const void *data ) + unsigned size, const void *data, unsigned usage ) { struct xm_buffer *xm_buf = xm_bo(buf); assert(!xm_buf->userBuffer); @@ -158,7 +158,8 @@ xm_buffer_get_subdata(struct pipe_winsys *pws, struct pipe_buffer_handle *buf, static void xm_flush_frontbuffer(struct pipe_winsys *pws, - struct pipe_surface *surf ) + struct pipe_surface *surf, + void *context_private) { /* The Xlib driver's front color surfaces are actually X Windows so * this flush is a no-op. @@ -167,11 +168,6 @@ xm_flush_frontbuffer(struct pipe_winsys *pws, */ } -static void -xm_wait_idle(struct pipe_winsys *pws) -{ - /* no-op */ -} static void xm_printf(struct pipe_winsys *pws, const char *fmtString, ...) @@ -190,7 +186,7 @@ xm_get_name(struct pipe_winsys *pws) static struct pipe_buffer_handle * -xm_buffer_create(struct pipe_winsys *pws, unsigned alignment) +xm_buffer_create(struct pipe_winsys *pws, unsigned flags) { struct xm_buffer *buffer = CALLOC_STRUCT(xm_buffer); buffer->refcount = 1; @@ -224,48 +220,11 @@ round_up(unsigned n, unsigned multiple) } -static struct pipe_region * -xm_region_alloc(struct pipe_winsys *winsys, - unsigned cpp, unsigned width, unsigned height, unsigned flags) -{ - struct pipe_region *region = CALLOC_STRUCT(pipe_region); - const unsigned alignment = 64; - - region->cpp = cpp; - region->pitch = round_up(width, alignment / cpp); - region->height = height; - region->refcount = 1; - - assert(region->pitch > 0); - - region->buffer = winsys->buffer_create( winsys, alignment ) -; - - /* NULL data --> just allocate the space */ - winsys->buffer_data( winsys, - region->buffer, - region->pitch * cpp * height, - NULL ); - return region; -} - - -static void -xm_region_release(struct pipe_winsys *winsys, struct pipe_region **region) +static unsigned +xm_surface_pitch(struct pipe_winsys *winsys, unsigned cpp, unsigned width, + unsigned flags) { - if (!*region) - return; - - assert((*region)->refcount > 0); - (*region)->refcount--; - - if ((*region)->refcount == 0) { - assert((*region)->map_refcount == 0); - - winsys->buffer_reference( winsys, &((*region)->buffer), NULL ); - free(*region); - } - *region = NULL; + return round_up(width, 64 / cpp); } @@ -283,6 +242,7 @@ xm_surface_alloc(struct pipe_winsys *ws, GLuint pipeFormat) xms->surface.format = pipeFormat; xms->surface.refcount = 1; + xms->surface.winsys = ws; #if 0 /* * This is really just a softpipe surface, not an XImage/Pixmap surface. @@ -294,13 +254,27 @@ xm_surface_alloc(struct pipe_winsys *ws, GLuint pipeFormat) +static void +xm_surface_release(struct pipe_winsys *winsys, struct pipe_surface **s) +{ + struct pipe_surface *surf = *s; + surf->refcount--; + if (surf->refcount == 0) { + if (surf->buffer) + winsys->buffer_reference(winsys, &surf->buffer, NULL); + free(surf); + } + *s = NULL; +} + + /** * 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 * +struct pipe_winsys * xmesa_get_pipe_winsys(void) { static struct pipe_winsys *ws = NULL; @@ -320,13 +294,11 @@ xmesa_get_pipe_winsys(void) 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_pitch = xm_surface_pitch; ws->surface_alloc = xm_surface_alloc; + ws->surface_release = xm_surface_release; ws->flush_frontbuffer = xm_flush_frontbuffer; - ws->wait_idle = xm_wait_idle; ws->printf = xm_printf; ws->get_name = xm_get_name; } @@ -346,10 +318,17 @@ xmesa_get_pipe_winsys(void) static boolean xmesa_is_format_supported(struct softpipe_winsys *sws, uint format) { + /* Any format supported by softpipe can be listed here. + * This query is not used for allocating window-system color buffers + * (which would depend on the screen depth/bpp). + */ switch (format) { case PIPE_FORMAT_U_A8_R8_G8_B8: case PIPE_FORMAT_S_R16_G16_B16_A16: case PIPE_FORMAT_S8_Z24: + case PIPE_FORMAT_U_S8: + case PIPE_FORMAT_U_Z16: + case PIPE_FORMAT_U_Z32: return TRUE; default: return FALSE; @@ -378,7 +357,7 @@ xmesa_get_softpipe_winsys(void) struct pipe_context * -xmesa_create_softpipe(XMesaContext xmesa) +xmesa_create_context(XMesaContext xmesa) { struct pipe_winsys *pws = xmesa_get_pipe_winsys(); struct softpipe_winsys *spws = xmesa_get_softpipe_winsys();